diff options
Diffstat (limited to 'debian')
-rw-r--r-- | debian/patches/exec_filename.patch (renamed from debian/patches/exec_filename_fs.patch) | 813 | ||||
-rw-r--r-- | debian/patches/exec_filename_exec.patch | 317 | ||||
-rw-r--r-- | debian/patches/exec_filename_fix.patch | 144 | ||||
-rw-r--r-- | debian/patches/exec_filename_use.patch | 113 | ||||
-rw-r--r-- | debian/patches/external.patch | 11 | ||||
-rw-r--r-- | debian/patches/series | 5 | ||||
-rw-r--r-- | debian/patches/xxx-fix-build.patch | 4 |
7 files changed, 478 insertions, 929 deletions
diff --git a/debian/patches/exec_filename_fs.patch b/debian/patches/exec_filename.patch index 25070ef8..e980ed2d 100644 --- a/debian/patches/exec_filename_fs.patch +++ b/debian/patches/exec_filename.patch @@ -1,29 +1,5 @@ -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 ++-- - init/init.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(-) - +diff --git a/TODO b/TODO +index d2500dc..297ac98 100644 --- a/TODO +++ b/TODO @@ -135,7 +135,7 @@ See `tasks', the exported task list. @@ -35,8 +11,34 @@ Change comments and documentation. *** 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 ecabfdf..6226e1a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -160,8 +160,8 @@ else + fi + AC_SUBST(VERSIONING) + +-# Check if libc contains getgrouplist and/or uselocale. +-AC_CHECK_FUNCS(getgrouplist uselocale) ++# Check if libc contains these functions. ++AC_CHECK_FUNCS(getgrouplist uselocale _hurd_exec_file_name) + + + # From glibc HEAD, 2007-11-07. +diff --git a/doc/hurd.texi b/doc/hurd.texi +index 07ddfb4..32a8194 100644 --- a/doc/hurd.texi +++ b/doc/hurd.texi +@@ -102,7 +102,7 @@ This file documents the GNU Hurd kernel component. This edition of the + documentation was last updated for version @value{VERSION} of the Hurd. + + Copyright @copyright{} 1994, 1996, 1998, 1999, 2000, 2001, 2002, 2003, +-2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. ++2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + + @quotation + Permission is granted to make and distribute verbatim copies of @@ -2737,10 +2737,10 @@ write the file. @node Program Execution @subsection Program Execution @@ -51,7 +53,7 @@ Change comments and documentation. 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 +@@ -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 @@ -69,32 +71,251 @@ Change comments and documentation. 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 +@@ -2766,14 +2766,14 @@ If the setuid/setgid transformation adds a new uid or gid to the user's + authentication handle that was not previously present (as opposed to + merely reordering them), then the @code{EXEC_SECURE} and + @code{EXEC_NEWTASK} flags should both be added in the call to +-@code{exec_exec}. ++@code{exec_exec_file_name}. + + The server then needs to open a new port onto the executed file which + will not share any file pointers with the port the user passed in, opened with @code{O_READ}. Finally, all the information (mutated appropriately for setuid/setgid) should be sent to the execserver with - @code{exec_exec_file_name}. Whatever error code @code{exec_exec_file_name} --returns should be returned to the caller of @code{file_exec}. +-@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_file_name}. @node File Locking @subsection File Locking +diff --git a/exec/exec.c b/exec/exec.c +index 935762e..3d12e09 100644 +--- a/exec/exec.c ++++ b/exec/exec.c +@@ -1,6 +1,6 @@ + /* GNU Hurd standard exec server. +- Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04 +- Free Software Foundation, Inc. ++ Copyright (C) 1992 ,1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, ++ 2002, 2004, 2010 Free Software Foundation, Inc. + Written by Roland McGrath. + + Can exec ELF format directly. +@@ -738,6 +738,7 @@ static error_t + do_exec (file_t file, + task_t oldtask, + int flags, ++ char *filename, + char *argv, mach_msg_type_number_t argvlen, boolean_t argv_copy, + char *envp, mach_msg_type_number_t envplen, boolean_t envp_copy, + mach_port_t *dtable, mach_msg_type_number_t dtablesize, +@@ -796,7 +797,7 @@ do_exec (file_t file, + { + /* Check for a #! executable file. */ + check_hashbang (&e, +- file, oldtask, flags, ++ file, oldtask, flags, filename, + argv, argvlen, argv_copy, + envp, envplen, envp_copy, + dtable, dtablesize, dtable_copy, +@@ -1371,6 +1372,7 @@ do_exec (file_t file, + return e.error; + } + ++/* Deprecated. */ + kern_return_t + S_exec_exec (struct trivfs_protid *protid, + file_t file, +@@ -1387,13 +1389,51 @@ S_exec_exec (struct trivfs_protid *protid, + mach_port_t *deallocnames, mach_msg_type_number_t ndeallocnames, + mach_port_t *destroynames, mach_msg_type_number_t ndestroynames) + { ++ return S_exec_exec_file_name (protid, ++ file, ++ oldtask, ++ flags, ++ "", ++ argv, argvlen, argv_copy, ++ envp, envplen, envp_copy, ++ dtable, dtablesize, ++ dtable_copy, ++ portarray, nports, ++ portarray_copy, ++ intarray, nints, ++ intarray_copy, ++ deallocnames, ndeallocnames, ++ destroynames, ndestroynames); ++} ++ ++kern_return_t ++S_exec_exec_file_name (struct trivfs_protid *protid, ++ file_t file, ++ task_t oldtask, ++ int flags, ++ char *filename, ++ char *argv, mach_msg_type_number_t argvlen, ++ boolean_t argv_copy, ++ char *envp, mach_msg_type_number_t envplen, ++ boolean_t envp_copy, ++ mach_port_t *dtable, mach_msg_type_number_t dtablesize, ++ boolean_t dtable_copy, ++ mach_port_t *portarray, mach_msg_type_number_t nports, ++ boolean_t portarray_copy, ++ int *intarray, mach_msg_type_number_t nints, ++ boolean_t intarray_copy, ++ mach_port_t *deallocnames, ++ mach_msg_type_number_t ndeallocnames, ++ mach_port_t *destroynames, ++ mach_msg_type_number_t ndestroynames) ++{ + if (! protid) + return EOPNOTSUPP; + + /* There were no user-specified exec servers, + or none of them could be found. */ + +- return do_exec (file, oldtask, flags, ++ return do_exec (file, oldtask, flags, filename, + argv, argvlen, argv_copy, + envp, envplen, envp_copy, + dtable, dtablesize, dtable_copy, +diff --git a/exec/hashexec.c b/exec/hashexec.c +index 5641218..9a01f7d 100644 --- a/exec/hashexec.c +++ b/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 +@@ -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, ++ 2014 Free Software Foundation, Inc. + Written by Roland McGrath. + + This file is part of the GNU Hurd. +@@ -35,6 +36,7 @@ check_hashbang (struct execdata *e, + file_t file, + task_t oldtask, + int flags, ++ char *file_name_exec, + char *argv, u_int argvlen, boolean_t argv_copy, + char *envp, u_int envplen, boolean_t envp_copy, + mach_port_t *dtable, u_int dtablesize, boolean_t dtable_copy, +@@ -225,10 +227,13 @@ check_hashbang (struct execdata *e, + file_name = NULL; + else if (! (flags & EXEC_SECURE)) + { +- /* Try to figure out the file's name. We guess that if ARGV[0] +- contains a slash, it might be the name of the file; and that +- if it contains no slash, looking for files named by ARGV[0] in +- the `PATH' environment variable might find it. */ ++ /* Try to figure out the file's name. If FILE_NAME_EXEC ++ is not NULL 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; +@@ -264,49 +269,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'; +- } ++ if (file_name_exec && file_name_exec[0] != '\0') ++ name = file_name_exec; + 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; +- +- if (!error && name_file != MACH_PORT_NULL) + { +- 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); + } - /* 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! */ + if (file_name == NULL) +@@ -416,15 +431,29 @@ check_hashbang (struct execdata *e, return; -+#ifdef HAVE_FILE_EXEC_FILE_NAME /* Execute the interpreter program. */ - e->error = file_exec (interp_file, - oldtask, flags, @@ -117,7 +338,6 @@ Change comments and documentation. + 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, @@ -132,6 +352,70 @@ Change comments and documentation. mach_port_deallocate (mach_task_self (), interp_file); munmap (new_argv, new_argvlen); +diff --git a/exec/priv.h b/exec/priv.h +index 733f35c..862a33c 100644 +--- a/exec/priv.h ++++ b/exec/priv.h +@@ -1,5 +1,6 @@ + /* GNU Hurd standard exec server, private declarations. +- Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc. ++ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2004, ++ 2010 Free Software Foundation, Inc. + Written by Roland McGrath. + + This file is part of the GNU Hurd. +@@ -135,6 +136,7 @@ void check_hashbang (struct execdata *e, + file_t file, + task_t oldtask, + int flags, ++ char *filename, + char *argv, u_int argvlen, boolean_t argv_copy, + char *envp, u_int envplen, boolean_t envp_copy, + mach_port_t *dtable, u_int dtablesize, +diff --git a/hurd/exec.defs b/hurd/exec.defs +index 2888fb1..ae4143b 100644 +--- a/hurd/exec.defs ++++ b/hurd/exec.defs +@@ -1,5 +1,6 @@ + /* Interface definitions for the exec servers. +- Copyright (C) 1991,92,93,94,95,2001 Free Software Foundation, Inc. ++ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010 ++ Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + +@@ -29,6 +30,7 @@ EXEC_IMPORTS + + INTR_INTERFACE + ++/* Deprecated: use exec_exec_file_name instead. */ + routine exec_exec ( + execserver: file_t; + file: mach_port_send_t; +@@ -42,7 +44,20 @@ routine exec_exec ( + deallocnames: mach_port_name_array_t; + destroynames: mach_port_name_array_t); + +-skip; /* obsolete exec_startup */ ++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); ++ + + /* This call is made by the bootstrapping filesystem to give the + execserver its auth handle. */ +diff --git a/hurd/fs.defs b/hurd/fs.defs +index 2452682..c68fde0 100644 --- a/hurd/fs.defs +++ b/hurd/fs.defs @@ -1,5 +1,6 @@ @@ -163,6 +447,30 @@ Change comments and documentation. written directly. */ routine file_check_access ( file: file_t; +@@ -371,3 +373,21 @@ routine file_get_source ( + file: file_t; + RPT + out source: string_t); ++ ++/* 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); +diff --git a/hurd/hurd_types.h b/hurd/hurd_types.h +index d569454..bb66e2d 100644 --- a/hurd/hurd_types.h +++ b/hurd/hurd_types.h @@ -1,5 +1,6 @@ @@ -173,7 +481,7 @@ Change comments and documentation. This file is part of the GNU Hurd. -@@ -78,7 +79,7 @@ typedef struct timespec timespec_t; +@@ -79,7 +80,7 @@ typedef struct timespec timespec_t; /* Many such parameters and flags are also defined in various libc headers. */ @@ -182,7 +490,7 @@ Change comments and documentation. #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. */ -@@ -344,7 +345,7 @@ typedef int *procinfo_t; +@@ -345,7 +346,7 @@ typedef int *procinfo_t; #define FSTYPE_MEMFS 0x00000019 /* In-core filesystem */ #define FSTYPE_ISO9660 0x0000001a /* ISO9660 */ @@ -191,7 +499,7 @@ Change comments and documentation. enum { INIT_PORT_CWDIR, -@@ -358,7 +359,7 @@ enum +@@ -359,7 +360,7 @@ enum INIT_PORT_MAX }; @@ -200,28 +508,21 @@ Change comments and documentation. enum { INIT_UMASK, +diff --git a/init/init.c b/init/init.c +index b7b40bd..3fd4fe5 100644 --- a/init/init.c +++ b/init/init.c -@@ -1,7 +1,7 @@ +@@ -1,7 +1,8 @@ /* 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 +@@ -376,13 +377,26 @@ run (const char *server, mach_port_t *ports, task_t *task) printf ("Pausing for %s\n", prog); getchar (); } @@ -232,7 +533,6 @@ Change comments and documentation. - 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. */ @@ -246,7 +546,6 @@ Change comments and documentation. + /* 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, @@ -257,7 +556,7 @@ Change comments and documentation. if (!err) break; -@@ -469,14 +487,27 @@ run_for_real (char *filename, char *args +@@ -469,14 +483,25 @@ run_for_real (char *filename, char *args, int arglen, mach_port_t ctty, ++progname; else progname = filename; @@ -269,7 +568,6 @@ Change comments and documentation. - 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, @@ -280,7 +578,6 @@ Change comments and documentation. + 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, @@ -293,7 +590,7 @@ Change comments and documentation. mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]); mach_port_deallocate (mach_task_self (), task); if (ctty != MACH_PORT_NULL) -@@ -1068,13 +1099,26 @@ start_child (const char *prog, char **pr +@@ -1068,14 +1093,25 @@ start_child (const char *prog, char **progargs) getchar (); } @@ -304,7 +601,6 @@ Change comments and documentation. - 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, @@ -315,7 +611,6 @@ Change comments and documentation. + 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, @@ -323,13 +618,16 @@ Change comments and documentation. + 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); + if (err) +diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c +index 9dd2751..4c79738 100644 --- a/libdiskfs/boot-start.c +++ b/libdiskfs/boot-start.c -@@ -208,7 +208,7 @@ diskfs_start_bootstrap () +@@ -196,7 +196,7 @@ diskfs_start_bootstrap () diskfs_exec_ctl = MACH_PORT_NULL; /* Not used after this. */ } @@ -338,6 +636,8 @@ Change comments and documentation. _hurd_port_set (&_diskfs_exec_portcell, diskfs_exec); if (_diskfs_boot_command) +diff --git a/libdiskfs/file-exec.c b/libdiskfs/file-exec.c +index 9572dbe..671a860 100644 --- a/libdiskfs/file-exec.c +++ b/libdiskfs/file-exec.c @@ -1,5 +1,6 @@ @@ -349,22 +649,7 @@ Change comments and documentation. 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, +@@ -47,6 +48,39 @@ diskfs_S_file_exec (struct protid *cred, mach_port_t *destroynames, size_t destroynameslen) { @@ -404,7 +689,7 @@ Change comments and documentation. struct node *np; uid_t uid; gid_t gid; -@@ -136,9 +174,9 @@ diskfs_S_file_exec (struct protid *cred, +@@ -136,9 +170,9 @@ diskfs_S_file_exec (struct protid *cred, if (! err) /* Make a new peropen for the exec server to access the file, since any @@ -417,7 +702,7 @@ Change comments and documentation. 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, +@@ -159,14 +193,29 @@ diskfs_S_file_exec (struct protid *cred, do { right = ports_get_send_right (newpi); @@ -429,7 +714,6 @@ Change comments and documentation. - 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, @@ -443,7 +727,6 @@ Change comments and documentation. + /* 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, @@ -457,6 +740,8 @@ Change comments and documentation. 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 64a20be..e519c6f 100644 --- a/libfshelp/start-translator-long.c +++ b/libfshelp/start-translator-long.c @@ -1,5 +1,6 @@ @@ -467,21 +752,9 @@ Change comments and documentation. 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]; +@@ -273,11 +274,19 @@ fshelp_start_translator_long (fshelp_open_fn_t underlying_open_fn, 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, @@ -495,7 +768,6 @@ Change comments and documentation. + 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, @@ -505,6 +777,8 @@ Change comments and documentation. ports_moved = 1; if (ports_type == MACH_MSG_TYPE_COPY_SEND) +diff --git a/libnetfs/file-exec.c b/libnetfs/file-exec.c +index 638f0ae..c1010f6 100644 --- a/libnetfs/file-exec.c +++ b/libnetfs/file-exec.c @@ -1,5 +1,6 @@ @@ -515,22 +789,7 @@ Change comments and documentation. 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, +@@ -49,6 +50,39 @@ netfs_S_file_exec (struct protid *cred, mach_port_t *destroynames, size_t destroynameslen) { @@ -570,7 +829,7 @@ Change comments and documentation. struct node *np; error_t err; uid_t uid; -@@ -133,14 +171,31 @@ netfs_S_file_exec (struct protid *cred, +@@ -133,14 +167,29 @@ netfs_S_file_exec (struct protid *cred, if (newpi) { right = ports_get_send_right (newpi); @@ -582,7 +841,6 @@ Change comments and documentation. - 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, @@ -596,7 +854,6 @@ Change comments and documentation. + /* 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, @@ -610,6 +867,8 @@ Change comments and documentation. mach_port_deallocate (mach_task_self (), right); ports_port_deref (newpi); } +diff --git a/libtrivfs/file-exec.c b/libtrivfs/file-exec.c +index a3ab048..f626955 100644 --- a/libtrivfs/file-exec.c +++ b/libtrivfs/file-exec.c @@ -1,5 +1,5 @@ @@ -619,7 +878,7 @@ Change comments and documentation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as -@@ -40,3 +40,28 @@ trivfs_S_file_exec (trivfs_protid_t exec +@@ -40,3 +40,28 @@ trivfs_S_file_exec (trivfs_protid_t exec_file, { return EOPNOTSUPP; } @@ -648,6 +907,8 @@ Change comments and documentation. +{ + return EOPNOTSUPP; +} +diff --git a/trans/fakeroot.c b/trans/fakeroot.c +index c519180..e439659 100644 --- a/trans/fakeroot.c +++ b/trans/fakeroot.c @@ -1,5 +1,5 @@ @@ -657,17 +918,7 @@ Change comments and documentation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as -@@ -28,6 +28,9 @@ - #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> - -@@ -778,6 +781,39 @@ netfs_S_file_exec (struct protid *user, +@@ -784,6 +784,39 @@ netfs_S_file_exec (struct protid *user, mach_port_t *destroynames, size_t destroynameslen) { @@ -707,11 +958,8 @@ Change comments and documentation. error_t err; file_t file; -@@ -794,13 +830,29 @@ netfs_S_file_exec (struct protid *user, - - if (!err) +@@ -802,11 +835,25 @@ netfs_S_file_exec (struct protid *user, { -+#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 (user->po->np->nn->file, task, flags, argv, argvlen, @@ -732,7 +980,6 @@ Change comments and documentation. + /* 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, @@ -742,22 +989,41 @@ Change comments and documentation. mach_port_deallocate (mach_task_self (), file); } -@@ -930,6 +982,7 @@ netfs_demuxer (mach_msg_header_t *inp, - { - mig_routine_t netfs_io_server_routine (mach_msg_header_t *); - mig_routine_t netfs_fs_server_routine (mach_msg_header_t *); -+ mig_routine_t netfs_fs_experimental_server_routine (mach_msg_header_t *); - mig_routine_t ports_notify_server_routine (mach_msg_header_t *); - mig_routine_t netfs_fsys_server_routine (mach_msg_header_t *); - mig_routine_t ports_interrupt_server_routine (mach_msg_header_t *); -@@ -937,6 +990,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/fakeauth.c b/utils/fakeauth.c +index 590a421..851772c 100644 +--- a/utils/fakeauth.c ++++ b/utils/fakeauth.c +@@ -1,5 +1,5 @@ + /* fakeauth -- proxy auth server to lie to users about what their IDs are +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2010 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as +@@ -397,7 +397,7 @@ believe it has restricted them to different identities or no identity at all.\ + /* We cannot use fork because it doesn't do the right thing with our send + rights that point to our own receive rights, i.e. the new auth port. + Since posix_spawn might be implemented with fork (prior to glibc 2.3), +- we cannot use that simple interface either. We use _hurd_exec ++ we cannot use that simple interface either. We use _hurd_exec_file_name + directly to effect what posix_spawn does in the simple case. */ + { + task_t newtask; +@@ -422,7 +422,12 @@ believe it has restricted them to different identities or no identity at all.\ + if (err) + error (3, err, "proc_child"); + ++#ifdef HAVE__HURD_EXEC_FILE_NAME ++ err = _hurd_exec_file_name (newtask, execfile, argv[argi], ++ &argv[argi], environ); ++#else + err = _hurd_exec (newtask, execfile, &argv[argi], environ); ++#endif + mach_port_deallocate (mach_task_self (), newtask); + mach_port_deallocate (mach_task_self (), execfile); + if (err) +diff --git a/utils/login.c b/utils/login.c +index cad3b1e..7065a9e 100644 --- a/utils/login.c +++ b/utils/login.c @@ -1,6 +1,7 @@ @@ -769,17 +1035,7 @@ Change comments and documentation. 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[]) +@@ -882,12 +883,20 @@ main(int argc, char *argv[]) } } @@ -789,7 +1045,6 @@ Change comments and documentation. - 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, @@ -798,7 +1053,6 @@ Change comments and documentation. + 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, @@ -808,178 +1062,61 @@ Change comments and documentation. if (err) error(5, err, "%s", shell); ---- /dev/null -+++ b/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 +diff --git a/utils/rpctrace.c b/utils/rpctrace.c +index d7ee203..17acb8d 100644 +--- a/utils/rpctrace.c ++++ b/utils/rpctrace.c +@@ -1,7 +1,7 @@ + /* Trace RPCs sent to selected ports + +- Copyright (C) 1998, 1999, 2001, 2002, 2003, 2005, 2006, 2009, 2011, +- 2013 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2001, 2002, 2003, 2005, 2006, 2009, 2010, ++ 2011, 2013 Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + +@@ -1734,7 +1734,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 -+ -+/* 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); ---- a/libdiskfs/Makefile -+++ b/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 - MIGCOMSFLAGS = -prefix diskfs_ ---- 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)) || ---- a/libnetfs/Makefile -+++ b/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_ ---- 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)) || ---- a/libtrivfs/Makefile -+++ b/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 ---- a/libtrivfs/demuxer.c -+++ b/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))) ---- a/configure.ac -+++ b/configure.ac -@@ -161,7 +161,7 @@ fi - AC_SUBST(VERSIONING) + if (err) + error (2, err, "cannot exec `%s'", argv[0]); - # Check if libc contains getgrouplist and/or uselocale. --AC_CHECK_FUNCS(getgrouplist uselocale) -+AC_CHECK_FUNCS(getgrouplist uselocale file_exec_file_name exec_exec_file_name) +diff --git a/utils/shd.c b/utils/shd.c +index a1a4b26..855284f 100644 +--- a/utils/shd.c ++++ b/utils/shd.c +@@ -1,5 +1,5 @@ + /* +- Copyright (C) 1994,95,99,2002 Free Software Foundation ++ Copyright (C) 1994, 1995, 1999, 2002, 2010 Free Software Foundation + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as +@@ -159,15 +159,18 @@ run (char **argv, int fd0, int fd1) + movefd (fd1, 1, &save1)) + return -1; - # From glibc HEAD, 2007-11-07. ++#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/exec_filename_exec.patch b/debian/patches/exec_filename_exec.patch deleted file mode 100644 index 40452608..00000000 --- a/debian/patches/exec_filename_exec.patch +++ /dev/null @@ -1,317 +0,0 @@ -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(-) - ---- a/doc/hurd.texi -+++ b/doc/hurd.texi -@@ -102,7 +102,7 @@ This file documents the GNU Hurd kernel - documentation was last updated for version @value{VERSION} of the Hurd. - - Copyright @copyright{} 1994, 1996, 1998, 1999, 2000, 2001, 2002, 2003, --2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. -+2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. - - @quotation - Permission is granted to make and distribute verbatim copies of -@@ -2766,14 +2766,14 @@ If the setuid/setgid transformation adds - 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 ---- a/exec/exec.c -+++ b/exec/exec.c -@@ -1,6 +1,6 @@ - /* GNU Hurd standard exec server. -- Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04 -- Free Software Foundation, Inc. -+ Copyright (C) 1992 ,1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+ 2002, 2004, 2010 Free Software Foundation, Inc. - Written by Roland McGrath. - - Can exec ELF format directly. -@@ -738,6 +738,7 @@ static error_t - do_exec (file_t file, - task_t oldtask, - int flags, -+ char *filename, - char *argv, mach_msg_type_number_t argvlen, boolean_t argv_copy, - char *envp, mach_msg_type_number_t envplen, boolean_t envp_copy, - mach_port_t *dtable, mach_msg_type_number_t dtablesize, -@@ -796,7 +797,7 @@ do_exec (file_t file, - { - /* Check for a #! executable file. */ - check_hashbang (&e, -- file, oldtask, flags, -+ file, oldtask, flags, filename, - argv, argvlen, argv_copy, - envp, envplen, envp_copy, - dtable, dtablesize, dtable_copy, -@@ -1356,6 +1357,7 @@ do_exec (file_t file, - return e.error; - } - -+/* Deprecated. */ - kern_return_t - S_exec_exec (struct trivfs_protid *protid, - file_t file, -@@ -1372,13 +1374,51 @@ S_exec_exec (struct trivfs_protid *proti - 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, ---- a/exec/hashexec.c -+++ b/exec/hashexec.c -@@ -1,5 +1,6 @@ - /* GNU Hurd standard exec server, #! script execution support. -- Copyright (C) 1995,96,97,98,99,2000,02 Free Software Foundation, Inc. -+ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2010 -+ Free Software Foundation, Inc. - Written by Roland McGrath. - - This file is part of the GNU Hurd. -@@ -35,6 +36,7 @@ check_hashbang (struct execdata *e, - file_t file, - task_t oldtask, - int flags, -+ char *file_name_exec, - char *argv, u_int argvlen, boolean_t argv_copy, - char *envp, u_int envplen, boolean_t envp_copy, - mach_port_t *dtable, u_int dtablesize, boolean_t dtable_copy, -@@ -225,10 +227,12 @@ check_hashbang (struct execdata *e, - file_name = NULL; - else if (! (flags & EXEC_SECURE)) - { -- /* Try to figure out the file's name. We guess that if ARGV[0] -- contains a slash, it might be the name of the file; and that -- if it contains no slash, looking for files named by ARGV[0] in -- the `PATH' environment variable might find it. */ -+ /* Try to figure out the file's name. If FILE_NAME_EXEC -+ is not NULL, then it's the file's name. Otherwise we -+ guess that if ARGV[0] contains a slash, it might be -+ the name of the file; and that if it contains no slash, -+ looking for files named by ARGV[0] in the `PATH' -+ environment variable might find it. */ - - error_t error; - char *name; -@@ -278,7 +282,9 @@ check_hashbang (struct execdata *e, - else - name = argv; - -- if (strchr (name, '/') != NULL) -+ if (file_name_exec && file_name_exec[0] != '\0') -+ error = lookup (name = file_name_exec, 0, &name_file); -+ else if (strchr (name, '/') != NULL) - error = lookup (name, 0, &name_file); - else if ((error = hurd_catch_signal - (sigmask (SIGBUS) | sigmask (SIGSEGV), ---- a/exec/priv.h -+++ b/exec/priv.h -@@ -1,5 +1,6 @@ - /* GNU Hurd standard exec server, private declarations. -- Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc. -+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2004, -+ 2010 Free Software Foundation, Inc. - Written by Roland McGrath. - - This file is part of the GNU Hurd. -@@ -32,6 +33,7 @@ the Free Software Foundation, 675 Mass A - #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 @@ void check_hashbang (struct execdata *e, - file_t file, - task_t oldtask, - int flags, -+ char *filename, - char *argv, u_int argvlen, boolean_t argv_copy, - char *envp, u_int envplen, boolean_t envp_copy, - mach_port_t *dtable, u_int dtablesize, ---- a/hurd/exec.defs -+++ b/hurd/exec.defs -@@ -1,5 +1,6 @@ - /* Interface definitions for the exec servers. -- Copyright (C) 1991,92,93,94,95,2001 Free Software Foundation, Inc. -+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010 -+ Free Software Foundation, Inc. - - This file is part of the GNU Hurd. - -@@ -29,6 +30,7 @@ EXEC_IMPORTS - - INTR_INTERFACE - -+/* Deprecated: use exec_exec_file_name instead. */ - routine exec_exec ( - execserver: file_t; - file: mach_port_send_t; ---- /dev/null -+++ b/hurd/exec_experimental.defs -@@ -0,0 +1,46 @@ -+/* Interface definitions for the exec servers. -+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010, 2012 -+ Free Software Foundation, Inc. -+ -+This file is part of the GNU Hurd. -+ -+The GNU Hurd is free software; you can redistribute it and/or modify -+it under the terms of the GNU General Public License as published by -+the Free Software Foundation; either version 2, or (at your option) -+any later version. -+ -+The GNU Hurd is distributed in the hope that it will be useful, -+but WITHOUT ANY WARRANTY; without even the implied warranty of -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+GNU General Public License for more details. -+ -+You should have received a copy of the GNU General Public License -+along with the GNU Hurd; see the file COPYING. If not, write to -+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -+ -+/* Written by Michael I. Bushnell and Roland McGrath. */ -+ -+subsystem exec_experimental 434242; -+ -+#include <hurd/hurd_types.defs> -+ -+#ifdef EXEC_IMPORTS -+EXEC_IMPORTS -+#endif -+ -+INTR_INTERFACE -+ -+routine exec_exec_file_name ( -+ execserver: file_t; -+ file: mach_port_send_t; -+ oldtask: task_t; -+ flags: int; -+ filename: string_t; -+ argv: data_t SCP; -+ envp: data_t SCP; -+ dtable: portarray_t SCP; -+ portarray: portarray_t SCP; -+ intarray: intarray_t SCP; -+ deallocnames: mach_port_name_array_t; -+ destroynames: mach_port_name_array_t); -+ ---- a/exec/Makefile -+++ b/exec/Makefile -@@ -22,7 +22,7 @@ makemode := server - - SRCS = exec.c main.c hashexec.c hostarch.c - OBJS = main.o hostarch.o exec.o hashexec.o \ -- execServer.o exec_startupServer.o -+ execServer.o exec_startupServer.o exec_experimentalServer.o - - target = exec - #targets = exec exec.static -@@ -30,7 +30,8 @@ HURDLIBS = trivfs fshelp iohelp ports ih - OTHERLIBS = -lpthread - - exec-MIGSFLAGS = -imacros $(srcdir)/execmutations.h - exec_startup-MIGSFLAGS = -imacros $(srcdir)/execmutations.h -+exec_experimental-MIGSFLAGS = -imacros $(srcdir)/execmutations.h - - include ../Makeconf - ---- a/exec/main.c -+++ b/exec/main.c -@@ -47,6 +47,7 @@ char **save_argv; - - - #include "exec_S.h" -+#include "exec_experimental_S.h" - #include "exec_startup_S.h" - - static int -@@ -54,6 +55,7 @@ exec_demuxer (mach_msg_header_t *inp, ma - { - 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 deleted file mode 100644 index 71836d9b..00000000 --- a/debian/patches/exec_filename_fix.patch +++ /dev/null @@ -1,144 +0,0 @@ -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_use.patch b/debian/patches/exec_filename_use.patch deleted file mode 100644 index c806aea2..00000000 --- a/debian/patches/exec_filename_use.patch +++ /dev/null @@ -1,113 +0,0 @@ -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 2012-06-05 00:38:18.000000000 +0000 -+++ hurd-debian/configure.ac 2012-06-05 00:38:18.000000000 +0000 -@@ -160,8 +160,8 @@ - fi - AC_SUBST(VERSIONING) - --# Check if libc contains getgrouplist and/or uselocale. --AC_CHECK_FUNCS(getgrouplist uselocale file_exec_file_name exec_exec_file_name) -+# Check if libc contains these functions. -+AC_CHECK_FUNCS(getgrouplist uselocale 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 2012-06-05 00:35:35.000000000 +0000 -+++ hurd-debian/utils/fakeauth.c 2012-06-05 01:48:00.000000000 +0000 -@@ -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 -@@ -388,7 +388,7 @@ - /* 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; -@@ -413,7 +413,12 @@ - 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 2012-06-05 00:35:35.000000000 +0000 -+++ hurd-debian/utils/rpctrace.c 2012-06-05 01:48:00.000000000 +0000 -@@ -1069,7 +1069,11 @@ - /* 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 2012-06-05 00:35:35.000000000 +0000 -+++ hurd-debian/utils/shd.c 2012-06-05 01:48:00.000000000 +0000 -@@ -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 @@ - 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/external.patch b/debian/patches/external.patch index a594eb4e..185f0ebe 100644 --- a/debian/patches/external.patch +++ b/debian/patches/external.patch @@ -23,17 +23,6 @@ Index: hurd-debian/Makefile ifeq ($(HAVE_SUN_RPC),yes) prog-subdirs += nfs nfsd ---- hurd-debian.orig/Makeconf -+++ hurd-debian/Makeconf -@@ -548,7 +548,7 @@ vpath %.defs $(top_srcdir)/hurd - # These we want to find in the libc include directory... - mach_defs_names = bootstrap exc mach mach4 \ - mach_host mach_port mach_timer_reply memory_object \ -- memory_object_default notify -+ memory_object_default notify experimental - device_defs_names = dev_forward device device_reply device_request - - mach_defs = $(addsuffix .defs,$(mach_defs_names)) diff --git a/configure.ac b/configure.ac index 05b959b..68ec159 100644 --- a/configure.ac diff --git a/debian/patches/series b/debian/patches/series index bef18f73..587ec3bd 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,4 @@ +exec_filename.patch diskfs_no_inherit_dir_group.patch init_try_runsystem.gnu.patch makedev.diff @@ -34,10 +35,6 @@ libdde_pr_cont.patch libdde_rx_queue.patch libdde_rcu.patch libmachdev.patch -exec_filename_exec.patch -exec_filename_fs.patch -exec_filename_use.patch -exec_filename_fix.patch mount.patch proc_set_init_task.patch newRPC.patch diff --git a/debian/patches/xxx-fix-build.patch b/debian/patches/xxx-fix-build.patch index c68e268d..0e0e8871 100644 --- a/debian/patches/xxx-fix-build.patch +++ b/debian/patches/xxx-fix-build.patch @@ -6,8 +6,8 @@ index 3ef742d..a9ae914 100644 SRCS = exec.c main.c hashexec.c hostarch.c OBJS = main.o hostarch.o exec.o hashexec.o \ -- execServer.o exec_startupServer.o exec_experimentalServer.o -+ execServer.o exec_startupServer.o exec_experimentalServer.o gnumachUser.o +- execServer.o exec_startupServer.o ++ execServer.o exec_startupServer.o gnumachUser.o target = exec #targets = exec exec.static |