Signal compat: sunos sigset_t conversions;
new sunos_sigvec() & sunos_sigpending()
This commit is contained in:
parent
a2e65ee4f1
commit
c7971c960e
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: sunos_misc.c,v 1.94 1998/09/08 20:02:52 rvb Exp $ */
|
/* $NetBSD: sunos_misc.c,v 1.95 1998/09/13 22:28:16 pk Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1992, 1993
|
* Copyright (c) 1992, 1993
|
||||||
@ -404,6 +404,29 @@ async_daemon(p, v, retval)
|
|||||||
}
|
}
|
||||||
#endif /* NFS */
|
#endif /* NFS */
|
||||||
|
|
||||||
|
void native_to_sunos_sigset __P((const sigset_t *, int *));
|
||||||
|
void sunos_to_native_sigset __P((const int, sigset_t *));
|
||||||
|
|
||||||
|
__inline__ void
|
||||||
|
native_to_sunos_sigset(ss, mask)
|
||||||
|
const sigset_t *ss;
|
||||||
|
int *mask;
|
||||||
|
{
|
||||||
|
*mask = ss->__bits[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
__inline__ void
|
||||||
|
sunos_to_native_sigset(mask, ss)
|
||||||
|
const int mask;
|
||||||
|
sigset_t *ss;
|
||||||
|
{
|
||||||
|
|
||||||
|
ss->__bits[0] = mask;
|
||||||
|
ss->__bits[1] = 0;
|
||||||
|
ss->__bits[2] = 0;
|
||||||
|
ss->__bits[3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sunos_sys_sigpending(p, v, retval)
|
sunos_sys_sigpending(p, v, retval)
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
@ -411,11 +434,32 @@ sunos_sys_sigpending(p, v, retval)
|
|||||||
register_t *retval;
|
register_t *retval;
|
||||||
{
|
{
|
||||||
struct sunos_sys_sigpending_args *uap = v;
|
struct sunos_sys_sigpending_args *uap = v;
|
||||||
int mask = p->p_siglist & p->p_sigmask;
|
sigset_t ss;
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
sigpending1(p, &ss);
|
||||||
|
native_to_sunos_sigset(&ss, &mask);
|
||||||
|
|
||||||
return (copyout((caddr_t)&mask, (caddr_t)SCARG(uap, mask), sizeof(int)));
|
return (copyout((caddr_t)&mask, (caddr_t)SCARG(uap, mask), sizeof(int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sunos_sys_sigsuspend(p, v, retval)
|
||||||
|
register struct proc *p;
|
||||||
|
void *v;
|
||||||
|
register_t *retval;
|
||||||
|
{
|
||||||
|
struct sunos_sys_sigsuspend_args /* {
|
||||||
|
syscallarg(int) mask;
|
||||||
|
} */ *uap = v;
|
||||||
|
int mask;
|
||||||
|
sigset_t ss;
|
||||||
|
|
||||||
|
mask = SCARG(uap, mask);
|
||||||
|
sunos_to_native_sigset(mask, &ss);
|
||||||
|
return (sigsuspend1(p, &ss));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read Sun-style directory entries. We suck them into kernel space so
|
* Read Sun-style directory entries. We suck them into kernel space so
|
||||||
* that they can be massaged before being copied out to user code. Like
|
* that they can be massaged before being copied out to user code. Like
|
||||||
@ -1205,57 +1249,50 @@ sunos_sys_sigvec(p, v, retval)
|
|||||||
void *v;
|
void *v;
|
||||||
register_t *retval;
|
register_t *retval;
|
||||||
{
|
{
|
||||||
register struct sunos_sys_sigvec_args /* {
|
struct sunos_sys_sigvec_args /* {
|
||||||
syscallarg(int) signum;
|
syscallarg(int) signum;
|
||||||
syscallarg(struct sigvec *) nsv;
|
syscallarg(struct sigvec *) nsv;
|
||||||
syscallarg(struct sigvec *) osv;
|
syscallarg(struct sigvec *) osv;
|
||||||
} */ *uap = v;
|
} */ *uap = v;
|
||||||
struct sigvec vec;
|
struct sigvec nsv, osv;
|
||||||
register struct sigacts *ps = p->p_sigacts;
|
struct sigaction nsa, osa;
|
||||||
register struct sigvec *sv;
|
int error;
|
||||||
register int signum;
|
/*XXX*/extern void compat_43_sigvec_to_sigaction
|
||||||
int bit, error;
|
__P((const struct sigvec *, struct sigaction *));
|
||||||
|
/*XXX*/extern void compat_43_sigaction_to_sigvec
|
||||||
|
__P((const struct sigaction *, struct sigvec *));
|
||||||
|
|
||||||
signum = SCARG(uap, signum);
|
|
||||||
if (signum <= 0 || signum >= NSIG ||
|
|
||||||
signum == SIGKILL || signum == SIGSTOP)
|
|
||||||
return (EINVAL);
|
|
||||||
sv = &vec;
|
|
||||||
if (SCARG(uap, osv)) {
|
|
||||||
*(sig_t *)&sv->sv_handler = ps->ps_sigact[signum];
|
|
||||||
sv->sv_mask = ps->ps_catchmask[signum];
|
|
||||||
bit = sigmask(signum);
|
|
||||||
sv->sv_flags = 0;
|
|
||||||
if ((ps->ps_sigonstack & bit) != 0)
|
|
||||||
sv->sv_flags |= SV_ONSTACK;
|
|
||||||
if ((ps->ps_sigintr & bit) != 0)
|
|
||||||
sv->sv_flags |= SV_INTERRUPT;
|
|
||||||
if ((ps->ps_sigreset & bit) != 0)
|
|
||||||
sv->sv_flags |= SA_RESETHAND;
|
|
||||||
sv->sv_mask &= ~bit;
|
|
||||||
error = copyout((caddr_t)sv, (caddr_t)SCARG(uap, osv),
|
|
||||||
sizeof (vec));
|
|
||||||
if (error)
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
if (SCARG(uap, nsv)) {
|
if (SCARG(uap, nsv)) {
|
||||||
error = copyin((caddr_t)SCARG(uap, nsv), (caddr_t)sv,
|
error = copyin(SCARG(uap, nsv), &nsv, sizeof(nsv));
|
||||||
sizeof (vec));
|
if (error != 0)
|
||||||
if (error)
|
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SunOS uses the mask 0x0004 as SV_RESETHAND
|
* SunOS uses the mask 0x0004 as SV_RESETHAND
|
||||||
* meaning: `reset to SIG_DFL on delivery'.
|
* meaning: `reset to SIG_DFL on delivery'.
|
||||||
* We support only the bits in: 0xF
|
* We support only the bits in: 0xF
|
||||||
* (those bits are the same as ours)
|
* (those bits are the same as ours)
|
||||||
*/
|
*/
|
||||||
if (sv->sv_flags & ~0xF)
|
if (nsv.sv_flags & ~0xF)
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
|
|
||||||
|
compat_43_sigvec_to_sigaction(&nsv, &nsa);
|
||||||
|
|
||||||
/* SunOS binaries have a user-mode trampoline. */
|
/* SunOS binaries have a user-mode trampoline. */
|
||||||
sv->sv_flags |= SA_USERTRAMP;
|
nsa.sa_flags |= SA_USERTRAMP;
|
||||||
/* Convert sigvec:SV_INTERRUPT to sigaction:SA_RESTART */
|
|
||||||
sv->sv_flags ^= SA_RESTART; /* same bit, inverted */
|
|
||||||
setsigvec(p, signum, (struct sigaction *)sv);
|
|
||||||
}
|
}
|
||||||
|
error = sigaction1(p, SCARG(uap, signum),
|
||||||
|
SCARG(uap, nsv) ? &nsa : 0,
|
||||||
|
SCARG(uap, osv) ? &osa : 0);
|
||||||
|
if (error != 0)
|
||||||
|
return (error);
|
||||||
|
|
||||||
|
if (SCARG(uap, osv)) {
|
||||||
|
compat_43_sigaction_to_sigvec(&osa, &osv);
|
||||||
|
error = copyout(SCARG(uap, osv), &osv, sizeof(osv));
|
||||||
|
if (error != 0)
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
$NetBSD: syscalls.master,v 1.46 1998/06/25 22:19:12 thorpej Exp $
|
$NetBSD: syscalls.master,v 1.47 1998/09/13 22:28:17 pk Exp $
|
||||||
|
|
||||||
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
|
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
|
||||||
|
|
||||||
@ -177,7 +177,7 @@
|
|||||||
struct sigvec *osv); }
|
struct sigvec *osv); }
|
||||||
109 NOARGS { int compat_43_sys_sigblock(int mask); }
|
109 NOARGS { int compat_43_sys_sigblock(int mask); }
|
||||||
110 NOARGS { int compat_43_sys_sigsetmask(int mask); }
|
110 NOARGS { int compat_43_sys_sigsetmask(int mask); }
|
||||||
111 NOARGS { int sys_sigsuspend(int mask); }
|
111 STD { int sunos_sys_sigsuspend(int mask); }
|
||||||
112 NOARGS { int compat_43_sys_sigstack(struct sigstack *nss, \
|
112 NOARGS { int compat_43_sys_sigstack(struct sigstack *nss, \
|
||||||
struct sigstack *oss); }
|
struct sigstack *oss); }
|
||||||
113 NOARGS { int compat_43_sys_recvmsg(int s, \
|
113 NOARGS { int compat_43_sys_recvmsg(int s, \
|
||||||
|
Loading…
Reference in New Issue
Block a user