diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/alpha/sigprocmask.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/sigprocmask.c | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/sysdeps/unix/sysv/linux/alpha/sigprocmask.c b/sysdeps/unix/sysv/linux/alpha/sigprocmask.c index a1d5636fcb..7fb58f1d80 100644 --- a/sysdeps/unix/sysv/linux/alpha/sigprocmask.c +++ b/sysdeps/unix/sysv/linux/alpha/sigprocmask.c @@ -1,48 +1,59 @@ -/* Copyright (C) 1993, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. Contributed by David Mosberger (davidm@azstarnet.com). -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 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. + 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., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + 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 <sysdep.h> #include <signal.h> +/* When there is kernel support for more than 64 signals, we'll have to + switch to a new system call convention here. */ + extern unsigned long __osf_sigprocmask (int how, unsigned long newmask); int __sigprocmask (int how, const sigset_t *set, sigset_t *oset) { - sigset_t setval; + unsigned long int setval; long result; - if (set) { - setval = *set; - } else { - sigemptyset(&setval); - how = SIG_BLOCK; /* ensure blocked mask doesn't get changed */ - } - result = __osf_sigprocmask(how, setval); - if (result == -1) { - /* if there are ever more than 63 signals, we need to recode this + if (set) + { + setval = set->__val[0]; + } + else + { + setval = 0; + how = SIG_BLOCK; /* ensure blocked mask doesn't get changed */ + } + result = __osf_sigprocmask (how, setval); + if (result == -1) + /* If there are ever more than 63 signals, we need to recode this in assembler since we wouldn't be able to distinguish a mask of all 1s from -1, but for now, we're doing just fine... */ return result; - } - if (oset) { - *oset = result; - } + + if (oset) + { + oset->__val[0] = result; + result = _SIGSET_NWORDS; + while (--result > 0) + oset->__val[result] = 0; + } return 0; } |