From a396a097b70c5d41dde5a7883b51e380ca484dab Mon Sep 17 00:00:00 2001 From: fvdl Date: Thu, 7 Sep 1995 21:48:59 +0000 Subject: [PATCH] Fix some bugs & typing problems. --- sys/compat/linux/arch/i386/syscalls.master | 10 ++-- sys/compat/linux/common/linux_break.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_file.c | 48 ++++++++++++++++-- sys/compat/linux/common/linux_llseek.c | 48 ++++++++++++++++-- sys/compat/linux/common/linux_misc.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_misc_notalpha.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_oldmmap.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_oldolduname.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_oldselect.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_olduname.c | 49 ++++++++++++++++++- sys/compat/linux/common/linux_pipe.c | 49 ++++++++++++++++++- sys/compat/linux/i386/syscalls.master | 10 ++-- sys/compat/linux/linux_file.c | 48 ++++++++++++++++-- sys/compat/linux/linux_misc.c | 49 ++++++++++++++++++- sys/compat/linux/multiarch/linux_break.c | 49 ++++++++++++++++++- sys/compat/linux/multiarch/linux_llseek.c | 48 ++++++++++++++++-- .../linux/multiarch/linux_misc_notalpha.c | 49 ++++++++++++++++++- sys/compat/linux/multiarch/linux_oldmmap.c | 49 ++++++++++++++++++- .../linux/multiarch/linux_oldolduname.c | 49 ++++++++++++++++++- sys/compat/linux/multiarch/linux_oldselect.c | 49 ++++++++++++++++++- sys/compat/linux/multiarch/linux_olduname.c | 49 ++++++++++++++++++- sys/compat/linux/multiarch/linux_pipe.c | 49 ++++++++++++++++++- sys/compat/linux/syscalls.master | 10 ++-- 23 files changed, 939 insertions(+), 67 deletions(-) diff --git a/sys/compat/linux/arch/i386/syscalls.master b/sys/compat/linux/arch/i386/syscalls.master index fef5c1593155..00007f8db017 100644 --- a/sys/compat/linux/arch/i386/syscalls.master +++ b/sys/compat/linux/arch/i386/syscalls.master @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.11 1995/08/27 20:51:53 fvdl Exp $ + $NetBSD: syscalls.master,v 1.12 1995/09/07 21:49:02 fvdl Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -87,7 +87,7 @@ 43 STD { int linux_times(struct times *tms); } 44 UNIMPL linux_prof 45 STD { int linux_brk(char *nsize); } -46 NOARGS { int setgid(uid_t gid); } +46 NOARGS { int setgid(gid_t gid); } 47 NOARGS { gid_t getgid(void); } 48 STD { int linux_signal(int sig, linux_handler_t handler); } 49 NOARGS { uid_t geteuid(void); } @@ -113,8 +113,8 @@ struct linux_sigaction *osa); } 68 STD { int linux_siggetmask(void); } 69 STD { int linux_sigsetmask(linux_sigset_t mask); } -70 NOARGS { int compat_43_setreuid(int ruid, int euid); } -71 NOARGS { int compat_43_setregid(int rgid, int egid); } +70 STD { int linux_setreuid(int ruid, int euid); } +71 STD { int linux_setregid(int rgid, int egid); } 72 STD { int linux_sigsuspend(caddr_t restart, int oldmask, \ int mask); } 73 STD { int linux_sigpending(linux_sigset_t *mask); } @@ -144,7 +144,7 @@ 92 STD { int linux_truncate(char *path, long length); } 93 NOARGS { int compat_43_ftruncate(int fd, long length); } 94 NOARGS { int fchmod(int fd, int mode); } -95 NOARGS { int fchown(int fd, int uid, int gid); } +95 STD { int linux_fchown(int fd, int uid, int gid); } 96 NOARGS { int getpriority(int which, int who); } 97 NOARGS { int setpriority(int which, int who, int prio); } 98 NOARGS { int profil(caddr_t samples, u_int size, \ diff --git a/sys/compat/linux/common/linux_break.c b/sys/compat/linux/common/linux_break.c index 62970a990392..cf1499b50c19 100644 --- a/sys/compat/linux/common/linux_break.c +++ b/sys/compat/linux/common/linux_break.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_break.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_break.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_file.c b/sys/compat/linux/common/linux_file.c index 4d95ced1e5b2..fb2a9ef10d60 100644 --- a/sys/compat/linux/common/linux_file.c +++ b/sys/compat/linux/common/linux_file.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_file.c,v 1.9 1995/08/27 20:51:48 fvdl Exp $ */ +/* $NetBSD: linux_file.c,v 1.10 1995/09/07 21:48:59 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -487,7 +487,7 @@ linux_lstat(p, uap, retval) } /* - * The following syscalls are only here because of the alternate path check. + * The following syscalls are mostly here because of the alternate path check. */ int linux_access(p, uap, retval) @@ -521,7 +521,8 @@ linux_unlink(p, uap, retval) return unlink(p, uap, retval); } -int linux_chdir(p, uap, retval) +int +linux_chdir(p, uap, retval) struct proc *p; struct linux_chdir_args /* { syscallarg(char *) path; @@ -546,10 +547,19 @@ linux_mknod(p, uap, retval) register_t *retval; { caddr_t sg = stackgap_init(p->p_emul); + struct mkfifo_args bma; LINUX_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path)); - return mknod(p, uap, retval); + /* + * BSD handles FIFOs seperately + */ + if (SCARG(uap, mode) & S_IFIFO) { + SCARG(&bma, path) = SCARG(uap, path); + SCARG(&bma, mode) = SCARG(uap, mode); + return mkfifo(p, uap, retval); + } else + return mknod(p, uap, retval); } int @@ -578,11 +588,39 @@ linux_chown(p, uap, retval) } */ *uap; register_t *retval; { + struct chown_args bca; caddr_t sg = stackgap_init(p->p_emul); LINUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); - return chmod(p, uap, retval); + SCARG(&bca, path) = SCARG(uap, path); + SCARG(&bca, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bca, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return chown(p, &bca, retval); +} + +int +linux_fchown(p, uap, retval) + struct proc *p; + struct linux_fchown_args /* { + syscallarg(int) fd; + syscallarg(int) uid; + syscallarg(int) gid; + } */ *uap; + register_t *retval; +{ + struct fchown_args bfa; + + SCARG(&bfa, fd) = SCARG(uap, fd); + SCARG(&bfa, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bfa, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return fchown(p, &bfa, retval); } int diff --git a/sys/compat/linux/common/linux_llseek.c b/sys/compat/linux/common/linux_llseek.c index 67596adca699..806f43973369 100644 --- a/sys/compat/linux/common/linux_llseek.c +++ b/sys/compat/linux/common/linux_llseek.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_llseek.c,v 1.9 1995/08/27 20:51:48 fvdl Exp $ */ +/* $NetBSD: linux_llseek.c,v 1.10 1995/09/07 21:48:59 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -487,7 +487,7 @@ linux_lstat(p, uap, retval) } /* - * The following syscalls are only here because of the alternate path check. + * The following syscalls are mostly here because of the alternate path check. */ int linux_access(p, uap, retval) @@ -521,7 +521,8 @@ linux_unlink(p, uap, retval) return unlink(p, uap, retval); } -int linux_chdir(p, uap, retval) +int +linux_chdir(p, uap, retval) struct proc *p; struct linux_chdir_args /* { syscallarg(char *) path; @@ -546,10 +547,19 @@ linux_mknod(p, uap, retval) register_t *retval; { caddr_t sg = stackgap_init(p->p_emul); + struct mkfifo_args bma; LINUX_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path)); - return mknod(p, uap, retval); + /* + * BSD handles FIFOs seperately + */ + if (SCARG(uap, mode) & S_IFIFO) { + SCARG(&bma, path) = SCARG(uap, path); + SCARG(&bma, mode) = SCARG(uap, mode); + return mkfifo(p, uap, retval); + } else + return mknod(p, uap, retval); } int @@ -578,11 +588,39 @@ linux_chown(p, uap, retval) } */ *uap; register_t *retval; { + struct chown_args bca; caddr_t sg = stackgap_init(p->p_emul); LINUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); - return chmod(p, uap, retval); + SCARG(&bca, path) = SCARG(uap, path); + SCARG(&bca, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bca, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return chown(p, &bca, retval); +} + +int +linux_fchown(p, uap, retval) + struct proc *p; + struct linux_fchown_args /* { + syscallarg(int) fd; + syscallarg(int) uid; + syscallarg(int) gid; + } */ *uap; + register_t *retval; +{ + struct fchown_args bfa; + + SCARG(&bfa, fd) = SCARG(uap, fd); + SCARG(&bfa, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bfa, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return fchown(p, &bfa, retval); } int diff --git a/sys/compat/linux/common/linux_misc.c b/sys/compat/linux/common/linux_misc.c index 85f2704cd87a..3b6bdd2de91e 100644 --- a/sys/compat/linux/common/linux_misc.c +++ b/sys/compat/linux/common/linux_misc.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_misc.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_misc_notalpha.c b/sys/compat/linux/common/linux_misc_notalpha.c index ed69dcf2c398..f50a12592181 100644 --- a/sys/compat/linux/common/linux_misc_notalpha.c +++ b/sys/compat/linux/common/linux_misc_notalpha.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc_notalpha.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_misc_notalpha.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_oldmmap.c b/sys/compat/linux/common/linux_oldmmap.c index 14f3847ba4be..a5ff6a01bc0f 100644 --- a/sys/compat/linux/common/linux_oldmmap.c +++ b/sys/compat/linux/common/linux_oldmmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_oldmmap.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_oldmmap.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_oldolduname.c b/sys/compat/linux/common/linux_oldolduname.c index d06c285e4d31..ed14347be7dd 100644 --- a/sys/compat/linux/common/linux_oldolduname.c +++ b/sys/compat/linux/common/linux_oldolduname.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_oldolduname.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_oldolduname.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_oldselect.c b/sys/compat/linux/common/linux_oldselect.c index 429225670e4c..9631fb1bb8fd 100644 --- a/sys/compat/linux/common/linux_oldselect.c +++ b/sys/compat/linux/common/linux_oldselect.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_oldselect.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_oldselect.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_olduname.c b/sys/compat/linux/common/linux_olduname.c index 43ff1e0924ea..a425c93edb8b 100644 --- a/sys/compat/linux/common/linux_olduname.c +++ b/sys/compat/linux/common/linux_olduname.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_olduname.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_olduname.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/common/linux_pipe.c b/sys/compat/linux/common/linux_pipe.c index f83af17be114..01093b13f6b1 100644 --- a/sys/compat/linux/common/linux_pipe.c +++ b/sys/compat/linux/common/linux_pipe.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_pipe.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_pipe.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/i386/syscalls.master b/sys/compat/linux/i386/syscalls.master index fef5c1593155..00007f8db017 100644 --- a/sys/compat/linux/i386/syscalls.master +++ b/sys/compat/linux/i386/syscalls.master @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.11 1995/08/27 20:51:53 fvdl Exp $ + $NetBSD: syscalls.master,v 1.12 1995/09/07 21:49:02 fvdl Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -87,7 +87,7 @@ 43 STD { int linux_times(struct times *tms); } 44 UNIMPL linux_prof 45 STD { int linux_brk(char *nsize); } -46 NOARGS { int setgid(uid_t gid); } +46 NOARGS { int setgid(gid_t gid); } 47 NOARGS { gid_t getgid(void); } 48 STD { int linux_signal(int sig, linux_handler_t handler); } 49 NOARGS { uid_t geteuid(void); } @@ -113,8 +113,8 @@ struct linux_sigaction *osa); } 68 STD { int linux_siggetmask(void); } 69 STD { int linux_sigsetmask(linux_sigset_t mask); } -70 NOARGS { int compat_43_setreuid(int ruid, int euid); } -71 NOARGS { int compat_43_setregid(int rgid, int egid); } +70 STD { int linux_setreuid(int ruid, int euid); } +71 STD { int linux_setregid(int rgid, int egid); } 72 STD { int linux_sigsuspend(caddr_t restart, int oldmask, \ int mask); } 73 STD { int linux_sigpending(linux_sigset_t *mask); } @@ -144,7 +144,7 @@ 92 STD { int linux_truncate(char *path, long length); } 93 NOARGS { int compat_43_ftruncate(int fd, long length); } 94 NOARGS { int fchmod(int fd, int mode); } -95 NOARGS { int fchown(int fd, int uid, int gid); } +95 STD { int linux_fchown(int fd, int uid, int gid); } 96 NOARGS { int getpriority(int which, int who); } 97 NOARGS { int setpriority(int which, int who, int prio); } 98 NOARGS { int profil(caddr_t samples, u_int size, \ diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index 4d95ced1e5b2..fb2a9ef10d60 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_file.c,v 1.9 1995/08/27 20:51:48 fvdl Exp $ */ +/* $NetBSD: linux_file.c,v 1.10 1995/09/07 21:48:59 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -487,7 +487,7 @@ linux_lstat(p, uap, retval) } /* - * The following syscalls are only here because of the alternate path check. + * The following syscalls are mostly here because of the alternate path check. */ int linux_access(p, uap, retval) @@ -521,7 +521,8 @@ linux_unlink(p, uap, retval) return unlink(p, uap, retval); } -int linux_chdir(p, uap, retval) +int +linux_chdir(p, uap, retval) struct proc *p; struct linux_chdir_args /* { syscallarg(char *) path; @@ -546,10 +547,19 @@ linux_mknod(p, uap, retval) register_t *retval; { caddr_t sg = stackgap_init(p->p_emul); + struct mkfifo_args bma; LINUX_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path)); - return mknod(p, uap, retval); + /* + * BSD handles FIFOs seperately + */ + if (SCARG(uap, mode) & S_IFIFO) { + SCARG(&bma, path) = SCARG(uap, path); + SCARG(&bma, mode) = SCARG(uap, mode); + return mkfifo(p, uap, retval); + } else + return mknod(p, uap, retval); } int @@ -578,11 +588,39 @@ linux_chown(p, uap, retval) } */ *uap; register_t *retval; { + struct chown_args bca; caddr_t sg = stackgap_init(p->p_emul); LINUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); - return chmod(p, uap, retval); + SCARG(&bca, path) = SCARG(uap, path); + SCARG(&bca, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bca, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return chown(p, &bca, retval); +} + +int +linux_fchown(p, uap, retval) + struct proc *p; + struct linux_fchown_args /* { + syscallarg(int) fd; + syscallarg(int) uid; + syscallarg(int) gid; + } */ *uap; + register_t *retval; +{ + struct fchown_args bfa; + + SCARG(&bfa, fd) = SCARG(uap, fd); + SCARG(&bfa, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bfa, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return fchown(p, &bfa, retval); } int diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 85f2704cd87a..3b6bdd2de91e 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_misc.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_break.c b/sys/compat/linux/multiarch/linux_break.c index 62970a990392..cf1499b50c19 100644 --- a/sys/compat/linux/multiarch/linux_break.c +++ b/sys/compat/linux/multiarch/linux_break.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_break.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_break.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_llseek.c b/sys/compat/linux/multiarch/linux_llseek.c index 67596adca699..806f43973369 100644 --- a/sys/compat/linux/multiarch/linux_llseek.c +++ b/sys/compat/linux/multiarch/linux_llseek.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_llseek.c,v 1.9 1995/08/27 20:51:48 fvdl Exp $ */ +/* $NetBSD: linux_llseek.c,v 1.10 1995/09/07 21:48:59 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -487,7 +487,7 @@ linux_lstat(p, uap, retval) } /* - * The following syscalls are only here because of the alternate path check. + * The following syscalls are mostly here because of the alternate path check. */ int linux_access(p, uap, retval) @@ -521,7 +521,8 @@ linux_unlink(p, uap, retval) return unlink(p, uap, retval); } -int linux_chdir(p, uap, retval) +int +linux_chdir(p, uap, retval) struct proc *p; struct linux_chdir_args /* { syscallarg(char *) path; @@ -546,10 +547,19 @@ linux_mknod(p, uap, retval) register_t *retval; { caddr_t sg = stackgap_init(p->p_emul); + struct mkfifo_args bma; LINUX_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path)); - return mknod(p, uap, retval); + /* + * BSD handles FIFOs seperately + */ + if (SCARG(uap, mode) & S_IFIFO) { + SCARG(&bma, path) = SCARG(uap, path); + SCARG(&bma, mode) = SCARG(uap, mode); + return mkfifo(p, uap, retval); + } else + return mknod(p, uap, retval); } int @@ -578,11 +588,39 @@ linux_chown(p, uap, retval) } */ *uap; register_t *retval; { + struct chown_args bca; caddr_t sg = stackgap_init(p->p_emul); LINUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); - return chmod(p, uap, retval); + SCARG(&bca, path) = SCARG(uap, path); + SCARG(&bca, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bca, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return chown(p, &bca, retval); +} + +int +linux_fchown(p, uap, retval) + struct proc *p; + struct linux_fchown_args /* { + syscallarg(int) fd; + syscallarg(int) uid; + syscallarg(int) gid; + } */ *uap; + register_t *retval; +{ + struct fchown_args bfa; + + SCARG(&bfa, fd) = SCARG(uap, fd); + SCARG(&bfa, uid) = ((linux_uid_t)SCARG(uap, uid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, uid); + SCARG(&bfa, gid) = ((linux_gid_t)SCARG(uap, gid) == (linux_gid_t)-1) ? + (gid_t)-1 : SCARG(uap, gid); + + return fchown(p, &bfa, retval); } int diff --git a/sys/compat/linux/multiarch/linux_misc_notalpha.c b/sys/compat/linux/multiarch/linux_misc_notalpha.c index ed69dcf2c398..f50a12592181 100644 --- a/sys/compat/linux/multiarch/linux_misc_notalpha.c +++ b/sys/compat/linux/multiarch/linux_misc_notalpha.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc_notalpha.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_misc_notalpha.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_oldmmap.c b/sys/compat/linux/multiarch/linux_oldmmap.c index 14f3847ba4be..a5ff6a01bc0f 100644 --- a/sys/compat/linux/multiarch/linux_oldmmap.c +++ b/sys/compat/linux/multiarch/linux_oldmmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_oldmmap.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_oldmmap.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_oldolduname.c b/sys/compat/linux/multiarch/linux_oldolduname.c index d06c285e4d31..ed14347be7dd 100644 --- a/sys/compat/linux/multiarch/linux_oldolduname.c +++ b/sys/compat/linux/multiarch/linux_oldolduname.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_oldolduname.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_oldolduname.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_oldselect.c b/sys/compat/linux/multiarch/linux_oldselect.c index 429225670e4c..9631fb1bb8fd 100644 --- a/sys/compat/linux/multiarch/linux_oldselect.c +++ b/sys/compat/linux/multiarch/linux_oldselect.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_oldselect.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_oldselect.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_olduname.c b/sys/compat/linux/multiarch/linux_olduname.c index 43ff1e0924ea..a425c93edb8b 100644 --- a/sys/compat/linux/multiarch/linux_olduname.c +++ b/sys/compat/linux/multiarch/linux_olduname.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_olduname.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_olduname.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/multiarch/linux_pipe.c b/sys/compat/linux/multiarch/linux_pipe.c index f83af17be114..01093b13f6b1 100644 --- a/sys/compat/linux/multiarch/linux_pipe.c +++ b/sys/compat/linux/multiarch/linux_pipe.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_pipe.c,v 1.17 1995/08/23 20:17:28 fvdl Exp $ */ +/* $NetBSD: linux_pipe.c,v 1.18 1995/09/07 21:49:01 fvdl Exp $ */ /* * Copyright (c) 1995 Frank van der Linden @@ -126,6 +126,8 @@ linux_waitpid(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -170,6 +172,8 @@ linux_wait4(p, uap, retval) if ((error = wait4(p, &w4a, retval))) return error; + p->p_siglist &= ~sigmask(SIGCHLD); + if (status != NULL) { if ((error = copyin(status, &tstat, sizeof tstat))) return error; @@ -1009,7 +1013,7 @@ linux_getpgid(p, uap, retval) int linux_personality(p, uap, retval) struct proc *p; - struct linux_personality_args /* P + struct linux_personality_args /* { syscallarg(int) per; } */ *uap; register_t *retval; @@ -1019,3 +1023,44 @@ linux_personality(p, uap, retval) retval[0] = 0; return 0; } + +/* + * The calls are here because of type conversions. + */ +int +linux_setreuid(p, uap, retval) + struct proc *p; + struct linux_setreuid_args /* { + syscallarg(int) ruid; + syscallarg(int) euid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setreuid_args bsa; + + SCARG(&bsa, ruid) = ((linux_uid_t)SCARG(uap, ruid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, ruid); + SCARG(&bsa, euid) = ((linux_uid_t)SCARG(uap, euid) == (linux_uid_t)-1) ? + (uid_t)-1 : SCARG(uap, euid); + + return compat_43_setreuid(p, &bsa, retval); +} + +int +linux_setregid(p, uap, retval) + struct proc *p; + struct linux_setregid_args /* { + syscallarg(int) rgid; + syscallarg(int) egid; + } */ *uap; + register_t *retval; +{ + struct compat_43_setregid_args bsa; + + SCARG(&bsa, rgid) = ((linux_gid_t)SCARG(uap, rgid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, rgid); + SCARG(&bsa, egid) = ((linux_gid_t)SCARG(uap, egid) == (linux_gid_t)-1) ? + (uid_t)-1 : SCARG(uap, egid); + + return compat_43_setregid(p, &bsa, retval); +} diff --git a/sys/compat/linux/syscalls.master b/sys/compat/linux/syscalls.master index fef5c1593155..00007f8db017 100644 --- a/sys/compat/linux/syscalls.master +++ b/sys/compat/linux/syscalls.master @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.11 1995/08/27 20:51:53 fvdl Exp $ + $NetBSD: syscalls.master,v 1.12 1995/09/07 21:49:02 fvdl Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -87,7 +87,7 @@ 43 STD { int linux_times(struct times *tms); } 44 UNIMPL linux_prof 45 STD { int linux_brk(char *nsize); } -46 NOARGS { int setgid(uid_t gid); } +46 NOARGS { int setgid(gid_t gid); } 47 NOARGS { gid_t getgid(void); } 48 STD { int linux_signal(int sig, linux_handler_t handler); } 49 NOARGS { uid_t geteuid(void); } @@ -113,8 +113,8 @@ struct linux_sigaction *osa); } 68 STD { int linux_siggetmask(void); } 69 STD { int linux_sigsetmask(linux_sigset_t mask); } -70 NOARGS { int compat_43_setreuid(int ruid, int euid); } -71 NOARGS { int compat_43_setregid(int rgid, int egid); } +70 STD { int linux_setreuid(int ruid, int euid); } +71 STD { int linux_setregid(int rgid, int egid); } 72 STD { int linux_sigsuspend(caddr_t restart, int oldmask, \ int mask); } 73 STD { int linux_sigpending(linux_sigset_t *mask); } @@ -144,7 +144,7 @@ 92 STD { int linux_truncate(char *path, long length); } 93 NOARGS { int compat_43_ftruncate(int fd, long length); } 94 NOARGS { int fchmod(int fd, int mode); } -95 NOARGS { int fchown(int fd, int uid, int gid); } +95 STD { int linux_fchown(int fd, int uid, int gid); } 96 NOARGS { int getpriority(int which, int who); } 97 NOARGS { int setpriority(int which, int who, int prio); } 98 NOARGS { int profil(caddr_t samples, u_int size, \