diff options
author | Justus Winter <justus@gnupg.org> | 2016-02-22 19:18:05 +0100 |
---|---|---|
committer | Justus Winter <justus@gnupg.org> | 2016-02-22 19:18:05 +0100 |
commit | 234568d0c683d35362a17dd44b76472c405fbd86 (patch) | |
tree | ab002e23bdf14c688c8882b813e2161f6d1f9b5b | |
parent | ff2557c4eca55f46a3fb2b9c88147963d3f8b4a3 (diff) |
utils/mount: start translators with stderr closed
Apparently some users of 'mount' do not cope with any output being
generated from the spawned translator.
* utils/mount.c (do_mount): Start translators with stderr closed.
-rw-r--r-- | utils/mount.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/utils/mount.c b/utils/mount.c index c5736ba9..5fa35bc4 100644 --- a/utils/mount.c +++ b/utils/mount.c @@ -420,9 +420,36 @@ do_mount (struct fs *fs, int remount) } explain ("settrans -a"); - err = fshelp_start_translator (open_node, NULL, fsopts, - fsopts, fsopts_len, timeout, - &active_control); + { + mach_port_t ports[INIT_PORT_MAX]; + mach_port_t fds[STDERR_FILENO + 1]; + int ints[INIT_INT_MAX]; + int i; + + for (i = 0; i < INIT_PORT_MAX; i++) + ports[i] = MACH_PORT_NULL; + for (i = 0; i < STDERR_FILENO + 1; i++) + fds[i] = MACH_PORT_NULL; + memset (ints, 0, INIT_INT_MAX * sizeof(int)); + + ports[INIT_PORT_CWDIR] = getcwdir (); + ports[INIT_PORT_CRDIR] = getcrdir (); + ports[INIT_PORT_AUTH] = getauth (); + + err = fshelp_start_translator_long (open_node, NULL, + fsopts, fsopts, fsopts_len, + fds, MACH_MSG_TYPE_COPY_SEND, + STDERR_FILENO + 1, + ports, MACH_MSG_TYPE_COPY_SEND, + INIT_PORT_MAX, + ints, INIT_INT_MAX, + geteuid (), + timeout, &active_control); + for (i = 0; i < INIT_PORT_MAX; i++) + mach_port_deallocate (mach_task_self (), ports[i]); + for (i = 0; i <= STDERR_FILENO; i++) + mach_port_deallocate (mach_task_self (), fds[i]); + } /* If ERR is due to a problem opening the translated node, we print that name, otherwise, the name of the translator. */ if (open_err) |