setsignal.c revision 39297
1/* 2 * Copyright (c) 1997 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that: (1) source code distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 */ 21 22#ifndef lint 23static const char rcsid[] = 24 "@(#) $Header: setsignal.c,v 1.4 97/06/15 13:20:29 leres Exp $ (LBL)"; 25#endif 26 27#include <sys/types.h> 28 29#ifdef HAVE_MEMORY_H 30#include <memory.h> 31#endif 32#include <signal.h> 33#ifdef HAVE_SIGACTION 34#include <string.h> 35#endif 36 37#include "gnuc.h" 38#ifdef HAVE_OS_PROTO_H 39#include "os-proto.h" 40#endif 41 42#include "setsignal.h" 43 44/* 45 * An os independent signal() with BSD semantics, e.g. the signal 46 * catcher is restored following service of the signal. 47 * 48 * When sigset() is available, signal() has SYSV semantics and sigset() 49 * has BSD semantics and call interface. Unfortunately, Linux does not 50 * have sigset() so we use the more complicated sigaction() interface 51 * there. 52 * 53 * Did I mention that signals suck? 54 */ 55RETSIGTYPE 56(*setsignal (int sig, RETSIGTYPE (*func)(int)))(int) 57{ 58#ifdef HAVE_SIGACTION 59 struct sigaction old, new; 60 61 memset(&new, 0, sizeof(new)); 62 new.sa_handler = func; 63#ifdef SA_RESTART 64 new.sa_flags |= SA_RESTART; 65#endif 66 if (sigaction(sig, &new, &old) < 0) 67 return (SIG_ERR); 68 return (old.sa_handler); 69 70#else 71#ifdef HAVE_SIGSET 72 return (sigset(sig, func)); 73#else 74 return (signal(sig, func)); 75#endif 76#endif 77} 78 79