diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/signal/Makefile | 2 | ||||
| -rw-r--r-- | libc/signal/sigintr.c | 57 | 
2 files changed, 58 insertions, 1 deletions
| diff --git a/libc/signal/Makefile b/libc/signal/Makefile index e4fa6b7b4..7973177f7 100644 --- a/libc/signal/Makefile +++ b/libc/signal/Makefile @@ -24,7 +24,7 @@ TOPDIR=../  include $(TOPDIR)Rules.mak  LIBC=$(TOPDIR)libc.a -CSRC=bsd_sig.c raise.c sigblock.c siggtmsk.c sigjmp.c signal.c \ +CSRC=bsd_sig.c raise.c sigblock.c siggtmsk.c sigjmp.c signal.c sigintr.c\  	sigpause.c sigstmsk.c sigaddset.c sigdelset.c sigismem.c sigemptyset.c  COBJS=$(patsubst %.c,%.o, $(CSRC)) diff --git a/libc/signal/sigintr.c b/libc/signal/sigintr.c new file mode 100644 index 000000000..483e5b71c --- /dev/null +++ b/libc/signal/sigintr.c @@ -0,0 +1,57 @@ +/* Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public +   License along with the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#include <stddef.h> +#include <signal.h> +#include <errno.h> + +/* If INTERRUPT is nonzero, make signal SIG interrupt system calls +   (causing them to fail with EINTR); if INTERRUPT is zero, make system +   calls be restarted after signal SIG.  */ +int +siginterrupt (sig, interrupt) +     int sig; +     int interrupt; +{ +#ifdef	SA_RESTART +  extern sigset_t _sigintr;	/* Defined in signal.c.  */ +  struct sigaction action; + +  if (sigaction (sig, (struct sigaction *) NULL, &action) < 0) +    return -1; + +  if (interrupt) +    { +      sigaddset (&_sigintr, sig); +      action.sa_flags &= ~SA_RESTART; +    } +  else +    { +      sigdelset (&_sigintr, sig); +      action.sa_flags |= SA_RESTART; +    } + +  if (sigaction (sig, &action, (struct sigaction *) NULL) < 0) +    return -1; + +  return 0; +#else +  __set_errno (ENOSYS); +  return -1; +#endif +} | 
