1 /* $OpenBSD: setsignal.c,v 1.6 2015/10/14 04:55:17 guenther Exp $ */ 2 3 /* 4 * Copyright (c) 1997 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that: (1) source code distributions 9 * retain the above copyright notice and this paragraph in its entirety, (2) 10 * distributions including binary code include the above copyright notice and 11 * this paragraph in its entirety in the documentation or other materials 12 * provided with the distribution, and (3) all advertising materials mentioning 13 * features or use of this software display the following acknowledgement: 14 * ``This product includes software developed by the University of California, 15 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 16 * the University nor the names of its contributors may be used to endorse 17 * or promote products derived from this software without specific prior 18 * written permission. 19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 20 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 22 */ 23 24 #include <sys/types.h> 25 26 #include <signal.h> 27 #include <string.h> 28 29 #include "setsignal.h" 30 31 void 32 setsignal(int sig, void (*func)(int)) 33 { 34 struct sigaction sa; 35 36 if (sigaction(sig, NULL, &sa) == 0 && sa.sa_handler != SIG_IGN) { 37 sa.sa_handler = func; 38 sa.sa_flags = SA_RESTART; 39 if (sig == SIGCHLD) 40 sa.sa_flags |= SA_NOCLDSTOP; 41 sigemptyset(&sa.sa_mask); 42 sigaction(sig, &sa, NULL); 43 } 44 } 45 46