~ubuntu-branches/ubuntu/trusty/musl/trusty-proposed

« back to all changes in this revision

Viewing changes to src/signal/sigset.c

  • Committer: Package Import Robot
  • Author(s): Kevin Bortis
  • Date: 2013-09-20 20:54:14 UTC
  • Revision ID: package-import@ubuntu.com-20130920205414-5b61trtmma18w58o
Tags: upstream-0.9.13
ImportĀ upstreamĀ versionĀ 0.9.13

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <signal.h>
 
2
#include <stdlib.h>
 
3
 
 
4
void (*sigset(int sig, void (*handler)(int)))(int)
 
5
{
 
6
        struct sigaction sa, sa_old;
 
7
        sigset_t mask;
 
8
 
 
9
        sigemptyset(&mask);
 
10
        if (sigaddset(&mask, sig) < 0)
 
11
                return SIG_ERR;
 
12
        
 
13
        if (handler == SIG_HOLD) {
 
14
                if (sigaction(sig, NULL, &sa_old) < 0)
 
15
                        return SIG_ERR;
 
16
                if (sigprocmask(SIG_BLOCK, &mask, &mask) < 0)
 
17
                        return SIG_ERR;
 
18
        } else {
 
19
                sa.sa_handler = handler;
 
20
                sa.sa_flags = 0;
 
21
                sigemptyset(&sa.sa_mask);
 
22
                if (sigaction(sig, &sa, &sa_old) < 0)
 
23
                        return SIG_ERR;
 
24
                if (sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0)
 
25
                        return SIG_ERR;
 
26
        }
 
27
        return sigismember(&mask, sig) ? SIG_HOLD : sa_old.sa_handler;
 
28
}