Author: kib
Date: Fri Jul 23 21:30:33 2010
New Revision: 210431
URL: http://svn.freebsd.org/changeset/base/210431

Log:
  Remove the linux_exec_copyin_args(), freebsd32_exec_copyin_args() may
  server as well. COMPAT_FREEBSD32 is a prerequisite for COMPAT_LINUX32.
  
  Reviewed by:  alc
  MFC after:    3 weeks

Modified:
  head/sys/amd64/linux32/linux32_machdep.c
  head/sys/amd64/linux32/syscalls.master
  head/sys/compat/freebsd32/freebsd32_misc.c
  head/sys/compat/freebsd32/freebsd32_util.h

Modified: head/sys/amd64/linux32/linux32_machdep.c
==============================================================================
--- head/sys/amd64/linux32/linux32_machdep.c    Fri Jul 23 19:36:11 2010        
(r210430)
+++ head/sys/amd64/linux32/linux32_machdep.c    Fri Jul 23 21:30:33 2010        
(r210431)
@@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_kern.h>
 #include <vm/vm_map.h>
 
+#include <compat/freebsd32/freebsd32_util.h>
 #include <amd64/linux32/linux.h>
 #include <amd64/linux32/linux32_proto.h>
 #include <compat/linux/linux_ipc.h>
@@ -107,103 +108,6 @@ bsd_to_linux_sigaltstack(int bsa)
        return (lsa);
 }
 
-/*
- * Custom version of exec_copyin_args() so that we can translate
- * the pointers.
- */
-static int
-linux_exec_copyin_args(struct image_args *args, char *fname,
-    enum uio_seg segflg, char **argv, char **envv)
-{
-       char *argp, *envp;
-       u_int32_t *p32, arg;
-       size_t length;
-       int error;
-
-       bzero(args, sizeof(*args));
-       if (argv == NULL)
-               return (EFAULT);
-
-       /*
-        * Allocate temporary demand zeroed space for argument and
-        *      environment strings
-        */
-       args->buf = (char *)kmem_alloc_wait(exec_map,
-           PATH_MAX + ARG_MAX + MAXSHELLCMDLEN);
-       if (args->buf == NULL)
-               return (ENOMEM);
-       args->begin_argv = args->buf;
-       args->endp = args->begin_argv;
-       args->stringspace = ARG_MAX;
-
-       args->fname = args->buf + ARG_MAX;
-
-       /*
-        * Copy the file name.
-        */
-       error = (segflg == UIO_SYSSPACE) ?
-           copystr(fname, args->fname, PATH_MAX, &length) :
-           copyinstr(fname, args->fname, PATH_MAX, &length);
-       if (error != 0)
-               goto err_exit;
-
-       /*
-        * extract arguments first
-        */
-       p32 = (u_int32_t *)argv;
-       for (;;) {
-               error = copyin(p32++, &arg, sizeof(arg));
-               if (error)
-                       goto err_exit;
-               if (arg == 0)
-                       break;
-               argp = PTRIN(arg);
-               error = copyinstr(argp, args->endp, args->stringspace, &length);
-               if (error) {
-                       if (error == ENAMETOOLONG)
-                               error = E2BIG;
-
-                       goto err_exit;
-               }
-               args->stringspace -= length;
-               args->endp += length;
-               args->argc++;
-       }
-
-       args->begin_envv = args->endp;
-
-       /*
-        * extract environment strings
-        */
-       if (envv) {
-               p32 = (u_int32_t *)envv;
-               for (;;) {
-                       error = copyin(p32++, &arg, sizeof(arg));
-                       if (error)
-                               goto err_exit;
-                       if (arg == 0)
-                               break;
-                       envp = PTRIN(arg);
-                       error = copyinstr(envp, args->endp, args->stringspace,
-                           &length);
-                       if (error) {
-                               if (error == ENAMETOOLONG)
-                                       error = E2BIG;
-                               goto err_exit;
-                       }
-                       args->stringspace -= length;
-                       args->endp += length;
-                       args->envc++;
-               }
-       }
-
-       return (0);
-
-err_exit:
-       exec_free_args(args);
-       return (error);
-}
-
 int
 linux_execve(struct thread *td, struct linux_execve_args *args)
 {
@@ -218,8 +122,8 @@ linux_execve(struct thread *td, struct l
                printf(ARGS(execve, "%s"), path);
 #endif
 
-       error = linux_exec_copyin_args(&eargs, path, UIO_SYSSPACE, args->argp,
-           args->envp);
+       error = freebsd32_exec_copyin_args(&eargs, path, UIO_SYSSPACE,
+           args->argp, args->envp);
        free(path, M_TEMP);
        if (error == 0)
                error = kern_execve(td, &eargs, NULL);

Modified: head/sys/amd64/linux32/syscalls.master
==============================================================================
--- head/sys/amd64/linux32/syscalls.master      Fri Jul 23 19:36:11 2010        
(r210430)
+++ head/sys/amd64/linux32/syscalls.master      Fri Jul 23 21:30:33 2010        
(r210431)
@@ -54,8 +54,8 @@
                                    l_int mode); }
 9      AUE_LINK        STD     { int linux_link(char *path, char *to); }
 10     AUE_UNLINK      STD     { int linux_unlink(char *path); }
-11     AUE_EXECVE      STD     { int linux_execve(char *path, char **argp, \
-                                   char **envp); }
+11     AUE_EXECVE      STD     { int linux_execve(char *path, u_int32_t *argp, 
\
+                                   u_int32_t *envp); }
 12     AUE_CHDIR       STD     { int linux_chdir(char *path); }
 13     AUE_NULL        STD     { int linux_time(l_time_t *tm); }
 14     AUE_MKNOD       STD     { int linux_mknod(char *path, l_int mode, \

Modified: head/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_misc.c  Fri Jul 23 19:36:11 2010        
(r210430)
+++ head/sys/compat/freebsd32/freebsd32_misc.c  Fri Jul 23 21:30:33 2010        
(r210431)
@@ -265,7 +265,7 @@ freebsd32_sigaltstack(struct thread *td,
  * Custom version of exec_copyin_args() so that we can translate
  * the pointers.
  */
-static int
+int
 freebsd32_exec_copyin_args(struct image_args *args, char *fname,
     enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv)
 {

Modified: head/sys/compat/freebsd32/freebsd32_util.h
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_util.h  Fri Jul 23 19:36:11 2010        
(r210430)
+++ head/sys/compat/freebsd32/freebsd32_util.h  Fri Jul 23 21:30:33 2010        
(r210431)
@@ -101,5 +101,9 @@ int freebsd32_copyiniov(struct iovec32 *
            struct iovec **iov, int error);
 void   freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32);
 
+enum uio_seg;
+struct image_args;
+int freebsd32_exec_copyin_args(struct image_args *args, char *fname,
+           enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv);
 
 #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to