diff options
Diffstat (limited to 'debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch')
-rw-r--r-- | debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch | 1017 |
1 files changed, 1017 insertions, 0 deletions
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 new file mode 100644 index 00000000..b3efb235 --- /dev/null +++ b/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch @@ -0,0 +1,1017 @@ +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 + |