xref: /original-bsd/lib/libc/gen/siginterrupt.c (revision bac379f5)
123f5926cSmckusick /*
2*bac379f5Sbostic  * Copyright (c) 1989, 1993
3*bac379f5Sbostic  *	The Regents of the University of California.  All rights reserved.
48eebfffeSbostic  *
532d8cbb4Sbostic  * %sccs.include.redist.c%
623f5926cSmckusick  */
723f5926cSmckusick 
822d52fbaSdonn #if defined(LIBC_SCCS) && !defined(lint)
9*bac379f5Sbostic static char sccsid[] = "@(#)siginterrupt.c	8.1 (Berkeley) 06/04/93";
108eebfffeSbostic #endif /* LIBC_SCCS and not lint */
113cb8d038Smckusick 
123cb8d038Smckusick #include <signal.h>
133cb8d038Smckusick 
143cb8d038Smckusick /*
153cb8d038Smckusick  * Set signal state to prevent restart of system calls
163cb8d038Smckusick  * after an instance of the indicated signal.
173cb8d038Smckusick  */
siginterrupt(sig,flag)183cb8d038Smckusick siginterrupt(sig, flag)
193cb8d038Smckusick 	int sig, flag;
203cb8d038Smckusick {
2146158b3aSkarels 	extern sigset_t _sigintr;
2246158b3aSkarels 	struct sigaction sa;
233cb8d038Smckusick 	int ret;
243cb8d038Smckusick 
2546158b3aSkarels 	if ((ret = sigaction(sig, (struct sigaction *)0, &sa)) < 0)
263cb8d038Smckusick 		return (ret);
2746158b3aSkarels 	if (flag) {
2846158b3aSkarels 		sigaddset(&_sigintr, sig);
2946158b3aSkarels 		sa.sa_flags &= ~SA_RESTART;
3046158b3aSkarels 	} else {
3146158b3aSkarels 		sigdelset(&_sigintr, sig);
3246158b3aSkarels 		sa.sa_flags |= SA_RESTART;
3346158b3aSkarels 	}
3446158b3aSkarels 	return (sigaction(sig, &sa, (struct sigaction *)0));
353cb8d038Smckusick }
36