diff options
author | Denis Vlasenko | 2009-03-20 22:17:13 +0000 |
---|---|---|
committer | Denis Vlasenko | 2009-03-20 22:17:13 +0000 |
commit | 83518d18a34a3ddfcaac1739930d8469f5bc2442 (patch) | |
tree | 2af665365a69f2689288cc13bb65efbb59e7d520 /libbb | |
parent | 0b28103cc774eb1ee62362cf61d52c32d44ec2cf (diff) | |
download | busybox-83518d18a34a3ddfcaac1739930d8469f5bc2442.zip busybox-83518d18a34a3ddfcaac1739930d8469f5bc2442.tar.gz |
Compatibility fixes:
grep: support -z
find: support --mindepth
together +45 bytes
cpio: support -p (configurable, +230 bytes)
libbb: tweaks for cpio
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/vfork_daemon_rexec.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 50dc3af..f64239a 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c @@ -251,35 +251,33 @@ void FAST_FUNC re_exec(char **argv) bb_perror_msg_and_die("exec %s", bb_busybox_exec_path); } -void FAST_FUNC forkexit_or_rexec(char **argv) +pid_t FAST_FUNC fork_or_rexec(char **argv) { pid_t pid; /* Maybe we are already re-execed and come here again? */ if (re_execed) - return; + return 0; /* child */ pid = vfork(); if (pid < 0) /* wtf? */ bb_perror_msg_and_die("vfork"); if (pid) /* parent */ - exit(EXIT_SUCCESS); + return pid; /* child - re-exec ourself */ re_exec(argv); } #else /* Dance around (void)...*/ -#undef forkexit_or_rexec -void FAST_FUNC forkexit_or_rexec(void) +#undef fork_or_rexec +pid_t FAST_FUNC fork_or_rexec(void) { pid_t pid; pid = fork(); if (pid < 0) /* wtf? */ bb_perror_msg_and_die("fork"); - if (pid) /* parent */ - exit(EXIT_SUCCESS); - /* child */ + return pid; } -#define forkexit_or_rexec(argv) forkexit_or_rexec() +#define fork_or_rexec(argv) fork_or_rexec() #endif /* Due to a #define in libbb.h on MMU systems we actually have 1 argument - @@ -310,7 +308,8 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv) fd = dup(fd); /* have 0,1,2 open at least to /dev/null */ if (!(flags & DAEMON_ONLY_SANITIZE)) { - forkexit_or_rexec(argv); + if (fork_or_rexec(argv)) + exit(EXIT_SUCCESS); /* parent */ /* if daemonizing, make sure we detach from stdio & ctty */ setsid(); dup2(fd, 0); |