diff options
| -rw-r--r-- | libc/sysdeps/linux/sparc/sigaction.c | 46 | 
1 files changed, 16 insertions, 30 deletions
| diff --git a/libc/sysdeps/linux/sparc/sigaction.c b/libc/sysdeps/linux/sparc/sigaction.c index 3964ae183..a22ac40af 100644 --- a/libc/sysdeps/linux/sparc/sigaction.c +++ b/libc/sysdeps/linux/sparc/sigaction.c @@ -37,46 +37,32 @@ static void __sigreturn_stub(void);  int __libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oact)  {  	int ret; -	struct old_kernel_sigaction kact, koact; +	struct sigaction kact, koact;  	unsigned long stub = 0; -	int saved_errno = errno;  	if (act) { -		kact.k_sa_handler = act->sa_handler; -		/* BUG?! kact.sa_mask is a long, but sigset_t is a vector -		/* of longs and it may be bigger (in glibc, it _is_ bigger). -		/* Should we do this instead? -		/* kact.sa_mask = act->sa_mask.__val[0]; */ -		memcpy(&kact.sa_mask, &act->sa_mask, sizeof(sigset_t)); -		kact.sa_flags = act->sa_flags; -		if (kact.sa_flags & SA_SIGINFO) +		kact.sa_handler = act->sa_handler; +		memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); +		if (((kact.sa_flags = act->sa_flags) & SA_SIGINFO) != 0)  			stub = (unsigned long) &__rt_sigreturn_stub;  		else  			stub = (unsigned long) &__sigreturn_stub;  		stub -= 8;  		kact.sa_restorer = NULL;  	} -	/* NB: kernel (as of 2.6.25) will return EINVAL -	 * if _NSIG / 8 does not match kernel's sizeof(sigset_t) */ -	ret = rt_sigaction(sig, -		(int)(act ? &kact : NULL), -		(int)(oact ? &koact : NULL), -		stub, -		_NSIG / 8); - -	/* BUG?! if ret == -1, we return -1 but do not set errno?! */ -	if (ret >= 0 || errno != ENOSYS) { -		if (oact && ret >= 0) { -			oact->sa_handler = koact.k_sa_handler; -			/* maybe oact->sa_mask.__val[0] = koact.sa_mask;? */ -			memcpy(&oact->sa_mask, &koact.sa_mask, sizeof(sigset_t)); -			oact->sa_flags = koact.sa_flags; -			oact->sa_restorer = koact.sa_restorer; -		} -		return ret; +	 +	/* XXX The size argument hopefully will have to be changed to the +	 * real size of the user-level sigset_t.  */ +	ret = INLINE_SYSCALL (rt_sigaction, 5, sig, act ? &kact : 0, +			oact ? &koact : 0, stub, _NSIG / 8); +	 +	if (oact && ret >= 0) { +		oact->sa_handler = koact.sa_handler; +		memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); +		oact->sa_flags = koact.sa_flags; +		oact->sa_restorer = koact.sa_restorer;  	} -	__set_errno(saved_errno); -	return -1; +	return ret;  }  #ifndef LIBC_SIGACTION | 
