/* * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ /* * Modification History * * June 1, 2001 Allan Nathanson * - public API conversion * * November 9, 2000 Allan Nathanson * - initial revision */ #include #include #include #include #include "scutil.h" #include #include "v1Compatibility.h" static int osig; static struct sigaction *oact = NULL; static CFComparisonResult sort_keys(const void *p1, const void *p2, void *context) { CFStringRef key1 = (CFStringRef)p1; CFStringRef key2 = (CFStringRef)p2; return CFStringCompare(key1, key2, 0); } void storeCallback(SCDynamicStoreRef store, CFArrayRef changedKeys, void *info) { int i; CFIndex n; SCPrint(TRUE, stdout, CFSTR("notification callback (store address = %p).\n"), store); n = CFArrayGetCount(changedKeys); if (n > 0) { for (i=0; i 0) { for (i=0; i 0) { for (i=0; i 0) { int got; got = read(fd, bufPtr, needed); if (got == -1) { /* if error detected */ SCPrint(TRUE, stdout, CFSTR("read() failed: %s.\n"), strerror(errno)); break; } if (got == 0) { /* if end of file detected */ SCPrint(TRUE, stdout, CFSTR("read(): detected end of file.\n")); break; } SCPrint(TRUE, stdout, CFSTR("Received %d bytes.\n"), got); bufPtr += got; needed -= got; } if (needed != sizeof(buf.gotID)) { SCPrint(TRUE, stdout, CFSTR(" Received notification, identifier = %d.\n"), buf.gotID); } /* this utility only allows processes one notification per "n.file" request */ (void) SCDynamicStoreNotifyCancel(store); (void) close(fd); /* close my side of the file descriptor */ return; } static void signalCatcher(int signum) { static int n = 0; SCPrint(TRUE, stdout, CFSTR("Received sig%s (#%d).\n"), sys_signame[signum], n++); return; } void do_notify_signal(int argc, char **argv) { int sig; pid_t pid; struct sigaction nact; int ret; if (isdigit(*argv[0])) { if ((sscanf(argv[0], "%d", &sig) != 1) || (sig <= 0) || (sig >= NSIG)) { SCPrint(TRUE, stdout, CFSTR("signal must be in the range of 1 .. %d.\n"), NSIG-1); return; } } else { for (sig=1; sig= NSIG) { CFMutableStringRef str; SCPrint(TRUE, stdout, CFSTR("Signal must be one of the following:\n")); str = CFStringCreateMutable(NULL, 0); for (sig=1; sig