Beispiel #1
0
/*
 * If act is not NULL, change the action for sig to *act.
 * If oact is not NULL, put the old action for sig in *oact.
 */
int __libc_sigaction(int signum, const struct sigaction *act,
		     struct sigaction *oldact)
{
	struct kernel_sigaction kact, koact;
	int result;

	if (act) {
		kact.k_sa_handler = act->sa_handler;
		memcpy(&kact.sa_mask, &act->sa_mask, sizeof (kact.sa_mask));
		kact.sa_flags = act->sa_flags;
		if (kact.sa_flags & SA_RESTORER)
			kact.sa_restorer = act->sa_restorer;
		else
			kact.sa_restorer = __default_rt_sa_restorer;
		kact.sa_flags |= SA_RESTORER;
	}

	result = __syscall_rt_sigaction(signum, act ? __ptrvalue(&kact) : NULL,
					oldact ? __ptrvalue(&koact) : NULL,
					_NSIG / 8);

	if (oldact && result >= 0) {
		oldact->sa_handler = koact.k_sa_handler;
		memcpy(&oldact->sa_mask, &koact.sa_mask,
		       sizeof(oldact->sa_mask));
		oldact->sa_flags = koact.sa_flags;
		oldact->sa_restorer = koact.sa_restorer;
	}

	return result;
}
Beispiel #2
0
/* If ACT is not NULL, change the action for SIG to *ACT.
   If OACT is not NULL, put the old action for SIG in *OACT.  */
int __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
{
    int result;
    struct kernel_sigaction kact, koact;

#ifdef SIGCANCEL
    if (sig == SIGCANCEL) {
        __set_errno (EINVAL);
        return -1;
    }
#endif
    if (act) {
        kact.k_sa_handler = act->sa_handler;
        memcpy (&kact.sa_mask, &act->sa_mask, sizeof (kact.sa_mask));
        kact.sa_flags = act->sa_flags;
# ifdef HAVE_SA_RESTORER
        kact.sa_restorer = act->sa_restorer;
# endif
    }

    /* XXX The size argument hopefully will have to be changed to the
       real size of the user-level sigset_t.  */
    result = __syscall_rt_sigaction(sig, act ? __ptrvalue (&kact) : NULL,
                                    oact ? __ptrvalue (&koact) : NULL, _NSIG / 8);

    if (oact && result >= 0) {
        oact->sa_handler = koact.k_sa_handler;
        memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (oact->sa_mask));
        oact->sa_flags = koact.sa_flags;
# ifdef HAVE_SA_RESTORER
        oact->sa_restorer = koact.sa_restorer;
# endif
    }
    return result;
}
Beispiel #3
0
/* If ACT is not NULL, change the action for SIG to *ACT.
   If OACT is not NULL, put the old action for SIG in *OACT.  */
int
__libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
{
	/* NB: kernel (as of 2.6.25) will return EINVAL
	 * if sizeof(act->sa_mask) does not match kernel's sizeof(sigset_t).
	 * Try to catch this problem at uclibc build time:  */
	struct BUG_sigset_size {
		int BUG_sigset_size
			[sizeof(act->sa_mask) == _NSIG / 8 ? 1 : -1];
	};
	return __syscall_rt_sigaction(sig, act, oact, sizeof(act->sa_mask));
}
Beispiel #4
0
/*
 * If act is not NULL, change the action for sig to *act.
 * If oact is not NULL, put the old action for sig in *oact.
 */
int __libc_sigaction(int sig, const struct sigaction *act,
		     struct sigaction *oact)
{
	struct sigaction kact;

	if (act && !(act->sa_flags & SA_RESTORER)) {
		memcpy(&kact, act, sizeof(kact));
		kact.sa_restorer = __default_rt_sa_restorer;
		kact.sa_flags |= SA_RESTORER;
		act = &kact;
	}

	/* NB: kernel (as of 2.6.25) will return EINVAL
	 * if sizeof(act->sa_mask) does not match kernel's sizeof(sigset_t) */
	return __syscall_rt_sigaction(sig, act, oact, sizeof(act->sa_mask));
}
/* If ACT is not NULL, change the action for SIG to *ACT.
   If OACT is not NULL, put the old action for SIG in *OACT.  */
int __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
{
    int result;
    struct kernel_sigaction kact, koact;

    if (act) {
	kact.k_sa_handler = act->sa_handler;
	memcpy (&kact.sa_mask, &act->sa_mask, sizeof (kact.sa_mask));
	kact.sa_flags = act->sa_flags;
# ifdef HAVE_SA_RESTORER
	if (kact.sa_flags & (SA_RESTORER | SA_ONSTACK)) {
	    kact.sa_restorer = act->sa_restorer;
	} else {
	    if (kact.sa_flags & SA_SIGINFO) {
		kact.sa_restorer = __default_rt_sa_restorer;
	    } else {
		kact.sa_restorer = __default_sa_restorer;
		kact.sa_flags |= SA_RESTORER;
	    }
	}
# endif
    }

    /* XXX The size argument hopefully will have to be changed to the
       real size of the user-level sigset_t.  */
    result = __syscall_rt_sigaction(sig, act ? __ptrvalue (&kact) : NULL,
	    oact ? __ptrvalue (&koact) : NULL, _NSIG / 8);

    if (oact && result >= 0) {
	oact->sa_handler = koact.k_sa_handler;
	memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (oact->sa_mask));
	oact->sa_flags = koact.sa_flags;
# ifdef HAVE_SA_RESTORER
	oact->sa_restorer = koact.sa_restorer;
# endif
    }
    return result;
}