diff options
5 files changed, 0 insertions, 1626 deletions
diff --git a/debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch b/debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch deleted file mode 100644 index ddbb1788..00000000 --- a/debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch +++ /dev/null @@ -1,340 +0,0 @@ -From 8ec005706bcb8afdf5c956b6bc8608aeb05d0d60 Mon Sep 17 00:00:00 2001 -From: Emilio Pozuelo Monfort <pochu27@gmail.com> -Date: Wed, 26 May 2010 00:15:37 +0200 -Subject: [PATCH hurd 1/4] Add a new exec_exec_file_name RPC - -* hurd/exec.defs (exec_exec_file_name): New RPC. -(exec_exec): Label as deprecated. -* doc/hurd.texi: Updated. -* exec/exec.c (S_exec_exec_file_name): New function. -(S_exec_exec): Label as deprecated. -(do_exec): Add argument. -* exec/hashexec.c (check_hashbang): Add argument. -Don't guess the file name if file_name_exec is set. -* exec/priv.h (check_hashbang): Add argument. ---- - doc/hurd.texi | 8 ++++---- - exec/Makefile | 3 ++- - exec/exec.c | 48 +++++++++++++++++++++++++++++++++++++++++---- - exec/hashexec.c | 18 +++++++++++------ - exec/main.c | 2 ++ - exec/priv.h | 5 ++++- - hurd/exec.defs | 4 +++- - hurd/exec_experimental.defs | 46 +++++++++++++++++++++++++++++++++++++++++++ - 8 files changed, 117 insertions(+), 17 deletions(-) - create mode 100644 hurd/exec_experimental.defs - -diff --git a/doc/hurd.texi b/doc/hurd.texi -index 2f36bdc..f36caf8 100644 ---- a/doc/hurd.texi -+++ b/doc/hurd.texi -@@ -102,7 +102,7 @@ This file documents the GNU Hurd kernel component. This edition of the - documentation was last updated for version @value{VERSION} of the Hurd. - - Copyright @copyright{} 1994, 1996, 1998, 1999, 2000, 2001, 2002, 2003, --2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. -+2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. - - @quotation - Permission is granted to make and distribute verbatim copies of -@@ -2766,14 +2766,14 @@ If the setuid/setgid transformation adds a new uid or gid to the user's - authentication handle that was not previously present (as opposed to - merely reordering them), then the @code{EXEC_SECURE} and - @code{EXEC_NEWTASK} flags should both be added in the call to --@code{exec_exec}. -+@code{exec_exec_file_name}. - - The server then needs to open a new port onto the executed file which - will not share any file pointers with the port the user passed in, - opened with @code{O_READ}. Finally, all the information (mutated - appropriately for setuid/setgid) should be sent to the execserver with --@code{exec_exec}. Whatever error code @code{exec_exec} returns should --returned to the caller of @code{file_exec}. -+@code{exec_exec_file_name}. Whatever error code @code{exec_exec_file_name} -+returns should be returned to the caller of @code{file_exec}. - - @node File Locking - @subsection File Locking -diff --git a/exec/Makefile b/exec/Makefile -index d332f36..c32d65e 100644 ---- a/exec/Makefile -+++ b/exec/Makefile -@@ -22,7 +22,7 @@ makemode := server - - SRCS = exec.c main.c hashexec.c hostarch.c - OBJS = main.o hostarch.o exec.o hashexec.o \ -- execServer.o exec_startupServer.o -+ execServer.o exec_startupServer.o exec_experimentalServer.o - - target = exec - #targets = exec exec.static -@@ -31,6 +31,7 @@ OTHERLIBS = -lpthread - - exec-MIGSFLAGS = -imacros $(srcdir)/execmutations.h - exec_startup-MIGSFLAGS = -imacros $(srcdir)/execmutations.h -+exec_experimental-MIGSFLAGS = -imacros $(srcdir)/execmutations.h - - include ../Makeconf - -diff --git a/exec/exec.c b/exec/exec.c -index 3b63b7f..b825cc5 100644 ---- a/exec/exec.c -+++ b/exec/exec.c -@@ -1,6 +1,6 @@ - /* GNU Hurd standard exec server. -- Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04 -- Free Software Foundation, Inc. -+ Copyright (C) 1992 ,1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+ 2002, 2004, 2010 Free Software Foundation, Inc. - Written by Roland McGrath. - - Can exec ELF format directly. -@@ -764,6 +764,7 @@ static error_t - do_exec (file_t file, - task_t oldtask, - int flags, -+ char *filename, - char *argv, mach_msg_type_number_t argvlen, boolean_t argv_copy, - char *envp, mach_msg_type_number_t envplen, boolean_t envp_copy, - mach_port_t *dtable, mach_msg_type_number_t dtablesize, -@@ -822,7 +823,7 @@ do_exec (file_t file, - { - /* Check for a #! executable file. */ - check_hashbang (&e, -- file, oldtask, flags, -+ file, oldtask, flags, filename, - argv, argvlen, argv_copy, - envp, envplen, envp_copy, - dtable, dtablesize, dtable_copy, -@@ -1405,6 +1406,7 @@ do_exec (file_t file, - return e.error; - } - -+/* Deprecated. */ - kern_return_t - S_exec_exec (struct trivfs_protid *protid, - file_t file, -@@ -1421,13 +1423,51 @@ S_exec_exec (struct trivfs_protid *protid, - mach_port_t *deallocnames, mach_msg_type_number_t ndeallocnames, - mach_port_t *destroynames, mach_msg_type_number_t ndestroynames) - { -+ return S_exec_exec_file_name (protid, -+ file, -+ oldtask, -+ flags, -+ "", -+ argv, argvlen, argv_copy, -+ envp, envplen, envp_copy, -+ dtable, dtablesize, -+ dtable_copy, -+ portarray, nports, -+ portarray_copy, -+ intarray, nints, -+ intarray_copy, -+ deallocnames, ndeallocnames, -+ destroynames, ndestroynames); -+} -+ -+kern_return_t -+S_exec_exec_file_name (struct trivfs_protid *protid, -+ file_t file, -+ task_t oldtask, -+ int flags, -+ char *filename, -+ char *argv, mach_msg_type_number_t argvlen, -+ boolean_t argv_copy, -+ char *envp, mach_msg_type_number_t envplen, -+ boolean_t envp_copy, -+ mach_port_t *dtable, mach_msg_type_number_t dtablesize, -+ boolean_t dtable_copy, -+ mach_port_t *portarray, mach_msg_type_number_t nports, -+ boolean_t portarray_copy, -+ int *intarray, mach_msg_type_number_t nints, -+ boolean_t intarray_copy, -+ mach_port_t *deallocnames, -+ mach_msg_type_number_t ndeallocnames, -+ mach_port_t *destroynames, -+ mach_msg_type_number_t ndestroynames) -+{ - if (! protid) - return EOPNOTSUPP; - - /* There were no user-specified exec servers, - or none of them could be found. */ - -- return do_exec (file, oldtask, flags, -+ return do_exec (file, oldtask, flags, filename, - argv, argvlen, argv_copy, - envp, envplen, envp_copy, - dtable, dtablesize, dtable_copy, -diff --git a/exec/hashexec.c b/exec/hashexec.c -index e53d2ee..118360f 100644 ---- a/exec/hashexec.c -+++ b/exec/hashexec.c -@@ -1,5 +1,6 @@ - /* GNU Hurd standard exec server, #! script execution support. -- Copyright (C) 1995,96,97,98,99,2000,02 Free Software Foundation, Inc. -+ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2010 -+ Free Software Foundation, Inc. - Written by Roland McGrath. - - This file is part of the GNU Hurd. -@@ -35,6 +36,7 @@ check_hashbang (struct execdata *e, - file_t file, - task_t oldtask, - int flags, -+ char *file_name_exec, - char *argv, u_int argvlen, boolean_t argv_copy, - char *envp, u_int envplen, boolean_t envp_copy, - mach_port_t *dtable, u_int dtablesize, boolean_t dtable_copy, -@@ -225,10 +227,12 @@ check_hashbang (struct execdata *e, - file_name = NULL; - else if (! (flags & EXEC_SECURE)) - { -- /* Try to figure out the file's name. We guess that if ARGV[0] -- contains a slash, it might be the name of the file; and that -- if it contains no slash, looking for files named by ARGV[0] in -- the `PATH' environment variable might find it. */ -+ /* Try to figure out the file's name. If FILE_NAME_EXEC -+ is not NULL, then it's the file's name. Otherwise we -+ guess that if ARGV[0] contains a slash, it might be -+ the name of the file; and that if it contains no slash, -+ looking for files named by ARGV[0] in the `PATH' -+ environment variable might find it. */ - - error_t error; - char *name; -@@ -278,7 +282,9 @@ check_hashbang (struct execdata *e, - else - name = argv; - -- if (strchr (name, '/') != NULL) -+ if (file_name_exec && file_name_exec[0] != '\0') -+ error = lookup (name = file_name_exec, 0, &name_file); -+ else if (strchr (name, '/') != NULL) - error = lookup (name, 0, &name_file); - else if ((error = hurd_catch_signal - (sigmask (SIGBUS) | sigmask (SIGSEGV), -diff --git a/exec/main.c b/exec/main.c -index c86c000..4b33916 100644 ---- a/exec/main.c -+++ b/exec/main.c -@@ -49,6 +49,7 @@ mach_port_t opt_device_master; - - - #include "exec_S.h" -+#include "exec_experimental_S.h" - #include "exec_startup_S.h" - - static int -@@ -56,6 +57,7 @@ exec_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) - { - mig_routine_t routine; - if ((routine = exec_server_routine (inp)) || -+ (routine = exec_experimental_server_routine (inp)) || - (routine = NULL, trivfs_demuxer (inp, outp)) || - (routine = exec_startup_server_routine (inp))) - { -diff --git a/exec/priv.h b/exec/priv.h -index 733f35c..daa7075 100644 ---- a/exec/priv.h -+++ b/exec/priv.h -@@ -1,5 +1,6 @@ - /* GNU Hurd standard exec server, private declarations. -- Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc. -+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2004, -+ 2010 Free Software Foundation, Inc. - Written by Roland McGrath. - - This file is part of the GNU Hurd. -@@ -32,6 +33,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include <link.h> /* This gives us the ElfW macro. */ - #include <fcntl.h> - #include "exec_S.h" -+#include "exec_experimental_S.h" - - - #ifndef exec_priv_h -@@ -135,6 +137,7 @@ void check_hashbang (struct execdata *e, - file_t file, - task_t oldtask, - int flags, -+ char *filename, - char *argv, u_int argvlen, boolean_t argv_copy, - char *envp, u_int envplen, boolean_t envp_copy, - mach_port_t *dtable, u_int dtablesize, -diff --git a/hurd/exec.defs b/hurd/exec.defs -index 2888fb1..7433cc2 100644 ---- a/hurd/exec.defs -+++ b/hurd/exec.defs -@@ -1,5 +1,6 @@ - /* Interface definitions for the exec servers. -- Copyright (C) 1991,92,93,94,95,2001 Free Software Foundation, Inc. -+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010 -+ Free Software Foundation, Inc. - - This file is part of the GNU Hurd. - -@@ -29,6 +30,7 @@ EXEC_IMPORTS - - INTR_INTERFACE - -+/* Deprecated: use exec_exec_file_name instead. */ - routine exec_exec ( - execserver: file_t; - file: mach_port_send_t; -diff --git a/hurd/exec_experimental.defs b/hurd/exec_experimental.defs -new file mode 100644 -index 0000000..ff2e02f ---- /dev/null -+++ b/hurd/exec_experimental.defs -@@ -0,0 +1,46 @@ -+/* Interface definitions for the exec servers. -+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010, 2012 -+ Free Software Foundation, Inc. -+ -+This file is part of the GNU Hurd. -+ -+The GNU Hurd is free software; you can redistribute it and/or modify -+it under the terms of the GNU General Public License as published by -+the Free Software Foundation; either version 2, or (at your option) -+any later version. -+ -+The GNU Hurd is distributed in the hope that it will be useful, -+but WITHOUT ANY WARRANTY; without even the implied warranty of -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+GNU General Public License for more details. -+ -+You should have received a copy of the GNU General Public License -+along with the GNU Hurd; see the file COPYING. If not, write to -+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -+ -+/* Written by Michael I. Bushnell and Roland McGrath. */ -+ -+subsystem exec_experimental 434242; -+ -+#include <hurd/hurd_types.defs> -+ -+#ifdef EXEC_IMPORTS -+EXEC_IMPORTS -+#endif -+ -+INTR_INTERFACE -+ -+routine exec_exec_file_name ( -+ execserver: file_t; -+ file: mach_port_send_t; -+ oldtask: task_t; -+ flags: int; -+ filename: string_t; -+ argv: data_t SCP; -+ envp: data_t SCP; -+ dtable: portarray_t SCP; -+ portarray: portarray_t SCP; -+ intarray: intarray_t SCP; -+ deallocnames: mach_port_name_array_t; -+ destroynames: mach_port_name_array_t); -+ --- -2.1.4 - diff --git a/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch b/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch deleted file mode 100644 index b3efb235..00000000 --- a/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch +++ /dev/null @@ -1,1017 +0,0 @@ -From 587f6f79cd2273907dc6ddacf287c2e13d2d813a Mon Sep 17 00:00:00 2001 -From: Emilio Pozuelo Monfort <pochu27@gmail.com> -Date: Wed, 26 May 2010 01:27:40 +0200 -Subject: [PATCH hurd 2/4] Add a file_exec_file_name RPC - -* hurd/fs.defs (file_exec): Deprecate in favor of... -(file_exec_file_name): ...this new RPC. -Change all implementations and forward old implementations to -the new version. Change all callers but fallback to old version. -Change comments and documentation. ---- - TODO | 2 +- - configure.ac | 2 + - doc/hurd.texi | 16 +++--- - exec/hashexec.c | 37 ++++++++++---- - hurd/fs.defs | 10 ++-- - hurd/hurd_types.h | 9 ++-- - libdiskfs/Makefile | 3 +- - libdiskfs/boot-start.c | 2 +- - libdiskfs/demuxer.c | 2 + - libdiskfs/file-exec.c | 81 +++++++++++++++++++++++++----- - libfshelp/start-translator-long.c | 26 +++++++--- - libnetfs/Makefile | 3 +- - libnetfs/demuxer.c | 2 + - libnetfs/file-exec.c | 73 ++++++++++++++++++++++++---- - libtrivfs/Makefile | 6 ++- - libtrivfs/demuxer.c | 2 + - libtrivfs/file-exec.c | 27 +++++++++- - startup/startup.c | 91 +++++++++++++++++++++++++--------- - trans/fakeroot.c | 100 +++++++++++++++++++++++++++++--------- - utils/login.c | 28 ++++++++--- - 20 files changed, 410 insertions(+), 112 deletions(-) - -diff --git a/TODO b/TODO -index de2a199..9fdb86f 100644 ---- a/TODO -+++ b/TODO -@@ -131,7 +131,7 @@ See `tasks', the exported task list. - - ** libtrivfs - *** Allow for read/write/exec to be passed down. --*** Implement file_exec when appropriate. !! -+*** Implement file_exec_file_name when appropriate. !! - *** Provide for the visible owner, etc., to be held in command-line args - instead of the underlying node, when it's important. !! - -diff --git a/configure.ac b/configure.ac -index b03057b..b3abe1a 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -162,6 +162,8 @@ else - VERSIONING=no - fi - AC_SUBST(VERSIONING) -+# Check if libc contains these functions. -+AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name) - - - # From glibc HEAD, 2007-11-07. -diff --git a/doc/hurd.texi b/doc/hurd.texi -index f36caf8..14cee22 100644 ---- a/doc/hurd.texi -+++ b/doc/hurd.texi -@@ -2737,10 +2737,10 @@ write the file. - @node Program Execution - @subsection Program Execution - --@findex file_exec -+@findex file_exec_file_name - Execution of programs on the Hurd is done through fileservers with the --@code{file_exec} RPC. The fileserver is expected to verify that the --user is allowed to execute the file, make whatever modifications to the -+@code{file_exec_file_name} RPC. The fileserver is expected to verify that -+the user is allowed to execute the file, make whatever modifications to the - ports are necessary for setuid execution, and then invoke the standard - execserver found on @file{/servers/exec}. - -@@ -2752,13 +2752,13 @@ The file must be opened for execution; if it is not, @code{EBADF} should - be returned. In addition, at least one of the execute bits must be on. A - failure of this check should result in @code{EACCES}---not - @code{ENOEXEC}. It is not proper for the fileserver ever to respond to --the @code{file_exec} RPC with @code{ENOEXEC}. -+the @code{file_exec_file_name} RPC with @code{ENOEXEC}. - - If either the setuid or setgid bits are set, the server needs to - construct a new authentication handle with the additional new ID's. --Then all the ports passed to @code{file_exec} need to be reauthenticated --with the new handle. If the fileserver is unable to make the new --authentication handle (for example, because it is not running as root) -+Then all the ports passed to @code{file_exec_file_name} need to be -+reauthenticated with the new handle. If the fileserver is unable to make the -+new authentication handle (for example, because it is not running as root) - it is not acceptable to return an error; in such a case the server - should simply silently fail to implement the setuid/setgid semantics. - -@@ -2773,7 +2773,7 @@ will not share any file pointers with the port the user passed in, - opened with @code{O_READ}. Finally, all the information (mutated - appropriately for setuid/setgid) should be sent to the execserver with - @code{exec_exec_file_name}. Whatever error code @code{exec_exec_file_name} --returns should be returned to the caller of @code{file_exec}. -+returns should be returned to the caller of @code{file_exec_file_name}. - - @node File Locking - @subsection File Locking -diff --git a/exec/hashexec.c b/exec/hashexec.c -index 118360f..c971279 100644 ---- a/exec/hashexec.c -+++ b/exec/hashexec.c -@@ -24,6 +24,9 @@ - #include <unistd.h> - #include <envz.h> - #include <sys/param.h> -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+#include <hurd/fs_experimental.h> -+#endif - - /* This is called to check E for a #! interpreter specification. E has - already been prepared (successfully) and checked (unsuccessfully). If -@@ -421,16 +424,32 @@ check_hashbang (struct execdata *e, - /* We cannot open the interpreter file to execute it. Lose! */ - return; - -+#ifdef HAVE_FILE_EXEC_FILE_NAME - /* Execute the interpreter program. */ -- e->error = file_exec (interp_file, -- oldtask, flags, -- new_argv, new_argvlen, envp, envplen, -- new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND, -- new_dtable ? new_dtablesize : dtablesize, -- portarray, MACH_MSG_TYPE_COPY_SEND, nports, -- intarray, nints, -- deallocnames, ndeallocnames, -- destroynames, ndestroynames); -+ e->error = file_exec_file_name (interp_file, -+ oldtask, flags, interp, -+ new_argv, new_argvlen, envp, envplen, -+ new_dtable ?: dtable, -+ MACH_MSG_TYPE_COPY_SEND, -+ new_dtable ? new_dtablesize : dtablesize, -+ portarray, MACH_MSG_TYPE_COPY_SEND, nports, -+ intarray, nints, -+ deallocnames, ndeallocnames, -+ destroynames, ndestroynames); -+ /* For backwards compatibility. Just drop it when we kill file_exec. */ -+ if (e->error == MIG_BAD_ID) -+#endif -+ e->error = file_exec (interp_file, -+ oldtask, flags, -+ new_argv, new_argvlen, envp, envplen, -+ new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND, -+ new_dtable ? new_dtablesize : dtablesize, -+ portarray, MACH_MSG_TYPE_COPY_SEND, nports, -+ intarray, nints, -+ deallocnames, ndeallocnames, -+ destroynames, ndestroynames); -+ -+ - mach_port_deallocate (mach_task_self (), interp_file); - munmap (new_argv, new_argvlen); - -diff --git a/hurd/fs.defs b/hurd/fs.defs -index a4a48cc..1322237 100644 ---- a/hurd/fs.defs -+++ b/hurd/fs.defs -@@ -1,5 +1,6 @@ - /* Definitions for the filesystem interface. -- Copyright (C) 1994,95,96,97,98,99,2002 Free Software Foundation, Inc. -+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2010 -+ Free Software Foundation, Inc. - - This file is part of the GNU Hurd. - -@@ -35,7 +36,8 @@ INTR_INTERFACE - /* Overlay a task with a file. Necessary initialization, including - authentication changes associated with set[ug]id execution must be - handled by the filesystem. Filesystems normally implement this by -- using exec_newtask or exec_loadtask as appropriate. */ -+ using exec_newtask or exec_loadtask as appropriate. -+ Deprecated: use file_exec_file_name instead. */ - routine file_exec ( - exec_file: file_t; - RPT -@@ -129,8 +131,8 @@ routine file_lock_stat ( - (regardless of the current open modes for this port). ALLOWED is a - bitwise OR of O_READ, O_WRITE, and O_EXEC. This is not necessarily the - same as what an open or exec would allow; O_EXEC is set for root even if -- no executable bits are on (in which case file_exec should fail) and -- O_WRITE is set a directory can be modified, even though it can't be -+ no executable bits are on (in which case file_exec_file_name should fail) -+ and O_WRITE is set a directory can be modified, even though it can't be - written directly. */ - routine file_check_access ( - file: file_t; -diff --git a/hurd/hurd_types.h b/hurd/hurd_types.h -index 4341177..83942a7 100644 ---- a/hurd/hurd_types.h -+++ b/hurd/hurd_types.h -@@ -1,5 +1,6 @@ - /* C declarations for Hurd server interfaces -- Copyright (C) 1993,94,95,96,98,99,2001,02 Free Software Foundation, Inc. -+ Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002, -+ 2010 Free Software Foundation, Inc. - - This file is part of the GNU Hurd. - -@@ -81,7 +82,7 @@ typedef struct timespec timespec_t; - /* Many such parameters and flags are also defined in various libc - headers. */ - --/* Bits for flags in fs.defs:file_exec and exec.defs:exec_* calls: */ -+/* Bits for flags in fs.defs:file_exec_file_name and exec.defs:exec_* calls: */ - #define EXEC_NEWTASK 0x00000001 /* Create new task; kill old one. */ - #define EXEC_SECURE 0x00000002 /* Use secure values of portarray, etc. */ - #define EXEC_DEFAULTS 0x00000004 /* Use defaults for unspecified ports. */ -@@ -347,7 +348,7 @@ typedef int *procinfo_t; - #define FSTYPE_MEMFS 0x00000019 /* In-core filesystem */ - #define FSTYPE_ISO9660 0x0000001a /* ISO9660 */ - --/* Standard port assignments for file_exec and exec_* */ -+/* Standard port assignments for file_exec_file_name and exec_* */ - enum - { - INIT_PORT_CWDIR, -@@ -361,7 +362,7 @@ enum - INIT_PORT_MAX - }; - --/* Standard ints for file_exec and exec_* */ -+/* Standard ints for file_exec_file_name and exec_* */ - enum - { - INIT_UMASK, -diff --git a/libdiskfs/Makefile b/libdiskfs/Makefile -index 47b9339..6646dbe 100644 ---- a/libdiskfs/Makefile -+++ b/libdiskfs/Makefile -@@ -56,7 +56,7 @@ OTHERSRCS = conch-fetch.c conch-set.c dir-clear.c dir-init.c dir-renamed.c \ - SRCS = $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS) - installhdrs = diskfs.h diskfs-pager.h - --MIGSTUBS = fsServer.o ioServer.o fsysServer.o exec_startupServer.o \ -+MIGSTUBS = fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o exec_startupServer.o \ - fsys_replyUser.o fs_notifyUser.o ifsockServer.o \ - startup_notifyServer.o - OBJS = $(sort $(SRCS:.c=.o) $(MIGSTUBS)) -@@ -66,6 +66,7 @@ LDLIBS += -lpthread - - fsys-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -DREPLY_PORTS - fs-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -+fs_experimental-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h - io-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h - ifsock-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h - exec_startup-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c -index d10d783..d80a4ca 100644 ---- a/libdiskfs/boot-start.c -+++ b/libdiskfs/boot-start.c -@@ -198,7 +198,7 @@ diskfs_start_bootstrap () - diskfs_exec_ctl = MACH_PORT_NULL; /* Not used after this. */ - } - -- /* Cache the exec server port for file_exec to use. */ -+ /* Cache the exec server port for file_exec_file_name to use. */ - _hurd_port_set (&_diskfs_exec_portcell, diskfs_exec); - - if (_diskfs_boot_command) -diff --git a/libdiskfs/demuxer.c b/libdiskfs/demuxer.c -index 4a1c4fb..ff33b1b 100644 ---- a/libdiskfs/demuxer.c -+++ b/libdiskfs/demuxer.c -@@ -19,6 +19,7 @@ - - #include "io_S.h" - #include "fs_S.h" -+#include "fs_experimental_S.h" - #include "../libports/notify_S.h" - #include "fsys_S.h" - #include "../libports/interrupt_S.h" -@@ -33,6 +34,7 @@ diskfs_demuxer (mach_msg_header_t *inp, - mig_routine_t routine; - if ((routine = diskfs_io_server_routine (inp)) || - (routine = diskfs_fs_server_routine (inp)) || -+ (routine = diskfs_fs_experimental_server_routine (inp)) || - (routine = ports_notify_server_routine (inp)) || - (routine = diskfs_fsys_server_routine (inp)) || - (routine = ports_interrupt_server_routine (inp)) || -diff --git a/libdiskfs/file-exec.c b/libdiskfs/file-exec.c -index e544b14..a491720 100644 ---- a/libdiskfs/file-exec.c -+++ b/libdiskfs/file-exec.c -@@ -1,5 +1,6 @@ --/* File execution (file_exec RPC) for diskfs servers, using exec server. -- Copyright (C) 1993,94,95,96,97,98,2000,02 Free Software Foundation, Inc. -+/* File execution (file_exec_file_name RPC) for diskfs servers, using exec server. -+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, -+ 2010 Free Software Foundation, Inc. - - This file is part of the GNU Hurd. - -@@ -21,10 +22,14 @@ - - #include "priv.h" - #include "fs_S.h" -+#include "fs_experimental_S.h" - #include <sys/stat.h> - #include <fcntl.h> - #include <hurd/exec.h> - #include <hurd/paths.h> -+#ifdef HAVE_EXEC_EXEC_FILE_NAME -+#include <hurd/exec_experimental.h> -+#endif - #include <string.h> - #include <idvec.h> - -@@ -47,6 +52,39 @@ diskfs_S_file_exec (struct protid *cred, - mach_port_t *destroynames, - size_t destroynameslen) - { -+ return diskfs_S_file_exec_file_name (cred, -+ task, -+ flags, -+ "", -+ argv, argvlen, -+ envp, envplen, -+ fds, fdslen, -+ portarray, portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+} -+ -+kern_return_t -+diskfs_S_file_exec_file_name (struct protid *cred, -+ task_t task, -+ int flags, -+ char *filename, -+ char *argv, -+ size_t argvlen, -+ char *envp, -+ size_t envplen, -+ mach_port_t *fds, -+ size_t fdslen, -+ mach_port_t *portarray, -+ size_t portarraylen, -+ int *intarray, -+ size_t intarraylen, -+ mach_port_t *deallocnames, -+ size_t deallocnameslen, -+ mach_port_t *destroynames, -+ size_t destroynameslen) -+{ - struct node *np; - uid_t uid; - gid_t gid; -@@ -136,9 +174,9 @@ diskfs_S_file_exec (struct protid *cred, - - if (! err) - /* Make a new peropen for the exec server to access the file, since any -- seeking the exec server might want to do should not affect the -- original peropen on which file_exec was called. (The new protid for -- this peropen clones the caller's iouser to preserve the caller's -+ seeking the exec server might want to do should not affect the original -+ peropen on which file_exec_file_name was called. (The new protid -+ for this peropen clones the caller's iouser to preserve the caller's - authentication credentials.) The new peropen's openmodes must have - O_READ even if the caller had only O_EXEC privilege, so the exec - server can read the executable file. We also include O_EXEC so that -@@ -159,14 +197,31 @@ diskfs_S_file_exec (struct protid *cred, - do - { - right = ports_get_send_right (newpi); -- err = exec_exec (execserver, -- right, MACH_MSG_TYPE_COPY_SEND, -- task, flags, argv, argvlen, envp, envplen, -- fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, -- intarray, intarraylen, -- deallocnames, deallocnameslen, -- destroynames, destroynameslen); -+#ifdef HAVE_EXEC_EXEC_FILE_NAME -+ err = exec_exec_file_name (execserver, -+ right, MACH_MSG_TYPE_COPY_SEND, -+ task, flags, filename, -+ argv, argvlen, envp, envplen, -+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -+ portarray, MACH_MSG_TYPE_COPY_SEND, -+ portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+ /* For backwards compatibility. Just drop it when we kill -+ exec_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = exec_exec (execserver, -+ right, MACH_MSG_TYPE_COPY_SEND, -+ task, flags, argv, argvlen, envp, envplen, -+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -+ portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+ -+ - mach_port_deallocate (mach_task_self (), right); - if (err == MACH_SEND_INVALID_DEST) - { -diff --git a/libfshelp/start-translator-long.c b/libfshelp/start-translator-long.c -index 8b00e08..f0966aa 100644 ---- a/libfshelp/start-translator-long.c -+++ b/libfshelp/start-translator-long.c -@@ -1,5 +1,6 @@ - /* -- Copyright (C) 1995,96,99,2000,02, 04 Free Software Foundation, Inc. -+ Copyright (C) 1995, 1996, 1999, 2000, 2002, 2004, 2010 -+ Free Software Foundation, Inc. - Written by Miles Bader and Michael I. Bushnell. - - This file is part of the GNU Hurd. -@@ -27,6 +28,9 @@ - #include <string.h> - #include <assert.h> - #include "fshelp.h" -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+#include <hurd/fs_experimental.h> -+#endif - - - /* The data passed in the various messages we're interested in. */ -@@ -272,12 +276,22 @@ fshelp_start_translator_long (fshelp_open_fn_t underlying_open_fn, - saveport = ports[INIT_PORT_BOOTSTRAP]; - ports[INIT_PORT_BOOTSTRAP] = bootstrap; - -+#ifdef HAVE_FILE_EXEC_FILE_NAME - /* Try and exec the translator in TASK... */ -- err = file_exec (executable, task, EXEC_DEFAULTS, -- argz, argz_len, 0, 0, -- fds, fds_type, fds_len, -- ports, ports_type, ports_len, -- ints, ints_len, 0, 0, 0, 0); -+ err = file_exec_file_name (executable, task, EXEC_DEFAULTS, name, -+ argz, argz_len, 0, 0, -+ fds, fds_type, fds_len, -+ ports, ports_type, ports_len, -+ ints, ints_len, 0, 0, 0, 0); -+ /* For backwards compatibility. Just drop it when we kill file_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = file_exec (executable, task, EXEC_DEFAULTS, -+ argz, argz_len, 0, 0, -+ fds, fds_type, fds_len, -+ ports, ports_type, ports_len, -+ ints, ints_len, 0, 0, 0, 0); -+ - ports_moved = 1; - - if (ports_type == MACH_MSG_TYPE_COPY_SEND) -diff --git a/libnetfs/Makefile b/libnetfs/Makefile -index c3830c0..4aade5a 100644 ---- a/libnetfs/Makefile -+++ b/libnetfs/Makefile -@@ -59,12 +59,13 @@ SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS) - - installhdrs=netfs.h - --MIGSTUBS= ioServer.o fsServer.o fsysServer.o fsys_replyUser.o ifsockServer.o -+MIGSTUBS= ioServer.o fsServer.o fs_experimentalServer.o fsysServer.o fsys_replyUser.o ifsockServer.o - - OBJS=$(sort $(SRCS:.c=.o) $(MIGSTUBS)) - - fsys-MIGSFLAGS = -imacros $(srcdir)/mutations.h -DREPLY_PORTS - fs-MIGSFLAGS = -imacros $(srcdir)/mutations.h -+fs_experimental-MIGSFLAGS = -imacros $(srcdir)/mutations.h - io-MIGSFLAGS = -imacros $(srcdir)/mutations.h - ifsock-MIGSFLAGS = -imacros $(srcdir)/mutations.h - MIGCOMSFLAGS = -prefix netfs_ -diff --git a/libnetfs/demuxer.c b/libnetfs/demuxer.c -index 4c20ab6..bf78812 100644 ---- a/libnetfs/demuxer.c -+++ b/libnetfs/demuxer.c -@@ -22,6 +22,7 @@ - - #include "io_S.h" - #include "fs_S.h" -+#include "fs_experimental_S.h" - #include "../libports/notify_S.h" - #include "fsys_S.h" - #include "../libports/interrupt_S.h" -@@ -34,6 +35,7 @@ netfs_demuxer (mach_msg_header_t *inp, - mig_routine_t routine; - if ((routine = netfs_io_server_routine (inp)) || - (routine = netfs_fs_server_routine (inp)) || -+ (routine = netfs_fs_experimental_server_routine (inp)) || - (routine = ports_notify_server_routine (inp)) || - (routine = netfs_fsys_server_routine (inp)) || - (routine = ports_interrupt_server_routine (inp)) || -diff --git a/libnetfs/file-exec.c b/libnetfs/file-exec.c -index 638f0ae..ffaf598 100644 ---- a/libnetfs/file-exec.c -+++ b/libnetfs/file-exec.c -@@ -1,5 +1,6 @@ - /* -- Copyright (C) 1996,97,2000,01,02 Free Software Foundation, Inc. -+ Copyright (C) 1996, 1997, 2000, 2001, 2002, 2010 -+ Free Software Foundation, Inc. - Written by Michael I. Bushnell, p/BSG. - - This file is part of the GNU Hurd. -@@ -23,10 +24,14 @@ - #include "netfs.h" - #include "execserver.h" - #include "fs_S.h" -+#include "fs_experimental_S.h" - #include <sys/stat.h> - #include <fcntl.h> - #include <hurd/exec.h> - #include <hurd/paths.h> -+#ifdef HAVE_EXEC_EXEC_FILE_NAME -+#include <hurd/exec_experimental.h> -+#endif - #include <string.h> - #include <idvec.h> - -@@ -49,6 +54,39 @@ netfs_S_file_exec (struct protid *cred, - mach_port_t *destroynames, - size_t destroynameslen) - { -+ return netfs_S_file_exec_file_name (cred, -+ task, -+ flags, -+ "", -+ argv, argvlen, -+ envp, envplen, -+ fds, fdslen, -+ portarray, portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+} -+ -+kern_return_t -+netfs_S_file_exec_file_name (struct protid *cred, -+ task_t task, -+ int flags, -+ char *filename, -+ char *argv, -+ size_t argvlen, -+ char *envp, -+ size_t envplen, -+ mach_port_t *fds, -+ size_t fdslen, -+ mach_port_t *portarray, -+ size_t portarraylen, -+ int *intarray, -+ size_t intarraylen, -+ mach_port_t *deallocnames, -+ size_t deallocnameslen, -+ mach_port_t *destroynames, -+ size_t destroynameslen) -+{ - struct node *np; - error_t err; - uid_t uid; -@@ -133,14 +171,31 @@ netfs_S_file_exec (struct protid *cred, - if (newpi) - { - right = ports_get_send_right (newpi); -- err = exec_exec (_netfs_exec, -- right, MACH_MSG_TYPE_COPY_SEND, -- task, flags, argv, argvlen, envp, envplen, -- fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, -- intarray, intarraylen, -- deallocnames, deallocnameslen, -- destroynames, destroynameslen); -+#ifdef HAVE_EXEC_EXEC_FILE_NAME -+ err = exec_exec_file_name (_netfs_exec, -+ right, MACH_MSG_TYPE_COPY_SEND, -+ task, flags, filename, -+ argv, argvlen, envp, envplen, -+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -+ portarray, MACH_MSG_TYPE_COPY_SEND, -+ portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+ /* For backwards compatibility. Just drop it when we kill -+ exec_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = exec_exec (_netfs_exec, -+ right, MACH_MSG_TYPE_COPY_SEND, -+ task, flags, argv, argvlen, envp, envplen, -+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -+ portarray, MACH_MSG_TYPE_COPY_SEND, -+ portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+ - mach_port_deallocate (mach_task_self (), right); - ports_port_deref (newpi); - } -diff --git a/libtrivfs/Makefile b/libtrivfs/Makefile -index 48a53d7..c440101 100644 ---- a/libtrivfs/Makefile -+++ b/libtrivfs/Makefile -@@ -44,7 +44,7 @@ OTHERSRCS=demuxer.c protid-clean.c protid-dup.c cntl-create.c \ - - SRCS=$(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(OTHERSRCS) - --MIGSTUBS=fsServer.o ioServer.o fsysServer.o fsys_replyUser.o -+MIGSTUBS=fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o fsys_replyUser.o - - libname = libtrivfs - HURDLIBS = fshelp iohelp ports shouldbeinlibc -@@ -54,6 +54,10 @@ MIGCOMSFLAGS = -prefix trivfs_ - installhdrs := trivfs.h - mig-sheader-prefix = trivfs_ - -+ifndef no_deps -+installhdrs += $(patsubst %,trivfs_%_S.h,fs fs_experimental io fsys) -+endif -+ - include ../Makeconf - - $(MIGSTUBS:%Server.o=%.sdefsi): $(srcdir)/mig-mutate.h -diff --git a/libtrivfs/demuxer.c b/libtrivfs/demuxer.c -index 8c1afe6..55229da 100644 ---- a/libtrivfs/demuxer.c -+++ b/libtrivfs/demuxer.c -@@ -23,6 +23,7 @@ - - #include "trivfs_io_S.h" - #include "trivfs_fs_S.h" -+#include "trivfs_fs_experimental_S.h" - #include "../libports/notify_S.h" - #include "trivfs_fsys_S.h" - #include "../libports/interrupt_S.h" -@@ -34,6 +35,7 @@ trivfs_demuxer (mach_msg_header_t *inp, - mig_routine_t routine; - if ((routine = trivfs_io_server_routine (inp)) || - (routine = trivfs_fs_server_routine (inp)) || -+ (routine = trivfs_fs_experimental_server_routine (inp)) || - (routine = ports_notify_server_routine (inp)) || - (routine = trivfs_fsys_server_routine (inp)) || - (routine = ports_interrupt_server_routine (inp))) -diff --git a/libtrivfs/file-exec.c b/libtrivfs/file-exec.c -index b353d8a..5f873c7 100644 ---- a/libtrivfs/file-exec.c -+++ b/libtrivfs/file-exec.c -@@ -1,5 +1,5 @@ - /* -- Copyright (C) 1994,2002 Free Software Foundation, Inc. -+ Copyright (C) 1994, 2002, 2010 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as -@@ -41,3 +41,28 @@ trivfs_S_file_exec (trivfs_protid_t exec_file, - { - return EOPNOTSUPP; - } -+ -+kern_return_t -+trivfs_S_file_exec_file_name (trivfs_protid_t exec_file, -+ mach_port_t reply, -+ mach_msg_type_name_t replyPoly, -+ mach_port_t exec_task, -+ int flags, -+ string_t filename, -+ data_t argv, -+ mach_msg_type_number_t argvCnt, -+ data_t envp, -+ mach_msg_type_number_t envpCnt, -+ portarray_t fdarray, -+ mach_msg_type_number_t fdarrayCnt, -+ portarray_t portarray, -+ mach_msg_type_number_t portarrayCnt, -+ intarray_t intarray, -+ mach_msg_type_number_t intarrayCnt, -+ mach_port_array_t deallocnames, -+ mach_msg_type_number_t deallocnamesCnt, -+ mach_port_array_t destroynames, -+ mach_msg_type_number_t destroynamesCnt) -+{ -+ return EOPNOTSUPP; -+} -diff --git a/startup/startup.c b/startup/startup.c -index e916768..8696709 100644 ---- a/startup/startup.c -+++ b/startup/startup.c -@@ -1,7 +1,7 @@ - /* Start and maintain hurd core servers and system run state - - Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -- 2005, 2008, 2013 Free Software Foundation, Inc. -+ 2005, 2008, 2010, 2013 Free Software Foundation, Inc. - This file is part of the GNU Hurd. - - The GNU Hurd is free software; you can redistribute it and/or modify -@@ -24,6 +24,9 @@ - one file. */ - #include <hurd.h> - #include <hurd/fs.h> -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+#include <hurd/fs_experimental.h> -+#endif - #include <hurd/fsys.h> - #include <device/device.h> - #include <stdio.h> -@@ -377,13 +380,29 @@ run (const char *server, mach_port_t *ports, task_t *task) - printf ("Pausing for %s\n", prog); - getchar (); - } -- err = file_exec (file, *task, 0, -- (char *)prog, strlen (prog) + 1, /* Args. */ -- startup_envz, startup_envz_len, -- default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, -- ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -- default_ints, INIT_INT_MAX, -- NULL, 0, NULL, 0); -+ -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+ err = file_exec_file_name (file, *task, 0, (char *)prog, -+ (char *)prog, -+ strlen (prog) + 1, /* Args. */ -+ startup_envz, startup_envz_len, -+ default_dtable, -+ MACH_MSG_TYPE_COPY_SEND, 3, -+ ports, MACH_MSG_TYPE_COPY_SEND, -+ INIT_PORT_MAX, -+ default_ints, INIT_INT_MAX, -+ NULL, 0, NULL, 0); -+ /* For backwards compatibility. Just drop it when we kill -+ file_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = file_exec (file, *task, 0, -+ (char *)prog, strlen (prog) + 1, /* Args. */ -+ startup_envz, startup_envz_len, -+ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, -+ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -+ default_ints, INIT_INT_MAX, -+ NULL, 0, NULL, 0); - if (!err) - break; - -@@ -470,14 +489,27 @@ run_for_real (char *filename, char *args, int arglen, mach_port_t ctty, - ++progname; - else - progname = filename; -- err = file_exec (file, task, 0, -- args, arglen, -- startup_envz, startup_envz_len, -- default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, -- default_ports, MACH_MSG_TYPE_COPY_SEND, -- INIT_PORT_MAX, -- default_ints, INIT_INT_MAX, -- NULL, 0, NULL, 0); -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+ err = file_exec_file_name (file, task, 0, filename, -+ args, arglen, -+ startup_envz, startup_envz_len, -+ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, -+ default_ports, MACH_MSG_TYPE_COPY_SEND, -+ INIT_PORT_MAX, -+ default_ints, INIT_INT_MAX, -+ NULL, 0, NULL, 0); -+ /* For backwards compatibility. Just drop it when we kill file_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = file_exec (file, task, 0, -+ args, arglen, -+ startup_envz, startup_envz_len, -+ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, -+ default_ports, MACH_MSG_TYPE_COPY_SEND, -+ INIT_PORT_MAX, -+ default_ints, INIT_INT_MAX, -+ NULL, 0, NULL, 0); -+ - mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]); - mach_port_deallocate (mach_task_self (), task); - if (ctty != MACH_PORT_NULL) -@@ -1075,13 +1107,26 @@ start_child (const char *prog, char **progargs) - getchar (); - } - -- err = file_exec (file, child_task, 0, -- args, arglen, -- startup_envz, startup_envz_len, -- NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */ -- default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -- default_ints, INIT_INT_MAX, -- NULL, 0, NULL, 0); -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+ err = file_exec_file_name (file, child_task, 0, args, -+ args, arglen, -+ startup_envz, startup_envz_len, -+ NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */ -+ default_ports, MACH_MSG_TYPE_COPY_SEND, -+ INIT_PORT_MAX, -+ default_ints, INIT_INT_MAX, -+ NULL, 0, NULL, 0); -+ /* For backwards compatibility. Just drop it when we kill file_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = file_exec (file, child_task, 0, -+ args, arglen, -+ startup_envz, startup_envz_len, -+ NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */ -+ default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -+ default_ints, INIT_INT_MAX, -+ NULL, 0, NULL, 0); -+ - proc_mark_important (default_ports[INIT_PORT_PROC]); - mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]); - mach_port_deallocate (mach_task_self (), file); -diff --git a/trans/fakeroot.c b/trans/fakeroot.c -index 76fc901..adbd07d 100644 ---- a/trans/fakeroot.c -+++ b/trans/fakeroot.c -@@ -28,10 +28,14 @@ - #include <pthread.h> - #include <hurd/ihash.h> - #include <hurd/paths.h> -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+#include <hurd/fs_experimental.h> -+#endif - - #include <version.h> - - #include "libnetfs/fs_S.h" -+#include "libnetfs/fs_experimental_S.h" - #include "libnetfs/io_S.h" - #include "libnetfs/fsys_S.h" - #include "libports/notify_S.h" -@@ -820,23 +824,24 @@ netfs_file_get_storage_info (struct iouser *cred, - } - - kern_return_t --netfs_S_file_exec (struct protid *user, -- task_t task, -- int flags, -- char *argv, -- size_t argvlen, -- char *envp, -- size_t envplen, -- mach_port_t *fds, -- size_t fdslen, -- mach_port_t *portarray, -- size_t portarraylen, -- int *intarray, -- size_t intarraylen, -- mach_port_t *deallocnames, -- size_t deallocnameslen, -- mach_port_t *destroynames, -- size_t destroynameslen) -+netfs_S_file_exec_file_name (struct protid *user, -+ task_t task, -+ int flags, -+ char *filename, -+ char *argv, -+ size_t argvlen, -+ char *envp, -+ size_t envplen, -+ mach_port_t *fds, -+ size_t fdslen, -+ mach_port_t *portarray, -+ size_t portarraylen, -+ int *intarray, -+ size_t intarraylen, -+ mach_port_t *deallocnames, -+ size_t deallocnameslen, -+ mach_port_t *destroynames, -+ size_t destroynameslen) - { - error_t err; - file_t file; -@@ -855,14 +860,30 @@ netfs_S_file_exec (struct protid *user, - - if (!err) - { -+#ifdef HAVE_FILE_EXEC_FILE_NAME - /* We cannot use MACH_MSG_TYPE_MOVE_SEND because we might need to - retry an interrupted call that would have consumed the rights. */ -- err = file_exec (netfs_node_netnode (user->po->np)->file, -- task, flags, argv, argvlen, -- envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, -- intarray, intarraylen, deallocnames, deallocnameslen, -- destroynames, destroynameslen); -+ err = file_exec_file_name (netfs_node_netnode (user->po->np)->file, -+ task, flags, -+ filename, -+ argv, argvlen, -+ envp, envplen, -+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -+ portarray, MACH_MSG_TYPE_COPY_SEND, -+ portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+ /* For backwards compatibility. Just drop it when we kill -+ file_exec. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = file_exec (user->po->np->nn->file, task, flags, argv, argvlen, -+ envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen, -+ portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, -+ intarray, intarraylen, deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+ - mach_port_deallocate (mach_task_self (), file); - } - -@@ -878,6 +899,38 @@ netfs_S_file_exec (struct protid *user, - return err; - } - -+kern_return_t -+netfs_S_file_exec (struct protid *user, -+ task_t task, -+ int flags, -+ char *argv, -+ size_t argvlen, -+ char *envp, -+ size_t envplen, -+ mach_port_t *fds, -+ size_t fdslen, -+ mach_port_t *portarray, -+ size_t portarraylen, -+ int *intarray, -+ size_t intarraylen, -+ mach_port_t *deallocnames, -+ size_t deallocnameslen, -+ mach_port_t *destroynames, -+ size_t destroynameslen) -+{ -+ return netfs_S_file_exec_file_name (user, -+ task, -+ flags, -+ "", -+ argv, argvlen, -+ envp, envplen, -+ fds, fdslen, -+ portarray, portarraylen, -+ intarray, intarraylen, -+ deallocnames, deallocnameslen, -+ destroynames, destroynameslen); -+} -+ - error_t - netfs_S_io_map (struct protid *user, - mach_port_t *rdobj, mach_msg_type_name_t *rdobjtype, -@@ -994,6 +1047,7 @@ netfs_demuxer (mach_msg_header_t *inp, - mig_routine_t routine; - if ((routine = netfs_io_server_routine (inp)) || - (routine = netfs_fs_server_routine (inp)) || -+ (routine = netfs_fs_experimental_server_routine (inp)) || - (routine = ports_notify_server_routine (inp)) || - (routine = netfs_fsys_server_routine (inp)) || - /* XXX we should intercept interrupt_operation and do -diff --git a/utils/login.c b/utils/login.c -index 9ee296a..cc04715 100644 ---- a/utils/login.c -+++ b/utils/login.c -@@ -1,6 +1,7 @@ - /* Hurdish login - -- Copyright (C) 1995,96,97,98,99,2002 Free Software Foundation, Inc. -+ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2010 -+ Free Software Foundation, Inc. - - Written by Miles Bader <miles@gnu.org> - -@@ -46,6 +47,9 @@ - #include <error.h> - #include <timefmt.h> - #include <hurd/lookup.h> -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+#include <hurd/fs_experimental.h> -+#endif - #include <ugids.h> - - const char *argp_program_version = STANDARD_HURD_VERSION (login); -@@ -882,12 +886,22 @@ main(int argc, char *argv[]) - } - } - -- err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS, -- sh_args, sh_args_len, env, env_len, -- fds, MACH_MSG_TYPE_COPY_SEND, 3, -- ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -- ints, INIT_INT_MAX, -- 0, 0, 0, 0); -+#ifdef HAVE_FILE_EXEC_FILE_NAME -+ err = file_exec_file_name (exec, mach_task_self (), EXEC_DEFAULTS, shell, -+ sh_args, sh_args_len, env, env_len, -+ fds, MACH_MSG_TYPE_COPY_SEND, 3, -+ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -+ ints, INIT_INT_MAX, -+ 0, 0, 0, 0); -+ /* Fallback in case the file server hasn't been restarted. */ -+ if (err == MIG_BAD_ID) -+#endif -+ err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS, -+ sh_args, sh_args_len, env, env_len, -+ fds, MACH_MSG_TYPE_COPY_SEND, 3, -+ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, -+ ints, INIT_INT_MAX, -+ 0, 0, 0, 0); - if (err) - error(5, err, "%s", shell); - --- -2.1.4 - diff --git a/debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch b/debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch deleted file mode 100644 index b64447be..00000000 --- a/debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 295124df024028b6696d239ed07732032771f686 Mon Sep 17 00:00:00 2001 -From: Emilio Pozuelo Monfort <pochu27@gmail.com> -Date: Wed, 26 May 2010 23:32:16 +0200 -Subject: [PATCH hurd 3/4] Use the new _hurd_exec_file_name function - -* configure.in: Check for _hurd_exec_file_name. -* utils/fakeauth.c: Call _hurd_exec_file_name instead of -_hurd_exec if it's available. -* utils/rpctrace.c: Likewise. -* utils/shd.c: Likewise. ---- - configure.ac | 2 +- - utils/fakeauth.c | 9 +++++++-- - utils/rpctrace.c | 4 ++++ - utils/shd.c | 9 ++++++--- - 4 files changed, 18 insertions(+), 6 deletions(-) - -diff --git a/configure.ac b/configure.ac -index b3abe1a..76fb673 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -163,7 +163,7 @@ else - fi - AC_SUBST(VERSIONING) - # Check if libc contains these functions. --AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name) -+AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name _hurd_exec_file_name) - - - # From glibc HEAD, 2007-11-07. -diff --git a/utils/fakeauth.c b/utils/fakeauth.c -index ba6a3ee..5cc88b7 100644 ---- a/utils/fakeauth.c -+++ b/utils/fakeauth.c -@@ -1,5 +1,5 @@ - /* fakeauth -- proxy auth server to lie to users about what their IDs are -- Copyright (C) 2002 Free Software Foundation, Inc. -+ Copyright (C) 2002, 2010 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as -@@ -397,7 +397,7 @@ believe it has restricted them to different identities or no identity at all.\ - /* We cannot use fork because it doesn't do the right thing with our send - rights that point to our own receive rights, i.e. the new auth port. - Since posix_spawn might be implemented with fork (prior to glibc 2.3), -- we cannot use that simple interface either. We use _hurd_exec -+ we cannot use that simple interface either. We use _hurd_exec_file_name - directly to effect what posix_spawn does in the simple case. */ - { - task_t newtask; -@@ -422,7 +422,12 @@ believe it has restricted them to different identities or no identity at all.\ - if (err) - error (3, err, "proc_child"); - -+#ifdef HAVE__HURD_EXEC_FILE_NAME -+ err = _hurd_exec_file_name (newtask, execfile, argv[argi], -+ &argv[argi], environ); -+#else - err = _hurd_exec (newtask, execfile, &argv[argi], environ); -+#endif - mach_port_deallocate (mach_task_self (), newtask); - mach_port_deallocate (mach_task_self (), execfile); - if (err) -diff --git a/utils/rpctrace.c b/utils/rpctrace.c -index d53b510..afe6b6d 100644 ---- a/utils/rpctrace.c -+++ b/utils/rpctrace.c -@@ -1659,7 +1659,11 @@ traced_spawn (char **argv, char **envp) - /* Now actually run the command they told us to trace. We do the exec on - the actual task, so the RPCs to map in the program itself do not get - traced. Could have an option to use TASK_WRAPPER here instead. */ -+#ifdef HAVE__HURD_EXEC_FILE_NAME -+ err = _hurd_exec_file_name (traced_task, file, *argv, argv, envp); -+#else - err = _hurd_exec (traced_task, file, argv, envp); -+#endif - if (err) - error (2, err, "cannot exec `%s'", argv[0]); - -diff --git a/utils/shd.c b/utils/shd.c -index a1a4b26..855284f 100644 ---- a/utils/shd.c -+++ b/utils/shd.c -@@ -1,5 +1,5 @@ - /* -- Copyright (C) 1994,95,99,2002 Free Software Foundation -+ Copyright (C) 1994, 1995, 1999, 2002, 2010 Free Software Foundation - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as -@@ -159,15 +159,18 @@ run (char **argv, int fd0, int fd1) - movefd (fd1, 1, &save1)) - return -1; - -+#ifdef HAVE__HURD_EXEC_FILE_NAME -+ err = _hurd_exec_file_name (task, file, program, argv, environ); -+#else - err = _hurd_exec (task, file, argv, environ); -- -+#endif - if (restorefd (fd0, 0, &save0) || - restorefd (fd1, 1, &save1)) - return -1; - - if (err) - { -- error (0, err, "_hurd_exec"); -+ error (0, err, "_hurd_exec_file_name"); - err = task_terminate (task); - if (err) - error (0, err, "task_terminate"); --- -2.1.4 - diff --git a/debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch b/debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch deleted file mode 100644 index fc7a2c77..00000000 --- a/debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch +++ /dev/null @@ -1,151 +0,0 @@ -From d8d55e78e778d4223d6e6624a5e63d7fbea83cce Mon Sep 17 00:00:00 2001 -From: Justus Winter <4winter@informatik.uni-hamburg.de> -Date: Sun, 13 Sep 2015 14:06:59 +0200 -Subject: [PATCH hurd 4/4] This patch is an amendment of - exec_filename_exec.patch. - -If file_name_exec is not given, check_hashbang will try to locate the -file. If argv[0] contains a '/', the file path is assumed to be -absolute and it will try to open the file. Otherwise, the file is -searched in the PATH. In either case, the resulting file identity port -is compared to the identity port of the original file handle passed to -check_hashbang. - -exec_filename_exec.patch explicitly provides the script files path in -file_name_exec. According to the comment, if this path is provided, it -is assumed to be the path to the script file and no attempt at -locating the script file is done. However, the identity ports are -still compared. This cannot succeed if fakeroot or chroot is used, -because the process doing the exec and thus the initial file lookup is -running in the chrooted environment, while the exec server is not. - -Fix this by skipping the identity test if file_name_exec is provided. - -* exec/hashexec.c (check_hashbang): Skip the file identity test if the - file_name_exec is provided. ---- - exec/hashexec.c | 93 +++++++++++++++++++++++++++++++-------------------------- - 1 file changed, 51 insertions(+), 42 deletions(-) - -diff --git a/exec/hashexec.c b/exec/hashexec.c -index c971279..c2eda5b 100644 ---- a/exec/hashexec.c -+++ b/exec/hashexec.c -@@ -231,11 +231,12 @@ check_hashbang (struct execdata *e, - else if (! (flags & EXEC_SECURE)) - { - /* Try to figure out the file's name. If FILE_NAME_EXEC -- is not NULL, then it's the file's name. Otherwise we -- guess that if ARGV[0] contains a slash, it might be -- the name of the file; and that if it contains no slash, -- looking for files named by ARGV[0] in the `PATH' -- environment variable might find it. */ -+ is not NULL and not the empty string, then it's the -+ file's name. Otherwise we guess that if ARGV[0] -+ contains a slash, it might be the name of the file; -+ and that if it contains no slash, looking for files -+ named by ARGV[0] in the `PATH' environment variable -+ might find it. */ - - error_t error; - char *name; -@@ -271,51 +272,59 @@ check_hashbang (struct execdata *e, - return err; - } - -- error = io_identity (file, &fileid, &filefsid, &fileno); -- if (error) -- goto out; -- mach_port_deallocate (mach_task_self (), filefsid); -- -- if (memchr (argv, '\0', argvlen) == NULL) -- { -- name = alloca (argvlen + 1); -- bcopy (argv, name, argvlen); -- name[argvlen] = '\0'; -- } -- else -- name = argv; -- - if (file_name_exec && file_name_exec[0] != '\0') -- error = lookup (name = file_name_exec, 0, &name_file); -- else if (strchr (name, '/') != NULL) -- error = lookup (name, 0, &name_file); -- else if ((error = hurd_catch_signal -- (sigmask (SIGBUS) | sigmask (SIGSEGV), -- (vm_address_t) envp, (vm_address_t) envp + envplen, -- &search_path, SIG_ERR))) -- name_file = MACH_PORT_NULL; -- -- if (!error && name_file != MACH_PORT_NULL) -+ name = file_name_exec; -+ else - { -- mach_port_t id, fsid; -- ino_t ino; -- error = io_identity (name_file, &id, &fsid, &ino); -- mach_port_deallocate (mach_task_self (), name_file); -- if (!error) -+ /* Try to locate the file. */ -+ error = io_identity (file, &fileid, &filefsid, &fileno); -+ if (error) -+ goto out; -+ mach_port_deallocate (mach_task_self (), filefsid); -+ -+ if (memchr (argv, '\0', argvlen) == NULL) - { -- mach_port_deallocate (mach_task_self (), fsid); -- mach_port_deallocate (mach_task_self (), id); -+ name = alloca (argvlen + 1); -+ bcopy (argv, name, argvlen); -+ name[argvlen] = '\0'; - } -- if (!error && id == fileid) -+ else -+ name = argv; -+ -+ if (strchr (name, '/') != NULL) -+ error = lookup (name, 0, &name_file); -+ else if ((error = hurd_catch_signal -+ (sigmask (SIGBUS) | sigmask (SIGSEGV), -+ (vm_address_t) envp, (vm_address_t) envp + envplen, -+ &search_path, SIG_ERR))) -+ name_file = MACH_PORT_NULL; -+ -+ /* See whether we found the right file. */ -+ if (!error && name_file != MACH_PORT_NULL) - { -- file_name = name; -- free_file_name = free_name; -+ mach_port_t id, fsid; -+ ino_t ino; -+ error = io_identity (name_file, &id, &fsid, &ino); -+ mach_port_deallocate (mach_task_self (), name_file); -+ if (!error) -+ { -+ mach_port_deallocate (mach_task_self (), fsid); -+ mach_port_deallocate (mach_task_self (), id); -+ if (id != fileid) -+ error = 1; -+ } - } -- else if (free_name) -- free (name); -+ -+ mach_port_deallocate (mach_task_self (), fileid); - } - -- mach_port_deallocate (mach_task_self (), fileid); -+ if (!error) -+ { -+ file_name = name; -+ free_file_name = free_name; -+ } -+ else if (free_name) -+ free (name); - } - - if (file_name == NULL) --- -2.1.4 - diff --git a/debian/patches/series b/debian/patches/series index 82c507f9..1861e8d1 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -37,10 +37,6 @@ libdde_rcu.patch mount.patch format -exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch -exec_filename0002-Add-a-file_exec_file_name-RPC.patch -exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch -exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch #trans-crash-add-verbose.patch |