/* * Copyright (c) 2000 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@ */ #include #include #include #include #include "scutil.h" static int osig; static struct sigaction *oact = NULL; void do_notify_list(int argc, char **argv) { int regexOptions = 0; SCDStatus status; CFArrayRef list; CFIndex listCnt; int i; if (argc == 1) regexOptions = kSCDRegexKey; status = SCDNotifierList(session, regexOptions, &list); if (status != SCD_OK) { printf("SCDNotifierList: %s\n", SCDError(status)); return; } listCnt = CFArrayGetCount(list); if (listCnt > 0) { for (i=0; i 0) { for (i=0; i 0) { int got; got = read(fd, bufPtr, needed); if (got == -1) { /* if error detected */ printf("read() failed: %s\n", strerror(errno)); break; } if (got == 0) { /* if end of file detected */ printf("read(): detected end of file\n"); break; } printf("Received %d bytes\n", got); bufPtr += got; needed -= got; } if (needed != sizeof(buf.gotID)) { printf(" Received notification, identifier = %d\n", buf.gotID); } /* this utility only allows processes one notification per "n.file" request */ (void)SCDNotifierCancel(session); (void) close(fd); /* close my side of the file descriptor */ return; } static char *signames[] = { "" , "HUP" , "INT" , "QUIT", "ILL" , "TRAP", "ABRT", "EMT" , "FPE" , "KILL", "BUS" , "SEGV", "SYS" , "PIPE", "ALRM", "TERM", "URG" , "STOP", "TSTP" , "CONT", "CHLD" , "TTIN", "TTOU", "IO" , "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", "USR2" }; static void signalCatcher(int signum) { static int n = 0; printf("Received SIG%s (#%d)\n", signames[signum], n++); return; } void do_notify_signal(int argc, char **argv) { int sig; pid_t pid; struct sigaction nact; int ret; SCDStatus status; if (isdigit(*argv[0])) { if ((sscanf(argv[0], "%d", &sig) != 1) || (sig <= 0) || (sig >= NSIG)) { printf("signal must be in the range of 1 .. %d\n", NSIG-1); return; } } else { for (sig=1; sig= NSIG) { printf("Signal must be one of the following:"); for (sig=1; sig