summaryrefslogtreecommitdiff
path: root/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch
diff options
context:
space:
mode:
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.patch1017
1 files changed, 0 insertions, 1017 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
deleted file mode 100644
index b3efb235..00000000
--- a/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch
+++ /dev/null
@@ -1,1017 +0,0 @@
-From 587f6f79cd2273907dc6ddacf287c2e13d2d813a Mon Sep 17 00:00:00 2001
-From: Emilio Pozuelo Monfort <pochu27@gmail.com>
-Date: Wed, 26 May 2010 01:27:40 +0200
-Subject: [PATCH hurd 2/4] Add a file_exec_file_name RPC
-
-* hurd/fs.defs (file_exec): Deprecate in favor of...
-(file_exec_file_name): ...this new RPC.
-Change all implementations and forward old implementations to
-the new version. Change all callers but fallback to old version.
-Change comments and documentation.
----
- TODO | 2 +-
- configure.ac | 2 +
- doc/hurd.texi | 16 +++---
- exec/hashexec.c | 37 ++++++++++----
- hurd/fs.defs | 10 ++--
- hurd/hurd_types.h | 9 ++--
- libdiskfs/Makefile | 3 +-
- libdiskfs/boot-start.c | 2 +-
- libdiskfs/demuxer.c | 2 +
- libdiskfs/file-exec.c | 81 +++++++++++++++++++++++++-----
- libfshelp/start-translator-long.c | 26 +++++++---
- libnetfs/Makefile | 3 +-
- libnetfs/demuxer.c | 2 +
- libnetfs/file-exec.c | 73 ++++++++++++++++++++++++----
- libtrivfs/Makefile | 6 ++-
- libtrivfs/demuxer.c | 2 +
- libtrivfs/file-exec.c | 27 +++++++++-
- startup/startup.c | 91 +++++++++++++++++++++++++---------
- trans/fakeroot.c | 100 +++++++++++++++++++++++++++++---------
- utils/login.c | 28 ++++++++---
- 20 files changed, 410 insertions(+), 112 deletions(-)
-
-diff --git a/TODO b/TODO
-index de2a199..9fdb86f 100644
---- a/TODO
-+++ b/TODO
-@@ -131,7 +131,7 @@ See `tasks', the exported task list.
-
- ** libtrivfs
- *** Allow for read/write/exec to be passed down.
--*** Implement file_exec when appropriate. !!
-+*** Implement file_exec_file_name when appropriate. !!
- *** Provide for the visible owner, etc., to be held in command-line args
- instead of the underlying node, when it's important. !!
-
-diff --git a/configure.ac b/configure.ac
-index b03057b..b3abe1a 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -162,6 +162,8 @@ else
- VERSIONING=no
- fi
- AC_SUBST(VERSIONING)
-+# Check if libc contains these functions.
-+AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name)
-
-
- # From glibc HEAD, 2007-11-07.
-diff --git a/doc/hurd.texi b/doc/hurd.texi
-index f36caf8..14cee22 100644
---- a/doc/hurd.texi
-+++ b/doc/hurd.texi
-@@ -2737,10 +2737,10 @@ write the file.
- @node Program Execution
- @subsection Program Execution
-
--@findex file_exec
-+@findex file_exec_file_name
- Execution of programs on the Hurd is done through fileservers with the
--@code{file_exec} RPC. The fileserver is expected to verify that the
--user is allowed to execute the file, make whatever modifications to the
-+@code{file_exec_file_name} RPC. The fileserver is expected to verify that
-+the user is allowed to execute the file, make whatever modifications to the
- ports are necessary for setuid execution, and then invoke the standard
- execserver found on @file{/servers/exec}.
-
-@@ -2752,13 +2752,13 @@ The file must be opened for execution; if it is not, @code{EBADF} should
- be returned. In addition, at least one of the execute bits must be on. A
- failure of this check should result in @code{EACCES}---not
- @code{ENOEXEC}. It is not proper for the fileserver ever to respond to
--the @code{file_exec} RPC with @code{ENOEXEC}.
-+the @code{file_exec_file_name} RPC with @code{ENOEXEC}.
-
- If either the setuid or setgid bits are set, the server needs to
- construct a new authentication handle with the additional new ID's.
--Then all the ports passed to @code{file_exec} need to be reauthenticated
--with the new handle. If the fileserver is unable to make the new
--authentication handle (for example, because it is not running as root)
-+Then all the ports passed to @code{file_exec_file_name} need to be
-+reauthenticated with the new handle. If the fileserver is unable to make the
-+new authentication handle (for example, because it is not running as root)
- it is not acceptable to return an error; in such a case the server
- should simply silently fail to implement the setuid/setgid semantics.
-
-@@ -2773,7 +2773,7 @@ will not share any file pointers with the port the user passed in,
- opened with @code{O_READ}. Finally, all the information (mutated
- appropriately for setuid/setgid) should be sent to the execserver with
- @code{exec_exec_file_name}. Whatever error code @code{exec_exec_file_name}
--returns should be returned to the caller of @code{file_exec}.
-+returns should be returned to the caller of @code{file_exec_file_name}.
-
- @node File Locking
- @subsection File Locking
-diff --git a/exec/hashexec.c b/exec/hashexec.c
-index 118360f..c971279 100644
---- a/exec/hashexec.c
-+++ b/exec/hashexec.c
-@@ -24,6 +24,9 @@
- #include <unistd.h>
- #include <envz.h>
- #include <sys/param.h>
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+#include <hurd/fs_experimental.h>
-+#endif
-
- /* This is called to check E for a #! interpreter specification. E has
- already been prepared (successfully) and checked (unsuccessfully). If
-@@ -421,16 +424,32 @@ check_hashbang (struct execdata *e,
- /* We cannot open the interpreter file to execute it. Lose! */
- return;
-
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
- /* Execute the interpreter program. */
-- e->error = file_exec (interp_file,
-- oldtask, flags,
-- new_argv, new_argvlen, envp, envplen,
-- new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND,
-- new_dtable ? new_dtablesize : dtablesize,
-- portarray, MACH_MSG_TYPE_COPY_SEND, nports,
-- intarray, nints,
-- deallocnames, ndeallocnames,
-- destroynames, ndestroynames);
-+ e->error = file_exec_file_name (interp_file,
-+ oldtask, flags, interp,
-+ new_argv, new_argvlen, envp, envplen,
-+ new_dtable ?: dtable,
-+ MACH_MSG_TYPE_COPY_SEND,
-+ new_dtable ? new_dtablesize : dtablesize,
-+ portarray, MACH_MSG_TYPE_COPY_SEND, nports,
-+ intarray, nints,
-+ deallocnames, ndeallocnames,
-+ destroynames, ndestroynames);
-+ /* For backwards compatibility. Just drop it when we kill file_exec. */
-+ if (e->error == MIG_BAD_ID)
-+#endif
-+ e->error = file_exec (interp_file,
-+ oldtask, flags,
-+ new_argv, new_argvlen, envp, envplen,
-+ new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND,
-+ new_dtable ? new_dtablesize : dtablesize,
-+ portarray, MACH_MSG_TYPE_COPY_SEND, nports,
-+ intarray, nints,
-+ deallocnames, ndeallocnames,
-+ destroynames, ndestroynames);
-+
-+
- mach_port_deallocate (mach_task_self (), interp_file);
- munmap (new_argv, new_argvlen);
-
-diff --git a/hurd/fs.defs b/hurd/fs.defs
-index a4a48cc..1322237 100644
---- a/hurd/fs.defs
-+++ b/hurd/fs.defs
-@@ -1,5 +1,6 @@
- /* Definitions for the filesystem interface.
-- Copyright (C) 1994,95,96,97,98,99,2002 Free Software Foundation, Inc.
-+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2010
-+ Free Software Foundation, Inc.
-
- This file is part of the GNU Hurd.
-
-@@ -35,7 +36,8 @@ INTR_INTERFACE
- /* Overlay a task with a file. Necessary initialization, including
- authentication changes associated with set[ug]id execution must be
- handled by the filesystem. Filesystems normally implement this by
-- using exec_newtask or exec_loadtask as appropriate. */
-+ using exec_newtask or exec_loadtask as appropriate.
-+ Deprecated: use file_exec_file_name instead. */
- routine file_exec (
- exec_file: file_t;
- RPT
-@@ -129,8 +131,8 @@ routine file_lock_stat (
- (regardless of the current open modes for this port). ALLOWED is a
- bitwise OR of O_READ, O_WRITE, and O_EXEC. This is not necessarily the
- same as what an open or exec would allow; O_EXEC is set for root even if
-- no executable bits are on (in which case file_exec should fail) and
-- O_WRITE is set a directory can be modified, even though it can't be
-+ no executable bits are on (in which case file_exec_file_name should fail)
-+ and O_WRITE is set a directory can be modified, even though it can't be
- written directly. */
- routine file_check_access (
- file: file_t;
-diff --git a/hurd/hurd_types.h b/hurd/hurd_types.h
-index 4341177..83942a7 100644
---- a/hurd/hurd_types.h
-+++ b/hurd/hurd_types.h
-@@ -1,5 +1,6 @@
- /* C declarations for Hurd server interfaces
-- Copyright (C) 1993,94,95,96,98,99,2001,02 Free Software Foundation, Inc.
-+ Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002,
-+ 2010 Free Software Foundation, Inc.
-
- This file is part of the GNU Hurd.
-
-@@ -81,7 +82,7 @@ typedef struct timespec timespec_t;
- /* Many such parameters and flags are also defined in various libc
- headers. */
-
--/* Bits for flags in fs.defs:file_exec and exec.defs:exec_* calls: */
-+/* Bits for flags in fs.defs:file_exec_file_name and exec.defs:exec_* calls: */
- #define EXEC_NEWTASK 0x00000001 /* Create new task; kill old one. */
- #define EXEC_SECURE 0x00000002 /* Use secure values of portarray, etc. */
- #define EXEC_DEFAULTS 0x00000004 /* Use defaults for unspecified ports. */
-@@ -347,7 +348,7 @@ typedef int *procinfo_t;
- #define FSTYPE_MEMFS 0x00000019 /* In-core filesystem */
- #define FSTYPE_ISO9660 0x0000001a /* ISO9660 */
-
--/* Standard port assignments for file_exec and exec_* */
-+/* Standard port assignments for file_exec_file_name and exec_* */
- enum
- {
- INIT_PORT_CWDIR,
-@@ -361,7 +362,7 @@ enum
- INIT_PORT_MAX
- };
-
--/* Standard ints for file_exec and exec_* */
-+/* Standard ints for file_exec_file_name and exec_* */
- enum
- {
- INIT_UMASK,
-diff --git a/libdiskfs/Makefile b/libdiskfs/Makefile
-index 47b9339..6646dbe 100644
---- a/libdiskfs/Makefile
-+++ b/libdiskfs/Makefile
-@@ -56,7 +56,7 @@ OTHERSRCS = conch-fetch.c conch-set.c dir-clear.c dir-init.c dir-renamed.c \
- SRCS = $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS)
- installhdrs = diskfs.h diskfs-pager.h
-
--MIGSTUBS = fsServer.o ioServer.o fsysServer.o exec_startupServer.o \
-+MIGSTUBS = fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o exec_startupServer.o \
- fsys_replyUser.o fs_notifyUser.o ifsockServer.o \
- startup_notifyServer.o
- OBJS = $(sort $(SRCS:.c=.o) $(MIGSTUBS))
-@@ -66,6 +66,7 @@ LDLIBS += -lpthread
-
- fsys-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -DREPLY_PORTS
- fs-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
-+fs_experimental-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
- io-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
- ifsock-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
- exec_startup-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
-diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c
-index d10d783..d80a4ca 100644
---- a/libdiskfs/boot-start.c
-+++ b/libdiskfs/boot-start.c
-@@ -198,7 +198,7 @@ diskfs_start_bootstrap ()
- diskfs_exec_ctl = MACH_PORT_NULL; /* Not used after this. */
- }
-
-- /* Cache the exec server port for file_exec to use. */
-+ /* Cache the exec server port for file_exec_file_name to use. */
- _hurd_port_set (&_diskfs_exec_portcell, diskfs_exec);
-
- if (_diskfs_boot_command)
-diff --git a/libdiskfs/demuxer.c b/libdiskfs/demuxer.c
-index 4a1c4fb..ff33b1b 100644
---- a/libdiskfs/demuxer.c
-+++ b/libdiskfs/demuxer.c
-@@ -19,6 +19,7 @@
-
- #include "io_S.h"
- #include "fs_S.h"
-+#include "fs_experimental_S.h"
- #include "../libports/notify_S.h"
- #include "fsys_S.h"
- #include "../libports/interrupt_S.h"
-@@ -33,6 +34,7 @@ diskfs_demuxer (mach_msg_header_t *inp,
- mig_routine_t routine;
- if ((routine = diskfs_io_server_routine (inp)) ||
- (routine = diskfs_fs_server_routine (inp)) ||
-+ (routine = diskfs_fs_experimental_server_routine (inp)) ||
- (routine = ports_notify_server_routine (inp)) ||
- (routine = diskfs_fsys_server_routine (inp)) ||
- (routine = ports_interrupt_server_routine (inp)) ||
-diff --git a/libdiskfs/file-exec.c b/libdiskfs/file-exec.c
-index e544b14..a491720 100644
---- a/libdiskfs/file-exec.c
-+++ b/libdiskfs/file-exec.c
-@@ -1,5 +1,6 @@
--/* File execution (file_exec RPC) for diskfs servers, using exec server.
-- Copyright (C) 1993,94,95,96,97,98,2000,02 Free Software Foundation, Inc.
-+/* File execution (file_exec_file_name RPC) for diskfs servers, using exec server.
-+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
-+ 2010 Free Software Foundation, Inc.
-
- This file is part of the GNU Hurd.
-
-@@ -21,10 +22,14 @@
-
- #include "priv.h"
- #include "fs_S.h"
-+#include "fs_experimental_S.h"
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <hurd/exec.h>
- #include <hurd/paths.h>
-+#ifdef HAVE_EXEC_EXEC_FILE_NAME
-+#include <hurd/exec_experimental.h>
-+#endif
- #include <string.h>
- #include <idvec.h>
-
-@@ -47,6 +52,39 @@ diskfs_S_file_exec (struct protid *cred,
- mach_port_t *destroynames,
- size_t destroynameslen)
- {
-+ return diskfs_S_file_exec_file_name (cred,
-+ task,
-+ flags,
-+ "",
-+ argv, argvlen,
-+ envp, envplen,
-+ fds, fdslen,
-+ portarray, portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+}
-+
-+kern_return_t
-+diskfs_S_file_exec_file_name (struct protid *cred,
-+ task_t task,
-+ int flags,
-+ char *filename,
-+ char *argv,
-+ size_t argvlen,
-+ char *envp,
-+ size_t envplen,
-+ mach_port_t *fds,
-+ size_t fdslen,
-+ mach_port_t *portarray,
-+ size_t portarraylen,
-+ int *intarray,
-+ size_t intarraylen,
-+ mach_port_t *deallocnames,
-+ size_t deallocnameslen,
-+ mach_port_t *destroynames,
-+ size_t destroynameslen)
-+{
- struct node *np;
- uid_t uid;
- gid_t gid;
-@@ -136,9 +174,9 @@ diskfs_S_file_exec (struct protid *cred,
-
- if (! err)
- /* Make a new peropen for the exec server to access the file, since any
-- seeking the exec server might want to do should not affect the
-- original peropen on which file_exec was called. (The new protid for
-- this peropen clones the caller's iouser to preserve the caller's
-+ seeking the exec server might want to do should not affect the original
-+ peropen on which file_exec_file_name was called. (The new protid
-+ for this peropen clones the caller's iouser to preserve the caller's
- authentication credentials.) The new peropen's openmodes must have
- O_READ even if the caller had only O_EXEC privilege, so the exec
- server can read the executable file. We also include O_EXEC so that
-@@ -159,14 +197,31 @@ diskfs_S_file_exec (struct protid *cred,
- do
- {
- right = ports_get_send_right (newpi);
-- err = exec_exec (execserver,
-- right, MACH_MSG_TYPE_COPY_SEND,
-- task, flags, argv, argvlen, envp, envplen,
-- fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-- intarray, intarraylen,
-- deallocnames, deallocnameslen,
-- destroynames, destroynameslen);
-+#ifdef HAVE_EXEC_EXEC_FILE_NAME
-+ err = exec_exec_file_name (execserver,
-+ right, MACH_MSG_TYPE_COPY_SEND,
-+ task, flags, filename,
-+ argv, argvlen, envp, envplen,
-+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-+ portarray, MACH_MSG_TYPE_COPY_SEND,
-+ portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+ /* For backwards compatibility. Just drop it when we kill
-+ exec_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = exec_exec (execserver,
-+ right, MACH_MSG_TYPE_COPY_SEND,
-+ task, flags, argv, argvlen, envp, envplen,
-+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-+ portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+
-+
- mach_port_deallocate (mach_task_self (), right);
- if (err == MACH_SEND_INVALID_DEST)
- {
-diff --git a/libfshelp/start-translator-long.c b/libfshelp/start-translator-long.c
-index 8b00e08..f0966aa 100644
---- a/libfshelp/start-translator-long.c
-+++ b/libfshelp/start-translator-long.c
-@@ -1,5 +1,6 @@
- /*
-- Copyright (C) 1995,96,99,2000,02, 04 Free Software Foundation, Inc.
-+ Copyright (C) 1995, 1996, 1999, 2000, 2002, 2004, 2010
-+ Free Software Foundation, Inc.
- Written by Miles Bader and Michael I. Bushnell.
-
- This file is part of the GNU Hurd.
-@@ -27,6 +28,9 @@
- #include <string.h>
- #include <assert.h>
- #include "fshelp.h"
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+#include <hurd/fs_experimental.h>
-+#endif
-
-
- /* The data passed in the various messages we're interested in. */
-@@ -272,12 +276,22 @@ fshelp_start_translator_long (fshelp_open_fn_t underlying_open_fn,
- saveport = ports[INIT_PORT_BOOTSTRAP];
- ports[INIT_PORT_BOOTSTRAP] = bootstrap;
-
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
- /* Try and exec the translator in TASK... */
-- err = file_exec (executable, task, EXEC_DEFAULTS,
-- argz, argz_len, 0, 0,
-- fds, fds_type, fds_len,
-- ports, ports_type, ports_len,
-- ints, ints_len, 0, 0, 0, 0);
-+ err = file_exec_file_name (executable, task, EXEC_DEFAULTS, name,
-+ argz, argz_len, 0, 0,
-+ fds, fds_type, fds_len,
-+ ports, ports_type, ports_len,
-+ ints, ints_len, 0, 0, 0, 0);
-+ /* For backwards compatibility. Just drop it when we kill file_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = file_exec (executable, task, EXEC_DEFAULTS,
-+ argz, argz_len, 0, 0,
-+ fds, fds_type, fds_len,
-+ ports, ports_type, ports_len,
-+ ints, ints_len, 0, 0, 0, 0);
-+
- ports_moved = 1;
-
- if (ports_type == MACH_MSG_TYPE_COPY_SEND)
-diff --git a/libnetfs/Makefile b/libnetfs/Makefile
-index c3830c0..4aade5a 100644
---- a/libnetfs/Makefile
-+++ b/libnetfs/Makefile
-@@ -59,12 +59,13 @@ SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS)
-
- installhdrs=netfs.h
-
--MIGSTUBS= ioServer.o fsServer.o fsysServer.o fsys_replyUser.o ifsockServer.o
-+MIGSTUBS= ioServer.o fsServer.o fs_experimentalServer.o fsysServer.o fsys_replyUser.o ifsockServer.o
-
- OBJS=$(sort $(SRCS:.c=.o) $(MIGSTUBS))
-
- fsys-MIGSFLAGS = -imacros $(srcdir)/mutations.h -DREPLY_PORTS
- fs-MIGSFLAGS = -imacros $(srcdir)/mutations.h
-+fs_experimental-MIGSFLAGS = -imacros $(srcdir)/mutations.h
- io-MIGSFLAGS = -imacros $(srcdir)/mutations.h
- ifsock-MIGSFLAGS = -imacros $(srcdir)/mutations.h
- MIGCOMSFLAGS = -prefix netfs_
-diff --git a/libnetfs/demuxer.c b/libnetfs/demuxer.c
-index 4c20ab6..bf78812 100644
---- a/libnetfs/demuxer.c
-+++ b/libnetfs/demuxer.c
-@@ -22,6 +22,7 @@
-
- #include "io_S.h"
- #include "fs_S.h"
-+#include "fs_experimental_S.h"
- #include "../libports/notify_S.h"
- #include "fsys_S.h"
- #include "../libports/interrupt_S.h"
-@@ -34,6 +35,7 @@ netfs_demuxer (mach_msg_header_t *inp,
- mig_routine_t routine;
- if ((routine = netfs_io_server_routine (inp)) ||
- (routine = netfs_fs_server_routine (inp)) ||
-+ (routine = netfs_fs_experimental_server_routine (inp)) ||
- (routine = ports_notify_server_routine (inp)) ||
- (routine = netfs_fsys_server_routine (inp)) ||
- (routine = ports_interrupt_server_routine (inp)) ||
-diff --git a/libnetfs/file-exec.c b/libnetfs/file-exec.c
-index 638f0ae..ffaf598 100644
---- a/libnetfs/file-exec.c
-+++ b/libnetfs/file-exec.c
-@@ -1,5 +1,6 @@
- /*
-- Copyright (C) 1996,97,2000,01,02 Free Software Foundation, Inc.
-+ Copyright (C) 1996, 1997, 2000, 2001, 2002, 2010
-+ Free Software Foundation, Inc.
- Written by Michael I. Bushnell, p/BSG.
-
- This file is part of the GNU Hurd.
-@@ -23,10 +24,14 @@
- #include "netfs.h"
- #include "execserver.h"
- #include "fs_S.h"
-+#include "fs_experimental_S.h"
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <hurd/exec.h>
- #include <hurd/paths.h>
-+#ifdef HAVE_EXEC_EXEC_FILE_NAME
-+#include <hurd/exec_experimental.h>
-+#endif
- #include <string.h>
- #include <idvec.h>
-
-@@ -49,6 +54,39 @@ netfs_S_file_exec (struct protid *cred,
- mach_port_t *destroynames,
- size_t destroynameslen)
- {
-+ return netfs_S_file_exec_file_name (cred,
-+ task,
-+ flags,
-+ "",
-+ argv, argvlen,
-+ envp, envplen,
-+ fds, fdslen,
-+ portarray, portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+}
-+
-+kern_return_t
-+netfs_S_file_exec_file_name (struct protid *cred,
-+ task_t task,
-+ int flags,
-+ char *filename,
-+ char *argv,
-+ size_t argvlen,
-+ char *envp,
-+ size_t envplen,
-+ mach_port_t *fds,
-+ size_t fdslen,
-+ mach_port_t *portarray,
-+ size_t portarraylen,
-+ int *intarray,
-+ size_t intarraylen,
-+ mach_port_t *deallocnames,
-+ size_t deallocnameslen,
-+ mach_port_t *destroynames,
-+ size_t destroynameslen)
-+{
- struct node *np;
- error_t err;
- uid_t uid;
-@@ -133,14 +171,31 @@ netfs_S_file_exec (struct protid *cred,
- if (newpi)
- {
- right = ports_get_send_right (newpi);
-- err = exec_exec (_netfs_exec,
-- right, MACH_MSG_TYPE_COPY_SEND,
-- task, flags, argv, argvlen, envp, envplen,
-- fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-- intarray, intarraylen,
-- deallocnames, deallocnameslen,
-- destroynames, destroynameslen);
-+#ifdef HAVE_EXEC_EXEC_FILE_NAME
-+ err = exec_exec_file_name (_netfs_exec,
-+ right, MACH_MSG_TYPE_COPY_SEND,
-+ task, flags, filename,
-+ argv, argvlen, envp, envplen,
-+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-+ portarray, MACH_MSG_TYPE_COPY_SEND,
-+ portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+ /* For backwards compatibility. Just drop it when we kill
-+ exec_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = exec_exec (_netfs_exec,
-+ right, MACH_MSG_TYPE_COPY_SEND,
-+ task, flags, argv, argvlen, envp, envplen,
-+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-+ portarray, MACH_MSG_TYPE_COPY_SEND,
-+ portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+
- mach_port_deallocate (mach_task_self (), right);
- ports_port_deref (newpi);
- }
-diff --git a/libtrivfs/Makefile b/libtrivfs/Makefile
-index 48a53d7..c440101 100644
---- a/libtrivfs/Makefile
-+++ b/libtrivfs/Makefile
-@@ -44,7 +44,7 @@ OTHERSRCS=demuxer.c protid-clean.c protid-dup.c cntl-create.c \
-
- SRCS=$(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(OTHERSRCS)
-
--MIGSTUBS=fsServer.o ioServer.o fsysServer.o fsys_replyUser.o
-+MIGSTUBS=fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o fsys_replyUser.o
-
- libname = libtrivfs
- HURDLIBS = fshelp iohelp ports shouldbeinlibc
-@@ -54,6 +54,10 @@ MIGCOMSFLAGS = -prefix trivfs_
- installhdrs := trivfs.h
- mig-sheader-prefix = trivfs_
-
-+ifndef no_deps
-+installhdrs += $(patsubst %,trivfs_%_S.h,fs fs_experimental io fsys)
-+endif
-+
- include ../Makeconf
-
- $(MIGSTUBS:%Server.o=%.sdefsi): $(srcdir)/mig-mutate.h
-diff --git a/libtrivfs/demuxer.c b/libtrivfs/demuxer.c
-index 8c1afe6..55229da 100644
---- a/libtrivfs/demuxer.c
-+++ b/libtrivfs/demuxer.c
-@@ -23,6 +23,7 @@
-
- #include "trivfs_io_S.h"
- #include "trivfs_fs_S.h"
-+#include "trivfs_fs_experimental_S.h"
- #include "../libports/notify_S.h"
- #include "trivfs_fsys_S.h"
- #include "../libports/interrupt_S.h"
-@@ -34,6 +35,7 @@ trivfs_demuxer (mach_msg_header_t *inp,
- mig_routine_t routine;
- if ((routine = trivfs_io_server_routine (inp)) ||
- (routine = trivfs_fs_server_routine (inp)) ||
-+ (routine = trivfs_fs_experimental_server_routine (inp)) ||
- (routine = ports_notify_server_routine (inp)) ||
- (routine = trivfs_fsys_server_routine (inp)) ||
- (routine = ports_interrupt_server_routine (inp)))
-diff --git a/libtrivfs/file-exec.c b/libtrivfs/file-exec.c
-index b353d8a..5f873c7 100644
---- a/libtrivfs/file-exec.c
-+++ b/libtrivfs/file-exec.c
-@@ -1,5 +1,5 @@
- /*
-- Copyright (C) 1994,2002 Free Software Foundation, Inc.
-+ Copyright (C) 1994, 2002, 2010 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
-@@ -41,3 +41,28 @@ trivfs_S_file_exec (trivfs_protid_t exec_file,
- {
- return EOPNOTSUPP;
- }
-+
-+kern_return_t
-+trivfs_S_file_exec_file_name (trivfs_protid_t exec_file,
-+ mach_port_t reply,
-+ mach_msg_type_name_t replyPoly,
-+ mach_port_t exec_task,
-+ int flags,
-+ string_t filename,
-+ data_t argv,
-+ mach_msg_type_number_t argvCnt,
-+ data_t envp,
-+ mach_msg_type_number_t envpCnt,
-+ portarray_t fdarray,
-+ mach_msg_type_number_t fdarrayCnt,
-+ portarray_t portarray,
-+ mach_msg_type_number_t portarrayCnt,
-+ intarray_t intarray,
-+ mach_msg_type_number_t intarrayCnt,
-+ mach_port_array_t deallocnames,
-+ mach_msg_type_number_t deallocnamesCnt,
-+ mach_port_array_t destroynames,
-+ mach_msg_type_number_t destroynamesCnt)
-+{
-+ return EOPNOTSUPP;
-+}
-diff --git a/startup/startup.c b/startup/startup.c
-index e916768..8696709 100644
---- a/startup/startup.c
-+++ b/startup/startup.c
-@@ -1,7 +1,7 @@
- /* Start and maintain hurd core servers and system run state
-
- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-- 2005, 2008, 2013 Free Software Foundation, Inc.
-+ 2005, 2008, 2010, 2013 Free Software Foundation, Inc.
- This file is part of the GNU Hurd.
-
- The GNU Hurd is free software; you can redistribute it and/or modify
-@@ -24,6 +24,9 @@
- one file. */
- #include <hurd.h>
- #include <hurd/fs.h>
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+#include <hurd/fs_experimental.h>
-+#endif
- #include <hurd/fsys.h>
- #include <device/device.h>
- #include <stdio.h>
-@@ -377,13 +380,29 @@ run (const char *server, mach_port_t *ports, task_t *task)
- printf ("Pausing for %s\n", prog);
- getchar ();
- }
-- err = file_exec (file, *task, 0,
-- (char *)prog, strlen (prog) + 1, /* Args. */
-- startup_envz, startup_envz_len,
-- default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-- ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-- default_ints, INIT_INT_MAX,
-- NULL, 0, NULL, 0);
-+
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+ err = file_exec_file_name (file, *task, 0, (char *)prog,
-+ (char *)prog,
-+ strlen (prog) + 1, /* Args. */
-+ startup_envz, startup_envz_len,
-+ default_dtable,
-+ MACH_MSG_TYPE_COPY_SEND, 3,
-+ ports, MACH_MSG_TYPE_COPY_SEND,
-+ INIT_PORT_MAX,
-+ default_ints, INIT_INT_MAX,
-+ NULL, 0, NULL, 0);
-+ /* For backwards compatibility. Just drop it when we kill
-+ file_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = file_exec (file, *task, 0,
-+ (char *)prog, strlen (prog) + 1, /* Args. */
-+ startup_envz, startup_envz_len,
-+ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-+ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-+ default_ints, INIT_INT_MAX,
-+ NULL, 0, NULL, 0);
- if (!err)
- break;
-
-@@ -470,14 +489,27 @@ run_for_real (char *filename, char *args, int arglen, mach_port_t ctty,
- ++progname;
- else
- progname = filename;
-- err = file_exec (file, task, 0,
-- args, arglen,
-- startup_envz, startup_envz_len,
-- default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-- default_ports, MACH_MSG_TYPE_COPY_SEND,
-- INIT_PORT_MAX,
-- default_ints, INIT_INT_MAX,
-- NULL, 0, NULL, 0);
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+ err = file_exec_file_name (file, task, 0, filename,
-+ args, arglen,
-+ startup_envz, startup_envz_len,
-+ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-+ default_ports, MACH_MSG_TYPE_COPY_SEND,
-+ INIT_PORT_MAX,
-+ default_ints, INIT_INT_MAX,
-+ NULL, 0, NULL, 0);
-+ /* For backwards compatibility. Just drop it when we kill file_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = file_exec (file, task, 0,
-+ args, arglen,
-+ startup_envz, startup_envz_len,
-+ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-+ default_ports, MACH_MSG_TYPE_COPY_SEND,
-+ INIT_PORT_MAX,
-+ default_ints, INIT_INT_MAX,
-+ NULL, 0, NULL, 0);
-+
- mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]);
- mach_port_deallocate (mach_task_self (), task);
- if (ctty != MACH_PORT_NULL)
-@@ -1075,13 +1107,26 @@ start_child (const char *prog, char **progargs)
- getchar ();
- }
-
-- err = file_exec (file, child_task, 0,
-- args, arglen,
-- startup_envz, startup_envz_len,
-- NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */
-- default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-- default_ints, INIT_INT_MAX,
-- NULL, 0, NULL, 0);
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+ err = file_exec_file_name (file, child_task, 0, args,
-+ args, arglen,
-+ startup_envz, startup_envz_len,
-+ NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */
-+ default_ports, MACH_MSG_TYPE_COPY_SEND,
-+ INIT_PORT_MAX,
-+ default_ints, INIT_INT_MAX,
-+ NULL, 0, NULL, 0);
-+ /* For backwards compatibility. Just drop it when we kill file_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = file_exec (file, child_task, 0,
-+ args, arglen,
-+ startup_envz, startup_envz_len,
-+ NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */
-+ default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-+ default_ints, INIT_INT_MAX,
-+ NULL, 0, NULL, 0);
-+
- proc_mark_important (default_ports[INIT_PORT_PROC]);
- mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]);
- mach_port_deallocate (mach_task_self (), file);
-diff --git a/trans/fakeroot.c b/trans/fakeroot.c
-index 76fc901..adbd07d 100644
---- a/trans/fakeroot.c
-+++ b/trans/fakeroot.c
-@@ -28,10 +28,14 @@
- #include <pthread.h>
- #include <hurd/ihash.h>
- #include <hurd/paths.h>
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+#include <hurd/fs_experimental.h>
-+#endif
-
- #include <version.h>
-
- #include "libnetfs/fs_S.h"
-+#include "libnetfs/fs_experimental_S.h"
- #include "libnetfs/io_S.h"
- #include "libnetfs/fsys_S.h"
- #include "libports/notify_S.h"
-@@ -820,23 +824,24 @@ netfs_file_get_storage_info (struct iouser *cred,
- }
-
- kern_return_t
--netfs_S_file_exec (struct protid *user,
-- task_t task,
-- int flags,
-- char *argv,
-- size_t argvlen,
-- char *envp,
-- size_t envplen,
-- mach_port_t *fds,
-- size_t fdslen,
-- mach_port_t *portarray,
-- size_t portarraylen,
-- int *intarray,
-- size_t intarraylen,
-- mach_port_t *deallocnames,
-- size_t deallocnameslen,
-- mach_port_t *destroynames,
-- size_t destroynameslen)
-+netfs_S_file_exec_file_name (struct protid *user,
-+ task_t task,
-+ int flags,
-+ char *filename,
-+ char *argv,
-+ size_t argvlen,
-+ char *envp,
-+ size_t envplen,
-+ mach_port_t *fds,
-+ size_t fdslen,
-+ mach_port_t *portarray,
-+ size_t portarraylen,
-+ int *intarray,
-+ size_t intarraylen,
-+ mach_port_t *deallocnames,
-+ size_t deallocnameslen,
-+ mach_port_t *destroynames,
-+ size_t destroynameslen)
- {
- error_t err;
- file_t file;
-@@ -855,14 +860,30 @@ netfs_S_file_exec (struct protid *user,
-
- if (!err)
- {
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
- /* We cannot use MACH_MSG_TYPE_MOVE_SEND because we might need to
- retry an interrupted call that would have consumed the rights. */
-- err = file_exec (netfs_node_netnode (user->po->np)->file,
-- task, flags, argv, argvlen,
-- envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-- intarray, intarraylen, deallocnames, deallocnameslen,
-- destroynames, destroynameslen);
-+ err = file_exec_file_name (netfs_node_netnode (user->po->np)->file,
-+ task, flags,
-+ filename,
-+ argv, argvlen,
-+ envp, envplen,
-+ fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-+ portarray, MACH_MSG_TYPE_COPY_SEND,
-+ portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+ /* For backwards compatibility. Just drop it when we kill
-+ file_exec. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = file_exec (user->po->np->nn->file, task, flags, argv, argvlen,
-+ envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-+ portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-+ intarray, intarraylen, deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+
- mach_port_deallocate (mach_task_self (), file);
- }
-
-@@ -878,6 +899,38 @@ netfs_S_file_exec (struct protid *user,
- return err;
- }
-
-+kern_return_t
-+netfs_S_file_exec (struct protid *user,
-+ task_t task,
-+ int flags,
-+ char *argv,
-+ size_t argvlen,
-+ char *envp,
-+ size_t envplen,
-+ mach_port_t *fds,
-+ size_t fdslen,
-+ mach_port_t *portarray,
-+ size_t portarraylen,
-+ int *intarray,
-+ size_t intarraylen,
-+ mach_port_t *deallocnames,
-+ size_t deallocnameslen,
-+ mach_port_t *destroynames,
-+ size_t destroynameslen)
-+{
-+ return netfs_S_file_exec_file_name (user,
-+ task,
-+ flags,
-+ "",
-+ argv, argvlen,
-+ envp, envplen,
-+ fds, fdslen,
-+ portarray, portarraylen,
-+ intarray, intarraylen,
-+ deallocnames, deallocnameslen,
-+ destroynames, destroynameslen);
-+}
-+
- error_t
- netfs_S_io_map (struct protid *user,
- mach_port_t *rdobj, mach_msg_type_name_t *rdobjtype,
-@@ -994,6 +1047,7 @@ netfs_demuxer (mach_msg_header_t *inp,
- mig_routine_t routine;
- if ((routine = netfs_io_server_routine (inp)) ||
- (routine = netfs_fs_server_routine (inp)) ||
-+ (routine = netfs_fs_experimental_server_routine (inp)) ||
- (routine = ports_notify_server_routine (inp)) ||
- (routine = netfs_fsys_server_routine (inp)) ||
- /* XXX we should intercept interrupt_operation and do
-diff --git a/utils/login.c b/utils/login.c
-index 9ee296a..cc04715 100644
---- a/utils/login.c
-+++ b/utils/login.c
-@@ -1,6 +1,7 @@
- /* Hurdish login
-
-- Copyright (C) 1995,96,97,98,99,2002 Free Software Foundation, Inc.
-+ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2010
-+ Free Software Foundation, Inc.
-
- Written by Miles Bader <miles@gnu.org>
-
-@@ -46,6 +47,9 @@
- #include <error.h>
- #include <timefmt.h>
- #include <hurd/lookup.h>
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+#include <hurd/fs_experimental.h>
-+#endif
- #include <ugids.h>
-
- const char *argp_program_version = STANDARD_HURD_VERSION (login);
-@@ -882,12 +886,22 @@ main(int argc, char *argv[])
- }
- }
-
-- err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS,
-- sh_args, sh_args_len, env, env_len,
-- fds, MACH_MSG_TYPE_COPY_SEND, 3,
-- ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-- ints, INIT_INT_MAX,
-- 0, 0, 0, 0);
-+#ifdef HAVE_FILE_EXEC_FILE_NAME
-+ err = file_exec_file_name (exec, mach_task_self (), EXEC_DEFAULTS, shell,
-+ sh_args, sh_args_len, env, env_len,
-+ fds, MACH_MSG_TYPE_COPY_SEND, 3,
-+ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-+ ints, INIT_INT_MAX,
-+ 0, 0, 0, 0);
-+ /* Fallback in case the file server hasn't been restarted. */
-+ if (err == MIG_BAD_ID)
-+#endif
-+ err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS,
-+ sh_args, sh_args_len, env, env_len,
-+ fds, MACH_MSG_TYPE_COPY_SEND, 3,
-+ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-+ ints, INIT_INT_MAX,
-+ 0, 0, 0, 0);
- if (err)
- error(5, err, "%s", shell);
-
---
-2.1.4
-