syscall messaging 3: Expand the 'header' that goes in front of the syscall
[dragonfly.git] / sys / emulation / svr4 / svr4_stat.c
index d29dd2e..ba942e1 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.3 2003/06/23 17:55:49 dillon Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_stat.c,v 1.6 2003/07/30 00:19:15 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -68,6 +68,7 @@
 #endif
 
 struct svr4_ustat_args {
+       union sysmsg            sysmsg;
        svr4_dev_t              dev;
        struct svr4_ustat * name;
 };
@@ -156,7 +157,7 @@ bsd_to_svr4_stat64(st, st4)
 int
 svr4_sys_stat(struct svr4_sys_stat_args *uap)
 {
-       struct proc *p = curproc;
+       struct thread *td = curthread;
        struct stat             st;
        struct svr4_stat        svr4_st;
        struct stat_args        cup;
@@ -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.sysmsg_result = 0;
 
        if ((error = stat(&cup)) != 0)
                return error;
@@ -175,10 +176,12 @@ svr4_sys_stat(struct svr4_sys_stat_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->sysmsg_result = cup.sysmsg_result;
+
        bsd_to_svr4_stat(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
-               (void) svr4_add_socket(p, SCARG(uap, path), &st);
+               (void) svr4_add_socket(td, SCARG(uap, path), &st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st)) != 0)
                return error;
@@ -190,7 +193,7 @@ svr4_sys_stat(struct svr4_sys_stat_args *uap)
 int
 svr4_sys_lstat(struct svr4_sys_lstat_args *uap)
 {
-       struct proc *p = curproc;
+       struct thread *td = curthread;
        struct stat             st;
        struct svr4_stat        svr4_st;
        struct lstat_args       cup;
@@ -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.sysmsg_result = 0;
 
        if ((error = lstat(&cup)) != 0)
                return error;
@@ -208,10 +212,12 @@ svr4_sys_lstat(struct svr4_sys_lstat_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->sysmsg_result = cup.sysmsg_result;
+
        bsd_to_svr4_stat(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
-               (void) svr4_add_socket(p, SCARG(uap, path), &st);
+               (void) svr4_add_socket(td, SCARG(uap, path), &st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st)) != 0)
                return error;
@@ -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.sysmsg_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->sysmsg_result = cup.sysmsg_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.sysmsg_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->sysmsg_result = cup.sysmsg_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.sysmsg_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->sysmsg_result = cup.sysmsg_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.sysmsg_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->sysmsg_result = cup.sysmsg_result;
+
        bsd_to_svr4_xstat(&st, &svr4_st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
@@ -342,7 +360,7 @@ svr4_sys_fxstat(struct svr4_sys_fxstat_args *uap)
 int
 svr4_sys_stat64(struct svr4_sys_stat64_args *uap)
 {
-       struct proc *p = curproc;
+       struct thread *td = curthread;
        struct stat             st;
        struct svr4_stat64      svr4_st;
        struct stat_args        cup;
@@ -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.sysmsg_result = 0;
 
        if ((error = stat(&cup)) != 0)
                return error;
@@ -360,10 +379,12 @@ svr4_sys_stat64(struct svr4_sys_stat64_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->sysmsg_result = cup.sysmsg_result;
+
        bsd_to_svr4_stat64(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
-               (void) svr4_add_socket(p, SCARG(uap, path), &st);
+               (void) svr4_add_socket(td, SCARG(uap, path), &st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                return error;
@@ -375,7 +396,7 @@ svr4_sys_stat64(struct svr4_sys_stat64_args *uap)
 int
 svr4_sys_lstat64(struct svr4_sys_lstat64_args *uap)
 {
-       struct proc *p = curproc;
+       struct thread *td = curthread;
        struct stat             st;
        struct svr4_stat64      svr4_st;
        struct stat_args        cup;
@@ -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.sysmsg_result = 0;
 
        if ((error = lstat((struct lstat_args *)&cup)) != 0)
                return error;
@@ -393,10 +415,12 @@ svr4_sys_lstat64(struct svr4_sys_lstat64_args *uap)
        if ((error = copyin(SCARG(&cup, ub), &st, sizeof st)) != 0)
                return error;
 
+       uap->sysmsg_result = cup.sysmsg_result;
+
        bsd_to_svr4_stat64(&st, &svr4_st);
 
        if (S_ISSOCK(st.st_mode))
-               (void) svr4_add_socket(p, SCARG(uap, path), &st);
+               (void) svr4_add_socket(td, SCARG(uap, path), &st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
                return error;
@@ -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.sysmsg_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->sysmsg_result = cup.sysmsg_result;
+
        bsd_to_svr4_stat64(&st, &svr4_st);
 
        if ((error = copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st)) != 0)
@@ -481,10 +508,9 @@ svr4_sys_uname(struct svr4_sys_uname_args *uap)
 int
 svr4_sys_systeminfo(struct svr4_sys_systeminfo_args *uap)
 {
-       struct proc *p = curproc;
        char            *str = NULL;
        int             error = 0;
-       register_t      *retval = p->p_retval;
+       register_t      *retval = &uap->sysmsg_result;
        size_t          len = 0;
        char            buf[1];   /* XXX NetBSD uses 256, but that seems
                                     like awfully excessive kstack usage
@@ -541,13 +567,13 @@ svr4_sys_systeminfo(struct svr4_sys_systeminfo_args *uap)
                break;
 #if defined(WHY_DOES_AN_EMULATOR_WANT_TO_SET_HOSTNAMES)
        case SVR4_SI_SET_HOSTNAME:
-               if ((error = suser(p)) != 0)
+               if ((error = suser(td)) != 0)
                        return error;
                name = KERN_HOSTNAME;
                return kern_sysctl(&name, 1, 0, 0, SCARG(uap, buf), rlen, p);
 
        case SVR4_SI_SET_SRPC_DOMAIN:
-               if ((error = suser(p)) != 0)
+               if ((error = suser(td)) != 0)
                        return error;
                name = KERN_NISDOMAINNAME;
                return kern_sysctl(&name, 1, 0, 0, SCARG(uap, buf), rlen, p);
@@ -594,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.sysmsg_result = 0;
+                       error = svr4_sys_uname(&ua);
+                       uap->sysmsg_result = ua.sysmsg_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.sysmsg_result = 0;
+                       error = svr4_ustat(&ua);
+                       uap->sysmsg_result = ua.sysmsg_result;
+                       return(error);
                }
 
        case 3:         /* fusers(2) */
@@ -640,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.sysmsg_result = 0;
+       error = utimes(&ap);
+       uap->sysmsg_result = ap.sysmsg_result;
+       return(error);
 }
 
 
@@ -707,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->sysmsg_result;
 
        CHECKALTEXIST(&sg, SCARG(uap, path));
 
@@ -731,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->sysmsg_result;
 
        SCARG(uap, name) = svr4_to_bsd_pathconf(SCARG(uap, name));