syscall messaging 2: Change the standard return value storage for system
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 26 Jul 2003 18:12:47 +0000 (18:12 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 26 Jul 2003 18:12:47 +0000 (18:12 +0000)
calls from proc->p_retval[] to the message structure embedded in the syscall.
System calls used to set their non-error return value in p_retval[] but
must now set it in the message structure.  This is a necessary precursor to
any sort of asynchronizatino, for obvious reasons.

This work was particularly annoying because all the emualtion code declares
and manually fills in syscall argument structures.

This commit could potentially destabilize some of the emulation code but I
went through the most important Linux emulation code three times and tested it
with linux-mozilla, so I am fairly confident that I got it right.

Note: proper linux emulation requires setting the fallback elf brand to 3 or
it will default to SVR4.  It really ought to default to linux (3), not SVR4.

    sysctl -w kern.fallback_elf_brand=3

65 files changed:
sys/dev/misc/streams/streams.c
sys/emulation/ibcs2/i386/ibcs2_fcntl.c
sys/emulation/ibcs2/i386/ibcs2_misc.c
sys/emulation/ibcs2/i386/ibcs2_msg.c
sys/emulation/ibcs2/i386/ibcs2_other.c
sys/emulation/ibcs2/i386/ibcs2_signal.c
sys/emulation/ibcs2/i386/ibcs2_sysi86.c
sys/emulation/ibcs2/i386/ibcs2_util.h
sys/emulation/ibcs2/i386/ibcs2_xenix.c
sys/emulation/ibcs2/i386/ibcs2_xenix.h
sys/emulation/linux/i386/linux_machdep.c
sys/emulation/linux/i386/linux_ptrace.c
sys/emulation/linux/i386/linux_sysvec.c
sys/emulation/linux/linux_file.c
sys/emulation/linux/linux_getcwd.c
sys/emulation/linux/linux_ipc.c
sys/emulation/linux/linux_ipc.h
sys/emulation/linux/linux_misc.c
sys/emulation/linux/linux_signal.c
sys/emulation/linux/linux_signal.h
sys/emulation/linux/linux_socket.c
sys/emulation/linux/linux_uid16.c
sys/emulation/posix4/p1003_1b.c
sys/emulation/svr4/svr4_fcntl.c
sys/emulation/svr4/svr4_filio.c
sys/emulation/svr4/svr4_ioctl.c
sys/emulation/svr4/svr4_ipc.c
sys/emulation/svr4/svr4_misc.c
sys/emulation/svr4/svr4_signal.c
sys/emulation/svr4/svr4_stat.c
sys/emulation/svr4/svr4_stream.c
sys/i386/i386/machdep.c
sys/i386/i386/sys_machdep.c
sys/i386/i386/trap.c
sys/kern/kern_descrip.c
sys/kern/kern_event.c
sys/kern/kern_exit.c
sys/kern/kern_fork.c
sys/kern/kern_linker.c
sys/kern/kern_module.c
sys/kern/kern_ntptime.c
sys/kern/kern_p1003_1b.c
sys/kern/kern_prot.c
sys/kern/kern_resource.c
sys/kern/kern_sig.c
sys/kern/kern_sysctl.c
sys/kern/kern_threads.c
sys/kern/kern_xxx.c
sys/kern/sys_generic.c
sys/kern/sys_pipe.c
sys/kern/sys_process.c
sys/kern/sysv_msg.c
sys/kern/sysv_sem.c
sys/kern/sysv_shm.c
sys/kern/uipc_syscalls.c
sys/kern/vfs_aio.c
sys/kern/vfs_syscalls.c
sys/netproto/ncp/ncp_mod.c
sys/platform/pc32/i386/machdep.c
sys/platform/pc32/i386/sys_machdep.c
sys/platform/pc32/i386/trap.c
sys/sys/msgport.h
sys/sys/proc.h
sys/sys/ptrace.h
sys/vm/vm_mmap.c

index 165fd76..6f5e5cb 100644 (file)
@@ -31,7 +31,7 @@
  * in 3.0-980524-SNAP then hacked a bit (but probably not enough :-).
  *
  * $FreeBSD: src/sys/dev/streams/streams.c,v 1.16.2.1 2001/02/26 04:23:07 jlemon Exp $
- * $DragonFly: src/sys/dev/misc/streams/Attic/streams.c,v 1.5 2003/07/21 05:50:36 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/streams/Attic/streams.c,v 1.6 2003/07/26 18:12:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -326,7 +326,7 @@ svr4_ptm_alloc(struct thread *td)
                case ENXIO:
                        return error;
                case 0:
-                       p->p_dupfd = p->p_retval[0];
+                       p->p_dupfd = oa.lmsg.u.ms_result;
                        return ENXIO;
                default:
                        if (ttynumbers[++n] == '\0') {
index 6a35e04..b8a0abd 100644 (file)
@@ -25,7 +25,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/ibcs2/ibcs2_fcntl.c,v 1.14 1999/09/19 17:00:14 green Exp $
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_fcntl.c,v 1.5 2003/07/21 07:57:44 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_fcntl.c,v 1.6 2003/07/26 18:12:43 dillon Exp $
  */
 
 #include "opt_spx_hack.h"
@@ -194,7 +194,7 @@ ibcs2_open(struct ibcs2_open_args *uap)
 #endif /* SPX_HACK */
        if (!ret && !noctty && p && SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
                struct filedesc *fdp = p->p_fd;
-               struct file *fp = fdp->fd_ofiles[p->p_retval[0]];
+               struct file *fp = fdp->fd_ofiles[uap->lmsg.u.ms_result];
 
                /* ignore any error, just give it a try */
                if (fp->f_type == DTYPE_VNODE)
@@ -231,7 +231,6 @@ ibcs2_access(struct ibcs2_access_args *uap)
 int
 ibcs2_fcntl(struct ibcs2_fcntl_args *uap)
 {
-       struct proc *p = curproc;
        int error;
        struct fcntl_args fa;
        struct flock *flp;
@@ -242,17 +241,17 @@ ibcs2_fcntl(struct ibcs2_fcntl_args *uap)
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_DUPFD;
                SCARG(&fa, arg) = (/* XXX */ int)SCARG(uap, arg);
-               return fcntl(&fa);
+               break;
        case IBCS2_F_GETFD:
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_GETFD;
                SCARG(&fa, arg) = (/* XXX */ int)SCARG(uap, arg);
-               return fcntl(&fa);
+               break;
        case IBCS2_F_SETFD:
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_SETFD;
                SCARG(&fa, arg) = (/* XXX */ int)SCARG(uap, arg);
-               return fcntl(&fa);
+               break;
        case IBCS2_F_GETFL:
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_GETFL;
@@ -260,15 +259,14 @@ ibcs2_fcntl(struct ibcs2_fcntl_args *uap)
                error = fcntl(&fa);
                if (error)
                        return error;
-               p->p_retval[0] = oflags2ioflags(p->p_retval[0]);
+               uap->lmsg.u.ms_result = oflags2ioflags(fa.lmsg.u.ms_result);
                return error;
        case IBCS2_F_SETFL:
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_SETFL;
                SCARG(&fa, arg) = (/* XXX */ int)
                                  ioflags2oflags((int)SCARG(uap, arg));
-               return fcntl(&fa);
-
+               break;
        case IBCS2_F_GETLK:
            {
                caddr_t sg = stackgap_init();
@@ -282,13 +280,14 @@ ibcs2_fcntl(struct ibcs2_fcntl_args *uap)
                SCARG(&fa, cmd) = F_GETLK;
                SCARG(&fa, arg) = (/* XXX */ int)flp;
                error = fcntl(&fa);
+               uap->lmsg.u.ms_result = fa.lmsg.u.ms_result;
                if (error)
                        return error;
                cvt_flock2iflock(flp, &ifl);
                return copyout((caddr_t)&ifl, (caddr_t)SCARG(uap, arg),
                               ibcs2_flock_len);
            }
-
+           break;
        case IBCS2_F_SETLK:
            {
                caddr_t sg = stackgap_init();
@@ -301,10 +300,8 @@ ibcs2_fcntl(struct ibcs2_fcntl_args *uap)
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_SETLK;
                SCARG(&fa, arg) = (/* XXX */ int)flp;
-
-               return fcntl(&fa);
            }
-
+           break;
        case IBCS2_F_SETLKW:
            {
                caddr_t sg = stackgap_init();
@@ -317,8 +314,12 @@ ibcs2_fcntl(struct ibcs2_fcntl_args *uap)
                SCARG(&fa, fd) = SCARG(uap, fd);
                SCARG(&fa, cmd) = F_SETLKW;
                SCARG(&fa, arg) = (/* XXX */ int)flp;
-               return fcntl(&fa);
            }
+           break;
+       default:
+           return ENOSYS;
        }
-       return ENOSYS;
+       error = fcntl(&fa);
+       uap->lmsg.u.ms_result = fa.lmsg.u.ms_result;
+       return(error);
 }
index c37e4ab..99a8e82 100644 (file)
@@ -46,7 +46,7 @@
  *     @(#)sun_misc.c  8.1 (Berkeley) 6/18/93
  *
  * $FreeBSD: src/sys/i386/ibcs2/ibcs2_misc.c,v 1.34 1999/09/29 15:12:09 marcel Exp $
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_misc.c,v 1.4 2003/06/25 03:55:53 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_misc.c,v 1.5 2003/07/26 18:12:43 dillon Exp $
  */
 
 /*
@@ -104,8 +104,9 @@ ibcs2_ulimit(struct ibcs2_ulimit_args *uap)
        
        switch (SCARG(uap, cmd)) {
        case IBCS2_GETFSIZE:
-               p->p_retval[0] = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
-               if (p->p_retval[0] == -1) p->p_retval[0] = 0x7fffffff;
+               uap->lmsg.u.ms_result = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
+               if (uap->lmsg.u.ms_result == -1) 
+                   uap->lmsg.u.ms_result = 0x7fffffff;
                return 0;
        case IBCS2_SETFSIZE:    /* XXX - fix this */
 #ifdef notyet
@@ -114,16 +115,16 @@ ibcs2_ulimit(struct ibcs2_ulimit_args *uap)
                sra.rlp = &rl;
                error = setrlimit(&sra);
                if (!error)
-                       p->p_retval[0] = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
+                       uap->lmsg.u.ms_result = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
                else
                        DPRINTF(("failed "));
                return error;
 #else
-               p->p_retval[0] = SCARG(uap, newlimit);
+               uap->lmsg.u.ms_result = SCARG(uap, newlimit);
                return 0;
 #endif
        case IBCS2_GETPSIZE:
-               p->p_retval[0] = p->p_rlimit[RLIMIT_RSS].rlim_cur; /* XXX */
+               uap->lmsg.u.ms_result = p->p_rlimit[RLIMIT_RSS].rlim_cur; /* XXX */
                return 0;
        case IBCS2_GETDTABLESIZE:
                uap->cmd = IBCS2_SC_OPEN_MAX;
@@ -158,6 +159,7 @@ ibcs2_wait(struct ibcs2_wait_args *uap)
        }
        if ((error = wait4(&w4)) != 0)
                return error;
+       uap->lmsg.u.ms_fds[0] = w4.lmsg.u.ms_fds[0];
        if (SCARG(&w4, status)) {       /* this is real iBCS brain-damage */
                error = copyin((caddr_t)SCARG(&w4, status), (caddr_t)&status,
                               sizeof(SCARG(&w4, status)));
@@ -173,7 +175,7 @@ ibcs2_wait(struct ibcs2_wait_args *uap)
                /* else exit status -- identical */
 
                /* record result/status */
-               p->p_retval[1] = status;
+               uap->lmsg.u.ms_fds[1] = status;
                return copyout((caddr_t)&status, (caddr_t)SCARG(&w4, status),
                               sizeof(SCARG(&w4, status)));
        }
@@ -186,12 +188,15 @@ ibcs2_execv(struct ibcs2_execv_args *uap)
 {
        struct execve_args ea;
        caddr_t sg = stackgap_init();
+       int error;
 
         CHECKALTEXIST(&sg, SCARG(uap, path));
        SCARG(&ea, fname) = SCARG(uap, path);
        SCARG(&ea, argv) = SCARG(uap, argp);
        SCARG(&ea, envv) = NULL;
-       return execve(&ea);
+       error = execve(&ea);
+       uap->lmsg.u.ms_result = ea.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -206,10 +211,13 @@ int
 ibcs2_umount(struct ibcs2_umount_args *uap)
 {
        struct unmount_args um;
+       int error;
 
        SCARG(&um, path) = SCARG(uap, name);
        SCARG(&um, flags) = 0;
-       return unmount(&um);
+       error = unmount(&um);
+       uap->lmsg.u.ms_result = um.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -417,7 +425,7 @@ again:
                goto again;
        fp->f_offset = off;             /* update the vnode offset */
 eof:
-       p->p_retval[0] = SCARG(uap, nbytes) - resid;
+       uap->lmsg.u.ms_result = SCARG(uap, nbytes) - resid;
 out:
        if (cookies)
                free(cookies, M_TEMP);
@@ -570,7 +578,7 @@ again:
                goto again;
        fp->f_offset = off;             /* update the vnode offset */
 eof:
-       p->p_retval[0] = SCARG(uap, nbytes) - resid;
+       uap->lmsg.u.ms_result = SCARG(uap, nbytes) - resid;
 out:
        if (cookies)
                free(cookies, M_TEMP);
@@ -583,26 +591,29 @@ int
 ibcs2_mknod(struct ibcs2_mknod_args *uap)
 {
         caddr_t sg = stackgap_init();
+       int error;
 
         CHECKALTCREAT(&sg, SCARG(uap, path));
        if (S_ISFIFO(SCARG(uap, mode))) {
                 struct mkfifo_args ap;
                 SCARG(&ap, path) = SCARG(uap, path);
                 SCARG(&ap, mode) = SCARG(uap, mode);
-               return mkfifo(&ap);
+               error = mkfifo(&ap);
+               uap->lmsg.u.ms_result = ap.lmsg.u.ms_result;
        } else {
                 struct mknod_args ap;
                 SCARG(&ap, path) = SCARG(uap, path);
                 SCARG(&ap, mode) = SCARG(uap, mode);
                 SCARG(&ap, dev) = SCARG(uap, dev);
-                return mknod(&ap);
+                error = mknod(&ap);
+               uap->lmsg.u.ms_result = ap.lmsg.u.ms_result;
        }
+       return(error);
 }
 
 int
 ibcs2_getgroups(struct ibcs2_getgroups_args *uap)
 {
-       struct proc *p = curproc;
        int error, i;
        ibcs2_gid_t *iset = NULL;
        struct getgroups_args sa;
@@ -618,14 +629,15 @@ ibcs2_getgroups(struct ibcs2_getgroups_args *uap)
        }
        if ((error = getgroups(&sa)) != 0)
                return error;
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
        if (SCARG(uap, gidsetsize) == 0)
                return 0;
 
-       for (i = 0, gp = SCARG(&sa, gidset); i < p->p_retval[0]; i++)
+       for (i = 0, gp = SCARG(&sa, gidset); i < uap->lmsg.u.ms_result; i++)
                iset[i] = (ibcs2_gid_t)*gp++;
-       if (p->p_retval[0] && (error = copyout((caddr_t)iset,
+       if (uap->lmsg.u.ms_result && (error = copyout((caddr_t)iset,
                                          (caddr_t)SCARG(uap, gidset),
-                                         sizeof(ibcs2_gid_t) * p->p_retval[0])))
+                                         sizeof(ibcs2_gid_t) * uap->lmsg.u.ms_result)))
                return error;
         return 0;
 }
@@ -652,35 +664,42 @@ ibcs2_setgroups(struct ibcs2_setgroups_args *uap)
        }
        for (i = 0, gp = SCARG(&sa, gidset); i < SCARG(&sa, gidsetsize); i++)
                *gp++ = (gid_t)iset[i];
-       return setgroups(&sa);
+       error = setgroups(&sa);
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 ibcs2_setuid(struct ibcs2_setuid_args *uap)
 {
        struct setuid_args sa;
+       int error;
 
        SCARG(&sa, uid) = (uid_t)SCARG(uap, uid);
-       return setuid(&sa);
+       error = setuid(&sa);
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 ibcs2_setgid(struct ibcs2_setgid_args *uap)
 {
        struct setgid_args sa;
+       int error;
 
        SCARG(&sa, gid) = (gid_t)SCARG(uap, gid);
-       return setgid(&sa);
+       error = setgid(&sa);
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 ibcs2_time(struct ibcs2_time_args *uap)
 {
-       struct proc *p = curproc;
        struct timeval tv;
 
        microtime(&tv);
-       p->p_retval[0] = tv.tv_sec;
+       uap->lmsg.u.ms_result = tv.tv_sec;
        if (SCARG(uap, tp))
                return copyout((caddr_t)&tv.tv_sec, (caddr_t)SCARG(uap, tp),
                               sizeof(ibcs2_time_t));
@@ -705,7 +724,6 @@ ibcs2_fpathconf(struct ibcs2_fpathconf_args *uap)
 int
 ibcs2_sysconf(struct ibcs2_sysconf_args *uap)
 {
-       struct proc *p = curproc;
        int mib[2], value, len, error;
        struct sysctl_args sa;
        struct __getrlimit_args ga;
@@ -723,12 +741,12 @@ ibcs2_sysconf(struct ibcs2_sysconf_args *uap)
                SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *));
                if ((error = getrlimit(&ga)) != 0)
                        return error;
-               p->p_retval[0] = SCARG(&ga, rlp)->rlim_cur;
+               uap->lmsg.u.ms_result = SCARG(&ga, rlp)->rlim_cur;
                return 0;
            }
 
        case IBCS2_SC_CLK_TCK:
-               p->p_retval[0] = hz;
+               uap->lmsg.u.ms_result = hz;
                return 0;
 
        case IBCS2_SC_NGROUPS_MAX:
@@ -743,7 +761,7 @@ ibcs2_sysconf(struct ibcs2_sysconf_args *uap)
                SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *));
                if ((error = getrlimit(&ga)) != 0)
                        return error;
-               p->p_retval[0] = SCARG(&ga, rlp)->rlim_cur;
+               uap->lmsg.u.ms_result = SCARG(&ga, rlp)->rlim_cur;
                return 0;
            }
                
@@ -760,11 +778,11 @@ ibcs2_sysconf(struct ibcs2_sysconf_args *uap)
                break;
                
        case IBCS2_SC_PASS_MAX:
-               p->p_retval[0] = 128;           /* XXX - should we create PASS_MAX ? */
+               uap->lmsg.u.ms_result = 128;            /* XXX - should we create PASS_MAX ? */
                return 0;
 
        case IBCS2_SC_XOPEN_VERSION:
-               p->p_retval[0] = 2;             /* XXX: What should that be? */
+               uap->lmsg.u.ms_result = 2;              /* XXX: What should that be? */
                return 0;
                
        default:
@@ -781,14 +799,13 @@ ibcs2_sysconf(struct ibcs2_sysconf_args *uap)
        SCARG(&sa, newlen) = 0;
        if ((error = __sysctl(&sa)) != 0)
                return error;
-       p->p_retval[0] = value;
+       uap->lmsg.u.ms_result = value;
        return 0;
 }
 
 int
 ibcs2_alarm(struct ibcs2_alarm_args *uap)
 {
-       struct proc *p = curproc;
        int error;
         struct itimerval *itp, *oitp;
        struct setitimer_args sa;
@@ -808,14 +825,13 @@ ibcs2_alarm(struct ibcs2_alarm_args *uap)
                return error;
         if (oitp->it_value.tv_usec)
                 oitp->it_value.tv_sec++;
-        p->p_retval[0] = oitp->it_value.tv_sec;
+        uap->lmsg.u.ms_result = oitp->it_value.tv_sec;
         return 0;
 }
 
 int
 ibcs2_times(struct ibcs2_times_args *uap)
 {
-       struct proc *p = curproc;
        int error;
        struct getrusage_args ga;
        struct tms tms;
@@ -840,7 +856,7 @@ ibcs2_times(struct ibcs2_times_args *uap)
         tms.tms_cstime = CONVTCK(ru->ru_stime);
 
        microtime(&t);
-        p->p_retval[0] = CONVTCK(t);
+        uap->lmsg.u.ms_result = CONVTCK(t);
        
        return copyout((caddr_t)&tms, (caddr_t)SCARG(uap, tp),
                       sizeof(struct tms));
@@ -861,6 +877,7 @@ ibcs2_stime(struct ibcs2_stime_args *uap)
        SCARG(&sa, tv)->tv_usec = 0;
        if ((error = settimeofday(&sa)) != 0)
                return EPERM;
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
        return 0;
 }
 
@@ -890,7 +907,9 @@ ibcs2_utime(struct ibcs2_utime_args *uap)
                tp->tv_usec = 0;
        } else
                SCARG(&sa, tptr) = NULL;
-       return utimes(&sa);
+       error = utimes(&sa);
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -905,7 +924,7 @@ ibcs2_nice(struct ibcs2_nice_args *uap)
        SCARG(&sa, prio) = p->p_nice + SCARG(uap, incr);
        if ((error = setpriority(&sa)) != 0)
                return EPERM;
-       p->p_retval[0] = p->p_nice;
+       uap->lmsg.u.ms_result = p->p_nice;
        return 0;
 }
 
@@ -920,7 +939,7 @@ ibcs2_pgrpsys(struct ibcs2_pgrpsys_args *uap)
 
        switch (SCARG(uap, type)) {
        case 0:                 /* getpgrp */
-               p->p_retval[0] = p->p_pgrp->pg_id;
+               uap->lmsg.u.ms_result = p->p_pgrp->pg_id;
                return 0;
 
        case 1:                 /* setpgrp */
@@ -930,21 +949,31 @@ ibcs2_pgrpsys(struct ibcs2_pgrpsys_args *uap)
                SCARG(&sa, pid) = 0;
                SCARG(&sa, pgid) = 0;
                setpgid(&sa);
-               p->p_retval[0] = p->p_pgrp->pg_id;
+               uap->lmsg.u.ms_result = p->p_pgrp->pg_id;
                return 0;
            }
 
        case 2:                 /* setpgid */
            {
                struct setpgid_args sa;
+               int error;
 
                SCARG(&sa, pid) = SCARG(uap, pid);
                SCARG(&sa, pgid) = SCARG(uap, pgid);
-               return setpgid(&sa);
+               error = setpgid(&sa);
+               uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+               return(error);
            }
 
        case 3:                 /* setsid */
-               return setsid(NULL);
+           {
+               struct setsid_args sida;
+               int error;
+
+               error = setsid(&sida);
+               uap->lmsg.u.ms_result = sida.lmsg.u.ms_result;
+               return(error);
+           }
 
        default:
                return EINVAL;
index c1ed0ea..2d185b4 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/ibcs2/ibcs2_msg.c,v 1.7 1999/08/28 00:43:59 peter Exp $
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_msg.c,v 1.3 2003/06/23 17:55:38 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_msg.c,v 1.4 2003/07/26 18:12:43 dillon Exp $
  */
 
 /*
@@ -57,7 +57,6 @@ ibcs2_putmsg(struct ibcs2_putmsg_args *uap)
 int
 ibcs2_poll(struct ibcs2_poll_args *uap)
 {
-       struct proc *p = curproc;
        int error, i;
        fd_set *readfds, *writefds, *exceptfds;
        struct timeval *timeout;
@@ -105,10 +104,11 @@ ibcs2_poll(struct ibcs2_poll_args *uap)
        }
        if ((error = select(&tmp_select)) != 0)
                return error;
-       if (p->p_retval[0] == 0)
+       uap->lmsg.u.ms_result = tmp_select.lmsg.u.ms_result;
+       if (uap->lmsg.u.ms_result == 0)
                return 0;
-       p->p_retval[0] = 0;
-       for (p->p_retval[0] = 0, i = 0; i < uap->nfds; i++) {
+       uap->lmsg.u.ms_result = 0;
+       for (i = 0; i < uap->nfds; i++) {
                copyin(uap->fds + i*sizeof(struct ibcs2_poll),
                       &conv, sizeof(conv));
                conv.revents = 0;
@@ -123,7 +123,7 @@ ibcs2_poll(struct ibcs2_poll_args *uap)
                        if (FD_ISSET(conv.fd, exceptfds))
                                conv.revents |= IBCS2_POLLERR;
                        if (conv.revents)
-                               ++p->p_retval[0];
+                               ++uap->lmsg.u.ms_result;
                }
                if ((error = copyout(&conv,
                                    uap->fds + i*sizeof(struct ibcs2_poll),
index 9012448..6d4978b 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/ibcs2/ibcs2_other.c,v 1.10 1999/08/28 00:43:59 peter Exp $
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_other.c,v 1.4 2003/07/21 07:57:44 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_other.c,v 1.5 2003/07/26 18:12:43 dillon Exp $
  */
 
 /*
@@ -37,8 +37,8 @@
 
 #include <i386/ibcs2/ibcs2_types.h>
 #include <i386/ibcs2/ibcs2_signal.h>
-#include <i386/ibcs2/ibcs2_util.h>
 #include <i386/ibcs2/ibcs2_proto.h>
+#include <i386/ibcs2/ibcs2_util.h>
 
 #define IBCS2_SECURE_GETLUID 1
 #define IBCS2_SECURE_SETLUID 2
@@ -50,7 +50,7 @@ ibcs2_secure(struct ibcs2_secure_args *uap)
 
        switch (uap->cmd) {
        case IBCS2_SECURE_GETLUID:              /* get login uid */
-               p->p_retval[0] = p->p_ucred->cr_uid;
+               uap->lmsg.u.ms_result = p->p_ucred->cr_uid;
                return 0;
        case IBCS2_SECURE_SETLUID:              /* set login uid */
                return EPERM;
@@ -79,14 +79,13 @@ ibcs2_lseek(register struct ibcs2_lseek_args *uap)
 #include <sys/un.h>     
 
 int
-spx_open(void *uap)
+spx_open(struct ibcs2_open_args *uap)
 {
        struct socket_args sock;
        struct connect_args conn;
        struct sockaddr_un *Xaddr;
        int fd, error;
        caddr_t sg = stackgap_init();
-       struct proc *p = curproc;
 
        /* obtain a socket. */
        DPRINTF(("SPX: open socket\n"));
@@ -105,7 +104,7 @@ spx_open(void *uap)
          strlen(Xaddr->sun_path) + 1;
        copyout("/tmp/.X11-unix/X0", Xaddr->sun_path, 18);
 
-       conn.s = fd = p->p_retval[0];
+       conn.s = fd = uap->lmsg.u.ms_result;
        conn.name = (caddr_t)Xaddr;
        conn.namelen = sizeof(struct sockaddr_un);
        error = connect(&conn);
@@ -115,7 +114,7 @@ spx_open(void *uap)
                close(&cl);
                return error;
        }
-       p->p_retval[0] = fd;
+       uap->lmsg.u.ms_result = fd;
        return 0;
 }
 #endif /* SPX_HACK */
index c36646b..352af1a 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/ibcs2/ibcs2_signal.c,v 1.16 1999/10/10 09:14:31 marcel Exp $
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_signal.c,v 1.3 2003/06/23 17:55:38 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_signal.c,v 1.4 2003/07/26 18:12:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -244,7 +244,7 @@ ibcs2_sigsys(struct ibcs2_sigsys_args *uap)
        if (signum <= 0 || signum >= IBCS2_NSIG) {
                if (IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGNAL_MASK ||
                    IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK)
-                       p->p_retval[0] = (int)IBCS2_SIG_ERR;
+                       uap->lmsg.u.ms_result = (int)IBCS2_SIG_ERR;
                return EINVAL;
        }
        
@@ -301,7 +301,7 @@ ibcs2_sigsys(struct ibcs2_sigsys_args *uap)
                        if (signum != SIGALRM)
                                sa.sa_flags |= SA_RESTART;
 #endif
-                       p->p_retval[0] = (int)IBCS2_SIG_ERR; /* init error return */
+                       uap->lmsg.u.ms_result = (int)IBCS2_SIG_ERR; /* init error return */
 
                        /* perform native sigaction() */
                        if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0)
@@ -313,14 +313,14 @@ ibcs2_sigsys(struct ibcs2_sigsys_args *uap)
                        }
                        if ((error = copyin(obsa, &sa, sizeof(sa))) != 0)
                                return error;
-                       p->p_retval[0] = (int)sa.sa_handler;
+                       uap->lmsg.u.ms_result = (int)sa.sa_handler;
 
                        /* special sigset() check */
                         if(IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK)
                                /* check to make sure signal is not blocked */
                                 if(sigismember(&p->p_sigmask, signum)) {
                                        /* return SIG_HOLD and unblock signal*/
-                                        p->p_retval[0] = (int)IBCS2_SIG_HOLD;
+                                        uap->lmsg.u.ms_result = (int)IBCS2_SIG_HOLD;
                                        SIGDELSET(p->p_sigmask, signum);
                                }
                                
index 3f2e26d..015fcdd 100644 (file)
@@ -27,6 +27,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  *     ibcs2_sysi86.c,v 1.1 1994/10/14 08:53:11 sos Exp
+ *     $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_sysi86.c,v 1.4 2003/07/26 18:12:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -54,7 +55,6 @@ int
 ibcs2_sysi86(struct ibcs2_sysi86_args *args)
 {
        struct thread *td = curthread;
-       struct proc *p = td->td_proc;
 
        switch (SCARG(args, cmd)) {
        case SI86_FPHW: {       /* Floating Point information */
@@ -85,7 +85,7 @@ ibcs2_sysi86(struct ibcs2_sysi86_args *args)
        }
 
        case SI86_MEM:  /* size of physical memory */
-               p->p_retval[0] = ctob(physmem);
+               args->lmsg.u.ms_result = ctob(physmem);
                return 0;
 
        default:
index d2eb3be..5b9d50e 100644 (file)
@@ -29,6 +29,7 @@
  *
  * from: svr4_util.h,v 1.5 1994/11/18 02:54:31 christos Exp
  * from: linux_util.h,v 1.2 1995/03/05 23:23:50 fvdl Exp
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_util.h,v 1.3 2003/07/26 18:12:43 dillon Exp $
  */
 
 /*
@@ -92,7 +93,7 @@ int ibcs2_emul_find __P((caddr_t *, const char *, char *,
     ibcs2_emul_find(sgp, ibcs2_emul_path, path, &(path), 1)
 
 #ifdef SPX_HACK
-int spx_open __P((void *uap));
+int spx_open __P((struct ibcs2_open_args *uap));
 #endif
 
 #endif /* !_IBCS2_UTIL_H_ */
index 3b60828..df81896 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/ibcs2/ibcs2_xenix.c,v 1.20 1999/12/15 23:01:46 eivind Exp $
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_xenix.c,v 1.5 2003/07/19 21:14:34 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_xenix.c,v 1.6 2003/07/26 18:12:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -75,7 +75,6 @@ ibcs2_xenix(struct ibcs2_xenix_args *uap)
 int
 xenix_rdchk(struct xenix_rdchk_args *uap)
 {
-       struct proc *p = curproc;
        int error;
        struct ioctl_args sa;
        caddr_t sg = stackgap_init();
@@ -86,7 +85,7 @@ xenix_rdchk(struct xenix_rdchk_args *uap)
        SCARG(&sa, data) = stackgap_alloc(&sg, sizeof(int));
        if ((error = ioctl(&sa)) != 0)
                return error;
-       p->p_retval[0] = (*((int*)SCARG(&sa, data))) ? 1 : 0;
+       uap->lmsg.u.ms_result = (*((int*)SCARG(&sa, data))) ? 1 : 0;
        return 0;
 }
 
@@ -185,10 +184,8 @@ xenix_utsname(struct xenix_utsname_args *uap)
 int
 xenix_scoinfo(struct xenix_scoinfo_args *uap)
 {
-       struct proc *p = curproc;
-
        /* scoinfo (not documented) */
-       p->p_retval[0] = 0;
+       uap->lmsg.u.ms_result = 0;
        return 0;
 }
 
index 8985cc5..d96b244 100644 (file)
@@ -2,7 +2,7 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_xenix.h,v 1.3 2003/06/23 17:55:38 dillon Exp $
+ * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_xenix.h,v 1.4 2003/07/26 18:12:43 dillon Exp $
  * created from TurtleBSD: src/sys/i386/ibcs2/syscalls.xenix,v 1.2 2003/06/17 04:28:35 dillon Exp 
  */
 
                0 : sizeof(register_t) - sizeof(t))
 
 struct xenix_rdchk_args {
+       struct lwkt_msg lmsg;
        int     fd;     char fd_[PAD_(int)];
 };
 struct xenix_chsize_args {
+       struct lwkt_msg lmsg;
        int     fd;     char fd_[PAD_(int)];
        long    size;   char size_[PAD_(long)];
 };
 struct xenix_ftime_args {
+       struct lwkt_msg lmsg;
        struct timeb *  tp;     char tp_[PAD_(struct timeb *)];
 };
 struct xenix_nap_args {
+       struct lwkt_msg lmsg;
        int     millisec;       char millisec_[PAD_(int)];
 };
 struct xenix_scoinfo_args {
+       struct lwkt_msg lmsg;
        register_t dummy;
 };
 struct xenix_eaccess_args {
+       struct lwkt_msg lmsg;
        char *  path;   char path_[PAD_(char *)];
        int     flags;  char flags_[PAD_(int)];
 };
 struct ibcs2_sigaction_args {
+       struct lwkt_msg lmsg;
        int     sig;    char sig_[PAD_(int)];
        struct ibcs2_sigaction *        act;    char act_[PAD_(struct ibcs2_sigaction *)];
        struct ibcs2_sigaction *        oact;   char oact_[PAD_(struct ibcs2_sigaction *)];
 };
 struct ibcs2_sigprocmask_args {
+       struct lwkt_msg lmsg;
        int     how;    char how_[PAD_(int)];
        ibcs2_sigset_t *        set;    char set_[PAD_(ibcs2_sigset_t *)];
        ibcs2_sigset_t *        oset;   char oset_[PAD_(ibcs2_sigset_t *)];
 };
 struct ibcs2_sigpending_args {
+       struct lwkt_msg lmsg;
        ibcs2_sigset_t *        mask;   char mask_[PAD_(ibcs2_sigset_t *)];
 };
 struct ibcs2_sigsuspend_args {
+       struct lwkt_msg lmsg;
        ibcs2_sigset_t *        mask;   char mask_[PAD_(ibcs2_sigset_t *)];
 };
 struct ibcs2_getgroups_args {
+       struct lwkt_msg lmsg;
        int     gidsetsize;     char gidsetsize_[PAD_(int)];
        ibcs2_gid_t *   gidset; char gidset_[PAD_(ibcs2_gid_t *)];
 };
 struct ibcs2_setgroups_args {
+       struct lwkt_msg lmsg;
        int     gidsetsize;     char gidsetsize_[PAD_(int)];
        ibcs2_gid_t *   gidset; char gidset_[PAD_(ibcs2_gid_t *)];
 };
 struct ibcs2_sysconf_args {
+       struct lwkt_msg lmsg;
        int     name;   char name_[PAD_(int)];
 };
 struct ibcs2_pathconf_args {
+       struct lwkt_msg lmsg;
        char *  path;   char path_[PAD_(char *)];
        int     name;   char name_[PAD_(int)];
 };
 struct ibcs2_fpathconf_args {
+       struct lwkt_msg lmsg;
        int     fd;     char fd_[PAD_(int)];
        int     name;   char name_[PAD_(int)];
 };
 struct ibcs2_rename_args {
+       struct lwkt_msg lmsg;
        char *  from;   char from_[PAD_(char *)];
        char *  to;     char to_[PAD_(char *)];
 };
 struct xenix_utsname_args {
+       struct lwkt_msg lmsg;
        long    addr;   char addr_[PAD_(long)];
 };
 int    xenix_rdchk __P((struct xenix_rdchk_args *));
index fd9debe..9eb96a4 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.6.2.4 2001/11/05 19:08:23 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/i386/linux_machdep.c,v 1.5 2003/07/23 02:30:19 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/i386/linux_machdep.c,v 1.6 2003/07/26 18:12:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -102,6 +102,7 @@ int
 linux_execve(struct linux_execve_args *args)
 {
        struct execve_args bsd;
+       int error;
        caddr_t sg;
 
        sg = stackgap_init();
@@ -112,10 +113,13 @@ linux_execve(struct linux_execve_args *args)
                printf(ARGS(execve, "%s"), args->path);
 #endif
 
+       bsd.lmsg.u.ms_result = 0;
        bsd.fname = args->path;
        bsd.argv = args->argp;
        bsd.envv = args->envp;
-       return (execve(&bsd));
+       error = execve(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 struct l_ipc_kludge {
@@ -126,6 +130,7 @@ struct l_ipc_kludge {
 int
 linux_ipc(struct linux_ipc_args *args)
 {
+       int error = 0;
 
        switch (args->what & 0xFFFF) {
        case LINUX_SEMOP: {
@@ -134,7 +139,10 @@ linux_ipc(struct linux_ipc_args *args)
                a.semid = args->arg1;
                a.tsops = args->ptr;
                a.nsops = args->arg2;
-               return (linux_semop(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_semop(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_SEMGET: {
                struct linux_semget_args a;
@@ -142,7 +150,10 @@ linux_ipc(struct linux_ipc_args *args)
                a.key = args->arg1;
                a.nsems = args->arg2;
                a.semflg = args->arg3;
-               return (linux_semget(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_semget(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_SEMCTL: {
                struct linux_semctl_args a;
@@ -151,10 +162,13 @@ linux_ipc(struct linux_ipc_args *args)
                a.semid = args->arg1;
                a.semnum = args->arg2;
                a.cmd = args->arg3;
+               a.lmsg.u.ms_lresult = 0;
                error = copyin((caddr_t)args->ptr, &a.arg, sizeof(a.arg));
                if (error)
                        return (error);
-               return (linux_semctl(&a));
+               error = linux_semctl(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_MSGSND: {
                struct linux_msgsnd_args a;
@@ -163,7 +177,10 @@ linux_ipc(struct linux_ipc_args *args)
                a.msgp = args->ptr;
                a.msgsz = args->arg2;
                a.msgflg = args->arg3;
-               return (linux_msgsnd(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_msgsnd(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_MSGRCV: {
                struct linux_msgrcv_args a;
@@ -171,6 +188,7 @@ linux_ipc(struct linux_ipc_args *args)
                a.msqid = args->arg1;
                a.msgsz = args->arg2;
                a.msgflg = args->arg3;
+               a.lmsg.u.ms_lresult = 0;
                if ((args->what >> 16) == 0) {
                        struct l_ipc_kludge tmp;
                        int error;
@@ -186,14 +204,19 @@ linux_ipc(struct linux_ipc_args *args)
                        a.msgp = args->ptr;
                        a.msgtyp = args->arg5;
                }
-               return (linux_msgrcv(&a));
+               error = linux_msgrcv(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_MSGGET: {
                struct linux_msgget_args a;
 
                a.key = args->arg1;
                a.msgflg = args->arg2;
-               return (linux_msgget(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_msgget(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_MSGCTL: {
                struct linux_msgctl_args a;
@@ -201,7 +224,10 @@ linux_ipc(struct linux_ipc_args *args)
                a.msqid = args->arg1;
                a.cmd = args->arg2;
                a.buf = args->ptr;
-               return (linux_msgctl(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_msgctl(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_SHMAT: {
                struct linux_shmat_args a;
@@ -210,13 +236,19 @@ linux_ipc(struct linux_ipc_args *args)
                a.shmaddr = args->ptr;
                a.shmflg = args->arg2;
                a.raddr = (l_ulong *)args->arg3;
-               return (linux_shmat(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_shmat(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_SHMDT: {
                struct linux_shmdt_args a;
 
                a.shmaddr = args->ptr;
-               return (linux_shmdt(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_shmdt(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_SHMGET: {
                struct linux_shmget_args a;
@@ -224,7 +256,10 @@ linux_ipc(struct linux_ipc_args *args)
                a.key = args->arg1;
                a.size = args->arg2;
                a.shmflg = args->arg3;
-               return (linux_shmget(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_shmget(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        case LINUX_SHMCTL: {
                struct linux_shmctl_args a;
@@ -232,13 +267,16 @@ linux_ipc(struct linux_ipc_args *args)
                a.shmid = args->arg1;
                a.cmd = args->arg2;
                a.buf = args->ptr;
-               return (linux_shmctl(&a));
+               a.lmsg.u.ms_lresult = 0;
+               error = linux_shmctl(&a);
+               args->lmsg.u.ms_lresult = a.lmsg.u.ms_lresult;
+               break;
        }
        default:
+               error = EINVAL;
                break;
        }
-
-       return (EINVAL);
+       return(error);
 }
 
 int
@@ -257,18 +295,20 @@ linux_old_select(struct linux_old_select_args *args)
        if (error)
                return (error);
 
+       newsel.lmsg.u.ms_result = 0;
        newsel.nfds = linux_args.nfds;
        newsel.readfds = linux_args.readfds;
        newsel.writefds = linux_args.writefds;
        newsel.exceptfds = linux_args.exceptfds;
        newsel.timeout = linux_args.timeout;
-       return (linux_select(&newsel));
+       error = linux_select(&newsel);
+       args->lmsg.u.ms_result = newsel.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_fork(struct linux_fork_args *args)
 {
-       struct proc *p = curproc;
        int error;
 
 #ifdef DEBUG
@@ -279,15 +319,14 @@ linux_fork(struct linux_fork_args *args)
        if ((error = fork((struct fork_args *)args)) != 0)
                return (error);
 
-       if (p->p_retval[1] == 1)
-               p->p_retval[0] = 0;
+       if (args->lmsg.u.ms_result == 1)
+               args->lmsg.u.ms_result = 0;
        return (0);
 }
 
 int
 linux_vfork(struct linux_vfork_args *args)
 {
-       struct proc *p = curproc;
        int error;
 
 #ifdef DEBUG
@@ -298,8 +337,8 @@ linux_vfork(struct linux_vfork_args *args)
        if ((error = vfork((struct vfork_args *)args)) != 0)
                return (error);
        /* Are we the child? */
-       if (p->p_retval[1] == 1)
-               p->p_retval[0] = 0;
+       if (args->lmsg.u.ms_result == 1)
+               args->lmsg.u.ms_result = 0;
        return (0);
 }
 
@@ -312,7 +351,6 @@ linux_vfork(struct linux_vfork_args *args)
 int
 linux_clone(struct linux_clone_args *args)
 {
-       struct proc *p = curproc;
        int error, ff = RFPROC;
        struct proc *p2;
        int exit_signal;
@@ -352,11 +390,13 @@ linux_clone(struct linux_clone_args *args)
        start = 0;
 
        rf_args.flags = ff;
+       rf_args.lmsg.u.ms_result = 0;
        if ((error = rfork(&rf_args)) != 0)
                return (error);
+       args->lmsg.u.ms_result = rf_args.lmsg.u.ms_result;
 
-       p2 = pfind(p->p_retval[0]);
-       if (p2 == 0)
+       p2 = pfind(rf_args.lmsg.u.ms_result);
+       if (p2 == NULL)
                return (ESRCH);
 
        p2->p_sigparent = exit_signal;
@@ -388,15 +428,7 @@ int
 linux_mmap(struct linux_mmap_args *args)
 {
        struct proc *p = curproc;
-       struct mmap_args /* {
-               caddr_t addr;
-               size_t len;
-               int prot;
-               int flags;
-               int fd;
-               long pad;
-               off_t pos;
-       } */ bsd_args;
+       struct mmap_args bsd_args;
        int error;
        struct l_mmap_argv linux_args;
 
@@ -412,6 +444,7 @@ linux_mmap(struct linux_mmap_args *args)
 #endif
 
        bsd_args.flags = 0;
+       bsd_args.lmsg.u.ms_resultp = NULL;
        if (linux_args.flags & LINUX_MAP_SHARED)
                bsd_args.flags |= MAP_SHARED;
        if (linux_args.flags & LINUX_MAP_PRIVATE)
@@ -502,36 +535,38 @@ linux_mmap(struct linux_mmap_args *args)
                    bsd_args.flags, bsd_args.fd, (int)bsd_args.pos);
 #endif
 
-       return (mmap(&bsd_args));
+       error = mmap(&bsd_args);
+       args->lmsg.u.ms_resultp = bsd_args.lmsg.u.ms_resultp;
+       return(error);
 }
 
 int
 linux_pipe(struct linux_pipe_args *args)
 {
-       struct proc *p = curproc;
        int error;
        int reg_edx;
+       struct pipe_args bsd_args;
 
 #ifdef DEBUG
        if (ldebug(pipe))
                printf(ARGS(pipe, "*"));
 #endif
 
-       reg_edx = p->p_retval[1];
-       error = pipe(NULL);
+       reg_edx = args->lmsg.u.ms_fds[1];
+       error = pipe(&bsd_args);
        if (error) {
-               p->p_retval[1] = reg_edx;
+               args->lmsg.u.ms_fds[1] = reg_edx;
                return (error);
        }
 
-       error = copyout(p->p_retval, args->pipefds, 2*sizeof(int));
+       error = copyout(bsd_args.lmsg.u.ms_fds, args->pipefds, 2*sizeof(int));
        if (error) {
-               p->p_retval[1] = reg_edx;
+               args->lmsg.u.ms_fds[1] = reg_edx;
                return (error);
        }
 
-       p->p_retval[1] = reg_edx;
-       p->p_retval[0] = 0;
+       args->lmsg.u.ms_fds[1] = reg_edx;
+       args->lmsg.u.ms_fds[0] = 0;
        return (0);
 }
 
@@ -541,15 +576,19 @@ linux_ioperm(struct linux_ioperm_args *args)
        struct sysarch_args sa;
        struct i386_ioperm_args *iia;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        iia = stackgap_alloc(&sg, sizeof(struct i386_ioperm_args));
        iia->start = args->start;
        iia->length = args->length;
        iia->enable = args->enable;
+       sa.lmsg.u.ms_resultp = NULL;
        sa.op = I386_SET_IOPERM;
        sa.parms = (char *)iia;
-       return (sysarch(&sa));
+       error = sysarch(&sa);
+       args->lmsg.u.ms_resultp = sa.lmsg.u.ms_resultp;
+       return(error);
 }
 
 int
@@ -575,7 +614,6 @@ linux_iopl(struct linux_iopl_args *args)
 int
 linux_modify_ldt(struct linux_modify_ldt_args *uap)
 {
-       struct proc *p = curproc;
        int error;
        caddr_t sg;
        struct sysarch_args args;
@@ -596,8 +634,10 @@ linux_modify_ldt(struct linux_modify_ldt_args *uap)
                ldt->num = uap->bytecount / sizeof(union descriptor);
                args.op = I386_GET_LDT;
                args.parms = (char*)ldt;
+               args.lmsg.u.ms_result = 0;
                error = sysarch(&args);
-               p->p_retval[0] *= sizeof(union descriptor);
+               uap->lmsg.u.ms_result = args.lmsg.u.ms_result *
+                                           sizeof(union descriptor);
                break;
        case 0x01: /* write_ldt */
        case 0x11: /* write_ldt */
@@ -626,7 +666,9 @@ linux_modify_ldt(struct linux_modify_ldt_args *uap)
                desc->sd.sd_gran = ld.limit_in_pages;
                args.op = I386_SET_LDT;
                args.parms = (char*)ldt;
+               args.lmsg.u.ms_result = 0;
                error = sysarch(&args);
+               uap->lmsg.u.ms_result = args.lmsg.u.ms_result;
                break;
        default:
                error = EINVAL;
@@ -667,7 +709,7 @@ linux_sigaction(struct linux_sigaction_args *args)
        }
 
        error = linux_do_sigaction(args->sig, args->nsa ? &act : NULL,
-           args->osa ? &oact : NULL);
+           args->osa ? &oact : NULL, &args->lmsg.u.ms_result);
 
        if (args->osa != NULL && !error) {
                osa.lsa_handler = oact.lsa_handler;
@@ -693,6 +735,7 @@ linux_sigsuspend(struct linux_sigsuspend_args *args)
        sigset_t *sigmask;
        l_sigset_t mask;
        caddr_t sg = stackgap_init();
+       int error;
 
 #ifdef DEBUG
        if (ldebug(sigsuspend))
@@ -704,7 +747,10 @@ linux_sigsuspend(struct linux_sigsuspend_args *args)
        mask.__bits[0] = args->mask;
        linux_to_bsd_sigset(&mask, sigmask);
        bsd.sigmask = sigmask;
-       return (sigsuspend(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+       error = sigsuspend(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -732,7 +778,10 @@ linux_rt_sigsuspend(struct linux_rt_sigsuspend_args *uap)
        bmask = stackgap_alloc(&sg, sizeof(sigset_t));
        linux_to_bsd_sigset(&lmask, bmask);
        bsd.sigmask = bmask;
-       return (sigsuspend(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+       error = sigsuspend(&bsd);
+       uap->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -742,6 +791,7 @@ linux_pause(struct linux_pause_args *args)
        struct sigsuspend_args bsd;
        sigset_t *sigmask;
        caddr_t sg = stackgap_init();
+       int error;
 
 #ifdef DEBUG
        if (ldebug(pause))
@@ -751,7 +801,10 @@ linux_pause(struct linux_pause_args *args)
        sigmask = stackgap_alloc(&sg, sizeof(sigset_t));
        *sigmask = p->p_sigmask;
        bsd.sigmask = sigmask;
-       return (sigsuspend(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+       error = sigsuspend(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -786,7 +839,9 @@ linux_sigaltstack(struct linux_sigaltstack_args *uap)
 
        bsd.ss = ss;
        bsd.oss = oss;
+       bsd.lmsg.u.ms_result = 0;
        error = sigaltstack(&bsd);
+       uap->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
 
        if (!error && oss != NULL) {
                lss.ss_sp = oss->ss_sp;
index 643e80c..f019af7 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/linux/linux_ptrace.c,v 1.7.4.3 2003/01/03 17:13:23 kan Exp $
- * $DragonFly: src/sys/emulation/linux/i386/linux_ptrace.c,v 1.4 2003/06/23 17:55:39 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/i386/linux_ptrace.c,v 1.5 2003/07/26 18:12:43 dillon Exp $
  */
 
 #include "opt_cpu.h"
@@ -275,34 +275,36 @@ linux_ptrace(struct linux_ptrace_args *uap)
        case PTRACE_POKETEXT:
        case PTRACE_POKEDATA:
        case PTRACE_KILL:
-               error = kern_ptrace(curp, req, pid, addr, uap->data);
+               error = kern_ptrace(curp, req, pid, addr, uap->data,
+                               &uap->lmsg.u.ms_result);
                break;
        case PTRACE_PEEKTEXT:
        case PTRACE_PEEKDATA: {
-               /* need to preserve return value */
-               int rval = curp->p_retval[0];
-               error = kern_ptrace(curp, req, pid, addr, 0);
-               if (error == 0)
-                       error = copyout(curp->p_retval, (caddr_t)uap->data,
-                           sizeof(l_int));
-               curp->p_retval[0] = rval;
+               /* need to preserve return value, use dummy */
+               l_int rval = 0;
+               error = kern_ptrace(curp, req, pid, addr, 0, &rval);
+               if (error == 0) {
+                       error = copyout(&rval, (caddr_t)uap->data, sizeof(l_int));
+               }
                break;
        }
        case PTRACE_DETACH:
                error = kern_ptrace(curp, PT_DETACH, pid, (void *)1,
-                    map_signum(uap->data));
+                    map_signum(uap->data), &uap->lmsg.u.ms_result);
                break;
        case PTRACE_SINGLESTEP:
        case PTRACE_CONT:
                error = kern_ptrace(curp, req, pid, (void *)1,
-                    map_signum(uap->data));
+                    map_signum(uap->data), &uap->lmsg.u.ms_result);
                break;
        case PTRACE_ATTACH:
-               error = kern_ptrace(curp, PT_ATTACH, pid, addr, uap->data);
+               error = kern_ptrace(curp, PT_ATTACH, pid, addr, uap->data,
+                               &uap->lmsg.u.ms_result);
                break;
        case PTRACE_GETREGS:
                /* Linux is using data where FreeBSD is using addr */
-               error = kern_ptrace(curp, PT_GETREGS, pid, &u.bsd_reg, 0);
+               error = kern_ptrace(curp, PT_GETREGS, pid, &u.bsd_reg, 0,
+                               &uap->lmsg.u.ms_result);
                if (error == 0) {
                        map_regs_to_linux(&u.bsd_reg, &r.reg);
                        error = copyout(&r.reg, (caddr_t)uap->data,
@@ -314,12 +316,13 @@ linux_ptrace(struct linux_ptrace_args *uap)
                error = copyin((caddr_t)uap->data, &r.reg, sizeof(r.reg));
                if (error == 0) {
                        map_regs_from_linux(&u.bsd_reg, &r.reg);
-                       error = kern_ptrace(curp, PT_SETREGS, pid, &u.bsd_reg, 0);
+                       error = kern_ptrace(curp, PT_SETREGS, pid, &u.bsd_reg, 0, &uap->lmsg.u.ms_result);
                }
                break;
        case PTRACE_GETFPREGS:
                /* Linux is using data where FreeBSD is using addr */
-               error = kern_ptrace(curp, PT_GETFPREGS, pid, &u.bsd_fpreg, 0);
+               error = kern_ptrace(curp, PT_GETFPREGS, pid, &u.bsd_fpreg, 0,
+                               &uap->lmsg.u.ms_result);
                if (error == 0) {
                        map_fpregs_to_linux(&u.bsd_fpreg, &r.fpreg);
                        error = copyout(&r.fpreg, (caddr_t)uap->data,
@@ -332,7 +335,7 @@ linux_ptrace(struct linux_ptrace_args *uap)
                if (error == 0) {
                        map_fpregs_from_linux(&u.bsd_fpreg, &r.fpreg);
                        error = kern_ptrace(curp, PT_SETFPREGS, pid,
-                           &u.bsd_fpreg, 0);
+                           &u.bsd_fpreg, 0, &uap->lmsg.u.ms_result);
                }
                break;
        case PTRACE_SETFPXREGS:
@@ -426,7 +429,7 @@ linux_ptrace(struct linux_ptrace_args *uap)
                 * as necessary.
                 */
                if (uap->addr < sizeof(struct linux_pt_reg)) {
-                       error = kern_ptrace(curp, PT_GETREGS, pid, &u.bsd_reg, 0);
+                       error = kern_ptrace(curp, PT_GETREGS, pid, &u.bsd_reg, 0, &uap->lmsg.u.ms_result);
                        if (error != 0)
                                break;
 
@@ -441,7 +444,7 @@ linux_ptrace(struct linux_ptrace_args *uap)
                            (l_int)uap->data;
 
                        map_regs_from_linux(&u.bsd_reg, &r.reg);
-                       error = kern_ptrace(curp, PT_SETREGS, pid, &u.bsd_reg, 0);
+                       error = kern_ptrace(curp, PT_SETREGS, pid, &u.bsd_reg, 0, &uap->lmsg.u.ms_result);
                }
 
                /*
@@ -449,8 +452,8 @@ linux_ptrace(struct linux_ptrace_args *uap)
                 */
                if (uap->addr >= LINUX_DBREG_OFFSET &&
                    uap->addr <= LINUX_DBREG_OFFSET + LINUX_DBREG_SIZE) {
-                       error = kern_ptrace(curp, PT_GETDBREGS, pid, &u.bsd_dbreg,
-                           0);
+                       error = kern_ptrace(curp, PT_GETDBREGS, pid, 
+                                   &u.bsd_dbreg, 0, &uap->lmsg.u.ms_result);
                        if (error != 0)
                                break;
 
@@ -465,7 +468,7 @@ linux_ptrace(struct linux_ptrace_args *uap)
                        *(l_int *)((char *)&u.bsd_dbreg + uap->addr) =
                             uap->data;
                        error = kern_ptrace(curp, PT_SETDBREGS, pid,
-                           &u.bsd_dbreg, 0);
+                           &u.bsd_dbreg, 0, &uap->lmsg.u.ms_result);
                }
 
                break;
index bd151f1..f08f061 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/linux/linux_sysvec.c,v 1.55.2.9 2002/01/12 11:03:30 bde Exp $
- * $DragonFly: src/sys/emulation/linux/i386/linux_sysvec.c,v 1.4 2003/06/25 03:55:55 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/i386/linux_sysvec.c,v 1.5 2003/07/26 18:12:43 dillon Exp $
  */
 
 /* XXX we use functions that might not exist. */
@@ -708,7 +708,9 @@ linux_rt_sigreturn(struct linux_rt_sigreturn_args *args)
 #endif
        sasargs.ss = ss;
        sasargs.oss = NULL;
+       sasargs.lmsg.u.ms_result = 0;
        (void) sigaltstack(&sasargs);
+       args->lmsg.u.ms_result = sasargs.lmsg.u.ms_result;
 
        return (EJUSTRETURN);
 }
index 3ce3289..3cb58b7 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_file.c,v 1.41.2.6 2003/01/06 09:19:43 fjoe Exp $
- * $DragonFly: src/sys/emulation/linux/linux_file.c,v 1.5 2003/06/26 05:55:10 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_file.c,v 1.6 2003/07/26 18:12:40 dillon Exp $
  */
 
 #include "opt_compat.h"
 int
 linux_creat(struct linux_creat_args *args)
 {
-    struct open_args /* {
-       char *path;
-       int flags;
-       int mode;
-    } */ bsd_open_args;
+    struct open_args bsd_open_args;
     caddr_t sg;
+    int error;
 
     sg = stackgap_init();
     CHECKALTCREAT(&sg, args->path);
@@ -73,21 +70,20 @@ linux_creat(struct linux_creat_args *args)
        if (ldebug(creat))
                printf(ARGS(creat, "%s, %d"), args->path, args->mode);
 #endif
+    bsd_open_args.lmsg.u.ms_result = 0;
     bsd_open_args.path = args->path;
     bsd_open_args.mode = args->mode;
     bsd_open_args.flags = O_WRONLY | O_CREAT | O_TRUNC;
-    return open(&bsd_open_args);
+    error = open(&bsd_open_args);
+    args->lmsg.u.ms_result = bsd_open_args.lmsg.u.ms_result;
+    return(error);
 }
 #endif /*!__alpha__*/
 
 int
 linux_open(struct linux_open_args *args)
 {
-    struct open_args /* {
-       char *path;
-       int flags;
-       int mode;
-    } */ bsd_open_args;
+    struct open_args bsd_open_args;
     int error;
     caddr_t sg;
     struct thread *td = curthread;
@@ -134,12 +130,14 @@ linux_open(struct linux_open_args *args)
        bsd_open_args.flags |= O_NOCTTY;
     bsd_open_args.path = args->path;
     bsd_open_args.mode = args->mode;
-
+    bsd_open_args.lmsg.u.ms_result = 0;
     error = open(&bsd_open_args);
+    args->lmsg.u.ms_result = bsd_open_args.lmsg.u.ms_result;
+
     if (!error && !(bsd_open_args.flags & O_NOCTTY) && 
        SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
        struct filedesc *fdp = p->p_fd;
-       struct file *fp = fdp->fd_ofiles[p->p_retval[0]];
+       struct file *fp = fdp->fd_ofiles[bsd_open_args.lmsg.u.ms_result];
 
        if (fp->f_type == DTYPE_VNODE)
            fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0, td);
@@ -154,13 +152,7 @@ linux_open(struct linux_open_args *args)
 int
 linux_lseek(struct linux_lseek_args *args)
 {
-
-    struct lseek_args /* {
-       int fd;
-       int pad;
-       off_t offset;
-       int whence;
-    } */ tmp_args;
+    struct lseek_args tmp_args;
     int error;
 
 #ifdef DEBUG
@@ -171,7 +163,9 @@ linux_lseek(struct linux_lseek_args *args)
     tmp_args.fd = args->fdes;
     tmp_args.offset = (off_t)args->off;
     tmp_args.whence = args->whence;
+    tmp_args.lmsg.u.ms_result = 0;
     error = lseek(&tmp_args);
+    args->lmsg.u.ms_result = tmp_args.lmsg.u.ms_result;
     return error;
 }
 
@@ -179,7 +173,6 @@ linux_lseek(struct linux_lseek_args *args)
 int
 linux_llseek(struct linux_llseek_args *args)
 {
-       struct proc *p = curproc;
        struct lseek_args bsd_args;
        int error;
        off_t off;
@@ -194,14 +187,15 @@ linux_llseek(struct linux_llseek_args *args)
        bsd_args.fd = args->fd;
        bsd_args.offset = off;
        bsd_args.whence = args->whence;
+       bsd_args.lmsg.u.ms_result = 0;
 
        if ((error = lseek(&bsd_args)))
                return error;
 
-       if ((error = copyout(p->p_retval, (caddr_t)args->res, sizeof (off_t))))
+       if ((error = copyout(&bsd_args.lmsg.u.ms_offset, (caddr_t)args->res, sizeof (off_t)))) {
                return error;
-
-       p->p_retval[0] = 0;
+       }
+       args->lmsg.u.ms_result = 0;
        return 0;
 }
 #endif /*!__alpha__*/
@@ -211,11 +205,15 @@ int
 linux_readdir(struct linux_readdir_args *args)
 {
        struct linux_getdents_args lda;
+       int error;
 
        lda.fd = args->fd;
        lda.dent = args->dent;
        lda.count = 1;
-       return linux_getdents(&lda);
+       lda.lmsg.u.ms_result = 0;
+       error = linux_getdents(&lda);
+       args->lmsg.u.ms_result = lda.lmsg.u.ms_result;
+       return(error);
 }
 #endif /*!__alpha__*/
 
@@ -433,7 +431,7 @@ again:
                nbytes = resid + linuxreclen;
 
 eof:
-       p->p_retval[0] = nbytes - resid;
+       args->lmsg.u.ms_result = nbytes - resid;
 
 out:
        if (cookies)
@@ -473,6 +471,7 @@ linux_access(struct linux_access_args *args)
 {
        struct access_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -483,8 +482,11 @@ linux_access(struct linux_access_args *args)
 #endif
        bsd.path = args->path;
        bsd.flags = args->flags;
+       bsd.lmsg.u.ms_result = 0;
 
-       return access(&bsd);
+       error = access(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -492,6 +494,7 @@ linux_unlink(struct linux_unlink_args *args)
 {
        struct unlink_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -501,8 +504,11 @@ linux_unlink(struct linux_unlink_args *args)
                printf(ARGS(unlink, "%s"), args->path);
 #endif
        bsd.path = args->path;
+       bsd.lmsg.u.ms_result = 0;
 
-       return unlink(&bsd);
+       error = unlink(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -510,6 +516,7 @@ linux_chdir(struct linux_chdir_args *args)
 {
        struct chdir_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -519,8 +526,11 @@ linux_chdir(struct linux_chdir_args *args)
                printf(ARGS(chdir, "%s"), args->path);
 #endif
        bsd.path = args->path;
+       bsd.lmsg.u.ms_result = 0;
 
-       return chdir(&bsd);
+       error = chdir(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -528,6 +538,7 @@ linux_chmod(struct linux_chmod_args *args)
 {
        struct chmod_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -538,8 +549,11 @@ linux_chmod(struct linux_chmod_args *args)
 #endif
        bsd.path = args->path;
        bsd.mode = args->mode;
+       bsd.lmsg.u.ms_result = 0;
 
-       return chmod(&bsd);
+       error = chmod(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -547,6 +561,7 @@ linux_mkdir(struct linux_mkdir_args *args)
 {
        struct mkdir_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTCREAT(&sg, args->path);
@@ -557,8 +572,11 @@ linux_mkdir(struct linux_mkdir_args *args)
 #endif
        bsd.path = args->path;
        bsd.mode = args->mode;
+       bsd.lmsg.u.ms_result = 0;
 
-       return mkdir(&bsd);
+       error = mkdir(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -566,6 +584,7 @@ linux_rmdir(struct linux_rmdir_args *args)
 {
        struct rmdir_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -575,8 +594,11 @@ linux_rmdir(struct linux_rmdir_args *args)
                printf(ARGS(rmdir, "%s"), args->path);
 #endif
        bsd.path = args->path;
+       bsd.lmsg.u.ms_result = 0;
 
-       return rmdir(&bsd);
+       error = rmdir(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -584,6 +606,7 @@ linux_rename(struct linux_rename_args *args)
 {
        struct rename_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->from);
@@ -595,8 +618,11 @@ linux_rename(struct linux_rename_args *args)
 #endif
        bsd.from = args->from;
        bsd.to = args->to;
+       bsd.lmsg.u.ms_result = 0;
 
-       return rename(&bsd);
+       error = rename(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -604,6 +630,7 @@ linux_symlink(struct linux_symlink_args *args)
 {
        struct symlink_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -615,8 +642,11 @@ linux_symlink(struct linux_symlink_args *args)
 #endif
        bsd.path = args->path;
        bsd.link = args->to;
+       bsd.lmsg.u.ms_result = 0;
 
-       return symlink(&bsd);
+       error = symlink(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -624,6 +654,7 @@ linux_readlink(struct linux_readlink_args *args)
 {
        struct readlink_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->name);
@@ -636,8 +667,11 @@ linux_readlink(struct linux_readlink_args *args)
        bsd.path = args->name;
        bsd.buf = args->buf;
        bsd.count = args->count;
+       bsd.lmsg.u.ms_result = 0;
 
-       return readlink(&bsd);
+       error = readlink(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -645,6 +679,7 @@ linux_truncate(struct linux_truncate_args *args)
 {
        struct truncate_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -656,8 +691,11 @@ linux_truncate(struct linux_truncate_args *args)
 #endif
        bsd.path = args->path;
        bsd.length = args->length;
+       bsd.lmsg.u.ms_result = 0;
 
-       return truncate(&bsd);
+       error = truncate(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -665,6 +703,7 @@ linux_link(struct linux_link_args *args)
 {
     struct link_args bsd;
     caddr_t sg;
+    int error;
 
     sg = stackgap_init();
     CHECKALTEXIST(&sg, args->path);
@@ -677,8 +716,11 @@ linux_link(struct linux_link_args *args)
 
     bsd.path = args->path;
     bsd.link = args->to;
+    bsd.lmsg.u.ms_result = 0;
 
-    return link(&bsd);
+    error = link(&bsd);
+    args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+    return(error);
 }
 
 #ifndef __alpha__
@@ -686,9 +728,14 @@ int
 linux_fdatasync(struct linux_fdatasync_args *uap)
 {
        struct fsync_args bsd;
+       int error;
 
        bsd.fd = uap->fd;
-       return fsync(&bsd);
+       bsd.lmsg.u.ms_result = 0;
+
+       error = fsync(&bsd);
+       uap->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 #endif /*!__alpha__*/
 
@@ -696,44 +743,63 @@ int
 linux_pread(struct linux_pread_args *uap)
 {
        struct pread_args bsd;
+       int error;
 
        bsd.fd = uap->fd;
        bsd.buf = uap->buf;
        bsd.nbyte = uap->nbyte;
        bsd.offset = uap->offset;
-       return pread(&bsd);
+       bsd.lmsg.u.ms_result = 0;
+
+       error = pread(&bsd);
+       uap->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_pwrite(struct linux_pwrite_args *uap)
 {
        struct pwrite_args bsd;
+       int error;
 
        bsd.fd = uap->fd;
        bsd.buf = uap->buf;
        bsd.nbyte = uap->nbyte;
        bsd.offset = uap->offset;
-       return pwrite(&bsd);
+       bsd.lmsg.u.ms_result = 0;
+
+       error = pwrite(&bsd);
+       uap->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_oldumount(struct linux_oldumount_args *args)
 {
        struct linux_umount_args args2;
+       int error;
 
        args2.path = args->path;
        args2.flags = 0;
-       return (linux_umount(&args2));
+       args2.lmsg.u.ms_result = 0;
+       error = linux_umount(&args2);
+       args->lmsg.u.ms_result = args2.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_umount(struct linux_umount_args *args)
 {
        struct unmount_args bsd;
+       int error;
 
        bsd.path = args->path;
        bsd.flags = args->flags;        /* XXX correct? */
-       return (unmount(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = unmount(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 /*
@@ -864,41 +930,39 @@ fcntl_common(struct linux_fcntl64_args *args)
        bsd_flock = (struct flock *)stackgap_alloc(&sg, sizeof(bsd_flock));
 
        fcntl_args.fd = args->fd;
+       fcntl_args.lmsg.u.ms_result = 0;
 
        switch (args->cmd) {
        case LINUX_F_DUPFD:
                fcntl_args.cmd = F_DUPFD;
                fcntl_args.arg = args->arg;
-               return (fcntl(&fcntl_args));
-
+               break;
        case LINUX_F_GETFD:
                fcntl_args.cmd = F_GETFD;
-               return (fcntl(&fcntl_args));
-
+               break;
        case LINUX_F_SETFD:
                fcntl_args.cmd = F_SETFD;
                fcntl_args.arg = args->arg;
-               return (fcntl(&fcntl_args));
-
+               break;
        case LINUX_F_GETFL:
                fcntl_args.cmd = F_GETFL;
                error = fcntl(&fcntl_args);
-               result = p->p_retval[0];
-               p->p_retval[0] = 0;
+               result = fcntl_args.lmsg.u.ms_result;
+               args->lmsg.u.ms_result = 0;
                if (result & O_RDONLY)
-                       p->p_retval[0] |= LINUX_O_RDONLY;
+                       args->lmsg.u.ms_result |= LINUX_O_RDONLY;
                if (result & O_WRONLY)
-                       p->p_retval[0] |= LINUX_O_WRONLY;
+                       args->lmsg.u.ms_result |= LINUX_O_WRONLY;
                if (result & O_RDWR)
-                       p->p_retval[0] |= LINUX_O_RDWR;
+                       args->lmsg.u.ms_result |= LINUX_O_RDWR;
                if (result & O_NDELAY)
-                       p->p_retval[0] |= LINUX_O_NONBLOCK;
+                       args->lmsg.u.ms_result |= LINUX_O_NONBLOCK;
                if (result & O_APPEND)
-                       p->p_retval[0] |= LINUX_O_APPEND;
+                       args->lmsg.u.ms_result |= LINUX_O_APPEND;
                if (result & O_FSYNC)
-                       p->p_retval[0] |= LINUX_O_SYNC;
+                       args->lmsg.u.ms_result |= LINUX_O_SYNC;
                if (result & O_ASYNC)
-                       p->p_retval[0] |= LINUX_FASYNC;
+                       args->lmsg.u.ms_result |= LINUX_FASYNC;
                return (error);
 
        case LINUX_F_SETFL:
@@ -912,7 +976,7 @@ fcntl_common(struct linux_fcntl64_args *args)
                if (args->arg & LINUX_FASYNC)
                        fcntl_args.arg |= O_ASYNC;
                fcntl_args.cmd = F_SETFL;
-               return (fcntl(&fcntl_args));
+               break;
 
        case LINUX_F_GETLK:
                error = copyin((caddr_t)args->arg, &linux_flock,
@@ -924,6 +988,7 @@ fcntl_common(struct linux_fcntl64_args *args)
                fcntl_args.cmd = F_GETLK;
                fcntl_args.arg = (long)bsd_flock;
                error = fcntl(&fcntl_args);
+               args->lmsg.u.ms_result = fcntl_args.lmsg.u.ms_result;
                if (error)
                        return (error);
                bsd_to_linux_flock(bsd_flock, &linux_flock);
@@ -939,8 +1004,7 @@ fcntl_common(struct linux_fcntl64_args *args)
                fcntl_args.fd = args->fd;
                fcntl_args.cmd = F_SETLK;
                fcntl_args.arg = (long)bsd_flock;
-               return (fcntl(&fcntl_args));
-
+               break;
        case LINUX_F_SETLKW:
                error = copyin((caddr_t)args->arg, &linux_flock,
                    sizeof(linux_flock));
@@ -950,12 +1014,10 @@ fcntl_common(struct linux_fcntl64_args *args)
                fcntl_args.fd = args->fd;
                fcntl_args.cmd = F_SETLKW;
                fcntl_args.arg = (long)bsd_flock;
-               return (fcntl(&fcntl_args));
-
+               break;
        case LINUX_F_GETOWN:
                fcntl_args.cmd = F_GETOWN;
-               return (fcntl(&fcntl_args));
-
+               break;
        case LINUX_F_SETOWN:
                /*
                 * XXX some Linux applications depend on F_SETOWN having no
@@ -968,19 +1030,22 @@ fcntl_common(struct linux_fcntl64_args *args)
                        return (EBADF);
                if (fp->f_type == DTYPE_PIPE)
                        return (EINVAL);
-
                fcntl_args.cmd = F_SETOWN;
                fcntl_args.arg = args->arg;
-               return (fcntl(&fcntl_args));
+               break;
+       default:
+               return (EINVAL);
        }
-
-       return (EINVAL);
+       error = fcntl(&fcntl_args);
+       args->lmsg.u.ms_result = fcntl_args.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_fcntl(struct linux_fcntl_args *args)
 {
        struct linux_fcntl64_args args64;
+       int error;
 
 #ifdef DEBUG
        if (ldebug(fcntl))
@@ -990,7 +1055,10 @@ linux_fcntl(struct linux_fcntl_args *args)
        args64.fd = args->fd;
        args64.cmd = args->cmd;
        args64.arg = args->arg;
-       return (fcntl_common(&args64));
+       args64.lmsg.u.ms_result = 0;
+       error = fcntl_common(&args64);
+       args->lmsg.u.ms_result = args64.lmsg.u.ms_result;
+       return(error);
 }
 
 #if defined(__i386__)
@@ -1010,6 +1078,7 @@ linux_fcntl64(struct linux_fcntl64_args *args)
        if (ldebug(fcntl64))
                printf(ARGS(fcntl64, "%d, %08x, *"), args->fd, args->cmd);
 #endif
+       fcntl_args.lmsg.u.ms_result = 0;
 
        switch (args->cmd) {
        case LINUX_F_GETLK64:
@@ -1022,6 +1091,7 @@ linux_fcntl64(struct linux_fcntl64_args *args)
                fcntl_args.cmd = F_GETLK;
                fcntl_args.arg = (long)bsd_flock;
                error = fcntl(&fcntl_args);
+               args->lmsg.u.ms_result = fcntl_args.lmsg.u.ms_result;
                if (error)
                        return (error);
                bsd_to_linux_flock64(bsd_flock, &linux_flock);
@@ -1037,7 +1107,9 @@ linux_fcntl64(struct linux_fcntl64_args *args)
                fcntl_args.fd = args->fd;
                fcntl_args.cmd = F_SETLK;
                fcntl_args.arg = (long)bsd_flock;
-               return (fcntl(&fcntl_args));
+               error = fcntl(&fcntl_args);
+               args->lmsg.u.ms_result = fcntl_args.lmsg.u.ms_result;
+               return(error);
 
        case LINUX_F_SETLKW64:
                error = copyin((caddr_t)args->arg, &linux_flock,
@@ -1048,7 +1120,9 @@ linux_fcntl64(struct linux_fcntl64_args *args)
                fcntl_args.fd = args->fd;
                fcntl_args.cmd = F_SETLKW;
                fcntl_args.arg = (long)bsd_flock;
-               return (fcntl(&fcntl_args));
+               error = fcntl(&fcntl_args);
+               args->lmsg.u.ms_result = fcntl_args.lmsg.u.ms_result;
+               return(error);
        }
 
        return (fcntl_common(args));
@@ -1060,6 +1134,7 @@ linux_chown(struct linux_chown_args *args)
 {
        struct chown_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -1073,7 +1148,10 @@ linux_chown(struct linux_chown_args *args)
        bsd.path = args->path;
        bsd.uid = args->uid;
        bsd.gid = args->gid;
-       return (chown(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+       error = chown(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -1081,6 +1159,7 @@ linux_lchown(struct linux_lchown_args *args)
 {
        struct lchown_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -1094,5 +1173,10 @@ linux_lchown(struct linux_lchown_args *args)
        bsd.path = args->path;
        bsd.uid = args->uid;
        bsd.gid = args->gid;
-       return (lchown(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = lchown(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
+
index 9c8a6bd..f66090d 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/compat/linux/linux_getcwd.c,v 1.2.2.3 2001/11/05 19:08:22 marcel Exp $ */
-/* $DragonFly: src/sys/emulation/linux/linux_getcwd.c,v 1.6 2003/07/21 07:57:39 dillon Exp $ */
+/* $DragonFly: src/sys/emulation/linux/linux_getcwd.c,v 1.7 2003/07/26 18:12:40 dillon Exp $ */
 /* $OpenBSD: linux_getcwd.c,v 1.2 2001/05/16 12:50:21 ho Exp $ */
 /* $NetBSD: vfs_getcwd.c,v 1.3.2.3 1999/07/11 10:24:09 sommerfeld Exp $ */
 
@@ -431,11 +431,13 @@ linux_getcwd(struct linux_getcwd_args *args)
        sg = stackgap_init();
        bsd.buf = stackgap_alloc(&sg, SPARE_USRSPACE);
        bsd.buflen = SPARE_USRSPACE;
+       bsd.lmsg.u.ms_result = 0;
        error = __getcwd(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
        if (!error) {
                lenused = strlen(bsd.buf) + 1;
                if (lenused <= args->bufsize) {
-                       p->p_retval[0] = lenused;
+                       args->lmsg.u.ms_result = lenused;
                        error = copyout(bsd.buf, args->buf, lenused);
                }
                else
@@ -466,7 +468,7 @@ linux_getcwd(struct linux_getcwd_args *args)
                if (error)
                        goto out;
                lenused = bend - bp;
-               p->p_retval[0] = lenused;
+               args->lmsg.u.ms_result = lenused;
                /* put the result into user buffer */
                error = copyout(bp, args->buf, lenused);
 
index d92d920..2540cd8 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_ipc.c,v 1.17.2.3 2001/11/05 19:08:22 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_ipc.c,v 1.3 2003/06/23 17:55:26 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_ipc.c,v 1.4 2003/07/26 18:12:40 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -182,44 +182,38 @@ bsd_to_linux_shmid_ds(struct shmid_ds *bsp, struct l_shmid_ds *lsp)
 int
 linux_semop(struct linux_semop_args *args)
 {
-       struct semop_args /* {
-       int     semid;
-       struct  sembuf *sops;
-       int             nsops;
-       } */ bsd_args;
+       struct semop_args bsd_args;
+       int error;
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.semid = args->semid;
        bsd_args.sops = (struct sembuf *)args->tsops;
        bsd_args.nsops = args->nsops;
-       return semop(&bsd_args);
+       error = semop(&bsd_args);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_semget(struct linux_semget_args *args)
 {
-       struct semget_args /* {
-       key_t   key;
-       int             nsems;
-       int             semflg;
-       } */ bsd_args;
+       struct semget_args bsd_args;
+       int error;
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.key = args->key;
        bsd_args.nsems = args->nsems;
        bsd_args.semflg = args->semflg;
-       return semget(&bsd_args);
+       error = semget(&bsd_args);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_semctl(struct linux_semctl_args *args)
 {
-       struct proc *p = curproc;
        struct l_semid_ds linux_semid;
-       struct __semctl_args /* {
-               int             semid;
-               int             semnum;
-               int             cmd;
-               union semun     *arg;
-       } */ bsd_args;
+       struct __semctl_args bsd_args;
        struct l_seminfo linux_seminfo;
        int error;
        union semun *unptr;
@@ -231,6 +225,7 @@ linux_semctl(struct linux_semctl_args *args)
        unptr = stackgap_alloc(&sg, sizeof(union semun));
        bcopy(&args->arg, unptr, sizeof(union semun));
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.semid = args->semid;
        bsd_args.semnum = args->semnum;
        bsd_args.arg = unptr;
@@ -262,14 +257,14 @@ linux_semctl(struct linux_semctl_args *args)
                        return (error);
                unptr->buf = stackgap_alloc(&sg, sizeof(struct semid_ds));
                linux_to_bsd_semid_ds(&linux_semid, unptr->buf);
-               return __semctl(&bsd_args);
+               break;
        case LINUX_IPC_STAT:
                bsd_args.cmd = IPC_STAT;
                unptr->buf = stackgap_alloc(&sg, sizeof(struct semid_ds));
                error = __semctl(&bsd_args);
                if (error)
                        return error;
-               p->p_retval[0] = IXSEQ_TO_IPCID(bsd_args.semid, 
+               args->lmsg.u.ms_result = IXSEQ_TO_IPCID(bsd_args.semid, 
                                                        unptr->buf->sem_perm);
                bsd_to_linux_semid_ds(unptr->buf, &linux_semid);
                return copyout(&linux_semid, (caddr_t)args->arg.buf,
@@ -291,7 +286,7 @@ linux_semctl(struct linux_semctl_args *args)
                                                sizeof(linux_seminfo) );
                if (error)
                        return error;
-               p->p_retval[0] = seminfo.semmni;
+               args->lmsg.u.ms_result = seminfo.semmni;
                return 0;                       /* No need for __semctl call */
        case LINUX_GETALL:
                /* FALLTHROUGH */
@@ -301,95 +296,91 @@ linux_semctl(struct linux_semctl_args *args)
                uprintf("linux: 'ipc' typ=%d not implemented\n", args->cmd);
                return EINVAL;
        }
-       return __semctl(&bsd_args);
+       error = __semctl(&bsd_args);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_msgsnd(struct linux_msgsnd_args *args)
 {
-    struct msgsnd_args /* {
-       int     msqid;   
-       void    *msgp;   
-       size_t  msgsz;   
-       int     msgflg; 
-    } */ bsd_args;
+    struct msgsnd_args bsd_args;
+    int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.msqid = args->msqid;
     bsd_args.msgp = args->msgp;
     bsd_args.msgsz = args->msgsz;
     bsd_args.msgflg = args->msgflg;
-    return msgsnd(&bsd_args);
+    error = msgsnd(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+    return(error);
 }
 
 int
 linux_msgrcv(struct linux_msgrcv_args *args)
 {
-    struct msgrcv_args /* {     
-        int    msqid;   
-       void    *msgp;   
-       size_t  msgsz;   
-       long    msgtyp; 
-       int     msgflg; 
-    } */ bsd_args; 
+    struct msgrcv_args bsd_args; 
+    int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.msqid = args->msqid;
     bsd_args.msgp = args->msgp;
     bsd_args.msgsz = args->msgsz;
     bsd_args.msgtyp = 0; /* XXX - args->msgtyp; */
     bsd_args.msgflg = args->msgflg;
-    return msgrcv(&bsd_args);
+    error = msgrcv(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+    return(error);
 }
 
 int
 linux_msgget(struct linux_msgget_args *args)
 {
-    struct msgget_args /* {
-       key_t   key;
-        int    msgflg;
-    } */ bsd_args;
+    struct msgget_args bsd_args;
+    int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.key = args->key;
     bsd_args.msgflg = args->msgflg;
-    return msgget(&bsd_args);
+    error = msgget(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+    return(error);
 }
 
 int
 linux_msgctl(struct linux_msgctl_args *args)
 {
-    struct msgctl_args /* {
-       int     msqid; 
-       int     cmd;
-       struct  msqid_ds *buf;
-    } */ bsd_args;
+    struct msgctl_args bsd_args;
     int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.msqid = args->msqid;
     bsd_args.cmd = args->cmd;
     bsd_args.buf = (struct msqid_ds *)args->buf;
     error = msgctl(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
     return ((args->cmd == LINUX_IPC_RMID && error == EINVAL) ? 0 : error);
 }
 
 int
 linux_shmat(struct linux_shmat_args *args)
 {
-    struct proc *p = curproc;
-    struct shmat_args /* {
-       int shmid;
-       void *shmaddr;
-       int shmflg;
-    } */ bsd_args;
+    struct shmat_args bsd_args;
     int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.shmid = args->shmid;
     bsd_args.shmaddr = args->shmaddr;
     bsd_args.shmflg = args->shmflg;
     if ((error = shmat(&bsd_args)))
        return error;
 #ifdef __i386__
-    if ((error = copyout(p->p_retval, (caddr_t)args->raddr, sizeof(l_ulong))))
+    if ((error = copyout(&bsd_args.lmsg.u.ms_lresult, (caddr_t)args->raddr, sizeof(l_ulong))))
        return error;
-    p->p_retval[0] = 0;
+    args->lmsg.u.ms_result = 0;
+#else
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
 #endif
     return 0;
 }
@@ -397,41 +388,40 @@ linux_shmat(struct linux_shmat_args *args)
 int
 linux_shmdt(struct linux_shmdt_args *args)
 {
-    struct shmdt_args /* {
-       void *shmaddr;
-    } */ bsd_args;
+    struct shmdt_args bsd_args;
+    int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.shmaddr = args->shmaddr;
-    return shmdt(&bsd_args);
+    error = shmdt(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+    return(error);
 }
 
 int
 linux_shmget(struct linux_shmget_args *args)
 {
-    struct shmget_args /* {
-       key_t key;
-       int size;
-       int shmflg;
-    } */ bsd_args;
+    struct shmget_args bsd_args;
+    int error;
 
+    bsd_args.lmsg.u.ms_result = 0;
     bsd_args.key = args->key;
     bsd_args.size = args->size;
     bsd_args.shmflg = args->shmflg;
-    return shmget(&bsd_args);
+    error = shmget(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+    return(error);
 }
 
 int
 linux_shmctl(struct linux_shmctl_args *args)
 {
     struct l_shmid_ds linux_shmid;
-    struct shmctl_args /* {
-       int shmid;
-       int cmd;
-       struct shmid_ds *buf;
-    } */ bsd_args;
+    struct shmctl_args bsd_args;
     int error;
     caddr_t sg = stackgap_init();
 
+    bsd_args.lmsg.u.ms_result = 0;
     switch (args->cmd) {
     case LINUX_IPC_STAT:
        bsd_args.shmid = args->shmid;
@@ -440,6 +430,7 @@ linux_shmctl(struct linux_shmctl_args *args)
        if ((error = shmctl(&bsd_args)))
            return error;
        bsd_to_linux_shmid_ds(bsd_args.buf, &linux_shmid);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
        return copyout(&linux_shmid, (caddr_t)args->buf, sizeof(linux_shmid));
 
     case LINUX_IPC_SET:
@@ -450,8 +441,7 @@ linux_shmctl(struct linux_shmctl_args *args)
        linux_to_bsd_shmid_ds(&linux_shmid, bsd_args.buf);
        bsd_args.shmid = args->shmid;
        bsd_args.cmd = IPC_SET;
-       return shmctl(&bsd_args);
-
+       break;
     case LINUX_IPC_RMID:
        bsd_args.shmid = args->shmid;
        bsd_args.cmd = IPC_RMID;
@@ -464,8 +454,7 @@ linux_shmctl(struct linux_shmctl_args *args)
            bsd_args.buf = (struct shmid_ds*)stackgap_alloc(&sg, sizeof(struct shmid_ds));
            linux_to_bsd_shmid_ds(&linux_shmid, bsd_args.buf);
        }
-       return shmctl(&bsd_args);
-
+       break;
     case LINUX_IPC_INFO:
     case LINUX_SHM_STAT:
     case LINUX_SHM_INFO:
@@ -475,4 +464,7 @@ linux_shmctl(struct linux_shmctl_args *args)
        uprintf("linux: 'ipc' typ=%d not implemented\n", args->cmd);
        return EINVAL;
     }
+    error = shmctl(&bsd_args);
+    args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+    return(error);
 }
index c4f92d4..19f1573 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_ipc.h,v 1.2.2.4 2001/11/05 19:08:22 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_ipc.h,v 1.3 2003/06/23 17:55:26 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_ipc.h,v 1.4 2003/07/26 18:12:40 dillon Exp $
  */
 
 #ifndef _LINUX_IPC_H_
@@ -36,6 +36,7 @@
 
 struct linux_msgctl_args 
 {
+       struct lwkt_msg lmsg;
        l_int           msqid;
        l_int           cmd;
        struct l_msqid_ds *buf;
@@ -43,12 +44,14 @@ struct linux_msgctl_args
 
 struct linux_msgget_args
 {
+       struct lwkt_msg lmsg;
        l_key_t         key;
        l_int           msgflg;
 };
 
 struct linux_msgrcv_args
 {
+       struct lwkt_msg lmsg;
        l_int           msqid;
        struct l_msgbuf *msgp;
        l_size_t        msgsz;
@@ -58,6 +61,7 @@ struct linux_msgrcv_args
 
 struct linux_msgsnd_args
 {
+       struct lwkt_msg lmsg;
        l_int           msqid;
        struct l_msgbuf *msgp;
        l_size_t        msgsz;
@@ -66,6 +70,7 @@ struct linux_msgsnd_args
 
 struct linux_semctl_args
 {
+       struct lwkt_msg lmsg;
        l_int           semid;
        l_int           semnum;
        l_int           cmd;
@@ -74,6 +79,7 @@ struct linux_semctl_args
 
 struct linux_semget_args
 {
+       struct lwkt_msg lmsg;
        l_key_t         key;
        l_int           nsems;
        l_int           semflg;
@@ -81,6 +87,7 @@ struct linux_semget_args
 
 struct linux_semop_args
 {
+       struct lwkt_msg lmsg;
        l_int           semid;
        struct l_sembuf *tsops;
        l_uint          nsops;
@@ -88,6 +95,7 @@ struct linux_semop_args
 
 struct linux_shmat_args
 {
+       struct lwkt_msg lmsg;
        l_int           shmid;
        char            *shmaddr;
        l_int           shmflg;
@@ -96,6 +104,7 @@ struct linux_shmat_args
 
 struct linux_shmctl_args
 {
+       struct lwkt_msg lmsg;
        l_int           shmid;
        l_int           cmd;
        struct l_shmid_ds *buf;
@@ -103,11 +112,13 @@ struct linux_shmctl_args
 
 struct linux_shmdt_args
 {
+       struct lwkt_msg lmsg;
        char *shmaddr;
 };
 
 struct linux_shmget_args
 {
+       struct lwkt_msg lmsg;
        l_key_t         key;
        l_size_t        size;
        l_int           shmflg;
index 0f3cc33..b18d1aa 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.85.2.9 2002/09/24 08:11:41 mdodd Exp $
- * $DragonFly: src/sys/emulation/linux/linux_misc.c,v 1.6 2003/07/03 17:23:59 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_misc.c,v 1.7 2003/07/26 18:12:40 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -202,7 +202,7 @@ linux_alarm(struct linux_alarm_args *args)
                timevalsub(&old_it.it_value, &tv);
                if (old_it.it_value.tv_usec != 0)
                        old_it.it_value.tv_sec++;
-               p->p_retval[0] = old_it.it_value.tv_sec;
+               args->lmsg.u.ms_result = old_it.it_value.tv_sec;
        }
        return 0;
 }
@@ -215,9 +215,7 @@ linux_brk(struct linux_brk_args *args)
        struct proc *p = td->td_proc;
        struct vmspace *vm;
        vm_offset_t new, old;
-       struct obreak_args /* {
-               char * nsize;
-       } */ tmp;
+       struct obreak_args bsd_args;
 
        KKASSERT(p);
        vm = p->p_vmspace;
@@ -227,11 +225,13 @@ linux_brk(struct linux_brk_args *args)
 #endif
        old = (vm_offset_t)vm->vm_daddr + ctob(vm->vm_dsize);
        new = (vm_offset_t)args->dsend;
-       tmp.nsize = (char *) new;
-       if (((caddr_t)new > vm->vm_daddr) && !obreak(&tmp))
-               p->p_retval[0] = (long)new;
+       bsd_args.lmsg.u.ms_result = 0;
+       bsd_args.nsize = (char *) new;
+       bsd_args.lmsg.u.ms_result = 0;
+       if (((caddr_t)new > vm->vm_daddr) && !obreak(&bsd_args))
+               args->lmsg.u.ms_result = (long)new;
        else
-               p->p_retval[0] = (long)old;
+               args->lmsg.u.ms_result = (long)old;
 
        return 0;
 }
@@ -492,6 +492,7 @@ linux_select(struct linux_select_args *args)
 #endif
 
        error = 0;
+       bsa.lmsg.u.ms_result = 0;
        bsa.nd = args->nfds;
        bsa.in = args->readfds;
        bsa.ou = args->writefds;
@@ -535,6 +536,7 @@ linux_select(struct linux_select_args *args)
        }
 
        error = select(&bsa);
+       args->lmsg.u.ms_result = bsa.lmsg.u.ms_result;
 #ifdef DEBUG
        if (ldebug(select))
                printf(LMSG("real select returns %d"), error);
@@ -550,7 +552,7 @@ linux_select(struct linux_select_args *args)
        }
 
        if (args->timeout) {
-               if (p->p_retval[0]) {
+               if (args->lmsg.u.ms_result) {
                        /*
                         * Compute how much time was left of the timeout,
                         * by subtracting the current time and the time
@@ -586,10 +588,7 @@ int
 linux_mremap(struct linux_mremap_args *args)
 {
        struct thread *td = curthread;
-       struct munmap_args /* {
-               void *addr;
-               size_t len;
-       } */ bsd_args; 
+       struct munmap_args bsd_args; 
        int error = 0;
        struct proc *p = td->td_proc;
 
@@ -607,17 +606,18 @@ linux_mremap(struct linux_mremap_args *args)
        args->old_len = round_page(args->old_len);
 
        if (args->new_len > args->old_len) {
-               p->p_retval[0] = 0;
+               args->lmsg.u.ms_result = 0;
                return ENOMEM;
        }
 
        if (args->new_len < args->old_len) {
+               bsd_args.lmsg.u.ms_result = 0;
                bsd_args.addr = (caddr_t)(args->addr + args->new_len);
                bsd_args.len = args->old_len - args->new_len;
                error = munmap(&bsd_args);
        }
 
-       p->p_retval[0] = error ? 0 : (u_long)args->addr;
+       args->lmsg.u.ms_resultp = error ? NULL : (void *)args->addr;
        return error;
 }
 
@@ -629,12 +629,16 @@ int
 linux_msync(struct linux_msync_args *args)
 {
        struct msync_args bsd_args;
+       int error;
 
        bsd_args.addr = (caddr_t)args->addr;
        bsd_args.len = args->len;
        bsd_args.flags = args->fl & ~LINUX_MS_SYNC;
+       bsd_args.lmsg.u.ms_result = 0;
 
-       return msync(&bsd_args);
+       error = msync(&bsd_args);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 #ifndef __alpha__
@@ -658,7 +662,7 @@ linux_time(struct linux_time_args *args)
        tm = tv.tv_sec;
        if (args->tm && (error = copyout(&tm, (caddr_t)args->tm, sizeof(tm))))
                return error;
-       p->p_retval[0] = tm;
+       args->lmsg.u.ms_lresult = tm;
        return 0;
 }
 #endif /*!__alpha__*/
@@ -706,7 +710,7 @@ linux_times(struct linux_times_args *args)
                return error;
 
        microuptime(&tv);
-       p->p_retval[0] = (int)CONVTCK(tv);
+       args->lmsg.u.ms_result = (int)CONVTCK(tv);
        return 0;
 }
 
@@ -780,7 +784,10 @@ linux_utime(struct linux_utime_args *args)
                bsdutimes.tptr = NULL;
 
        bsdutimes.path = args->fname;
-       return utimes(&bsdutimes);
+       bsdutimes.lmsg.u.ms_result = 0;
+       error = utimes(&bsdutimes);
+       args->lmsg.u.ms_result = bsdutimes.lmsg.u.ms_result;
+       return(error);
 }
 #endif /* __i386__ */
 
@@ -790,12 +797,7 @@ linux_utime(struct linux_utime_args *args)
 int
 linux_waitpid(struct linux_waitpid_args *args)
 {
-       struct wait_args /* {
-               int pid;
-               int *status;
-               int options;
-               struct  rusage *rusage;
-       } */ tmp;
+       struct wait_args bsd_args;
        int error, tmpstat;
 
 #ifdef DEBUG
@@ -804,16 +806,18 @@ linux_waitpid(struct linux_waitpid_args *args)
                    args->pid, (void *)args->status, args->options);
 #endif
 
-       tmp.pid = args->pid;
-       tmp.status = args->status;
-       tmp.options = (args->options & (WNOHANG | WUNTRACED));
+       bsd_args.lmsg.u.ms_result = 0;
+       bsd_args.pid = args->pid;
+       bsd_args.status = args->status;
+       bsd_args.options = (args->options & (WNOHANG | WUNTRACED));
        /* WLINUXCLONE should be equal to __WCLONE, but we make sure */
        if (args->options & __WCLONE)
-               tmp.options |= WLINUXCLONE;
-       tmp.rusage = NULL;
+               bsd_args.options |= WLINUXCLONE;
+       bsd_args.rusage = NULL;
 
-       if ((error = wait4(&tmp)) != 0)
+       if ((error = wait4(&bsd_args)) != 0)
                return error;
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
 
        if (args->status) {
                if ((error = copyin((caddr_t)args->status, &tmpstat,
@@ -838,12 +842,7 @@ linux_wait4(struct linux_wait4_args *args)
 {
        struct thread *td = curthread;
        struct proc *p = td->td_proc;
-       struct wait_args /* {
-               int pid;
-               int *status;
-               int options;
-               struct  rusage *rusage;
-       } */ tmp;
+       struct wait_args bsd_args;
        int error, tmpstat;
 
        KKASSERT(p);
@@ -855,16 +854,18 @@ linux_wait4(struct linux_wait4_args *args)
                    (void *)args->rusage);
 #endif
 
-       tmp.pid = args->pid;
-       tmp.status = args->status;
-       tmp.options = (args->options & (WNOHANG | WUNTRACED));
+       bsd_args.lmsg.u.ms_result = 0;
+       bsd_args.pid = args->pid;
+       bsd_args.status = args->status;
+       bsd_args.options = (args->options & (WNOHANG | WUNTRACED));
        /* WLINUXCLONE should be equal to __WCLONE, but we make sure */
        if (args->options & __WCLONE)
-               tmp.options |= WLINUXCLONE;
-       tmp.rusage = (struct rusage *)args->rusage;
+               bsd_args.options |= WLINUXCLONE;
+       bsd_args.rusage = (struct rusage *)args->rusage;
 
-       if ((error = wait4(&tmp)) != 0)
+       if ((error = wait4(&bsd_args)) != 0)
                return error;
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
 
        SIGDELSET(p->p_siglist, SIGCHLD);
 
@@ -888,6 +889,7 @@ linux_wait4(struct linux_wait4_args *args)
 int
 linux_mknod(struct linux_mknod_args *args)
 {
+       int error;
        caddr_t sg;
        struct mknod_args bsd_mknod;
        struct mkfifo_args bsd_mkfifo;
@@ -905,13 +907,18 @@ linux_mknod(struct linux_mknod_args *args)
        if (args->mode & S_IFIFO) {
                bsd_mkfifo.path = args->path;
                bsd_mkfifo.mode = args->mode;
-               return mkfifo(&bsd_mkfifo);
+               bsd_mkfifo.lmsg.u.ms_result = 0;
+               error = mkfifo(&bsd_mkfifo);
+               args->lmsg.u.ms_result = bsd_mkfifo.lmsg.u.ms_result;
        } else {
                bsd_mknod.path = args->path;
                bsd_mknod.mode = args->mode;
                bsd_mknod.dev = args->dev;
-               return mknod(&bsd_mknod);
+               bsd_mknod.lmsg.u.ms_result = 0;
+               error = mknod(&bsd_mknod);
+               args->lmsg.u.ms_result = bsd_mknod.lmsg.u.ms_result;
        }
+       return(error);
 }
 
 /*
@@ -934,7 +941,7 @@ linux_personality(struct linux_personality_args *args)
 #endif
 
        /* Yes Jim, it's still a Linux... */
-       p->p_retval[0] = 0;
+       args->lmsg.u.ms_result = 0;
        return 0;
 }
 
@@ -956,6 +963,7 @@ linux_setitimer(struct linux_setitimer_args *args)
        bsa.which = args->which;
        bsa.itv = (struct itimerval *)args->itv;
        bsa.oitv = (struct itimerval *)args->oitv;
+       bsa.lmsg.u.ms_result = 0;
        if (args->itv) {
            if ((error = copyin((caddr_t)args->itv, &foo, sizeof(foo))))
                return error;
@@ -968,20 +976,26 @@ linux_setitimer(struct linux_setitimer_args *args)
            }
 #endif
        }
-       return setitimer(&bsa);
+       error = setitimer(&bsa);
+       args->lmsg.u.ms_result = bsa.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_getitimer(struct linux_getitimer_args *args)
 {
        struct getitimer_args bsa;
+       int error;
 #ifdef DEBUG
        if (ldebug(getitimer))
                printf(ARGS(getitimer, "%p"), (void *)args->itv);
 #endif
        bsa.which = args->which;
        bsa.itv = (struct itimerval *)args->itv;
-       return getitimer(&bsa);
+       bsa.lmsg.u.ms_result = 0;
+       error = getitimer(&bsa);
+       args->lmsg.u.ms_result = bsa.lmsg.u.ms_result;
+       return(error);
 }
 
 #ifndef __alpha__
@@ -989,11 +1003,15 @@ int
 linux_nice(struct linux_nice_args *args)
 {
        struct setpriority_args bsd_args;
+       int error;
 
        bsd_args.which = PRIO_PROCESS;
        bsd_args.who = 0;       /* current process */
        bsd_args.prio = args->inc;
-       return setpriority(&bsd_args);
+       bsd_args.lmsg.u.ms_result = 0;
+       error = setpriority(&bsd_args);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 #endif /*!__alpha__*/
 
@@ -1072,7 +1090,7 @@ linux_getgroups(struct linux_getgroups_args *args)
         */
 
        if ((ngrp = args->gidsetsize) == 0) {
-               p->p_retval[0] = bsd_gidsetsz;
+               args->lmsg.u.ms_result = bsd_gidsetsz;
                return (0);
        }
 
@@ -1089,7 +1107,7 @@ linux_getgroups(struct linux_getgroups_args *args)
            ngrp * sizeof(l_gid_t))))
                return (error);
 
-       p->p_retval[0] = ngrp;
+       args->lmsg.u.ms_result = ngrp;
        return (0);
 }
 
@@ -1122,7 +1140,10 @@ linux_setrlimit(struct linux_setrlimit_args *args)
        bsd.rlp = stackgap_alloc(&sg, sizeof(struct rlimit));
        bsd.rlp->rlim_cur = (rlim_t)rlim.rlim_cur;
        bsd.rlp->rlim_max = (rlim_t)rlim.rlim_max;
-       return (setrlimit(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+       error = setrlimit(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -1147,10 +1168,11 @@ linux_old_getrlimit(struct linux_old_getrlimit_args *args)
                return (EINVAL);
 
        bsd.rlp = stackgap_alloc(&sg, sizeof(struct rlimit));
+       bsd.lmsg.u.ms_result = 0;
        error = getrlimit(&bsd);
        if (error)
                return (error);
-
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
        rlim.rlim_cur = (unsigned long)bsd.rlp->rlim_cur;
        if (rlim.rlim_cur == ULONG_MAX)
                rlim.rlim_cur = LONG_MAX;
@@ -1182,9 +1204,11 @@ linux_getrlimit(struct linux_getrlimit_args *args)
                return (EINVAL);
 
        bsd.rlp = stackgap_alloc(&sg, sizeof(struct rlimit));
+       bsd.lmsg.u.ms_result = 0;
        error = getrlimit(&bsd);
        if (error)
                return (error);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
 
        rlim.rlim_cur = (l_ulong)bsd.rlp->rlim_cur;
        rlim.rlim_max = (l_ulong)bsd.rlp->rlim_max;
@@ -1196,6 +1220,7 @@ int
 linux_sched_setscheduler(struct linux_sched_setscheduler_args *args)
 {
        struct sched_setscheduler_args bsd;
+       int error;
 
 #ifdef DEBUG
        if (ldebug(sched_setscheduler))
@@ -1219,7 +1244,11 @@ linux_sched_setscheduler(struct linux_sched_setscheduler_args *args)
 
        bsd.pid = args->pid;
        bsd.param = (struct sched_param *)args->param;
-       return sched_setscheduler(&bsd);
+       bsd.lmsg.u.ms_result = 0;
+
+       error = sched_setscheduler(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -1237,21 +1266,22 @@ linux_sched_getscheduler(struct linux_sched_getscheduler_args *args)
                printf(ARGS(sched_getscheduler, "%d"), args->pid);
 #endif
 
+       bsd.lmsg.u.ms_result = 0;
        bsd.pid = args->pid;
        error = sched_getscheduler(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
 
-       switch (p->p_retval[0]) {
+       switch (args->lmsg.u.ms_result) {
        case SCHED_OTHER:
-               p->p_retval[0] = LINUX_SCHED_OTHER;
+               args->lmsg.u.ms_result = LINUX_SCHED_OTHER;
                break;
        case SCHED_FIFO:
-               p->p_retval[0] = LINUX_SCHED_FIFO;
+               args->lmsg.u.ms_result = LINUX_SCHED_FIFO;
                break;
        case SCHED_RR:
-               p->p_retval[0] = LINUX_SCHED_RR;
+               args->lmsg.u.ms_result = LINUX_SCHED_RR;
                break;
        }
-
        return error;
 }
 
@@ -1259,6 +1289,7 @@ int
 linux_sched_get_priority_max(struct linux_sched_get_priority_max_args *args)
 {
        struct sched_get_priority_max_args bsd;
+       int error;
 
 #ifdef DEBUG
        if (ldebug(sched_get_priority_max))
@@ -1278,13 +1309,18 @@ linux_sched_get_priority_max(struct linux_sched_get_priority_max_args *args)
        default:
                return EINVAL;
        }
-       return sched_get_priority_max(&bsd);
+       bsd.lmsg.u.ms_result = 0;
+
+       error = sched_get_priority_max(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_sched_get_priority_min(struct linux_sched_get_priority_min_args *args)
 {
        struct sched_get_priority_min_args bsd;
+       int error;
 
 #ifdef DEBUG
        if (ldebug(sched_get_priority_min))
@@ -1304,7 +1340,11 @@ linux_sched_get_priority_min(struct linux_sched_get_priority_min_args *args)
        default:
                return EINVAL;
        }
-       return sched_get_priority_min(&bsd);
+       bsd.lmsg.u.ms_result = 0;
+
+       error = sched_get_priority_min(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 #define REBOOT_CAD_ON  0x89abcdef
@@ -1315,6 +1355,7 @@ int
 linux_reboot(struct linux_reboot_args *args)
 {
        struct reboot_args bsd_args;
+       int error;
 
 #ifdef DEBUG
        if (ldebug(reboot))
@@ -1323,7 +1364,11 @@ linux_reboot(struct linux_reboot_args *args)
        if (args->cmd == REBOOT_CAD_ON || args->cmd == REBOOT_CAD_OFF)
                return (0);
        bsd_args.opt = (args->cmd == REBOOT_HALT) ? RB_HALT : 0;
-       return (reboot(&bsd_args));
+       bsd_args.lmsg.u.ms_result = 0;
+
+       error = reboot(&bsd_args);
+       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 #ifndef __alpha__
@@ -1348,7 +1393,7 @@ linux_getpid(struct linux_getpid_args *args)
 
        KKASSERT(p);
 
-       p->p_retval[0] = p->p_pid;
+       args->lmsg.u.ms_result = p->p_pid;
        return (0);
 }
 
@@ -1360,7 +1405,7 @@ linux_getgid(struct linux_getgid_args *args)
 
        KKASSERT(p);
 
-       p->p_retval[0] = p->p_ucred->cr_rgid;
+       args->lmsg.u.ms_result = p->p_ucred->cr_rgid;
        return (0);
 }
 
@@ -1372,7 +1417,7 @@ linux_getuid(struct linux_getuid_args *args)
 
        KKASSERT(p);
 
-       p->p_retval[0] = p->p_ucred->cr_ruid;
+       args->lmsg.u.ms_result = p->p_ucred->cr_ruid;
        return (0);
 }
 
@@ -1382,6 +1427,12 @@ int
 linux_getsid(struct linux_getsid_args *args)
 {
        struct getsid_args bsd;
+       int error;
+
+       bsd.lmsg.u.ms_result = 0;
        bsd.pid = args->pid;
-       return getsid(&bsd);
+       error = getsid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
+
index a5c4339..c5b0a0a 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_signal.c,v 1.23.2.3 2001/11/05 19:08:23 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_signal.c,v 1.3 2003/06/23 17:55:26 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_signal.c,v 1.4 2003/07/26 18:12:40 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -132,7 +132,7 @@ bsd_to_linux_sigaction(struct sigaction *bsa, l_sigaction_t *lsa)
 
 int
 linux_do_sigaction(int linux_sig, l_sigaction_t *linux_nsa,
-                  l_sigaction_t *linux_osa)
+                  l_sigaction_t *linux_osa, int *res)
 {
        struct sigaction *nsa, *osa;
        struct sigaction_args sa_args;
@@ -163,9 +163,11 @@ linux_do_sigaction(int linux_sig, l_sigaction_t *linux_nsa,
 
        sa_args.act = nsa;
        sa_args.oact = osa;
+       sa_args.lmsg.u.ms_result = 0;
        error = sigaction(&sa_args);
        if (error)
                return (error);
+       *res = sa_args.lmsg.u.ms_result;
 
        if (linux_osa != NULL)
                bsd_to_linux_sigaction(osa, linux_osa);
@@ -178,9 +180,9 @@ linux_do_sigaction(int linux_sig, l_sigaction_t *linux_nsa,
 int
 linux_signal(struct linux_signal_args *args)
 {
-       struct proc *p = curproc;
        l_sigaction_t nsa, osa;
        int error;
+       int dummy;
 
 #ifdef DEBUG
        if (ldebug(signal))
@@ -192,8 +194,8 @@ linux_signal(struct linux_signal_args *args)
        nsa.lsa_flags = LINUX_SA_ONESHOT | LINUX_SA_NOMASK;
        LINUX_SIGEMPTYSET(nsa.lsa_mask);
 
-       error = linux_do_sigaction(args->sig, &nsa, &osa);
-       p->p_retval[0] = (int)osa.lsa_handler;
+       error = linux_do_sigaction(args->sig, &nsa, &osa, &dummy);
+       args->lmsg.u.ms_result = (int)osa.lsa_handler;
 
        return (error);
 }
@@ -223,7 +225,8 @@ linux_rt_sigaction(struct linux_rt_sigaction_args *args)
 
        error = linux_do_sigaction(args->sig,
                                   args->act ? &nsa : NULL,
-                                  args->oact ? &osa : NULL);
+                                  args->oact ? &osa : NULL,
+                                  &args->lmsg.u.ms_result);
 
        if (args->oact != NULL && !error) {
                error = copyout(&osa, args->oact, sizeof(l_sigaction_t));
@@ -233,14 +236,14 @@ linux_rt_sigaction(struct linux_rt_sigaction_args *args)
 }
 
 static int
-linux_do_sigprocmask(int how, l_sigset_t *new, l_sigset_t *old)
+linux_do_sigprocmask(int how, l_sigset_t *new, l_sigset_t *old, int *res)
 {
        struct proc *p = curproc;
        int error;
        sigset_t mask;
 
        error = 0;
-       p->p_retval[0] = 0;
+       *res = 0;
 
        if (old != NULL)
                bsd_to_linux_sigset(&p->p_sigmask, old);
@@ -292,7 +295,8 @@ linux_sigprocmask(struct linux_sigprocmask_args *args)
 
        error = linux_do_sigprocmask(args->how,
                                     args->mask ? &set : NULL,
-                                    args->omask ? &oset : NULL);
+                                    args->omask ? &oset : NULL,
+                                    &args->lmsg.u.ms_result);
 
        if (args->omask != NULL && !error) {
                mask = oset.__bits[0];
@@ -327,7 +331,8 @@ linux_rt_sigprocmask(struct linux_rt_sigprocmask_args *args)
 
        error = linux_do_sigprocmask(args->how,
                                     args->mask ? &set : NULL,
-                                    args->omask ? &oset : NULL);
+                                    args->omask ? &oset : NULL,
+                                    &args->lmsg.u.ms_result);
 
        if (args->omask != NULL && !error) {
                error = copyout(&oset, args->omask, sizeof(l_sigset_t));
@@ -349,7 +354,7 @@ linux_sgetmask(struct linux_sgetmask_args *args)
 #endif
 
        bsd_to_linux_sigset(&p->p_sigmask, &mask);
-       p->p_retval[0] = mask.__bits[0];
+       args->lmsg.u.ms_result = mask.__bits[0];
        return (0);
 }
 
@@ -366,7 +371,7 @@ linux_ssetmask(struct linux_ssetmask_args *args)
 #endif
 
        bsd_to_linux_sigset(&p->p_sigmask, &lset);
-       p->p_retval[0] = lset.__bits[0];
+       args->lmsg.u.ms_result = lset.__bits[0];
        LINUX_SIGEMPTYSET(lset);
        lset.__bits[0] = args->mask;
        linux_to_bsd_sigset(&lset, &bset);
@@ -399,10 +404,8 @@ linux_sigpending(struct linux_sigpending_args *args)
 int
 linux_kill(struct linux_kill_args *args)
 {
-       struct kill_args /* {
-           int pid;
-           int signum;
-       } */ tmp;
+       struct kill_args ka;
+       int error;
 
 #ifdef DEBUG
        if (ldebug(kill))
@@ -417,11 +420,15 @@ linux_kill(struct linux_kill_args *args)
 
 #ifndef __alpha__
        if (args->signum > 0 && args->signum <= LINUX_SIGTBLSZ)
-               tmp.signum = linux_to_bsd_signal[_SIG_IDX(args->signum)];
+               ka.signum = linux_to_bsd_signal[_SIG_IDX(args->signum)];
        else
 #endif
-               tmp.signum = args->signum;
+               ka.signum = args->signum;
 
-       tmp.pid = args->pid;
-       return (kill(&tmp));
+       ka.pid = args->pid;
+       ka.lmsg.u.ms_result = 0;
+       error = kill(&ka);
+       args->lmsg.u.ms_result = ka.lmsg.u.ms_result;
+       return(error);
 }
+
index 65c7e6c..9afbe31 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_signal.h,v 1.2.2.3 2001/11/05 19:08:23 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_signal.h,v 1.3 2003/06/23 17:55:26 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_signal.h,v 1.4 2003/07/26 18:12:40 dillon Exp $
  */
 
 #ifndef _LINUX_SIGNAL_H_
@@ -34,6 +34,6 @@
 
 void linux_to_bsd_sigset __P((l_sigset_t *, sigset_t *));
 void bsd_to_linux_sigset __P((sigset_t *, l_sigset_t *));
-int linux_do_sigaction __P((int, l_sigaction_t *, l_sigaction_t *));
+int linux_do_sigaction __P((int, l_sigaction_t *, l_sigaction_t *, int *));
 
 #endif /* _LINUX_SIGNAL_H_ */
index 70f812c..3806523 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.19.2.8 2001/11/07 20:33:55 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_socket.c,v 1.4 2003/06/25 03:55:44 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_socket.c,v 1.5 2003/07/26 18:12:40 dillon Exp $
  */
 
 /* XXX we use functions that might not exist. */
@@ -235,8 +235,10 @@ linux_check_hdrincl(int s)
        bsd_args.name = IP_HDRINCL;
        bsd_args.val = val;
        bsd_args.avalsize = (int *)valsize;
+       bsd_args.lmsg.u.ms_result = 0;
        if ((error = getsockopt(&bsd_args)))
                return (error);
+       /* return value not used */
 
        if ((error = copyin(val, &optval, sizeof(optval))))
                return (error);
@@ -259,12 +261,11 @@ linux_sendto_hdrincl(struct sendto_args *bsd_args)
  */
 #define linux_ip_copysize      8
 
+       int error;
        caddr_t sg;
        struct ip *packet;
        struct msghdr *msg;
        struct iovec *iov;
-
-       int error;
        struct  sendmsg_args /* {
                int s;
                caddr_t msg;
@@ -310,7 +311,10 @@ linux_sendto_hdrincl(struct sendto_args *bsd_args)
        sendmsg_args.s = bsd_args->s;
        sendmsg_args.msg = (caddr_t)msg;
        sendmsg_args.flags = bsd_args->flags;
-       return (sendmsg(&sendmsg_args));
+       sendmsg_args.lmsg.u.ms_result = 0;
+       error = sendmsg(&sendmsg_args);
+       bsd_args->lmsg.u.ms_result = sendmsg_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_socket_args {
@@ -320,21 +324,17 @@ struct linux_socket_args {
 };
 
 static int
-linux_socket(struct linux_socket_args *args)
+linux_socket(struct linux_socket_args *args, int *res)
 {
-       struct proc *p = curproc;
        struct linux_socket_args linux_args;
-       struct socket_args /* {
-               int domain;
-               int type;
-               int protocol;
-       } */ bsd_args;
+       struct socket_args bsd_args;
        int error;
        int retval_socket;
 
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.protocol = linux_args.protocol;
        bsd_args.type = linux_args.type;
        bsd_args.domain = linux_to_bsd_domain(linux_args.domain);
@@ -342,6 +342,8 @@ linux_socket(struct linux_socket_args *args)
                return (EINVAL);
 
        retval_socket = socket(&bsd_args);
+       /* Copy back the return value from socket() */
+       *res = bsd_args.lmsg.u.ms_result;
        if (bsd_args.type == SOCK_RAW
            && (bsd_args.protocol == IPPROTO_RAW || bsd_args.protocol == 0)
            && bsd_args.domain == AF_INET
@@ -360,15 +362,13 @@ linux_socket(struct linux_socket_args *args)
                sg = stackgap_init();
                hdrincl = (int *)stackgap_alloc(&sg, sizeof(*hdrincl));
                *hdrincl = 1;
-               bsd_setsockopt_args.s = p->p_retval[0];
+               bsd_setsockopt_args.s = bsd_args.lmsg.u.ms_result;
                bsd_setsockopt_args.level = IPPROTO_IP;
                bsd_setsockopt_args.name = IP_HDRINCL;
                bsd_setsockopt_args.val = (caddr_t)hdrincl;
                bsd_setsockopt_args.valsize = sizeof(*hdrincl);
                /* We ignore any error returned by setsockopt() */
                setsockopt(&bsd_setsockopt_args);
-               /* Copy back the return value from socket() */
-               p->p_retval[0] = bsd_setsockopt_args.s;
        }
 
        return (retval_socket);
@@ -381,7 +381,7 @@ struct linux_bind_args {
 };
 
 static int
-linux_bind(struct linux_bind_args *args)
+linux_bind(struct linux_bind_args *args, int *res)
 {
        struct linux_bind_args linux_args;
        struct bind_args /* {
@@ -394,11 +394,14 @@ linux_bind(struct linux_bind_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.name = (caddr_t)linux_args.name;
        bsd_args.namelen = linux_to_bsd_namelen(bsd_args.name,
            linux_args.namelen);
-       return (bind(&bsd_args));
+       error = bind(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_connect_args {
@@ -406,11 +409,11 @@ struct linux_connect_args {
        struct sockaddr * name;
        int namelen;
 };
-int linux_connect(struct linux_connect_args *);
+int linux_connect(struct linux_connect_args *, int *res);
 #endif /* !__alpha__*/
 
 int
-linux_connect(struct linux_connect_args *args)
+linux_connect(struct linux_connect_args *args, int *res)
 {
        struct thread *td = curthread;  /* XXX */
        struct proc *p = td->td_proc;
@@ -433,11 +436,13 @@ linux_connect(struct linux_connect_args *args)
                return (error);
 #endif /* __alpha__ */
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.name = (caddr_t)linux_args.name;
        bsd_args.namelen = linux_to_bsd_namelen(bsd_args.name,
            linux_args.namelen);
        error = connect(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
        if (error != EISCONN)
                return (error);
 
@@ -468,7 +473,7 @@ struct linux_listen_args {
 };
 
 static int
-linux_listen(struct linux_listen_args *args)
+linux_listen(struct linux_listen_args *args, int *res)
 {
        struct linux_listen_args linux_args;
        struct listen_args /* {
@@ -480,9 +485,12 @@ linux_listen(struct linux_listen_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.backlog = linux_args.backlog;
-       return (listen(&bsd_args));
+       error = listen(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_accept_args {
@@ -492,9 +500,8 @@ struct linux_accept_args {
 };
 
 static int
-linux_accept(struct linux_accept_args *args)
+linux_accept(struct linux_accept_args *args, int *res)
 {
-       struct proc *p = curproc;
        struct linux_accept_args linux_args;
        struct accept_args /* {
                int s;
@@ -511,6 +518,7 @@ linux_accept(struct linux_accept_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.name = (caddr_t)linux_args.addr;
        bsd_args.anamelen = linux_args.namelen;
@@ -523,11 +531,10 @@ linux_accept(struct linux_accept_args *args)
         * accepted one, so we must clear the flags in the new descriptor.
         * Ignore any errors, because we already have an open fd.
         */
-       f_args.fd = p->p_retval[0];
+       f_args.fd = *res = bsd_args.lmsg.u.ms_result;
        f_args.cmd = F_SETFL;
        f_args.arg = 0;
        (void)fcntl(&f_args);
-       p->p_retval[0] = f_args.fd;
        return (0);
 }
 
@@ -538,7 +545,7 @@ struct linux_getsockname_args {
 };
 
 static int
-linux_getsockname(struct linux_getsockname_args *args)
+linux_getsockname(struct linux_getsockname_args *args, int *res)
 {
        struct linux_getsockname_args linux_args;
        struct getsockname_args /* {
@@ -551,10 +558,13 @@ linux_getsockname(struct linux_getsockname_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.fdes = linux_args.s;
        bsd_args.asa = (caddr_t) linux_args.addr;
        bsd_args.alen = linux_args.namelen;
-       return (ogetsockname(&bsd_args));
+       error = ogetsockname(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_getpeername_args {
@@ -564,7 +574,7 @@ struct linux_getpeername_args {
 };
 
 static int
-linux_getpeername(struct linux_getpeername_args *args)
+linux_getpeername(struct linux_getpeername_args *args, int *res)
 {
        struct linux_getpeername_args linux_args;
        struct ogetpeername_args /* {
@@ -577,10 +587,13 @@ linux_getpeername(struct linux_getpeername_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.fdes = linux_args.s;
        bsd_args.asa = (caddr_t) linux_args.addr;
        bsd_args.alen = linux_args.namelen;
-       return (ogetpeername(&bsd_args));
+       error = ogetpeername(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_socketpair_args {
@@ -591,7 +604,7 @@ struct linux_socketpair_args {
 };
 
 static int
-linux_socketpair(struct linux_socketpair_args *args)
+linux_socketpair(struct linux_socketpair_args *args, int *res)
 {
        struct linux_socketpair_args linux_args;
        struct socketpair_args /* {
@@ -609,10 +622,13 @@ linux_socketpair(struct linux_socketpair_args *args)
        if (bsd_args.domain == -1)
                return (EINVAL);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.type = linux_args.type;
        bsd_args.protocol = linux_args.protocol;
        bsd_args.rsv = linux_args.rsv;
-       return (socketpair(&bsd_args));
+       error = socketpair(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_send_args {
@@ -623,7 +639,7 @@ struct linux_send_args {
 };
 
 static int
-linux_send(struct linux_send_args *args)
+linux_send(struct linux_send_args *args, int *res)
 {
        struct linux_send_args linux_args;
        struct osend_args /* {
@@ -637,11 +653,14 @@ linux_send(struct linux_send_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.buf = linux_args.msg;
        bsd_args.len = linux_args.len;
        bsd_args.flags = linux_args.flags;
-       return (osend(&bsd_args));
+       error = osend(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_recv_args {
@@ -652,7 +671,7 @@ struct linux_recv_args {
 };
 
 static int
-linux_recv(struct linux_recv_args *args)
+linux_recv(struct linux_recv_args *args, int *res)
 {
        struct linux_recv_args linux_args;
        struct orecv_args /* {
@@ -666,11 +685,14 @@ linux_recv(struct linux_recv_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.buf = linux_args.msg;
        bsd_args.len = linux_args.len;
        bsd_args.flags = linux_args.flags;
-       return (orecv(&bsd_args));
+       error = orecv(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_sendto_args {
@@ -683,7 +705,7 @@ struct linux_sendto_args {
 };
 
 static int
-linux_sendto(struct linux_sendto_args *args)
+linux_sendto(struct linux_sendto_args *args, int *res)
 {
        struct linux_sendto_args linux_args;
        struct sendto_args /* {
@@ -699,6 +721,7 @@ linux_sendto(struct linux_sendto_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.buf = linux_args.msg;
        bsd_args.len = linux_args.len;
@@ -710,7 +733,9 @@ linux_sendto(struct linux_sendto_args *args)
                /* IP_HDRINCL set, tweak the packet before sending */
                return (linux_sendto_hdrincl(&bsd_args));
 
-       return (sendto(&bsd_args));
+       error = sendto(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_recvfrom_args {
@@ -723,7 +748,7 @@ struct linux_recvfrom_args {
 };
 
 static int
-linux_recvfrom(struct linux_recvfrom_args *args)
+linux_recvfrom(struct linux_recvfrom_args *args, int *res)
 {
        struct linux_recvfrom_args linux_args;
        struct recvfrom_args /* {
@@ -739,13 +764,16 @@ linux_recvfrom(struct linux_recvfrom_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.buf = linux_args.buf;
        bsd_args.len = linux_args.len;
        bsd_args.flags = linux_to_bsd_msg_flags(linux_args.flags);
        bsd_args.from = linux_args.from;
        bsd_args.fromlenaddr = linux_args.fromlen;
-       return (orecvfrom(&bsd_args));
+       error = orecvfrom(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_recvmsg_args {
@@ -755,7 +783,7 @@ struct linux_recvmsg_args {
 };
 
 static int
-linux_recvmsg(struct linux_recvmsg_args *args)
+linux_recvmsg(struct linux_recvmsg_args *args, int *res)
 {
        struct linux_recvmsg_args linux_args;
        struct recvmsg_args /* {
@@ -768,10 +796,13 @@ linux_recvmsg(struct linux_recvmsg_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.msg = linux_args.msg;
        bsd_args.flags = linux_to_bsd_msg_flags(linux_args.flags);
-       return (recvmsg(&bsd_args));
+       error = recvmsg(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_shutdown_args {
@@ -780,7 +811,7 @@ struct linux_shutdown_args {
 };
 
 static int
-linux_shutdown(struct linux_shutdown_args *args)
+linux_shutdown(struct linux_shutdown_args *args, int *res)
 {
        struct linux_shutdown_args linux_args;
        struct shutdown_args /* {
@@ -792,9 +823,12 @@ linux_shutdown(struct linux_shutdown_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.how = linux_args.how;
-       return (shutdown(&bsd_args));
+       error = shutdown(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_setsockopt_args {
@@ -806,7 +840,7 @@ struct linux_setsockopt_args {
 };
 
 static int
-linux_setsockopt(struct linux_setsockopt_args *args)
+linux_setsockopt(struct linux_setsockopt_args *args, int *res)
 {
        struct linux_setsockopt_args linux_args;
        struct setsockopt_args /* {
@@ -821,6 +855,7 @@ linux_setsockopt(struct linux_setsockopt_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.level = linux_to_bsd_sockopt_level(linux_args.level);
        switch (bsd_args.level) {
@@ -844,7 +879,9 @@ linux_setsockopt(struct linux_setsockopt_args *args)
        bsd_args.name = name;
        bsd_args.val = linux_args.optval;
        bsd_args.valsize = linux_args.optlen;
-       return (setsockopt(&bsd_args));
+       error = setsockopt(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 struct linux_getsockopt_args {
@@ -856,7 +893,7 @@ struct linux_getsockopt_args {
 };
 
 static int
-linux_getsockopt(struct linux_getsockopt_args *args)
+linux_getsockopt(struct linux_getsockopt_args *args, int *res)
 {
        struct linux_getsockopt_args linux_args;
        struct getsockopt_args /* {
@@ -871,6 +908,7 @@ linux_getsockopt(struct linux_getsockopt_args *args)
        if ((error = copyin(args, &linux_args, sizeof(linux_args))))
                return (error);
 
+       bsd_args.lmsg.u.ms_result = 0;
        bsd_args.s = linux_args.s;
        bsd_args.level = linux_to_bsd_sockopt_level(linux_args.level);
        switch (bsd_args.level) {
@@ -894,7 +932,9 @@ linux_getsockopt(struct linux_getsockopt_args *args)
        bsd_args.name = name;
        bsd_args.val = linux_args.optval;
        bsd_args.avalsize = linux_args.optlen;
-       return (getsockopt(&bsd_args));
+       error = getsockopt(&bsd_args);
+       *res = bsd_args.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -904,47 +944,46 @@ linux_socketcall(struct linux_socketcall_args *args)
 
        switch (args->what) {
        case LINUX_SOCKET:
-               return (linux_socket(arg));
+               return (linux_socket(arg, &args->lmsg.u.ms_result));
        case LINUX_BIND:
-               return (linux_bind(arg));
+               return (linux_bind(arg, &args->lmsg.u.ms_result));
        case LINUX_CONNECT:
-               return (linux_connect(arg));
+               return (linux_connect(arg, &args->lmsg.u.ms_result));
        case LINUX_LISTEN:
-               return (linux_listen(arg));
+               return (linux_listen(arg, &args->lmsg.u.ms_result));
        case LINUX_ACCEPT:
-               return (linux_accept(arg));
+               return (linux_accept(arg, &args->lmsg.u.ms_result));
        case LINUX_GETSOCKNAME:
-               return (linux_getsockname(arg));
+               return (linux_getsockname(arg, &args->lmsg.u.ms_result));
        case LINUX_GETPEERNAME:
-               return (linux_getpeername(arg));
+               return (linux_getpeername(arg, &args->lmsg.u.ms_result));
        case LINUX_SOCKETPAIR:
-               return (linux_socketpair(arg));
+               return (linux_socketpair(arg, &args->lmsg.u.ms_result));
        case LINUX_SEND:
-               return (linux_send(arg));
+               return (linux_send(arg, &args->lmsg.u.ms_result));
        case LINUX_RECV:
-               return (linux_recv(arg));
+               return (linux_recv(arg, &args->lmsg.u.ms_result));
        case LINUX_SENDTO:
-               return (linux_sendto(arg));
+               return (linux_sendto(arg, &args->lmsg.u.ms_result));
        case LINUX_RECVFROM:
-               return (linux_recvfrom(arg));
+               return (linux_recvfrom(arg, &args->lmsg.u.ms_result));
        case LINUX_SHUTDOWN:
-               return (linux_shutdown(arg));
+               return (linux_shutdown(arg, &args->lmsg.u.ms_result));
        case LINUX_SETSOCKOPT:
-               return (linux_setsockopt(arg));
+               return (linux_setsockopt(arg, &args->lmsg.u.ms_result));
        case LINUX_GETSOCKOPT:
-               return (linux_getsockopt(arg));
+               return (linux_getsockopt(arg, &args->lmsg.u.ms_result));
        case LINUX_SENDMSG:
                do {
                        int error;
                        int level;
                        caddr_t control;
-                       struct {
-                               int s;
-                               const struct msghdr *msg;
-                               int flags;
-                       } *uap = arg;
+                       struct sendmsg_args bsd_args; 
 
-                       error = copyin(&uap->msg->msg_control, &control,
+                       error = copyin(arg, &bsd_args.s, sizeof(bsd_args) - offsetof(struct sendmsg_args, s));
+                       if (error)
+                               return (error);
+                       error = copyin(&((struct msghdr *)bsd_args.msg)->msg_control, &control,
                            sizeof(caddr_t));
                        if (error)
                                return (error);
@@ -970,10 +1009,13 @@ linux_socketcall(struct linux_socketcall_args *args)
                                        return (error);
                        }
                done:
-                       return (sendmsg(arg));
+                       bsd_args.lmsg.u.ms_result = 0;
+                       error = sendmsg(&bsd_args);
+                       args->lmsg.u.ms_result = bsd_args.lmsg.u.ms_result;
+                       return(error);
                } while (0);
        case LINUX_RECVMSG:
-               return (linux_recvmsg(arg));
+               return (linux_recvmsg(arg, &args->lmsg.u.ms_result));
        }
 
        uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what);
index 6147b6b..fdb4a44 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_uid16.c,v 1.4.2.1 2001/10/21 03:57:35 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_uid16.c,v 1.4 2003/06/25 03:55:44 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_uid16.c,v 1.5 2003/07/26 18:12:40 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -50,6 +50,7 @@ linux_chown16(struct linux_chown16_args *args)
 {
        struct chown_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -63,7 +64,10 @@ linux_chown16(struct linux_chown16_args *args)
        bsd.path = args->path;
        bsd.uid = CAST_NOCHG(args->uid);
        bsd.gid = CAST_NOCHG(args->gid);
-       return (chown(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+       error = chown(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -71,6 +75,7 @@ linux_lchown16(struct linux_lchown16_args *args)
 {
        struct lchown_args bsd;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, args->path);
@@ -84,7 +89,11 @@ linux_lchown16(struct linux_lchown16_args *args)
        bsd.path = args->path;
        bsd.uid = CAST_NOCHG(args->uid);
        bsd.gid = CAST_NOCHG(args->gid);
-       return (lchown(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = lchown(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -166,7 +175,7 @@ linux_getgroups16(struct linux_getgroups16_args *args)
         */
 
        if ((ngrp = args->gidsetsize) == 0) {
-               p->p_retval[0] = bsd_gidsetsz;
+               args->lmsg.u.ms_result = bsd_gidsetsz;
                return (0);
        }
 
@@ -184,7 +193,7 @@ linux_getgroups16(struct linux_getgroups16_args *args)
        if (error)
                return (error);
 
-       p->p_retval[0] = ngrp;
+       args->lmsg.u.ms_result = ngrp;
        return (0);
 }
 
@@ -204,7 +213,7 @@ linux_getgid16(struct linux_getgid16_args *args)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_ucred->cr_rgid;
+       args->lmsg.u.ms_result = p->p_ucred->cr_rgid;
        return (0);
 }
 
@@ -213,7 +222,7 @@ linux_getuid16(struct linux_getuid16_args *args)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_ucred->cr_ruid;
+       args->lmsg.u.ms_result = p->p_ucred->cr_ruid;
        return (0);
 }
 
@@ -221,74 +230,115 @@ int
 linux_getegid16(struct linux_getegid16_args *args)
 {
        struct getegid_args bsd;
+       int error;
+
+       bsd.lmsg.u.ms_result = 0;
 
-       return (getegid(&bsd));
+       error = getegid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_geteuid16(struct linux_geteuid16_args *args)
 {
        struct geteuid_args bsd;
+       int error;
+
+       bsd.lmsg.u.ms_result = 0;
 
-       return (geteuid(&bsd));
+       error = geteuid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_setgid16(struct linux_setgid16_args *args)
 {
        struct setgid_args bsd;
+       int error;
 
        bsd.gid = args->gid;
-       return (setgid(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = setgid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_setuid16(struct linux_setuid16_args *args)
 {
        struct setuid_args bsd;
+       int error;
 
        bsd.uid = args->uid;
-       return (setuid(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = setuid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_setregid16(struct linux_setregid16_args *args)
 {
        struct setregid_args bsd;
+       int error;
 
        bsd.rgid = CAST_NOCHG(args->rgid);
        bsd.egid = CAST_NOCHG(args->egid);
-       return (setregid(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = setregid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_setreuid16(struct linux_setreuid16_args *args)
 {
        struct setreuid_args bsd;
+       int error;
 
        bsd.ruid = CAST_NOCHG(args->ruid);
        bsd.euid = CAST_NOCHG(args->euid);
-       return (setreuid(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = setreuid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_setresgid16(struct linux_setresgid16_args *args)
 {
        struct setresgid_args bsd;
+       int error;
 
        bsd.rgid = CAST_NOCHG(args->rgid);
        bsd.egid = CAST_NOCHG(args->egid);
        bsd.sgid = CAST_NOCHG(args->sgid);
-       return (setresgid(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = setresgid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 linux_setresuid16(struct linux_setresuid16_args *args)
 {
        struct setresuid_args bsd;
+       int error;
 
        bsd.ruid = CAST_NOCHG(args->ruid);
        bsd.euid = CAST_NOCHG(args->euid);
        bsd.suid = CAST_NOCHG(args->suid);
-       return (setresuid(&bsd));
+       bsd.lmsg.u.ms_result = 0;
+
+       error = setresuid(&bsd);
+       args->lmsg.u.ms_result = bsd.lmsg.u.ms_result;
+       return(error);
 }
+
index 676f773..3fe87a5 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/posix4/p1003_1b.c,v 1.5.2.2 2003/03/25 06:13:35 rwatson Exp $
- * $DragonFly: src/sys/emulation/posix4/Attic/p1003_1b.c,v 1.3 2003/06/23 17:55:49 dillon Exp $
+ * $DragonFly: src/sys/emulation/posix4/Attic/p1003_1b.c,v 1.4 2003/07/26 18:12:45 dillon Exp $
  */
 
 /* p1003_1b: Real Time common code.
@@ -169,7 +169,7 @@ sched_setparam(struct sched_setparam_args *uap)
        copyin(uap->param, &sched_param, sizeof(sched_param));
 
        if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
-               e = ksched_setparam(&p->p_retval[0], ksched, p,
+               e = ksched_setparam(&uap->lmsg.u.ms_result, ksched, p,
                    (const struct sched_param *)&sched_param);
        }
        return e;
@@ -191,7 +191,7 @@ sched_getparam(struct sched_getparam_args *uap)
                targetp = p;
        }
  
-       e = ksched_getparam(&p->p_retval[0], ksched, targetp, &sched_param);
+       e = ksched_getparam(&uap->lmsg.u.ms_result, ksched, targetp, &sched_param);
 
        if (!e)
                copyout(&sched_param, uap->param, sizeof(sched_param));
@@ -209,7 +209,7 @@ sched_setscheduler(struct sched_setscheduler_args *uap)
        copyin(uap->param, &sched_param, sizeof(sched_param));
 
        if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
-               e = ksched_setscheduler(&p->p_retval[0], ksched, p,
+               e = ksched_setscheduler(&uap->lmsg.u.ms_result, ksched, p,
                    uap->policy, (const struct sched_param *)&sched_param);
        }
        return e;
@@ -230,7 +230,7 @@ sched_getscheduler(struct sched_getscheduler_args *uap)
                targetp = p;
        }
  
-       e = ksched_getscheduler(&p->p_retval[0], ksched, targetp);
+       e = ksched_getscheduler(&uap->lmsg.u.ms_result, ksched, targetp);
 
        return e;
 }
@@ -238,22 +238,19 @@ sched_getscheduler(struct sched_getscheduler_args *uap)
 int
 sched_yield(struct sched_yield_args *uap)
 {
-       struct proc *p = curproc;
-       return ksched_yield(&p->p_retval[0], ksched);
+       return ksched_yield(&uap->lmsg.u.ms_result, ksched);
 }
 
 int
 sched_get_priority_max(struct sched_get_priority_max_args *uap)
 {
-       struct proc *p = curproc;
-       return ksched_get_priority_max(&p->p_retval[0], ksched, uap->policy);
+       return ksched_get_priority_max(&uap->lmsg.u.ms_result, ksched, uap->policy);
 }
 
 int
 sched_get_priority_min(struct sched_get_priority_min_args *uap)
 {
-       struct proc *p = curproc;
-       return ksched_get_priority_min(&p->p_retval[0], ksched, uap->policy);
+       return ksched_get_priority_min(&uap->lmsg.u.ms_result, ksched, uap->policy);
 }
 
 int
@@ -263,7 +260,7 @@ sched_rr_get_interval(struct sched_rr_get_interval_args *uap)
        struct proc *p = curproc;
 
        if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
-           e = ksched_rr_get_interval(&p->p_retval[0], ksched,
+           e = ksched_rr_get_interval(&uap->lmsg.u.ms_result, ksched,
                    p, uap->interval);
        }
        return e;
index 60d1d9b..7cbac10 100644 (file)
@@ -29,7 +29,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_fcntl.c,v 1.7 1999/12/12 10:27:04 newton Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_fcntl.c,v 1.6 2003/06/26 05:55:19 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_fcntl.c,v 1.7 2003/07/26 18:12:46 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -57,7 +57,7 @@
 static int svr4_to_bsd_flags __P((int));
 static u_long svr4_to_bsd_cmd __P((u_long));
 static int fd_revoke __P((struct thread *, int));
-static int fd_truncate __P((struct thread *, int, struct flock *));
+static int fd_truncate __P((struct thread *, int, struct flock *, int *));
 static int bsd_to_svr4_flags __P((int));
 static void bsd_to_svr4_flock __P((struct flock *, struct svr4_flock *));
 static void svr4_to_bsd_flock __P((struct svr4_flock *, struct flock *));
@@ -250,12 +250,11 @@ fd_revoke(struct thread *td, int fd)
        struct file *fp;
        struct vnode *vp;
        struct vattr vattr;
-       int error, *retval;
+       int error;
 
        KKASSERT(p);
 
        fdp = p->p_fd;
-       retval = p->p_retval;
        if ((u_int)fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL)
                return EBADF;
 
@@ -285,7 +284,7 @@ out:
 
 
 static int
-fd_truncate(struct thread *td, int fd, struct flock *flp)
+fd_truncate(struct thread *td, int fd, struct flock *flp, int *retval)
 {
        struct proc *p = td->td_proc;
        struct filedesc *fdp;
@@ -293,12 +292,11 @@ fd_truncate(struct thread *td, int fd, struct flock *flp)
        off_t start, length;
        struct vnode *vp;
        struct vattr vattr;
-       int error, *retval;
+       int error;
        struct ftruncate_args ft;
 
        KKASSERT(p);
        fdp = p->p_fd;
-       retval = p->p_retval;
 
        /*
         * We only support truncating the file.
@@ -339,8 +337,9 @@ fd_truncate(struct thread *td, int fd, struct flock *flp)
 
        SCARG(&ft, fd) = fd;
        SCARG(&ft, length) = start;
-
-       return ftruncate(&ft);
+       error = ftruncate(&ft);
+       *retval = ft.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -354,9 +353,10 @@ svr4_sys_open(struct svr4_sys_open_args *uap)
        caddr_t sg = stackgap_init();
        CHECKALTEXIST(&sg, SCARG(uap, path));
 
-       (&cup)->path = uap->path;
-       (&cup)->flags = svr4_to_bsd_flags(uap->flags);
-       (&cup)->mode = uap->mode;
+       cup.lmsg.u.ms_result = 0;
+       cup.path = uap->path;
+       cup.flags = svr4_to_bsd_flags(uap->flags);
+       cup.mode = uap->mode;
        error = open(&cup);
 
        if (error) {
@@ -366,7 +366,7 @@ svr4_sys_open(struct svr4_sys_open_args *uap)
        }
 
        KKASSERT(p);
-       retval = p->p_retval[0];
+       retval = uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
 
        if (!(SCARG(&cup, flags) & O_NOCTTY) && SESS_LEADER(p) &&
            !(p->p_flag & P_CONTROLT)) {
@@ -392,6 +392,7 @@ int
 svr4_sys_creat(struct svr4_sys_creat_args *uap)
 {
        struct open_args cup;
+       int error;
 
        caddr_t sg = stackgap_init();
        CHECKALTEXIST(&sg, SCARG(uap, path));
@@ -400,7 +401,10 @@ svr4_sys_creat(struct svr4_sys_creat_args *uap)
        SCARG(&cup, mode) = SCARG(uap, mode);
        SCARG(&cup, flags) = O_WRONLY | O_CREAT | O_TRUNC;
 
-       return open(&cup);
+       cup.lmsg.u.ms_result = 0;
+       error = open(&cup);
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -435,18 +439,19 @@ svr4_sys_access(struct svr4_sys_access_args *uap)
        struct thread *td = curthread;  /* XXX */
        struct proc *p = td->td_proc;
        struct access_args cup;
-       int *retval;
+       int error;
 
        caddr_t sg = stackgap_init();
        CHECKALTEXIST(&sg, SCARG(uap, path));
 
        KKASSERT(p);
-       retval = p->p_retval;
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, flags) = SCARG(uap, flags);
-
-       return access(&cup);
+       cup.lmsg.u.ms_result = 0;
+       error = access(&cup);
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+       return(error);
 }
 
 #if defined(NOTYET)
@@ -454,6 +459,7 @@ int
 svr4_sys_pread(struct svr4_sys_pread_args *uap)
 {
        struct pread_args pra;
+       int error;
 
        /*
         * Just translate the args structure and call the NetBSD
@@ -464,7 +470,10 @@ svr4_sys_pread(struct svr4_sys_pread_args *uap)
        SCARG(&pra, nbyte) = SCARG(uap, nbyte);
        SCARG(&pra, offset) = SCARG(uap, off);
 
-       return pread(&pra);
+       pra.lmsg.u.ms_result = 0;
+       error = pread(&pra);
+       uap->lmsg.u.ms_result = pra.lmsg.u.ms_result;
+       return(error);
 }
 #endif
 
@@ -474,6 +483,7 @@ svr4_sys_pread64(struct thread *td, void *v, register_t *retval)
 {
        struct svr4_sys_pread64_args *uap = v;
        struct sys_pread_args pra;
+       int error;
 
        /*
         * Just translate the args structure and call the NetBSD
@@ -484,7 +494,10 @@ svr4_sys_pread64(struct thread *td, void *v, register_t *retval)
        SCARG(&pra, nbyte) = SCARG(uap, nbyte);
        SCARG(&pra, offset) = SCARG(uap, off);
 
-       return (sys_pread(&pra, retval));
+       pra.lmsg.u.ms_result = 0;
+       error = sys_pread(&pra, retval);
+       uap->lmsg.u.ms_result = pra.lmsg.u.ms_result;
+       return(error);
 }
 #endif /* NOTYET */
 
@@ -493,6 +506,7 @@ int
 svr4_sys_pwrite(struct svr4_sys_pwrite_args *uap)
 {
        struct pwrite_args pwa;
+       int error;
 
        /*
         * Just translate the args structure and call the NetBSD
@@ -503,7 +517,10 @@ svr4_sys_pwrite(struct svr4_sys_pwrite_args *uap)
        SCARG(&pwa, nbyte) = SCARG(uap, nbyte);
        SCARG(&pwa, offset) = SCARG(uap, off);
 
-       return pwrite(&pwa);
+       pwa.lmsg.u.ms_result = 0;
+       error = pwrite(&pwa);
+       uap->lmsg.u.ms_result = pwa.lmsg.u.ms_result;
+       return(error);
 }
 #endif
 
@@ -537,7 +554,7 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
        int                             *retval;
 
        KKASSERT(p);
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
 
        SCARG(&fa, fd) = SCARG(uap, fd);
        SCARG(&fa, cmd) = svr4_to_bsd_cmd(SCARG(uap, cmd));
@@ -547,14 +564,17 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
        case F_GETFD:
        case F_SETFD:
                SCARG(&fa, arg) = (long) SCARG(uap, arg);
-               return fcntl(&fa);
+               fa.lmsg.u.ms_result = 0;
+               error = fcntl(&fa);
+               *retval = fa.lmsg.u.ms_result;
+               return error;
 
        case F_GETFL:
                SCARG(&fa, arg) = (long) SCARG(uap, arg);
                error = fcntl(&fa);
                if (error)
                        return error;
-               *retval = bsd_to_svr4_flags(*retval);
+               *retval = bsd_to_svr4_flags(fa.lmsg.u.ms_result);
                return error;
 
        case F_SETFL:
@@ -572,12 +592,14 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
                        SCARG(&fa, cmd) = F_GETFL;
                        if ((error = fcntl(&fa)) != 0)
                                return error;
-                       flags = *retval;
+                       flags = fa.lmsg.u.ms_result;
                        flags &= O_ASYNC;
                        flags |= svr4_to_bsd_flags((u_long) SCARG(uap, arg));
                        SCARG(&fa, cmd) = cmd;
                        SCARG(&fa, arg) = (long) flags;
-                       return fcntl(&fa);
+                       error = fcntl(&fa);
+                       *retval = fa.lmsg.u.ms_result;
+                       return error;
                }
 
        case F_GETLK:
@@ -601,7 +623,9 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
                        if (error)
                                return error;
 
+                       fa.lmsg.u.ms_result = 0;
                        error = fcntl(&fa);
+                       *retval = fa.lmsg.u.ms_result;
                        if (error || SCARG(&fa, cmd) != F_GETLK)
                                return error;
 
@@ -638,7 +662,7 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
                                if (error)
                                        return error;
                                svr4_to_bsd_flock(&ifl, &fl);
-                               return fd_truncate(td, SCARG(uap, fd), &fl);
+                               return fd_truncate(td, SCARG(uap, fd), &fl, retval);
                        }
 
                case SVR4_F_GETLK64:
@@ -663,7 +687,9 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
                                if (error)
                                        return error;
 
+                               fa.lmsg.u.ms_result = 0;
                                error = fcntl(&fa);
+                               *retval = fa.lmsg.u.ms_result;
                                if (error || SCARG(&fa, cmd) != F_GETLK)
                                        return error;
 
@@ -687,7 +713,7 @@ svr4_sys_fcntl(struct svr4_sys_fcntl_args *uap)
                                if (error)
                                        return error;
                                svr4_to_bsd_flock64(&ifl, &fl);
-                               return fd_truncate(td, SCARG(uap, fd), &fl);
+                               return fd_truncate(td, SCARG(uap, fd), &fl, retval);
                        }
 
                case SVR4_F_REVOKE:
index 756dd85..3880763 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_filio.c,v 1.8 2000/01/15 15:30:44 newton Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_filio.c,v 1.4 2003/06/25 03:56:09 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_filio.c,v 1.5 2003/07/26 18:12:46 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -124,7 +124,9 @@ svr4_sys_read(struct svr4_sys_read_args *uap)
 #endif
      }
 
+     ra.lmsg.u.ms_result = 0;
      rv = read(&ra);
+     uap->lmsg.u.ms_result = ra.lmsg.u.ms_result;
 
      DPRINTF(("svr4_read(%d, 0x%0x, %d) = %d\n", 
             SCARG(uap, fd), SCARG(uap, buf), SCARG(uap, nbyte), rv));
@@ -158,7 +160,9 @@ svr4_sys_write(struct svr4_sys_write_args *uap)
      SCARG(&wa, buf) = SCARG(uap, buf);
      SCARG(&wa, nbyte) = SCARG(uap, nbyte);
 
+     wa.lmsg.u.ms_result = 0;
      rv = write(&wa);
+     uap->lmsg.u.ms_result = wa.lmsg.u.ms_result;
 
      DPRINTF(("svr4_write(%d, 0x%0x, %d) = %d\n", 
             SCARG(uap, fd), SCARG(uap, buf), SCARG(uap, nbyte), rv));
index 05439b0..42d7e16 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_ioctl.c,v 1.6 1999/12/08 12:00:48 newton Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_ioctl.c,v 1.6 2003/06/25 03:56:09 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_ioctl.c,v 1.7 2003/07/26 18:12:46 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -103,7 +103,7 @@ svr4_sys_ioctl(struct svr4_sys_ioctl_args *uap)
            SCARG(uap, com), SCARG(uap, fd),
            dir, c, num, argsiz, SCARG(uap, data)));
 #endif
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        fdp = p->p_fd;
        cmd = SCARG(uap, com);
 
index 3fbb990..8e9ecec 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $FreeBSD: src/sys/svr4/svr4_ipc.c,v 1.5 1999/12/08 10:51:16 newton Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_ipc.c,v 1.2 2003/06/17 04:28:57 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_ipc.c,v 1.3 2003/07/26 18:12:46 dillon Exp $
  *     Derived from:
  *     $NetBSD: svr4_ipc.c,v 1.7 1998/10/19 22:43:00 tron Exp $        */
 
@@ -344,6 +344,7 @@ svr4_semget(p, v, retval)
 }
 
 struct svr4_sys_semop_args {
+       XXX lmsg ?
        syscallarg(int) what;
        syscallarg(int) semid;
        syscallarg(struct svr4_sembuf *) sops;
@@ -448,6 +449,7 @@ svr4_to_bsd_msqid_ds(sds, bds)
 }
 
 struct svr4_sys_msgsnd_args {
+       XXX lmsg ?
        syscallarg(int) what;
        syscallarg(int) msqid;
        syscallarg(void *) msgp;
@@ -473,6 +475,7 @@ svr4_msgsnd(p, v, retval)
 }
 
 struct svr4_sys_msgrcv_args {
+       XXX lmsg ?
        syscallarg(int) what;
        syscallarg(int) msqid;
        syscallarg(void *) msgp;
@@ -500,6 +503,7 @@ svr4_msgrcv(p, v, retval)
 }
        
 struct svr4_sys_msgget_args {
+       XXX lmsg ?
        syscallarg(int) what;
        syscallarg(svr4_key_t) key;
        syscallarg(int) msgflg;
@@ -521,6 +525,7 @@ svr4_msgget(p, v, retval)
 }
 
 struct svr4_sys_msgctl_args {
+       XXX lmsg ?
        syscallarg(int) what;
        syscallarg(int) msqid;
        syscallarg(int) cmd;
index b626d34..dd72e30 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_misc.c,v 1.13.2.7 2003/01/14 21:33:58 dillon Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_misc.c,v 1.6 2003/07/19 21:14:49 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_misc.c,v 1.7 2003/07/26 18:12:46 dillon Exp $
  */
 
 /*
@@ -113,7 +113,7 @@ static struct proc *svr4_pfind __P((pid_t pid));
 int
 svr4_sys_setitimer(struct svr4_sys_setitimer_args *uap)
 {
-        p->p_retval[0] = 0;
+        uap->lmsg.u.ms_result = 0;
        return 0;
 }
 #endif
@@ -121,9 +121,8 @@ svr4_sys_setitimer(struct svr4_sys_setitimer_args *uap)
 int
 svr4_sys_wait(struct svr4_sys_wait_args *uap)
 {
-       struct proc *p = curproc;
        struct wait_args w4;
-       int error, *retval = p->p_retval, st, sig;
+       int error, *retval = &uap->lmsg.u.ms_result, st, sig;
        size_t sz = sizeof(*SCARG(&w4, status));
 
        SCARG(&w4, rusage) = NULL;
@@ -138,9 +137,10 @@ svr4_sys_wait(struct svr4_sys_wait_args *uap)
                SCARG(&w4, status) = SCARG(uap, status);
 
        SCARG(&w4, pid) = WAIT_ANY;
-
+       w4.lmsg.u.ms_result = 0;
        if ((error = wait4(&w4)) != 0)
                return error;
+       *retval = w4.lmsg.u.ms_result;
       
        if ((error = copyin(SCARG(&w4, status), &st, sizeof(st))) != 0)
                return error;
@@ -173,6 +173,7 @@ svr4_sys_execv(struct svr4_sys_execv_args *uap)
 {
        struct execve_args ap;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, SCARG(uap, path));
@@ -180,8 +181,10 @@ svr4_sys_execv(struct svr4_sys_execv_args *uap)
        SCARG(&ap, fname) = SCARG(uap, path);
        SCARG(&ap, argv) = SCARG(uap, argp);
        SCARG(&ap, envv) = NULL;
-
-       return execve(&ap);
+       ap.lmsg.u.ms_result = 0;
+       error = execve(&ap);
+       uap->lmsg.u.ms_result = ap.lmsg.u.ms_result;
+       return(error);
 }
 
 int
@@ -189,6 +192,7 @@ svr4_sys_execve(struct svr4_sys_execve_args *uap)
 {
        struct execve_args ap;
        caddr_t sg;
+       int error;
 
        sg = stackgap_init();
        CHECKALTEXIST(&sg, uap->path);
@@ -197,13 +201,15 @@ svr4_sys_execve(struct svr4_sys_execve_args *uap)
        SCARG(&ap, argv) = SCARG(uap, argp);
        SCARG(&ap, envv) = SCARG(uap, envp);
 
-       return execve(&ap);
+       ap.lmsg.u.ms_result = 0;
+       error = execve(&ap);
+       uap->lmsg.u.ms_result = ap.lmsg.u.ms_result;
+       return(error);
 }
 
 int
 svr4_sys_time(struct svr4_sys_time_args *v)
 {
-       struct proc *p = curproc;
        struct svr4_sys_time_args *uap = v;
        int error = 0;
        struct timeval tv;
@@ -212,7 +218,7 @@ svr4_sys_time(struct svr4_sys_time_args *v)
        if (SCARG(uap, t))
                error = copyout(&tv.tv_sec, SCARG(uap, t),
                                sizeof(*(SCARG(uap, t))));
-       p->p_retval[0] = (int) tv.tv_sec;
+       v->lmsg.u.ms_result = (int) tv.tv_sec;
 
        return error;
 }
@@ -390,7 +396,7 @@ again:
                nbytes = resid + svr4reclen;
 
 eof:
-       p->p_retval[0] = nbytes - resid;
+       uap->lmsg.u.ms_result = nbytes - resid;
 out:
        if (cookies)
                free(cookies, M_TEMP);
@@ -418,7 +424,7 @@ svr4_sys_getdents(struct svr4_sys_getdents_args *uap)
        off_t off;              /* true file offset */
        int buflen, error, eofflag;
        u_long *cookiebuf = NULL, *cookie;
-       int ncookies = 0, *retval = p->p_retval;
+       int ncookies = 0, *retval = &uap->lmsg.u.ms_result;
 
        KKASSERT(p);
 
@@ -519,11 +525,11 @@ out:
 int
 svr4_sys_mmap(struct svr4_sys_mmap_args *uap)
 {
-       struct proc *p = curproc;
        struct mmap_args         mm;
        int             *retval;
+       int error;
 
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
 #define _MAP_NEW       0x80000000
        /*
          * Verify the arguments.
@@ -540,8 +546,10 @@ svr4_sys_mmap(struct svr4_sys_mmap_args *uap)
        SCARG(&mm, fd) = SCARG(uap, fd);
        SCARG(&mm, addr) = SCARG(uap, addr);
        SCARG(&mm, pos) = SCARG(uap, pos);
-
-       return mmap(&mm);
+       mm.lmsg.u.ms_resultp = NULL;
+       error = mmap(&mm);
+       uap->lmsg.u.ms_resultp = mm.lmsg.u.ms_resultp;
+       return(error);
 }
 
 int
@@ -550,6 +558,7 @@ svr4_sys_mmap64(struct svr4_sys_mmap64_args *uap)
        struct proc *p = curproc;
        struct mmap_args         mm;
        void            *rp;
+       int error;
 
 #define _MAP_NEW       0x80000000
        /*
@@ -573,7 +582,10 @@ svr4_sys_mmap64(struct svr4_sys_mmap64_args *uap)
            SCARG(&mm, addr) != 0 && (void *)SCARG(&mm, addr) < rp)
                SCARG(&mm, addr) = rp;
 
-       return mmap(&mm);
+       mm.lmsg.u.ms_resultp = 0;
+       error = mmap(&mm);
+       uap->lmsg.u.ms_resultp = mm.lmsg.u.ms_resultp;
+       return(error);
 }
 
 
@@ -621,6 +633,7 @@ svr4_mknod(retval, path, mode, dev)
        svr4_dev_t dev;
 {
        caddr_t sg = stackgap_init();
+       int error;
 
        CHECKALTEXIST(&sg, path);
 
@@ -628,14 +641,17 @@ svr4_mknod(retval, path, mode, dev)
                struct mkfifo_args ap;
                SCARG(&ap, path) = path;
                SCARG(&ap, mode) = mode;
-               return mkfifo(&ap);
+               error = mkfifo(&ap);
+               *retval = ap.lmsg.u.ms_result;
        } else {
                struct mknod_args ap;
                SCARG(&ap, path) = path;
                SCARG(&ap, mode) = mode;
                SCARG(&ap, dev) = dev;
-               return mknod(&ap);
+               error = mknod(&ap);
+               *retval = ap.lmsg.u.ms_result;
        }
+       return(error);
 }
 
 
@@ -647,7 +663,7 @@ svr4_sys_mknod(struct svr4_sys_mknod_args *uap)
         int *retval;
 
        KKASSERT(p);
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
 
        return svr4_mknod(retval, SCARG(uap, path), SCARG(uap, mode),
                          (svr4_dev_t)svr4_to_bsd_odev_t(SCARG(uap, dev)));
@@ -662,7 +678,7 @@ svr4_sys_xmknod(struct svr4_sys_xmknod_args *uap)
         int *retval;
 
        KKASSERT(p);
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
 
        return svr4_mknod(retval, SCARG(uap, path), SCARG(uap, mode),
                          (svr4_dev_t)svr4_to_bsd_dev_t(SCARG(uap, dev)));
@@ -684,7 +700,7 @@ svr4_sys_sysconfig(struct svr4_sys_sysconfig_args *uap)
        int *retval;
 
        KKASSERT(p);
-       retval = &(p->p_retval[0]);
+       retval = &uap->lmsg.u.ms_result;
 
        switch (SCARG(uap, name)) {
        case SVR4_CONFIG_UNUSED:
@@ -845,8 +861,7 @@ timeval_to_clock_t(tv)
 int
 svr4_sys_times(struct svr4_sys_times_args *uap)
 {
-       struct proc *p = curproc;
-       int                      error, *retval = p->p_retval;
+       int                      error, *retval = &uap->lmsg.u.ms_result;
        struct tms               tms;
        struct timeval           t;
        struct rusage           *ru;
@@ -891,7 +906,7 @@ int
 svr4_sys_ulimit(struct svr4_sys_ulimit_args *uap)
 {
        struct proc *p = curproc;
-        int *retval = p->p_retval;
+        int *retval = &uap->lmsg.u.ms_result;
 
        switch (SCARG(uap, cmd)) {
        case SVR4_GFILLIM:
@@ -977,7 +992,7 @@ int
 svr4_sys_pgrpsys(struct svr4_sys_pgrpsys_args *uap)
 {
        struct proc *p = curproc;
-        int *retval = p->p_retval;
+        int *retval = &uap->lmsg.u.ms_result;
 
        switch (SCARG(uap, cmd)) {
        case 1:                 /* setpgrp() */
@@ -988,7 +1003,13 @@ svr4_sys_pgrpsys(struct svr4_sys_pgrpsys_args *uap)
                 * setsid() for SVR4.  (Under BSD, the difference is that
                 * a setpgid(0,0) will not create a new session.)
                 */
-               setsid(NULL);
+               {
+                       struct setsid_args sida;
+
+                       sida.lmsg.u.ms_result = 0;
+                       setsid(&sida);
+                       /* ignore result? */
+               }
                /*FALLTHROUGH*/
 
        case 0:                 /* getpgrp() */
@@ -1007,8 +1028,16 @@ svr4_sys_pgrpsys(struct svr4_sys_pgrpsys_args *uap)
                return 0;
 
        case 3:                 /* setsid() */
-               return setsid(NULL);
+               {
+                       
+                       struct setsid_args sida;
+                       int error;
 
+                       sida.lmsg.u.ms_result = 0;
+                       error = setsid(&sida);
+                       uap->lmsg.u.ms_result = sida.lmsg.u.ms_result;
+                       return(error);
+               }
        case 4:                 /* getpgid(pid) */
 
                if (SCARG(uap, pid) != 0 &&
@@ -1021,10 +1050,13 @@ svr4_sys_pgrpsys(struct svr4_sys_pgrpsys_args *uap)
        case 5:                 /* setpgid(pid, pgid); */
                {
                        struct setpgid_args sa;
+                       int error;
 
                        SCARG(&sa, pid) = SCARG(uap, pid);
                        SCARG(&sa, pgid) = SCARG(uap, pgid);
-                       return setpgid(&sa);
+                       sa.lmsg.u.ms_result = 0;
+                       error = setpgid(&sa);
+                       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
                }
 
        default:
@@ -1089,12 +1121,11 @@ svr4_hrtcntl(struct svr4_hrtcntl_args *uap, register_t *retval)
 int
 svr4_sys_hrtsys(struct svr4_sys_hrtsys_args *uap)
 {
-       struct proc *p = curproc;
-        int *retval = p->p_retval;
+        int *retval = &uap->lmsg.u.ms_result;
 
        switch (SCARG(uap, cmd)) {
        case SVR4_HRT_CNTL:
-               return svr4_hrtcntl((struct svr4_hrtcntl_args *) uap, retval);
+               return svr4_hrtcntl((struct svr4_hrtcntl_args *)(&uap->lmsg + 1), retval);
 
        case SVR4_HRT_ALRM:
                DPRINTF(("hrtalarm\n"));
@@ -1176,7 +1207,7 @@ svr4_sys_waitsys(struct svr4_sys_waitsys_args *uap)
 {
        struct proc *p = curproc;
        int nfound;
-       int error, *retval = p->p_retval;
+       int error, *retval = &uap->lmsg.u.ms_result;
        struct proc *q, *t;
 
 
@@ -1387,6 +1418,8 @@ svr4_sys_statvfs(struct svr4_sys_statvfs_args *uap)
        if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = fs_args.lmsg.u.ms_result;
+
        bsd_statfs_to_svr4_statvfs(&bfs, &sfs);
 
        return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
@@ -1412,6 +1445,8 @@ svr4_sys_fstatvfs(struct svr4_sys_fstatvfs_args *uap)
        if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = fs_args.lmsg.u.ms_result;
+
        bsd_statfs_to_svr4_statvfs(&bfs, &sfs);
 
        return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
@@ -1438,6 +1473,8 @@ svr4_sys_statvfs64(struct svr4_sys_statvfs64_args *uap)
        if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = fs_args.lmsg.u.ms_result;
+
        bsd_statfs_to_svr4_statvfs64(&bfs, &sfs);
 
        return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
@@ -1463,6 +1500,8 @@ svr4_sys_fstatvfs64(struct svr4_sys_fstatvfs64_args *uap)
        if ((error = copyin(fs, &bfs, sizeof(bfs))) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = fs_args.lmsg.u.ms_result;
+
        bsd_statfs_to_svr4_statvfs64(&bfs, &sfs);
 
        return copyout(&sfs, SCARG(uap, fs), sizeof(sfs));
@@ -1471,7 +1510,6 @@ svr4_sys_fstatvfs64(struct svr4_sys_fstatvfs64_args *uap)
 int
 svr4_sys_alarm(struct svr4_sys_alarm_args *uap)
 {
-       struct proc *p = curproc;
        int error;
         struct itimerval *itp, *oitp;
        struct setitimer_args sa;
@@ -1491,7 +1529,7 @@ svr4_sys_alarm(struct svr4_sys_alarm_args *uap)
                return error;
         if (oitp->it_value.tv_usec)
                 oitp->it_value.tv_sec++;
-        p->p_retval[0] = oitp->it_value.tv_sec;
+        uap->lmsg.u.ms_result = oitp->it_value.tv_sec;
         return 0;
 
 }
@@ -1512,10 +1550,9 @@ svr4_sys_gettimeofday(struct svr4_sys_gettimeofday_args *uap)
 int
 svr4_sys_facl(struct svr4_sys_facl_args *uap)
 {
-       struct proc *p = curproc;
        int *retval;
 
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        *retval = 0;
 
        switch (SCARG(uap, cmd)) {
@@ -1559,22 +1596,30 @@ svr4_sys_memcntl(struct svr4_sys_memcntl_args *uap)
        case SVR4_MC_SYNC:
                {
                        struct msync_args msa;
+                       int error;
 
                        SCARG(&msa, addr) = SCARG(uap, addr);
                        SCARG(&msa, len) = SCARG(uap, len);
                        SCARG(&msa, flags) = (int)SCARG(uap, arg);
 
-                       return msync(&msa);
+                       msa.lmsg.u.ms_result = 0;
+                       error = msync(&msa);
+                       uap->lmsg.u.ms_result = msa.lmsg.u.ms_result;
+                       return(error);
                }
        case SVR4_MC_ADVISE:
                {
                        struct madvise_args maa;
+                       int error;
 
                        SCARG(&maa, addr) = SCARG(uap, addr);
                        SCARG(&maa, len) = SCARG(uap, len);
                        SCARG(&maa, behav) = (int)SCARG(uap, arg);
 
-                       return madvise(&maa);
+                       maa.lmsg.u.ms_result = 0;
+                       error = madvise(&maa);
+                       uap->lmsg.u.ms_result = maa.lmsg.u.ms_result;
+                       return(error);
                }
        case SVR4_MC_LOCK:
        case SVR4_MC_UNLOCK:
@@ -1604,6 +1649,8 @@ svr4_sys_nice(struct svr4_sys_nice_args *uap)
        if ((error = getpriority((struct getpriority_args *)&ap)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = ap.lmsg.u.ms_result;
+
        return 0;
 }
 
@@ -1617,7 +1664,7 @@ svr4_sys_resolvepath(struct svr4_sys_resolvepath_args *uap)
        int *retval;
 
        KKASSERT(p);
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
 
        NDINIT(&nd, LOOKUP, NOFOLLOW | SAVENAME, UIO_USERSPACE,
            SCARG(uap, path), td);
index 7e22e77..c922dde 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_signal.c,v 1.9 2000/01/15 15:38:17 newton Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_signal.c,v 1.5 2003/06/25 05:22:33 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_signal.c,v 1.6 2003/07/26 18:12:46 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -305,8 +305,10 @@ svr4_sys_sigaction(struct svr4_sys_sigaction_args *uap)
        SCARG(&sa, act) = nbsa;
        SCARG(&sa, oact) = obsa;
 
+       sa.lmsg.u.ms_result = 0;
        if ((error = sigaction(&sa)) != 0)
                return error;
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
 
        if (oisa != NULL) {
                if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
@@ -322,14 +324,13 @@ svr4_sys_sigaction(struct svr4_sys_sigaction_args *uap)
 int 
 svr4_sys_sigaltstack(struct svr4_sys_sigaltstack_args *uap)
 {
-       struct proc *p = curproc;
        struct svr4_sigaltstack *nsss, *osss, tmpsss;
        struct sigaltstack *nbss, *obss, tmpbss;
        struct sigaltstack_args sa;
        caddr_t sg;
        int error, *retval;
 
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        sg = stackgap_init();
        nsss = SCARG(uap, nss);
        osss = SCARG(uap, oss);
@@ -351,10 +352,13 @@ svr4_sys_sigaltstack(struct svr4_sys_sigaltstack_args *uap)
 
        SCARG(&sa, ss) = nbss;
        SCARG(&sa, oss) = obss;
+       sa.lmsg.u.ms_result = 0;
 
        if ((error = sigaltstack(&sa)) != 0)
                return error;
 
+       *retval = sa.lmsg.u.ms_result;
+
        if (obss != NULL) {
                if ((error = copyin(obss, &tmpbss, sizeof(tmpbss))) != 0)
                        return error;
@@ -374,7 +378,7 @@ svr4_sys_signal(struct svr4_sys_signal_args *uap)
 {
        struct proc *p = curproc;
        int signum;
-       int error, *retval = p->p_retval;
+       int error, *retval = &uap->lmsg.u.ms_result;
        caddr_t sg = stackgap_init();
 
        DPRINTF(("@@@ svr4_sys_signal(%d)\n", p->p_pid));
@@ -399,6 +403,7 @@ svr4_sys_signal(struct svr4_sys_signal_args *uap)
                        SCARG(&sa_args, sig) = signum;
                        SCARG(&sa_args, act) = nbsa;
                        SCARG(&sa_args, oact) = obsa;
+                       sa_args.lmsg.u.ms_result = 0;
 
                        sa.sa_handler = (sig_t) SCARG(uap, handler);
                        SIGEMPTYSET(sa.sa_mask);
@@ -433,7 +438,10 @@ sighold:
                        SCARG(&sa, how) = SIG_BLOCK;
                        SCARG(&sa, set) = set;
                        SCARG(&sa, oset) = NULL;
-                       return sigprocmask(&sa);
+                       sa.lmsg.u.ms_result = 0;
+                       error = sigprocmask(&sa);
+                       *retval = sa.lmsg.u.ms_result;
+                       return(error);
                }
 
        case SVR4_SIGRELSE_MASK:
@@ -447,7 +455,10 @@ sighold:
                        SCARG(&sa, how) = SIG_UNBLOCK;
                        SCARG(&sa, set) = set;
                        SCARG(&sa, oset) = NULL;
-                       return sigprocmask(&sa);
+                       sa.lmsg.u.ms_result = 0;
+                       error = sigprocmask(&sa);
+                       *retval = sa.lmsg.u.ms_result;
+                       return(error);
                }
 
        case SVR4_SIGIGNORE_MASK:
@@ -465,10 +476,12 @@ sighold:
                        sa.sa_flags = 0;
                        if ((error = copyout(&sa, bsa, sizeof(sa))) != 0)
                                return error;
+                       sa_args.lmsg.u.ms_result = 0;
                        if ((error = sigaction(&sa_args)) != 0) {
                                DPRINTF(("sigignore: sigaction failed\n"));
                                return error;
                        }
+                       *retval = sa_args.lmsg.u.ms_result;
                        return 0;
                }
 
@@ -481,7 +494,10 @@ sighold:
                        *set = p->p_sigmask;
                        SIGDELSET(*set, signum);
                        SCARG(&sa, sigmask) = set;
-                       return sigsuspend(&sa);
+                       sa.lmsg.u.ms_result = 0;
+                       error = sigsuspend(&sa);
+                       *retval = sa.lmsg.u.ms_result;
+                       return(error);
                }
 
        default:
@@ -498,7 +514,7 @@ svr4_sys_sigprocmask(struct svr4_sys_sigprocmask_args *uap)
        sigset_t bss;
        int error = 0, *retval;
 
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        if (SCARG(uap, oset) != NULL) {
                /* Fix the return value first if needed */
                bsd_to_svr4_sigset(&p->p_sigmask, &sss);
@@ -551,7 +567,7 @@ svr4_sys_sigpending(struct svr4_sys_sigpending_args *uap)
        svr4_sigset_t sss;
 
        DPRINTF(("@@@ svr4_sys_sigpending(%d)\n", p->p_pid));
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        switch (SCARG(uap, what)) {
        case 1: /* sigpending */
                if (SCARG(uap, mask) == NULL)
@@ -595,7 +611,10 @@ svr4_sys_sigsuspend(struct svr4_sys_sigsuspend_args *uap)
        svr4_to_bsd_sigset(&sss, bss);
 
        SCARG(&sa, sigmask) = bss;
-       return sigsuspend(&sa);
+       sa.lmsg.u.ms_result = 0;
+       error = sigsuspend(&sa);
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+       return(error);
 }
 
 
@@ -603,10 +622,14 @@ int
 svr4_sys_kill(struct svr4_sys_kill_args *uap)
 {
        struct kill_args ka;
+       int error;
 
        SCARG(&ka, pid) = SCARG(uap, pid);
        SCARG(&ka, signum) = SVR4_SVR42BSD_SIG(SCARG(uap, signum));
-       return kill(&ka);
+       ka.lmsg.u.ms_result = 0;
+       error = kill(&ka);
+       uap->lmsg.u.ms_result = ka.lmsg.u.ms_result;
+       return(error);
 }
 
 
@@ -652,7 +675,11 @@ svr4_sys_pause(struct svr4_sys_pause_args *uap)
 {
        struct proc *p = curproc;
        struct sigsuspend_args bsa;
+       int error;
 
        SCARG(&bsa, sigmask) = &p->p_sigmask;
-       return sigsuspend(&bsa);
+       bsa.lmsg.u.ms_result = 0;
+       error = sigsuspend(&bsa);
+       uap->lmsg.u.ms_result = bsa.lmsg.u.ms_result;
+       return(error);
 }
index 57528f2..1a82116 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_stat.c,v 1.6 1999/12/08 12:00:48 newton Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_stat.c,v 1.4 2003/06/25 03:56:10 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_stat.c,v 1.5 2003/07/26 18:12:46 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -68,6 +68,7 @@
 #endif
 
 struct svr4_ustat_args {
+       struct lwkt_msg         lmsg;
        svr4_dev_t              dev;
        struct svr4_ustat * name;
 };
@@ -167,7 +168,7 @@ svr4_sys_stat(struct svr4_sys_stat_args *uap)
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
-
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = stat(&cup)) != 0)
                return error;
@@ -175,6 +176,8 @@ svr4_sys_stat(struct svr4_sys_stat_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_stat(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
@@ -201,6 +204,7 @@ svr4_sys_lstat(struct svr4_sys_lstat_args *uap)
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = lstat(&cup)) != 0)
                return error;
@@ -208,6 +212,8 @@ svr4_sys_lstat(struct svr4_sys_lstat_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_stat(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
@@ -231,6 +237,7 @@ svr4_sys_fstat(struct svr4_sys_fstat_args *uap)
 
        SCARG(&cup, fd) = SCARG(uap, fd);
        SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = fstat(&cup)) != 0)
                return error;
@@ -238,6 +245,8 @@ svr4_sys_fstat(struct svr4_sys_fstat_args *uap)
        if ((error = copyin(SCARG(&cup, sb), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_stat(&st, &svr4_st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
@@ -260,6 +269,7 @@ svr4_sys_xstat(struct svr4_sys_xstat_args *uap)
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = stat(&cup)) != 0)
                return error;
@@ -267,6 +277,8 @@ svr4_sys_xstat(struct svr4_sys_xstat_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_xstat(&st, &svr4_st);
 
 #if defined(SOCKET_NOTYET)
@@ -292,6 +304,7 @@ svr4_sys_lxstat(struct svr4_sys_lxstat_args *uap)
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = lstat(&cup)) != 0)
                return error;
@@ -299,6 +312,8 @@ svr4_sys_lxstat(struct svr4_sys_lxstat_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_xstat(&st, &svr4_st);
 
 #if defined(SOCKET_NOTYET)
@@ -324,6 +339,7 @@ svr4_sys_fxstat(struct svr4_sys_fxstat_args *uap)
 
        SCARG(&cup, fd) = SCARG(uap, fd);
        SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = fstat(&cup)) != 0)
                return error;
@@ -331,6 +347,8 @@ svr4_sys_fxstat(struct svr4_sys_fxstat_args *uap)
        if ((error = copyin(SCARG(&cup, sb), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_xstat(&st, &svr4_st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
@@ -353,6 +371,7 @@ svr4_sys_stat64(struct svr4_sys_stat64_args *uap)
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = stat(&cup)) != 0)
                return error;
@@ -360,6 +379,8 @@ svr4_sys_stat64(struct svr4_sys_stat64_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_stat64(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
@@ -386,6 +407,7 @@ svr4_sys_lstat64(struct svr4_sys_lstat64_args *uap)
 
        SCARG(&cup, path) = SCARG(uap, path);
        SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = lstat((struct lstat_args *)&cup)) != 0)
                return error;
@@ -393,6 +415,8 @@ svr4_sys_lstat64(struct svr4_sys_lstat64_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_stat64(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
@@ -416,6 +440,7 @@ svr4_sys_fstat64(struct svr4_sys_fstat64_args *uap)
 
        SCARG(&cup, fd) = SCARG(uap, fd);
        SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(struct stat));
+       cup.lmsg.u.ms_result = 0;
 
        if ((error = fstat(&cup)) != 0)
                return error;
@@ -423,6 +448,8 @@ svr4_sys_fstat64(struct svr4_sys_fstat64_args *uap)
        if ((error = copyin(SCARG(&cup, sb), &st, sizeof st)) != 0)
                return error;
 
+       uap->lmsg.u.ms_result = cup.lmsg.u.ms_result;
+
        bsd_to_svr4_stat64(&st, &svr4_st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
@@ -481,11 +508,9 @@ svr4_sys_uname(struct svr4_sys_uname_args *uap)
 int
 svr4_sys_systeminfo(struct svr4_sys_systeminfo_args *uap)
 {
-       struct thread *td = curthread;
-       struct proc *p = td->td_proc;
        char            *str = NULL;
        int             error = 0;
-       register_t      *retval = p->p_retval;
+       register_t      *retval = &uap->lmsg.u.ms_result;
        size_t          len = 0;
        char            buf[1];   /* XXX NetBSD uses 256, but that seems
                                     like awfully excessive kstack usage
@@ -595,16 +620,26 @@ svr4_sys_utssys(struct svr4_sys_utssys_args *uap)
        case 0:         /* uname(2)  */
                {
                        struct svr4_sys_uname_args ua;
+                       int error;
+
                        SCARG(&ua, name) = SCARG(uap, a1);
-                       return svr4_sys_uname(&ua);
+                       ua.lmsg.u.ms_result = 0;
+                       error = svr4_sys_uname(&ua);
+                       uap->lmsg.u.ms_result = ua.lmsg.u.ms_result;
+                       return(error);
                }
 
        case 2:         /* ustat(2)  */
                {
                        struct svr4_ustat_args ua;
+                       int error;
+
                        SCARG(&ua, dev) = (svr4_dev_t) SCARG(uap, a2);
                        SCARG(&ua, name) = SCARG(uap, a1);
-                       return svr4_ustat(&ua);
+                       ua.lmsg.u.ms_result = 0;
+                       error = svr4_ustat(&ua);
+                       uap->lmsg.u.ms_result = ua.lmsg.u.ms_result;
+                       return(error);
                }
 
        case 3:         /* fusers(2) */
@@ -641,10 +676,13 @@ svr4_sys_utime(struct svr4_sys_utime_args *uap)
                if (error)
                        return error;
                SCARG(&ap, tptr) = ttp;
-       }
-       else
+       } else {
                SCARG(&ap, tptr) = NULL;
-       return utimes(&ap);
+       }
+       ap.lmsg.u.ms_result = 0;
+       error = utimes(&ap);
+       uap->lmsg.u.ms_result = ap.lmsg.u.ms_result;
+       return(error);
 }
 
 
@@ -708,9 +746,8 @@ svr4_to_bsd_pathconf(name)
 int
 svr4_sys_pathconf(struct svr4_sys_pathconf_args *uap)
 {
-       struct proc *p = curproc;
        caddr_t         sg = stackgap_init();
-       register_t      *retval = p->p_retval;
+       register_t      *retval = &uap->lmsg.u.ms_result;
 
        CHECKALTEXIST(&sg, SCARG(uap, path));
 
@@ -732,8 +769,7 @@ svr4_sys_pathconf(struct svr4_sys_pathconf_args *uap)
 int
 svr4_sys_fpathconf(struct svr4_sys_fpathconf_args *uap)
 {
-       struct proc *p = curproc;
-        register_t     *retval = p->p_retval;
+        register_t     *retval = &uap->lmsg.u.ms_result;
 
        SCARG(uap, name) = svr4_to_bsd_pathconf(SCARG(uap, name));
 
index 12dfe76..f42a6a2 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_stream.c,v 1.12.2.2 2000/11/26 04:42:27 dillon Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_stream.c,v 1.5 2003/07/23 02:30:23 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_stream.c,v 1.6 2003/07/26 18:12:46 dillon Exp $
  */
 
 /*
@@ -130,10 +130,10 @@ static int ti_bind       __P((struct file *, int, struct svr4_strioctl *,
 
 /* infrastructure */
 static int svr4_sendit __P((struct thread *td, int s, struct msghdr *mp,
-                           int flags));
+                           int flags, int *retval));
 
 static int svr4_recvit __P((struct thread *td, int s, struct msghdr *mp,
-                           caddr_t namelenp));
+                           caddr_t namelenp, int *retval));
 
 /* <sigh>  Ok, so we shouldn't use sendit() in uipc_syscalls.c because
  * it isn't part of a "public" interface;  We're supposed to use
@@ -146,11 +146,12 @@ static int svr4_recvit __P((struct thread *td, int s, struct msghdr *mp,
  * I will take out all the #ifdef COMPAT_OLDSOCK gumph, though.
  */
 static int
-svr4_sendit(td, s, mp, flags)
+svr4_sendit(td, s, mp, flags, retval)
        struct thread *td;
        int s;
        struct msghdr *mp;
        int flags;
+       int *retval;
 {
        struct proc *p;
        struct file *fp;
@@ -228,12 +229,12 @@ svr4_sendit(td, s, mp, flags)
                        psignal(p, SIGPIPE);
        }
        if (error == 0)
-               p->p_retval[0] = len - auio.uio_resid;
+               *retval = len - auio.uio_resid;
 #ifdef KTRACE
        if (ktriov != NULL) {
                if (error == 0) {
                        ktruio.uio_iov = ktriov;
-                       ktruio.uio_resid = p->p_retval[0];
+                       ktruio.uio_resid = *retval;
                        ktrgenio(p->p_tracep, s, UIO_WRITE, &ktruio, error);
                }
                FREE(ktriov, M_TEMP);
@@ -247,11 +248,12 @@ bad:
 }
 
 static int
-svr4_recvit(td, s, mp, namelenp)
+svr4_recvit(td, s, mp, namelenp, retval)
        struct thread *td;
        int s;
        struct msghdr *mp;
        caddr_t namelenp;
+       int *retval;
 {
        struct proc *p = td->td_proc;
        struct file *fp;
@@ -318,7 +320,7 @@ svr4_recvit(td, s, mp, namelenp)
 #endif
        if (error)
                goto out;
-       p->p_retval[0] = len - auio.uio_resid;
+       *retval = len - auio.uio_resid;
        if (mp->msg_name) {
                len = mp->msg_namelen;
                if (len <= 0 || fromsa == 0)
@@ -1469,7 +1471,7 @@ i_setsig(fp, td, retval, fd, cmd, dat)
        if ((error = fcntl(&fa)) != 0)
                return error;
 
-       oflags = p->p_retval[0];
+       oflags = fa.lmsg.u.ms_result;
 
        /* update the flags */
        if (dat != NULL) {
@@ -1497,15 +1499,18 @@ i_setsig(fp, td, retval, fd, cmd, dat)
                SCARG(&fa, arg) = (long) flags;
                if ((error = fcntl(&fa)) != 0)
                          return error;
-               flags = p->p_retval[0];
+               flags =fa.lmsg.u.ms_result;
        }
 
        /* set up SIGIO receiver if needed */
        if (dat != NULL) {
                SCARG(&fa, cmd) = F_SETOWN;
                SCARG(&fa, arg) = (long) p->p_pid;
-               return fcntl(&fa);
+               error = fcntl(&fa);
+               *retval = fa.lmsg.u.ms_result;
+               return(error);
        }
+       *retval = fa.lmsg.u.ms_result;
        return 0;
 }
 
@@ -1732,7 +1737,7 @@ svr4_sys_putmsg(struct svr4_sys_putmsg_args *uap)
 
        KKASSERT(p);
        fdp = p->p_fd;
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        fp = fdp->fd_ofiles[SCARG(uap, fd)];
 
        if (((u_int)SCARG(uap, fd) >= fdp->fd_nfiles) || (fp == NULL)) {
@@ -1811,7 +1816,11 @@ svr4_sys_putmsg(struct svr4_sys_putmsg_args *uap)
                                SCARG(&wa, fd) = SCARG(uap, fd);
                                SCARG(&wa, buf) = dat.buf;
                                SCARG(&wa, nbyte) = dat.len;
-                               return write(&wa);
+                               wa.lmsg.u.ms_result = 0;
+
+                               error = write(&wa);
+                               *retval = wa.lmsg.u.ms_result;
+                               return(error);
                        }
                        DPRINTF(("putmsg: Invalid inet length %ld\n", sc.len));
                        return EINVAL;
@@ -1863,8 +1872,11 @@ svr4_sys_putmsg(struct svr4_sys_putmsg_args *uap)
                        SCARG(&co, s) = SCARG(uap, fd);
                        SCARG(&co, name) = (void *) sup;
                        SCARG(&co, namelen) = (int) sasize;
+                       co.lmsg.u.ms_result = 0;
                        
-                       return connect(&co);
+                       error = connect(&co);
+                       *retval = co.lmsg.u.ms_result;
+                       return(error);
                }
 
        case SVR4_TI_SENDTO_REQUEST:    /* sendto       */
@@ -1885,7 +1897,7 @@ svr4_sys_putmsg(struct svr4_sys_putmsg_args *uap)
                                    (so, 0, uio, 0, 0, 0, uio->uio_td);
 #endif
                        error = svr4_sendit(td, SCARG(uap, fd), &msg,
-                                      SCARG(uap, flags));
+                                      SCARG(uap, flags), retval);
                        DPRINTF(("sendto_request error: %d\n", error));
                        *retval = 0;
                        return error;
@@ -1922,7 +1934,7 @@ svr4_sys_getmsg(struct svr4_sys_getmsg_args *uap)
 
        KKASSERT(p);
        fdp = p->p_fd;
-       retval = p->p_retval;
+       retval = &uap->lmsg.u.ms_result;
        fp = fdp->fd_ofiles[SCARG(uap, fd)];
 
        if (((u_int)SCARG(uap, fd) >= fdp->fd_nfiles) || (fp == NULL))
@@ -2151,7 +2163,7 @@ svr4_sys_getmsg(struct svr4_sys_getmsg_args *uap)
                aiov.iov_len = dat.maxlen;
                msg.msg_flags = 0;
 
-               error = svr4_recvit(td, SCARG(uap, fd), &msg, (caddr_t) flen);
+               error = svr4_recvit(td, SCARG(uap, fd), &msg, (caddr_t) flen, retval);
 
                if (error) {
                        DPRINTF(("getmsg: recvit failed %d\n", error));
@@ -2245,21 +2257,31 @@ svr4_sys_getmsg(struct svr4_sys_getmsg_args *uap)
 int svr4_sys_send(struct svr4_sys_send_args *uap)
 {
        struct osend_args osa;
+       int error;
+
        SCARG(&osa, s) = SCARG(uap, s);
        SCARG(&osa, buf) = SCARG(uap, buf);
        SCARG(&osa, len) = SCARG(uap, len);
        SCARG(&osa, flags) = SCARG(uap, flags);
-       return osend(&osa);
+       osa.lmsg.u.ms_result = 0;
+       error = osend(&osa);
+       uap->lmsg.u.ms_result = osa.lmsg.u.ms_result;
+       return(error);
 }
 
 int svr4_sys_recv(struct svr4_sys_recv_args *uap)
 {
        struct orecv_args ora;
+       int error;
+
        SCARG(&ora, s) = SCARG(uap, s);
        SCARG(&ora, buf) = SCARG(uap, buf);
        SCARG(&ora, len) = SCARG(uap, len);
        SCARG(&ora, flags) = SCARG(uap, flags);
-       return orecv(&ora);
+       ora.lmsg.u.ms_result = 0;
+       error = orecv(&ora);
+       uap->lmsg.u.ms_result = ora.lmsg.u.ms_result;
+       return(error);
 }
 
 /* 
@@ -2270,6 +2292,7 @@ int
 svr4_sys_sendto(struct svr4_sys_sendto_args *uap)
 {
         struct sendto_args sa;
+       int error;
 
        SCARG(&sa, s) = SCARG(uap, s);
        SCARG(&sa, buf) = SCARG(uap, buf);
@@ -2279,6 +2302,9 @@ svr4_sys_sendto(struct svr4_sys_sendto_args *uap)
        SCARG(&sa, tolen) = SCARG(uap, tolen);
 
        DPRINTF(("calling sendto()\n"));
-       return sendto(&sa);
+       sa.lmsg.u.ms_result = 0;
+       error = sendto(&sa);
+       uap->lmsg.u.ms_result = sa.lmsg.u.ms_result;
+       return(error);
 }
 
index f9cadac..f33ba35 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.28 2003/07/24 23:52:36 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.29 2003/07/26 18:12:42 dillon Exp $
  */
 
 #include "apm.h"
@@ -1075,12 +1075,10 @@ setregs(p, entry, stack, ps_strings)
        npxinit(__INITIAL_NPXCW__);
 #endif
 
-      /*
-       * XXX - Linux emulator
-       * Make sure sure edx is 0x0 on entry. Linux binaries depend
-       * on it.
-       */
-      p->p_retval[1] = 0;
+       /*
+        * note: linux emulator needs edx to be 0x0 on entry, which is
+        * handled in execve simply by leaving the return value(s) 0.
+        */
 }
 
 void
index c7b4f0d..3ed604a 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91
  * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.47.2.3 2002/10/07 17:20:00 jhb Exp $
- * $DragonFly: src/sys/i386/i386/Attic/sys_machdep.c,v 1.8 2003/07/21 07:57:43 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/sys_machdep.c,v 1.9 2003/07/26 18:12:42 dillon Exp $
  *
  */
 
@@ -72,8 +72,8 @@
 
 
 #ifdef USER_LDT
-static int i386_get_ldt        __P((struct proc *, char *));
-static int i386_set_ldt        __P((struct proc *, char *));
+static int i386_get_ldt        __P((struct proc *, char *, int *));
+static int i386_set_ldt        __P((struct proc *, char *, int *));
 #endif
 static int i386_get_ioperm     __P((struct proc *, char *));
 static int i386_set_ioperm     __P((struct proc *, char *));
@@ -92,11 +92,11 @@ sysarch(struct sysarch_args *uap)
        switch(uap->op) {
 #ifdef USER_LDT
        case I386_GET_LDT:
-               error = i386_get_ldt(p, uap->parms);
+               error = i386_get_ldt(p, uap->parms, &uap->lmsg.u.ms_result);
                break;
 
        case I386_SET_LDT:
-               error = i386_set_ldt(p, uap->parms);
+               error = i386_set_ldt(p, uap->parms, &uap->lmsg.u.ms_result);
                break;
 #endif
        case I386_GET_IOPERM:
@@ -317,9 +317,7 @@ user_ldt_free(struct pcb *pcb)
 }
 
 static int
-i386_get_ldt(p, args)
-       struct proc *p;
-       char *args;
+i386_get_ldt(struct proc *p, char *args, int *res)
 {
        int error = 0;
        struct pcb *pcb = p->p_thread->td_pcb;
@@ -359,16 +357,13 @@ i386_get_ldt(p, args)
 
        error = copyout(lp, uap->descs, num * sizeof(union descriptor));
        if (!error)
-               p->p_retval[0] = num;
-
+               *res = num;
        splx(s);
        return(error);
 }
 
 static int
-i386_set_ldt(p, args)
-       struct proc *p;
-       char *args;
+i386_set_ldt(struct proc *p, char *args, int *res)
 {
        int error = 0, i, n;
        int largest_ld;
@@ -502,7 +497,7 @@ i386_set_ldt(p, args)
        bcopy(descs, 
                 &((union descriptor *)(pcb_ldt->ldt_base))[uap->start],
                uap->num * sizeof(union descriptor));
-       p->p_retval[0] = uap->start;
+       *res = uap->start;
 
        splx(s);
        kmem_free(kernel_map, (vm_offset_t)descs, descs_size);
index 1b71347..d64e912 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)trap.c        7.4 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
- * $DragonFly: src/sys/i386/i386/Attic/trap.c,v 1.28 2003/07/25 05:51:15 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/trap.c,v 1.29 2003/07/26 18:12:42 dillon Exp $
  */
 
 /*
@@ -1280,8 +1280,8 @@ syscall2(struct trapframe frame)
                ktrsyscall(p->p_tracep, code, narg, (void *)(&args.lmsg + 1));
        }
 #endif
-       p->p_retval[0] = 0;
-       p->p_retval[1] = frame.tf_edx;
+       args.lmsg.u.ms_fds[0] = 0;
+       args.lmsg.u.ms_fds[1] = frame.tf_edx;
 
        STOPEVENT(p, S_SCE, narg);      /* MP aware */
 
@@ -1297,8 +1297,8 @@ syscall2(struct trapframe frame)
                 * if this is a child returning from fork syscall.
                 */
                p = curproc;
-               frame.tf_eax = p->p_retval[0];
-               frame.tf_edx = p->p_retval[1];
+               frame.tf_eax = args.lmsg.u.ms_fds[0];
+               frame.tf_edx = args.lmsg.u.ms_fds[1];
                frame.tf_eflags &= ~PSL_C;
                break;
 
@@ -1341,7 +1341,7 @@ bad:
 
 #ifdef KTRACE
        if (KTRPOINT(td, KTR_SYSRET)) {
-               ktrsysret(p->p_tracep, code, error, p->p_retval[0]);
+               ktrsysret(p->p_tracep, code, error, args.lmsg.u.ms_result);
        }
 #endif
 
@@ -1380,6 +1380,7 @@ sendsys2(struct trapframe frame)
        int narg;
        u_int code = 0;
        int msgsize;
+       int result;
 
 #ifdef DIAGNOSTIC
        if (ISPL(frame.tf_cs) != SEL_UPL) {
@@ -1405,6 +1406,7 @@ sendsys2(struct trapframe frame)
 
        p->p_md.md_regs = &frame;
        orig_tf_eflags = frame.tf_eflags;
+       result = 0;
 
        /*
         * Extract the system call message.  If msgsize is zero we are 
@@ -1475,8 +1477,8 @@ sendsys2(struct trapframe frame)
                ktrsyscall(p->p_tracep, code, narg, (void *)(&sysmsg->lmsg + 1));
        }
 #endif
-       p->p_retval[0] = 0;
-       p->p_retval[1] = 0;
+       sysmsg->lmsg.u.ms_fds[0] = 0;
+       sysmsg->lmsg.u.ms_fds[1] = 0;
 
        STOPEVENT(p, S_SCE, narg);      /* MP aware */
 
@@ -1497,17 +1499,19 @@ bad1:
        /*
         * If a synchronous return copy p_retval to ms_result64 and return
         * the sysmsg to the free pool.
+        *
+        * YYY Don't writeback message if execve() YYY
         */
        if (error != EASYNC) {
+               result = sysmsg->lmsg.u.ms_fds[0];
+               if (error == 0 && code != SYS_execve) {
+                       error = suword(&umsg->u.ms_result32 + 0, sysmsg->lmsg.u.ms_fds[0]);
+                       error = suword(&umsg->u.ms_result32 + 1, sysmsg->lmsg.u.ms_fds[1]);
+               }
                crit_enter_quick(td);
                sysmsg->lmsg.opaque.ms_sysnext = gd->gd_freesysmsg;
                gd->gd_freesysmsg = sysmsg;
                crit_exit_quick(td);
-               if (error == 0) {
-                       error = suword(&umsg->u.ms_result32 + 0, p->p_retval[0]);
-                       error = suword(&umsg->u.ms_result32 + 1, p->p_retval[1]);
-                       /*error = copyout(p->p_retval, &umsg->u.ms_result64, sizeof(umsg->u.ms_result64));*/
-               }
        }
 bad2:
        frame.tf_eax = error;
@@ -1527,7 +1531,7 @@ bad2:
 
 #ifdef KTRACE
        if (KTRPOINT(td, KTR_SYSRET)) {
-               ktrsysret(p->p_tracep, code, error, p->p_retval[0]);
+               ktrsysret(p->p_tracep, code, error, result);
        }
 #endif
 
index b3ae383..9d9ddba 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_descrip.c      8.6 (Berkeley) 4/19/94
  * $FreeBSD: src/sys/kern/kern_descrip.c,v 1.81.2.17 2003/06/06 20:21:32 tegge Exp $
- * $DragonFly: src/sys/kern/kern_descrip.c,v 1.8 2003/07/24 01:41:24 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_descrip.c,v 1.9 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -121,7 +121,7 @@ getdtablesize(struct getdtablesize_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = 
+       uap->lmsg.u.ms_result = 
            min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfilesperproc);
        return (0);
 }
@@ -149,7 +149,7 @@ retry:
                return (EBADF);
        }
        if (old == new) {
-               p->p_retval[0] = new;
+               uap->lmsg.u.ms_result = new;
                return (0);
        }
        if (new >= fdp->fd_nfiles) {
@@ -160,7 +160,7 @@ retry:
                 */
                goto retry;
        }
-       return (do_dup(fdp, (int)old, (int)new, p->p_retval, p));
+       return (do_dup(fdp, (int)old, (int)new, uap->lmsg.u.ms_fds, p));
 }
 
 /*
@@ -181,7 +181,7 @@ dup(struct dup_args *uap)
                return (EBADF);
        if ((error = fdalloc(p, 0, &new)))
                return (error);
-       return (do_dup(fdp, (int)old, new, p->p_retval, p));
+       return (do_dup(fdp, (int)old, new, uap->lmsg.u.ms_fds, p));
 }
 
 /*
@@ -216,10 +216,10 @@ fcntl(struct fcntl_args *uap)
                        return (EINVAL);
                if ((error = fdalloc(p, newmin, &i)))
                        return (error);
-               return (do_dup(fdp, uap->fd, i, p->p_retval, p));
+               return (do_dup(fdp, uap->fd, i, uap->lmsg.u.ms_fds, p));
 
        case F_GETFD:
-               p->p_retval[0] = (*pop & UF_EXCLOSE) ? FD_CLOEXEC : 0;
+               uap->lmsg.u.ms_result = (*pop & UF_EXCLOSE) ? FD_CLOEXEC : 0;
                return (0);
 
        case F_SETFD:
@@ -228,7 +228,7 @@ fcntl(struct fcntl_args *uap)
                return (0);
 
        case F_GETFL:
-               p->p_retval[0] = OFLAGS(fp->f_flag);
+               uap->lmsg.u.ms_result = OFLAGS(fp->f_flag);
                return (0);
 
        case F_SETFL:
@@ -255,7 +255,7 @@ fcntl(struct fcntl_args *uap)
 
        case F_GETOWN:
                fhold(fp);
-               error = fo_ioctl(fp, FIOGETOWN, (caddr_t)p->p_retval, td);
+               error = fo_ioctl(fp, FIOGETOWN, (caddr_t)uap->lmsg.u.ms_fds, td);
                fdrop(fp, td);
                return(error);
 
@@ -728,14 +728,14 @@ fpathconf(struct fpathconf_args *uap)
                if (uap->name != _PC_PIPE_BUF) {
                        error = EINVAL;
                } else {
-                       p->p_retval[0] = PIPE_BUF;
+                       uap->lmsg.u.ms_result = PIPE_BUF;
                        error = 0;
                }
                break;
        case DTYPE_FIFO:
        case DTYPE_VNODE:
                vp = (struct vnode *)fp->f_data;
-               error = VOP_PATHCONF(vp, uap->name, p->p_retval);
+               error = VOP_PATHCONF(vp, uap->name, uap->lmsg.u.ms_fds);
                break;
        default:
                error = EOPNOTSUPP;
index 70c6b4f..97f7327 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_event.c,v 1.2.2.9 2003/05/08 07:47:16 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_event.c,v 1.6 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_event.c,v 1.7 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -55,7 +55,7 @@ MALLOC_DEFINE(M_KQUEUE, "kqueue", "memory for kqueue system");
 
 static int     kqueue_scan(struct file *fp, int maxevents,
                    struct kevent *ulistp, const struct timespec *timeout,
-                   struct proc *p);
+                   struct proc *p, int *res);
 static int     kqueue_read(struct file *fp, struct uio *uio,
                    struct ucred *cred, int flags, struct thread *td);
 static int     kqueue_write(struct file *fp, struct uio *uio,
@@ -374,7 +374,7 @@ kqueue(struct kqueue_args *uap)
        kq = malloc(sizeof(struct kqueue), M_KQUEUE, M_WAITOK | M_ZERO);
        TAILQ_INIT(&kq->kq_head);
        fp->f_data = (caddr_t)kq;
-       p->p_retval[0] = fd;
+       uap->lmsg.u.ms_result = fd;
        if (fdp->fd_knlistsize < 0)
                fdp->fd_knlistsize = 0;         /* this process has a kq */
        kq->kq_fdp = fdp;
@@ -442,12 +442,12 @@ kevent(struct kevent_args *uap)
                uap->changelist += n;
        }
        if (nerrors) {
-               p->p_retval[0] = nerrors;
+               uap->lmsg.u.ms_result = nerrors;
                error = 0;
                goto done;
        }
 
-       error = kqueue_scan(fp, uap->nevents, uap->eventlist, uap->timeout, p);
+       error = kqueue_scan(fp, uap->nevents, uap->eventlist, uap->timeout, p, &uap->lmsg.u.ms_result);
 done:
        if (fp != NULL)
                fdrop(fp, p->p_thread);
@@ -587,7 +587,7 @@ done:
 
 static int
 kqueue_scan(struct file *fp, int maxevents, struct kevent *ulistp,
-       const struct timespec *tsp, struct proc *p)
+       const struct timespec *tsp, struct proc *p, int *res)
 {
        struct thread *td = p->p_thread;
        struct kqueue *kq = (struct kqueue *)fp->f_data;
@@ -710,7 +710,7 @@ done:
        if (nkev != 0)
                error = copyout((caddr_t)&kq->kq_kev, (caddr_t)ulistp,
                    sizeof(struct kevent) * nkev);
-        p->p_retval[0] = maxevents - count;
+        *res = maxevents - count;
        return (error);
 }
 
index 768d4f4..4370cfd 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
  * $FreeBSD: src/sys/kern/kern_exit.c,v 1.92.2.11 2003/01/13 22:51:16 dillon Exp $
- * $DragonFly: src/sys/kern/kern_exit.c,v 1.19 2003/07/23 07:14:18 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_exit.c,v 1.20 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -473,10 +473,10 @@ loop:
                                    ESTCPULIM(curproc->p_estcpu + p->p_estcpu);
                        }
 
-                       q->p_retval[0] = p->p_pid;
+                       uap->lmsg.u.ms_fds[0] = p->p_pid;
 #ifdef COMPAT_43
                        if (compat)
-                               q->p_retval[1] = p->p_xstat;
+                               uap->lmsg.u.ms_fds[1] = p->p_xstat;
                        else
 #endif
                        if (uap->status) {
@@ -544,10 +544,10 @@ loop:
                if (p->p_stat == SSTOP && (p->p_flag & P_WAITED) == 0 &&
                    (p->p_flag & P_TRACED || uap->options & WUNTRACED)) {
                        p->p_flag |= P_WAITED;
-                       q->p_retval[0] = p->p_pid;
+                       uap->lmsg.u.ms_fds[0] = p->p_pid;
 #ifdef COMPAT_43
                        if (compat) {
-                               q->p_retval[1] = W_STOPCODE(p->p_xstat);
+                               uap->lmsg.u.ms_fds[1] = W_STOPCODE(p->p_xstat);
                                error = 0;
                        } else
 #endif
@@ -563,7 +563,7 @@ loop:
        if (nfound == 0)
                return (ECHILD);
        if (uap->options & WNOHANG) {
-               q->p_retval[0] = 0;
+               uap->lmsg.u.ms_fds[0] = 0;
                return (0);
        }
        if ((error = tsleep((caddr_t)q, PCATCH, "wait", 0)))
index 06c3c35..e928aae 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
  * $FreeBSD: src/sys/kern/kern_fork.c,v 1.72.2.13 2003/06/06 20:21:32 tegge Exp $
- * $DragonFly: src/sys/kern/kern_fork.c,v 1.13 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_fork.c,v 1.14 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -94,8 +94,8 @@ fork(struct fork_args *uap)
        error = fork1(p, RFFDG | RFPROC, &p2);
        if (error == 0) {
                start_forked_proc(p, p2);
-               p->p_retval[0] = p2->p_pid;
-               p->p_retval[1] = 0;
+               uap->lmsg.u.ms_fds[0] = p2->p_pid;
+               uap->lmsg.u.ms_fds[1] = 0;
        }
        return error;
 }
@@ -111,8 +111,8 @@ vfork(struct vfork_args *uap)
        error = fork1(p, RFFDG | RFPROC | RFPPWAIT | RFMEM, &p2);
        if (error == 0) {
                start_forked_proc(p, p2);
-               p->p_retval[0] = p2->p_pid;
-               p->p_retval[1] = 0;
+               uap->lmsg.u.ms_fds[0] = p2->p_pid;
+               uap->lmsg.u.ms_fds[1] = 0;
        }
        return error;
 }
@@ -127,8 +127,8 @@ rfork(struct rfork_args *uap)
        error = fork1(p, uap->flags, &p2);
        if (error == 0) {
                start_forked_proc(p, p2);
-               p->p_retval[0] = p2 ? p2->p_pid : 0;
-               p->p_retval[1] = 0;
+               uap->lmsg.u.ms_fds[0] = p2 ? p2->p_pid : 0;
+               uap->lmsg.u.ms_fds[1] = 0;
        }
        return error;
 }
index c845087..dc0aa1b 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_linker.c,v 1.41.2.3 2001/11/21 17:50:35 luigi Exp $
- * $DragonFly: src/sys/kern/kern_linker.c,v 1.8 2003/07/19 21:14:38 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_linker.c,v 1.9 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_ddb.h"
@@ -660,12 +660,11 @@ int
 kldload(struct kldload_args *uap)
 {
     struct thread *td = curthread;
-    struct proc *p = td->td_proc;
     char* filename = NULL, *modulename;
     linker_file_t lf;
     int error = 0;
 
-    p->p_retval[0] = -1;
+    uap->lmsg.u.ms_result = -1;
 
     if (securelevel > 0)       /* redundant, but that's OK */
        return EPERM;
@@ -692,7 +691,7 @@ kldload(struct kldload_args *uap)
        goto out;
 
     lf->userrefs++;
-    p->p_retval[0] = lf->id;
+    uap->lmsg.u.ms_result = lf->id;
 
 out:
     if (filename)
@@ -735,12 +734,11 @@ out:
 int
 kldfind(struct kldfind_args *uap)
 {
-    struct proc *p = curproc;
     char *filename = NULL, *modulename;
     linker_file_t lf;
     int error = 0;
 
-    p->p_retval[0] = -1;
+    uap->lmsg.u.ms_result = -1;
 
     filename = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
     if ((error = copyinstr(SCARG(uap, file), filename, MAXPATHLEN, NULL)) != 0)
@@ -752,7 +750,7 @@ kldfind(struct kldfind_args *uap)
 
     lf = linker_find_file_by_name(modulename);
     if (lf)
-       p->p_retval[0] = lf->id;
+       uap->lmsg.u.ms_result = lf->id;
     else
        error = ENOENT;
 
@@ -765,24 +763,23 @@ out:
 int
 kldnext(struct kldnext_args *uap)
 {
-    struct proc *p = curproc;
     linker_file_t lf;
     int error = 0;
 
     if (SCARG(uap, fileid) == 0) {
        if (TAILQ_FIRST(&linker_files))
-           p->p_retval[0] = TAILQ_FIRST(&linker_files)->id;
+           uap->lmsg.u.ms_result = TAILQ_FIRST(&linker_files)->id;
        else
-           p->p_retval[0] = 0;
+           uap->lmsg.u.ms_result = 0;
        return 0;
     }
 
     lf = linker_find_file_by_id(SCARG(uap, fileid));
     if (lf) {
        if (TAILQ_NEXT(lf, link))
-           p->p_retval[0] = TAILQ_NEXT(lf, link)->id;
+           uap->lmsg.u.ms_result = TAILQ_NEXT(lf, link)->id;
        else
-           p->p_retval[0] = 0;
+           uap->lmsg.u.ms_result = 0;
     } else
        error = ENOENT;
 
@@ -792,7 +789,6 @@ kldnext(struct kldnext_args *uap)
 int
 kldstat(struct kldstat_args *uap)
 {
-    struct proc *p = curproc;
     linker_file_t lf;
     int error = 0;
     int version;
@@ -831,7 +827,7 @@ kldstat(struct kldstat_args *uap)
     if ((error = copyout(&lf->size, &stat->size, sizeof(size_t))) != 0)
        goto out;
 
-    p->p_retval[0] = 0;
+    uap->lmsg.u.ms_result = 0;
 
 out:
     return error;
@@ -840,16 +836,15 @@ out:
 int
 kldfirstmod(struct kldfirstmod_args *uap)
 {
-    struct proc *p = curproc;
     linker_file_t lf;
     int error = 0;
 
     lf = linker_find_file_by_id(SCARG(uap, fileid));
     if (lf) {
        if (TAILQ_FIRST(&lf->modules))
-           p->p_retval[0] = module_getid(TAILQ_FIRST(&lf->modules));
+           uap->lmsg.u.ms_result = module_getid(TAILQ_FIRST(&lf->modules));
        else
-           p->p_retval[0] = 0;
+           uap->lmsg.u.ms_result = 0;
     } else
        error = ENOENT;
 
index d487566..359ace7 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_module.c,v 1.21 1999/11/08 06:53:30 peter Exp $
- * $DragonFly: src/sys/kern/kern_module.c,v 1.3 2003/06/23 17:55:41 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_module.c,v 1.4 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -233,14 +233,13 @@ module_setspecific(module_t mod, modspecific_t *datap)
 int
 modnext(struct modnext_args *uap)
 {
-    struct proc *p = curproc;
     module_t mod;
 
-    p->p_retval[0] = -1;
+    uap->lmsg.u.ms_result = -1;
     if (SCARG(uap, modid) == 0) {
        mod = TAILQ_FIRST(&modules);
        if (mod) {
-           p->p_retval[0] = mod->id;
+           uap->lmsg.u.ms_result = mod->id;
            return 0;
        } else
            return ENOENT;
@@ -251,28 +250,27 @@ modnext(struct modnext_args *uap)
        return ENOENT;
 
     if (TAILQ_NEXT(mod, link))
-       p->p_retval[0] = TAILQ_NEXT(mod, link)->id;
+       uap->lmsg.u.ms_result = TAILQ_NEXT(mod, link)->id;
     else
-       p->p_retval[0] = 0;
+       uap->lmsg.u.ms_result = 0;
     return 0;
 }
 
 int
 modfnext(struct modfnext_args *uap)
 {
-    struct proc *p = curproc;
     module_t mod;
 
-    p->p_retval[0] = -1;
+    uap->lmsg.u.ms_result = -1;
 
     mod = module_lookupbyid(SCARG(uap, modid));
     if (!mod)
        return ENOENT;
 
     if (TAILQ_NEXT(mod, flink))
-       p->p_retval[0] = TAILQ_NEXT(mod, flink)->id;
+       uap->lmsg.u.ms_result = TAILQ_NEXT(mod, flink)->id;
     else
-       p->p_retval[0] = 0;
+       uap->lmsg.u.ms_result = 0;
     return 0;
 }
 
@@ -286,7 +284,6 @@ struct module_stat_v1 {
 int
 modstat(struct modstat_args *uap)
 {
-    struct proc *p = curproc;
     module_t mod;
     int error = 0;
     int namelen;
@@ -329,7 +326,7 @@ modstat(struct modstat_args *uap)
            goto out;
     }
 
-    p->p_retval[0] = 0;
+    uap->lmsg.u.ms_result = 0;
 
 out:
     return error;
@@ -338,7 +335,6 @@ out:
 int
 modfind(struct modfind_args *uap)
 {
-    struct proc *p = curproc;
     int error = 0;
     char name[MAXMODNAME];
     module_t mod;
@@ -350,7 +346,7 @@ modfind(struct modfind_args *uap)
     if (!mod)
        error = ENOENT;
     else
-       p->p_retval[0] = mod->id;
+       uap->lmsg.u.ms_result = mod->id;
 
 out:
     return error;
index 6c0ed53..b28a6d2 100644 (file)
@@ -29,7 +29,7 @@
  * confusing and/or plain wrong in that context.
  *
  * $FreeBSD: src/sys/kern/kern_ntptime.c,v 1.32.2.2 2001/04/22 11:19:46 jhay Exp $
- * $DragonFly: src/sys/kern/kern_ntptime.c,v 1.5 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_ntptime.c,v 1.6 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_ntp.h"
@@ -404,10 +404,11 @@ ntp_adjtime(struct ntp_adjtime_args *uap)
            (time_status & STA_PPSTIME &&
            time_status & STA_PPSJITTER) ||
            (time_status & STA_PPSFREQ &&
-           time_status & (STA_PPSWANDER | STA_PPSERROR)))
-               curproc->p_retval[0] = TIME_ERROR;
-       else
-               curproc->p_retval[0] = time_state;
+           time_status & (STA_PPSWANDER | STA_PPSERROR))) {
+               uap->lmsg.u.ms_result = TIME_ERROR;
+       } else {
+               uap->lmsg.u.ms_result = time_state;
+       }
        return (error);
 }
 
index a985960..a8dc173 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/posix4/p1003_1b.c,v 1.5.2.2 2003/03/25 06:13:35 rwatson Exp $
- * $DragonFly: src/sys/kern/kern_p1003_1b.c,v 1.3 2003/06/23 17:55:49 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_p1003_1b.c,v 1.4 2003/07/26 18:12:45 dillon Exp $
  */
 
 /* p1003_1b: Real Time common code.
@@ -169,7 +169,7 @@ sched_setparam(struct sched_setparam_args *uap)
        copyin(uap->param, &sched_param, sizeof(sched_param));
 
        if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
-               e = ksched_setparam(&p->p_retval[0], ksched, p,
+               e = ksched_setparam(&uap->lmsg.u.ms_result, ksched, p,
                    (const struct sched_param *)&sched_param);
        }
        return e;
@@ -191,7 +191,7 @@ sched_getparam(struct sched_getparam_args *uap)
                targetp = p;
        }
  
-       e = ksched_getparam(&p->p_retval[0], ksched, targetp, &sched_param);
+       e = ksched_getparam(&uap->lmsg.u.ms_result, ksched, targetp, &sched_param);
 
        if (!e)
                copyout(&sched_param, uap->param, sizeof(sched_param));
@@ -209,7 +209,7 @@ sched_setscheduler(struct sched_setscheduler_args *uap)
        copyin(uap->param, &sched_param, sizeof(sched_param));
 
        if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
-               e = ksched_setscheduler(&p->p_retval[0], ksched, p,
+               e = ksched_setscheduler(&uap->lmsg.u.ms_result, ksched, p,
                    uap->policy, (const struct sched_param *)&sched_param);
        }
        return e;
@@ -230,7 +230,7 @@ sched_getscheduler(struct sched_getscheduler_args *uap)
                targetp = p;
        }
  
-       e = ksched_getscheduler(&p->p_retval[0], ksched, targetp);
+       e = ksched_getscheduler(&uap->lmsg.u.ms_result, ksched, targetp);
 
        return e;
 }
@@ -238,22 +238,19 @@ sched_getscheduler(struct sched_getscheduler_args *uap)
 int
 sched_yield(struct sched_yield_args *uap)
 {
-       struct proc *p = curproc;
-       return ksched_yield(&p->p_retval[0], ksched);
+       return ksched_yield(&uap->lmsg.u.ms_result, ksched);
 }
 
 int
 sched_get_priority_max(struct sched_get_priority_max_args *uap)
 {
-       struct proc *p = curproc;
-       return ksched_get_priority_max(&p->p_retval[0], ksched, uap->policy);
+       return ksched_get_priority_max(&uap->lmsg.u.ms_result, ksched, uap->policy);
 }
 
 int
 sched_get_priority_min(struct sched_get_priority_min_args *uap)
 {
-       struct proc *p = curproc;
-       return ksched_get_priority_min(&p->p_retval[0], ksched, uap->policy);
+       return ksched_get_priority_min(&uap->lmsg.u.ms_result, ksched, uap->policy);
 }
 
 int
@@ -263,7 +260,7 @@ sched_rr_get_interval(struct sched_rr_get_interval_args *uap)
        struct proc *p = curproc;
 
        if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
-           e = ksched_rr_get_interval(&p->p_retval[0], ksched,
+           e = ksched_rr_get_interval(&uap->lmsg.u.ms_result, ksched,
                    p, uap->interval);
        }
        return e;
index cddbde8..70e2e9d 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_prot.c 8.6 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_prot.c,v 1.53.2.9 2002/03/09 05:20:26 dd Exp $
- * $DragonFly: src/sys/kern/kern_prot.c,v 1.6 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_prot.c,v 1.7 2003/07/26 18:12:44 dillon Exp $
  */
 
 /*
@@ -68,9 +68,9 @@ getpid(struct getpid_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_pid;
+       uap->lmsg.u.ms_fds[0] = p->p_pid;
 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
-       p->p_retval[1] = p->p_pptr->p_pid;
+       uap->lmsg.u.ms_fds[1] = p->p_pptr->p_pid;
 #endif
        return (0);
 }
@@ -81,7 +81,7 @@ getppid(struct getppid_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_pptr->p_pid;
+       uap->lmsg.u.ms_result = p->p_pptr->p_pid;
        return (0);
 }
 
@@ -95,7 +95,7 @@ getpgrp(struct getpgrp_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_pgrp->pg_id;
+       uap->lmsg.u.ms_result = p->p_pgrp->pg_id;
        return (0);
 }
 
@@ -115,7 +115,7 @@ getpgid(struct getpgid_args *uap)
        if ((pt = pfind(uap->pid)) == 0)
                return ESRCH;
 found:
-       p->p_retval[0] = pt->p_pgrp->pg_id;
+       uap->lmsg.u.ms_result = pt->p_pgrp->pg_id;
        return 0;
 }
 
@@ -135,7 +135,7 @@ getsid(struct getsid_args *uap)
        if ((pt = pfind(uap->pid)) == 0)
                return ESRCH;
 found:
-       p->p_retval[0] = pt->p_session->s_sid;
+       uap->lmsg.u.ms_result = pt->p_session->s_sid;
        return 0;
 }
 
@@ -149,9 +149,9 @@ getuid(struct getuid_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_ucred->cr_ruid;
+       uap->lmsg.u.ms_fds[0] = p->p_ucred->cr_ruid;
 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
-       p->p_retval[1] = p->p_ucred->cr_uid;
+       uap->lmsg.u.ms_fds[1] = p->p_ucred->cr_uid;
 #endif
        return (0);
 }
@@ -165,7 +165,7 @@ geteuid(struct geteuid_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_ucred->cr_uid;
+       uap->lmsg.u.ms_result = p->p_ucred->cr_uid;
        return (0);
 }
 
@@ -178,9 +178,9 @@ getgid(struct getgid_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_ucred->cr_rgid;
+       uap->lmsg.u.ms_fds[0] = p->p_ucred->cr_rgid;
 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
-       p->p_retval[1] = p->p_ucred->cr_groups[0];
+       uap->lmsg.u.ms_fds[1] = p->p_ucred->cr_groups[0];
 #endif
        return (0);
 }
@@ -196,7 +196,7 @@ getegid(struct getegid_args *uap)
 {
        struct proc *p = curproc;
 
-       p->p_retval[0] = p->p_ucred->cr_groups[0];
+       uap->lmsg.u.ms_result = p->p_ucred->cr_groups[0];
        return (0);
 }
 
@@ -213,7 +213,7 @@ getgroups(struct getgroups_args *uap)
        cr = p->p_ucred;
 
        if ((ngrp = uap->gidsetsize) == 0) {
-               p->p_retval[0] = cr->cr_ngroups;
+               uap->lmsg.u.ms_result = cr->cr_ngroups;
                return (0);
        }
        if (ngrp < cr->cr_ngroups)
@@ -222,7 +222,7 @@ getgroups(struct getgroups_args *uap)
        if ((error = copyout((caddr_t)cr->cr_groups,
            (caddr_t)uap->gidset, ngrp * sizeof(gid_t))))
                return (error);
-       p->p_retval[0] = ngrp;
+       uap->lmsg.u.ms_result = ngrp;
        return (0);
 }
 
@@ -236,7 +236,7 @@ setsid(struct setsid_args *uap)
                return (EPERM);
        } else {
                (void)enterpgrp(p, p->p_pid, 1);
-               p->p_retval[0] = p->p_pid;
+               uap->lmsg.u.ms_result = p->p_pid;
                return (0);
        }
 }
@@ -773,7 +773,7 @@ issetugid(struct issetugid_args *uap)
         * a user without an exec - programs cannot know *everything*
         * that libc *might* have put in their data segment.
         */
-       p->p_retval[0] = (p->p_flag & P_SUGID) ? 1 : 0;
+       uap->lmsg.u.ms_result = (p->p_flag & P_SUGID) ? 1 : 0;
        return (0);
 }
 
index c94960c..fd99263 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_resource.c     8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_resource.c,v 1.55.2.5 2001/11/03 01:41:08 ps Exp $
- * $DragonFly: src/sys/kern/kern_resource.c,v 1.9 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_resource.c,v 1.10 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -121,7 +121,7 @@ getpriority(struct getpriority_args *uap)
        }
        if (low == PRIO_MAX + 1)
                return (ESRCH);
-       curp->p_retval[0] = low;
+       uap->lmsg.u.ms_result = low;
        return (0);
 }
 
index 2b13e5b..1763acb 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_sig.c  8.7 (Berkeley) 4/18/94
  * $FreeBSD: src/sys/kern/kern_sig.c,v 1.72.2.17 2003/05/16 16:34:34 obrien Exp $
- * $DragonFly: src/sys/kern/kern_sig.c,v 1.13 2003/07/25 05:26:50 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_sig.c,v 1.14 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -501,7 +501,7 @@ osigprocmask(struct osigprocmask_args *uap)
 
        OSIG2SIG(uap->mask, set);
        error = do_sigprocmask(uap->how, &set, &oset, 1);
-       SIG2OSIG(oset, curproc->p_retval[0]);
+       SIG2OSIG(oset, uap->lmsg.u.ms_result);
        return (error);
 }
 
@@ -520,7 +520,7 @@ osigpending(struct osigpending_args *uap)
 {
        struct proc *p = curproc;
 
-       SIG2OSIG(p->p_siglist, p->p_retval[0]);
+       SIG2OSIG(p->p_siglist, uap->lmsg.u.ms_result);
        return (0);
 }
 
@@ -577,7 +577,7 @@ osigblock(struct osigblock_args *uap)
        OSIG2SIG(uap->mask, set);
        SIG_CANTMASK(set);
        (void) splhigh();
-       SIG2OSIG(p->p_sigmask, p->p_retval[0]);
+       SIG2OSIG(p->p_sigmask, uap->lmsg.u.ms_result);
        SIGSETOR(p->p_sigmask, set);
        (void) spl0();
        return (0);
@@ -592,7 +592,7 @@ osigsetmask(struct osigsetmask_args *uap)
        OSIG2SIG(uap->mask, set);
        SIG_CANTMASK(set);
        (void) splhigh();
-       SIG2OSIG(p->p_sigmask, p->p_retval[0]);
+       SIG2OSIG(p->p_sigmask, uap->lmsg.u.ms_result);
        SIGSETLO(p->p_sigmask, set);
        (void) spl0();
        return (0);
index 81e9e6d..6983ed6 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     @(#)kern_sysctl.c       8.4 (Berkeley) 4/14/94
  * $FreeBSD: src/sys/kern/kern_sysctl.c,v 1.92.2.9 2003/05/01 22:48:09 trhodes Exp $
- * $DragonFly: src/sys/kern/kern_sysctl.c,v 1.9 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_sysctl.c,v 1.10 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -1427,7 +1427,7 @@ ogetkerninfo(struct getkerninfo_args *uap)
        }
        if (error)
                return (error);
-       curproc->p_retval[0] = size;
+       uap->lmsg.u.ms_result = size;
        if (uap->size)
                error = copyout((caddr_t)&size, (caddr_t)uap->size,
                    sizeof(size));
index 23ba0a4..0e66922 100644 (file)
@@ -47,7 +47,7 @@
  * and I certainly make no claims as to its fitness for *any* purpose.
  * 
  * $FreeBSD: src/sys/kern/kern_threads.c,v 1.15 1999/08/28 00:46:15 peter Exp $
- * $DragonFly: src/sys/kern/kern_threads.c,v 1.5 2003/07/19 21:14:38 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_threads.c,v 1.6 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -99,7 +99,7 @@ thr_sleep(struct thr_sleep_args *uap)
                timo = tvtohz(&atv);
        }
 
-       p->p_retval[0] = 0;
+       uap->lmsg.u.ms_result = 0;
        if (p->p_wakeup == 0) {
                sleepstart = ticks;
                p->p_flag |= P_SINTR;
@@ -107,11 +107,11 @@ thr_sleep(struct thr_sleep_args *uap)
                p->p_flag &= ~P_SINTR;
                if (error == EWOULDBLOCK) {
                        p->p_wakeup = 0;
-                       p->p_retval[0] = EAGAIN;
+                       uap->lmsg.u.ms_result = EAGAIN;
                        return 0;
                }
                if (uap->timeout == 0)
-                       p->p_retval[0] = ticks - sleepstart;
+                       uap->lmsg.u.ms_result = ticks - sleepstart;
        }
        p->p_wakeup = 0;
        return (0);
@@ -127,7 +127,7 @@ thr_wakeup(struct thr_wakeup_args *uap)
                pSlave = pSlave->p_peers;
 
        if(pSlave == 0) {
-               p->p_retval[0] = ESRCH;
+               uap->lmsg.u.ms_result = ESRCH;
                return(0);
        }
 
@@ -137,7 +137,7 @@ thr_wakeup(struct thr_wakeup_args *uap)
                return(0);
        }
 
-       p->p_retval[0] = EAGAIN;
+       uap->lmsg.u.ms_result = EAGAIN;
        return 0;
 }
 
@@ -147,9 +147,7 @@ thr_wakeup(struct thr_wakeup_args *uap)
 int
 yield(struct yield_args *uap) 
 {
-       struct proc *p = curproc;
-
-       p->p_retval[0] = 0;
+       uap->lmsg.u.ms_result = 0;
        uio_yield();
        return(0);
 }
index 677bed8..9b32d07 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)kern_xxx.c  8.2 (Berkeley) 11/14/93
  * $FreeBSD: src/sys/kern/kern_xxx.c,v 1.31 1999/08/28 00:46:15 peter Exp $
- * $DragonFly: src/sys/kern/kern_xxx.c,v 1.5 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_xxx.c,v 1.6 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -82,9 +82,7 @@ osethostname(struct sethostname_args *uap)
 int
 ogethostid(struct ogethostid_args *uap)
 {
-       struct proc *p = curproc;
-
-       *(long *)(p->p_retval) = hostid;
+       uap->lmsg.u.ms_lresult = hostid;
        return (0);
 }
 #endif /* COMPAT_43 || COMPAT_SUNOS */
index 45035fe..912b237 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)sys_generic.c       8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $
- * $DragonFly: src/sys/kern/sys_generic.c,v 1.7 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/sys_generic.c,v 1.8 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -73,12 +73,13 @@ static MALLOC_DEFINE(M_IOCTLOPS, "ioctlops", "ioctl data buffer");
 static MALLOC_DEFINE(M_SELECT, "select", "select() buffer");
 MALLOC_DEFINE(M_IOV, "iov", "large iov's");
 
-static int     pollscan __P((struct proc *, struct pollfd *, u_int));
-static int     selscan __P((struct proc *, fd_mask **, fd_mask **, int));
+static int     pollscan __P((struct proc *, struct pollfd *, u_int, int *));
+static int     selscan __P((struct proc *, fd_mask **, fd_mask **,
+                       int, int *));
 static int     dofileread __P((struct file *, int, void *,
-                   size_t, off_t, int));
+                       size_t, off_t, int, int *));
 static int     dofilewrite __P((struct file *, int,
-                   const void *, size_t, off_t, int));
+                       const void *, size_t, off_t, int, int *));
 
 struct file*
 holdfp(fdp, fd, flag)
@@ -110,7 +111,8 @@ read(struct read_args *uap)
        KKASSERT(p);
        if ((fp = holdfp(p->p_fd, uap->fd, FREAD)) == NULL)
                return (EBADF);
-       error = dofileread(fp, uap->fd, uap->buf, uap->nbyte, (off_t)-1, 0);
+       error = dofileread(fp, uap->fd, uap->buf, uap->nbyte, (off_t)-1, 0,
+                       &uap->lmsg.u.ms_result);
        fdrop(fp, td);
        return(error);
 }
@@ -133,7 +135,7 @@ pread(struct pread_args *uap)
                error = ESPIPE;
        } else {
            error = dofileread(fp, uap->fd, uap->buf, uap->nbyte, 
-               uap->offset, FOF_OFFSET);
+               uap->offset, FOF_OFFSET, &uap->lmsg.u.ms_result);
        }
        fdrop(fp, td);
        return(error);
@@ -143,12 +145,13 @@ pread(struct pread_args *uap)
  * Code common for read and pread
  */
 int
-dofileread(fp, fd, buf, nbyte, offset, flags)
+dofileread(fp, fd, buf, nbyte, offset, flags, res)
        struct file *fp;
        int fd, flags;
        void *buf;
        size_t nbyte;
        off_t offset;
+       int *res;
 {
        struct thread *td = curthread;
        struct proc *p = td->td_proc;
@@ -197,7 +200,7 @@ dofileread(fp, fd, buf, nbyte, offset, flags)
                ktrgenio(p->p_tracep, fd, UIO_READ, &ktruio, error);
        }
 #endif
-       p->p_retval[0] = cnt;
+       *res = cnt;
        return (error);
 }
 
@@ -280,7 +283,7 @@ readv(struct readv_args *uap)
                FREE(ktriov, M_TEMP);
        }
 #endif
-       p->p_retval[0] = cnt;
+       uap->lmsg.u.ms_result = cnt;
 done:
        fdrop(fp, td);
        if (needfree)
@@ -303,7 +306,8 @@ write(struct write_args *uap)
 
        if ((fp = holdfp(p->p_fd, uap->fd, FWRITE)) == NULL)
                return (EBADF);
-       error = dofilewrite(fp, uap->fd, uap->buf, uap->nbyte, (off_t)-1, 0);
+       error = dofilewrite(fp, uap->fd, uap->buf, uap->nbyte, (off_t)-1, 0,
+                       &uap->lmsg.u.ms_result);
        fdrop(fp, td);
        return(error);
 }
@@ -326,7 +330,7 @@ pwrite(struct pwrite_args *uap)
                error = ESPIPE;
        } else {
            error = dofilewrite(fp, uap->fd, uap->buf, uap->nbyte,
-               uap->offset, FOF_OFFSET);
+               uap->offset, FOF_OFFSET, &uap->lmsg.u.ms_result);
        }
        fdrop(fp, td);
        return(error);
@@ -339,7 +343,8 @@ dofilewrite(
        const void *buf,
        size_t nbyte,
        off_t offset,
-       int flags
+       int flags,
+       int *res
 ) {
        struct thread *td = curthread;
        struct proc *p = td->td_proc;
@@ -391,7 +396,7 @@ dofilewrite(
                ktrgenio(p->p_tracep, fd, UIO_WRITE, &ktruio, error);
        }
 #endif
-       p->p_retval[0] = cnt;
+       *res = cnt;
        return (error);
 }
 
@@ -484,7 +489,7 @@ writev(struct writev_args *uap)
                FREE(ktriov, M_TEMP);
        }
 #endif
-       p->p_retval[0] = cnt;
+       uap->lmsg.u.ms_result = cnt;
 done:
        fdrop(fp, td);
        if (needfree)
@@ -697,8 +702,8 @@ select(struct select_args *uap)
 retry:
        ncoll = nselcoll;
        p->p_flag |= P_SELECT;
-       error = selscan(p, ibits, obits, uap->nd);
-       if (error || p->p_retval[0])
+       error = selscan(p, ibits, obits, uap->nd, &uap->lmsg.u.ms_result);
+       if (error || uap->lmsg.u.ms_result)
                goto done;
        if (atv.tv_sec || atv.tv_usec) {
                getmicrouptime(&rtv);
@@ -745,7 +750,7 @@ done:
 }
 
 static int
-selscan(struct proc *p, fd_mask **ibits, fd_mask **obits, int nfd)
+selscan(struct proc *p, fd_mask **ibits, fd_mask **obits, int nfd, int *res)
 {
        struct thread *td = p->p_thread;
        struct filedesc *fdp = p->p_fd;
@@ -776,7 +781,7 @@ selscan(struct proc *p, fd_mask **ibits, fd_mask **obits, int nfd)
                        }
                }
        }
-       p->p_retval[0] = n;
+       *res = n;
        return (0);
 }
 
@@ -829,8 +834,8 @@ poll(struct poll_args *uap)
 retry:
        ncoll = nselcoll;
        p->p_flag |= P_SELECT;
-       error = pollscan(p, (struct pollfd *)bits, nfds);
-       if (error || p->p_retval[0])
+       error = pollscan(p, (struct pollfd *)bits, nfds, &uap->lmsg.u.ms_result);
+       if (error || uap->lmsg.u.ms_result)
                goto done;
        if (atv.tv_sec || atv.tv_usec) {
                getmicrouptime(&rtv);
@@ -870,7 +875,7 @@ out:
 }
 
 static int
-pollscan(struct proc *p, struct pollfd *fds, u_int nfd)
+pollscan(struct proc *p, struct pollfd *fds, u_int nfd, int *res)
 {
        struct thread *td = p->p_thread;
        struct filedesc *fdp = p->p_fd;
@@ -901,7 +906,7 @@ pollscan(struct proc *p, struct pollfd *fds, u_int nfd)
                        }
                }
        }
-       p->p_retval[0] = n;
+       *res = n;
        return (0);
 }
 
index c63a154..73ce2dd 100644 (file)
@@ -17,7 +17,7 @@
  *    are met.
  *
  * $FreeBSD: src/sys/kern/sys_pipe.c,v 1.60.2.13 2002/08/05 15:05:15 des Exp $
- * $DragonFly: src/sys/kern/sys_pipe.c,v 1.5 2003/07/19 21:14:39 dillon Exp $
+ * $DragonFly: src/sys/kern/sys_pipe.c,v 1.6 2003/07/26 18:12:44 dillon Exp $
  */
 
 /*
@@ -177,7 +177,7 @@ pipe(struct pipe_args *uap)
        struct filedesc *fdp;
        struct file *rf, *wf;
        struct pipe *rpipe, *wpipe;
-       int fd, error;
+       int fd1, fd2, error;
 
        KKASSERT(p);
        fdp = p->p_fd;
@@ -195,14 +195,14 @@ pipe(struct pipe_args *uap)
        rpipe->pipe_state |= PIPE_DIRECTOK;
        wpipe->pipe_state |= PIPE_DIRECTOK;
 
-       error = falloc(p, &rf, &fd);
+       error = falloc(p, &rf, &fd1);
        if (error) {
                pipeclose(rpipe);
                pipeclose(wpipe);
                return (error);
        }
        fhold(rf);
-       p->p_retval[0] = fd;
+       uap->lmsg.u.ms_fds[0] = fd1;
 
        /*
         * Warning: once we've gotten past allocation of the fd for the
@@ -214,10 +214,10 @@ pipe(struct pipe_args *uap)
        rf->f_type = DTYPE_PIPE;
        rf->f_data = (caddr_t)rpipe;
        rf->f_ops = &pipeops;
-       error = falloc(p, &wf, &fd);
+       error = falloc(p, &wf, &fd2);
        if (error) {
-               if (fdp->fd_ofiles[p->p_retval[0]] == rf) {
-                       fdp->fd_ofiles[p->p_retval[0]] = NULL;
+               if (fdp->fd_ofiles[fd1] == rf) {
+                       fdp->fd_ofiles[fd1] = NULL;
                        fdrop(rf, td);
                }
                fdrop(rf, td);
@@ -229,7 +229,7 @@ pipe(struct pipe_args *uap)
        wf->f_type = DTYPE_PIPE;
        wf->f_data = (caddr_t)wpipe;
        wf->f_ops = &pipeops;
-       p->p_retval[1] = fd;
+       uap->lmsg.u.ms_fds[1] = fd2;
 
        rpipe->pipe_peer = wpipe;
        wpipe->pipe_peer = rpipe;
index 117836d..746aac8 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/sys_process.c,v 1.51.2.6 2003/01/08 03:06:45 kan Exp $
- * $DragonFly: src/sys/kern/sys_process.c,v 1.7 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/sys_process.c,v 1.8 2003/07/26 18:12:44 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -237,7 +237,8 @@ ptrace(struct ptrace_args *uap)
        if (error)
                return (error);
 
-       error = kern_ptrace(p, uap->req, uap->pid, addr, uap->data);
+       error = kern_ptrace(p, uap->req, uap->pid, addr, uap->data,
+                       &uap->lmsg.u.ms_result);
        if (error)
                return (error);
 
@@ -262,7 +263,7 @@ ptrace(struct ptrace_args *uap)
 }
 
 int
-kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data)
+kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data, int *res)
 {
        struct proc *p, *pp;
        struct iovec iov;
@@ -378,7 +379,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void *addr, int data)
         * Actually do the requests
         */
 
-       curp->p_retval[0] = 0;
+       *res = 0;
 
        switch (req) {
        case PT_TRACE_ME:
@@ -479,7 +480,7 @@ kern_ptrace(struct proc *curp, int req, pid_t pid, void