summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-06-05 19:30:53 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-06-05 19:30:53 +0200
commitb5c820fe30e8af451a3e3de2e83de7a24775d17f (patch)
tree53d1be20d57c98a5ac3c8ca84661138cdfc2bec8 /debian
parentb598d5a3d9089cefb746e8c98b8438fe73e19452 (diff)
re-add exec_filename patches from debian packaging
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/exec_filename_exec.patch332
-rw-r--r--debian/patches/exec_filename_fix.patch144
-rw-r--r--debian/patches/exec_filename_fs.patch1060
-rw-r--r--debian/patches/exec_filename_use.patch111
-rw-r--r--debian/patches/series6
5 files changed, 1651 insertions, 2 deletions
diff --git a/debian/patches/exec_filename_exec.patch b/debian/patches/exec_filename_exec.patch
new file mode 100644
index 00000000..632c94a7
--- /dev/null
+++ b/debian/patches/exec_filename_exec.patch
@@ -0,0 +1,332 @@
+From 011df9d35eb68132cdb14a0f55e2435375e2cfce 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 1/3] 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/exec.c | 50 +++++++++++++++++++++++++++++++++++++++++++++-----
+ exec/hashexec.c | 18 ++++++++++++------
+ exec/priv.h | 4 +++-
+ hurd/exec.defs | 19 +++++++++++++++++--
+ 5 files changed, 81 insertions(+), 18 deletions(-)
+
+Index: hurd-debian/doc/hurd.texi
+===================================================================
+--- hurd-debian.orig/doc/hurd.texi 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/doc/hurd.texi 2014-02-03 23:45:08.000000000 +0000
+@@ -102,7 +102,7 @@
+ 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 @@
+ 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
+Index: hurd-debian/exec/exec.c
+===================================================================
+--- hurd-debian.orig/exec/exec.c 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/exec/exec.c 2014-02-03 22:48:44.000000000 +0000
+@@ -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.
+@@ -738,6 +738,7 @@
+ 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,
+@@ -796,7 +797,7 @@
+ {
+ /* 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,
+@@ -1356,6 +1357,7 @@
+ return e.error;
+ }
+
++/* Deprecated. */
+ kern_return_t
+ S_exec_exec (struct trivfs_protid *protid,
+ file_t file,
+@@ -1372,13 +1374,51 @@
+ 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,
+Index: hurd-debian/exec/hashexec.c
+===================================================================
+--- hurd-debian.orig/exec/hashexec.c 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/exec/hashexec.c 2014-02-03 23:45:08.000000000 +0000
+@@ -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 @@
+ 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 @@
+ 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 @@
+ 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),
+Index: hurd-debian/exec/priv.h
+===================================================================
+--- hurd-debian.orig/exec/priv.h 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/exec/priv.h 2014-02-03 22:48:44.000000000 +0000
+@@ -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 @@
+ #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
+@@ -134,6 +136,7 @@
+ 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,
+Index: hurd-debian/hurd/exec.defs
+===================================================================
+--- hurd-debian.orig/hurd/exec.defs 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/hurd/exec.defs 2014-02-03 22:48:44.000000000 +0000
+@@ -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 @@
+
+ INTR_INTERFACE
+
++/* Deprecated: use exec_exec_file_name instead. */
+ routine exec_exec (
+ execserver: file_t;
+ file: mach_port_send_t;
+Index: hurd-debian/hurd/exec_experimental.defs
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ hurd-debian/hurd/exec_experimental.defs 2014-02-03 22:48:44.000000000 +0000
+@@ -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);
++
+Index: hurd-debian/exec/Makefile
+===================================================================
+--- hurd-debian.orig/exec/Makefile 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/exec/Makefile 2014-02-03 22:48:44.000000000 +0000
+@@ -22,7 +22,7 @@
+
+ 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
+@@ -30,6 +30,7 @@
+
+ exec-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
+ exec_startup-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
++exec_experimental-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
+
+ include ../Makeconf
+
+Index: hurd-debian/exec/main.c
+===================================================================
+--- hurd-debian.orig/exec/main.c 2014-02-03 22:48:45.000000000 +0000
++++ hurd-debian/exec/main.c 2014-02-03 23:45:19.000000000 +0000
+@@ -47,6 +47,7 @@
+
+
+ #include "exec_S.h"
++#include "exec_experimental_S.h"
+ #include "exec_startup_S.h"
+
+ static int
+@@ -54,6 +55,7 @@
+ {
+ 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/debian/patches/exec_filename_fix.patch b/debian/patches/exec_filename_fix.patch
new file mode 100644
index 00000000..71836d9b
--- /dev/null
+++ b/debian/patches/exec_filename_fix.patch
@@ -0,0 +1,144 @@
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+
+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 | 91 ++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 50 insertions(+), 41 deletions(-)
+
+--- 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)
diff --git a/debian/patches/exec_filename_fs.patch b/debian/patches/exec_filename_fs.patch
new file mode 100644
index 00000000..15054fdb
--- /dev/null
+++ b/debian/patches/exec_filename_fs.patch
@@ -0,0 +1,1060 @@
+From ba528e4a9db131112aa09edfdbb3449b55618578 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 2/3] 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 +-
+ doc/hurd.texi | 16 ++++----
+ exec/hashexec.c | 32 ++++++++++----
+ hurd/fs.defs | 28 +++++++++++--
+ hurd/hurd_types.h | 9 ++--
+ startup/startup.c | 81 ++++++++++++++++++++++++++----------
+ libdiskfs/boot-start.c | 2 +-
+ libdiskfs/file-exec.c | 75 ++++++++++++++++++++++++++++------
+ libfshelp/start-translator-long.c | 21 +++++++---
+ libnetfs/file-exec.c | 67 ++++++++++++++++++++++++++----
+ libtrivfs/file-exec.c | 27 ++++++++++++-
+ trans/fakeroot.c | 59 ++++++++++++++++++++++++---
+ utils/login.c | 23 +++++++---
+ 13 files changed, 350 insertions(+), 92 deletions(-)
+
+Index: hurd-debian/TODO
+===================================================================
+--- hurd-debian.orig/TODO
++++ hurd-debian/TODO
+@@ -133,7 +133,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. !!
+
+Index: hurd-debian/doc/hurd.texi
+===================================================================
+--- hurd-debian.orig/doc/hurd.texi
++++ hurd-debian/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; i
+ 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 th
+ 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
+Index: hurd-debian/exec/hashexec.c
+===================================================================
+--- hurd-debian.orig/exec/hashexec.c
++++ hurd-debian/exec/hashexec.c
+@@ -24,6 +24,9 @@ the Free Software Foundation, 675 Mass A
+ #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);
+
+Index: hurd-debian/hurd/fs.defs
+===================================================================
+--- hurd-debian.orig/hurd/fs.defs
++++ hurd-debian/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;
+Index: hurd-debian/hurd/hurd_types.h
+===================================================================
+--- hurd-debian.orig/hurd/hurd_types.h
++++ hurd-debian/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,
+Index: hurd-debian/startup/startup.c
+===================================================================
+--- hurd-debian.orig/startup/startup.c
++++ hurd-debian/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>
+@@ -376,13 +379,28 @@ run (const char *server, mach_port_t *po
+ getchar ();
+ }
+ task_set_name (*task, (char *) prog);
+- 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;
+
+@@ -469,14 +487,27 @@ run_for_real (char *filename, char *args
+ ++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)
+@@ -1035,13 +1066,26 @@ start_child (const char *prog, char **pr
+ 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);
+Index: hurd-debian/libdiskfs/boot-start.c
+===================================================================
+--- hurd-debian.orig/libdiskfs/boot-start.c
++++ hurd-debian/libdiskfs/boot-start.c
+@@ -209,7 +209,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)
+Index: hurd-debian/libdiskfs/file-exec.c
+===================================================================
+--- hurd-debian.orig/libdiskfs/file-exec.c
++++ hurd-debian/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 @@ the Free Software Foundation, 675 Mass A
+
+ #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)
+ {
+Index: hurd-debian/libfshelp/start-translator-long.c
+===================================================================
+--- hurd-debian.orig/libfshelp/start-translator-long.c
++++ hurd-debian/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_ope
+ 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)
+Index: hurd-debian/libnetfs/file-exec.c
+===================================================================
+--- hurd-debian.orig/libnetfs/file-exec.c
++++ hurd-debian/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);
+ }
+Index: hurd-debian/libtrivfs/file-exec.c
+===================================================================
+--- hurd-debian.orig/libtrivfs/file-exec.c
++++ hurd-debian/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
+ {
+ 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;
++}
+Index: hurd-debian/trans/fakeroot.c
+===================================================================
+--- hurd-debian.orig/trans/fakeroot.c
++++ hurd-debian/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"
+@@ -785,23 +789,24 @@ netfs_file_get_storage_info (struct ious
+ }
+
+ 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;
+@@ -820,14 +825,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);
+ }
+
+@@ -843,6 +864,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,
+@@ -959,6 +1012,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
+Index: hurd-debian/utils/login.c
+===================================================================
+--- hurd-debian.orig/utils/login.c
++++ hurd-debian/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);
+
+Index: hurd-debian/hurd/fs_experimental.defs
+===================================================================
+--- /dev/null
++++ hurd-debian/hurd/fs_experimental.defs
+@@ -0,0 +1,51 @@
++/* Definitions for the filesystem interface.
++ Copyright (C) 1994,95,96,97,98,99,2002 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. */
++
++
++/* All these objects also implement the generic IO facilities. */
++
++subsystem fs_experimental 444242;
++
++#include <hurd/hurd_types.defs>
++
++#ifdef FILE_IMPORTS
++FILE_IMPORTS
++#endif
++
++/* Operations supported on all files */
++
++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. */
++routine file_exec_file_name (
++ exec_file: file_t;
++ RPT
++ exec_task: task_t;
++ flags: int;
++ filename: string_t;
++ argv: data_t SCP;
++ envp: data_t SCP;
++ fdarray: portarray_t SCP;
++ portarray: portarray_t SCP;
++ intarray: intarray_t SCP;
++ deallocnames: mach_port_name_array_t SCP;
++ destroynames: mach_port_name_array_t SCP);
+Index: hurd-debian/libdiskfs/Makefile
+===================================================================
+--- hurd-debian.orig/libdiskfs/Makefile
++++ hurd-debian/libdiskfs/Makefile
+@@ -56,7 +56,7 @@ OTHERSRCS = conch-fetch.c conch-set.c di
+ 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
+Index: hurd-debian/libdiskfs/demuxer.c
+===================================================================
+--- hurd-debian.orig/libdiskfs/demuxer.c
++++ hurd-debian/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)) ||
+Index: hurd-debian/libnetfs/Makefile
+===================================================================
+--- hurd-debian.orig/libnetfs/Makefile
++++ hurd-debian/libnetfs/Makefile
+@@ -59,12 +59,13 @@ SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $
+
+ 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_
+Index: hurd-debian/libnetfs/demuxer.c
+===================================================================
+--- hurd-debian.orig/libnetfs/demuxer.c
++++ hurd-debian/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)) ||
+Index: hurd-debian/libtrivfs/Makefile
+===================================================================
+--- hurd-debian.orig/libtrivfs/Makefile
++++ hurd-debian/libtrivfs/Makefile
+@@ -44,7 +44,7 @@ OTHERSRCS=demuxer.c protid-clean.c proti
+
+ 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,7 +54,7 @@ MIGCOMSFLAGS = -prefix trivfs_
+ installhdrs := trivfs.h
+ mig-sheader-prefix = trivfs_
+ ifndef no_deps
+-installhdrs += $(patsubst %,trivfs_%_S.h,fs io fsys)
++installhdrs += $(patsubst %,trivfs_%_S.h,fs fs_experimental io fsys)
+ endif
+
+ include ../Makeconf
+Index: hurd-debian/libtrivfs/demuxer.c
+===================================================================
+--- hurd-debian.orig/libtrivfs/demuxer.c
++++ hurd-debian/libtrivfs/demuxer.c
+@@ -23,6 +23,7 @@ the Free Software Foundation, 675 Mass A
+
+ #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)))
+Index: hurd-debian/configure.ac
+===================================================================
+--- hurd-debian.orig/configure.ac
++++ hurd-debian/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/debian/patches/exec_filename_use.patch b/debian/patches/exec_filename_use.patch
new file mode 100644
index 00000000..bc19a019
--- /dev/null
+++ b/debian/patches/exec_filename_use.patch
@@ -0,0 +1,111 @@
+From bbce8439190738efc9260490fa52f9dfe9600306 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 3/3] 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.in | 4 ++--
+ utils/fakeauth.c | 9 +++++++--
+ utils/rpctrace.c | 6 +++++-
+ utils/shd.c | 9 ++++++---
+ 4 files changed, 20 insertions(+), 8 deletions(-)
+
+Index: hurd-debian/configure.ac
+===================================================================
+--- hurd-debian.orig/configure.ac
++++ hurd-debian/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.
+Index: hurd-debian/utils/fakeauth.c
+===================================================================
+--- hurd-debian.orig/utils/fakeauth.c
++++ hurd-debian/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 differ
+ /* 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 differ
+ 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)
+Index: hurd-debian/utils/rpctrace.c
+===================================================================
+--- hurd-debian.orig/utils/rpctrace.c
++++ hurd-debian/utils/rpctrace.c
+@@ -1742,7 +1742,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]);
+
+Index: hurd-debian/utils/shd.c
+===================================================================
+--- hurd-debian.orig/utils/shd.c
++++ hurd-debian/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");
diff --git a/debian/patches/series b/debian/patches/series
index 416b258c..ddf7fa73 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -63,5 +63,7 @@ bootshell0007-XXX-bootshell.patch
bootshell0008-XXX-proc-fix-build.patch
bootshell0009-fixup-more-error-handling.patch
bootshell0010-pull-code-from-livecd-XXX-document.patch
-fix-console0001-console-client-xkb-kstoucs.c-find_ucs-assert-precond.patch
-fix-console0002-console-client-Fix-lower-range-of-binary-search.patch
+exec_filename_exec.patch
+exec_filename_fs.patch
+exec_filename_use.patch
+exec_filename_fix.patch