*: introduce and use xvfork()
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 1 Jul 2008 10:40:41 +0000 (10:40 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 1 Jul 2008 10:40:41 +0000 (10:40 -0000)
function                                             old     new   delta
time_main                                           1052    1285    +233
crontab_main                                         623     856    +233
ifupdown_main                                       2202    2403    +201
xvfork                                                 -      20     +20
passwd_main                                         1049    1053      +4
grave                                               1068    1066      -2
script_main                                          935     921     -14
vfork_or_die                                          20       -     -20
vfork_compressor                                     206     175     -31
open_as_user                                         109       -    -109
popen2                                               218       -    -218
edit_file                                            910     690    -220
run_command                                          268       -    -268
------------------------------------------------------------------------------
(add/remove: 1/4 grow/shrink: 4/4 up/down: 691/-882)         Total: -191 bytes

12 files changed:
archival/libunarchive/open_transformer.c
archival/tar.c
debianutils/start_stop_daemon.c
include/libbb.h
libbb/Kbuild
libbb/vfork_daemon_rexec.c
miscutils/crontab.c
miscutils/time.c
networking/ifupdown.c
networking/sendmail.c
shell/hush.c
util-linux/script.c

index a6bc623215182320a82153f3f6cb5d4f798a3b2c..16ca6a59c2a5092cf2d7afa41ed350da42bcabc8 100644 (file)
@@ -25,9 +25,7 @@ int FAST_FUNC open_transformer(int src_fd,
        if (pid == -1)
                bb_perror_msg_and_die("can't fork");
 #else
-       pid = vfork();
-       if (pid == -1)
-               bb_perror_msg_and_die("can't vfork");
+       pid = xvfork();
 #endif
 
        if (pid == 0) {
index 526edb69d59eed7cb80b8cd9094fb99e67f3d3f1..17ac6c55a124be2319259ad199a2d3619f1f1f6e 100644 (file)
@@ -536,9 +536,7 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
        (void) &zip_exec;
 #endif
 
-       gzipPid = vfork();
-       if (gzipPid < 0)
-               bb_perror_msg_and_die("can't vfork");
+       gzipPid = xvfork();
 
        if (gzipPid == 0) {
                /* child */
index 459fb77e0fe98556a7c461aab2dc751ea8b241f7..f10572ddf58c27680be95b26cfc003941b9fca3c 100644 (file)
@@ -404,9 +404,7 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
                /* DAEMON_DEVNULL_STDIO is superfluous -
                 * it's always done by bb_daemonize() */
 #else
-               pid_t pid = vfork();
-               if (pid < 0) /* error */
-                       bb_perror_msg_and_die("vfork");
+               pid_t pid = xvfork();
                if (pid != 0) {
                        /* parent */
                        /* why _exit? the child may have changed the stack,
index 54601f87b4b09d24eed78784d1e56b1160b675d5..33e465cf4d53b5b7ede05cd068d2f7f90ad378cf 100644 (file)
@@ -719,6 +719,8 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
 #define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
 #endif
 
+pid_t xvfork(void) FAST_FUNC;
+
 /* NOMMU friendy fork+exec */
 pid_t spawn(char **argv) FAST_FUNC;
 pid_t xspawn(char **argv) FAST_FUNC;
index 5cbecd537b1ab8b19b5a7aa0006371c8f1c9bce5..5ace87cad8a5f246182dec54a558d5b6064c19ff 100644 (file)
@@ -109,6 +109,7 @@ lib-y += xfunc_die.o
 lib-y += xgetcwd.o
 lib-y += xgethostbyname.o
 lib-y += xreadlink.o
+lib-y += xvfork.o
 
 # conditionally compiled objects:
 lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o
index 37d4c274e9fa420a2225af5dbea2d44570e257d1..9baa813a118a2293d9b2a8e03110346168f67bf8 100644 (file)
@@ -226,9 +226,7 @@ void FAST_FUNC forkexit_or_rexec(char **argv)
        if (re_execed)
                return;
 
-       pid = vfork();
-       if (pid < 0) /* wtf? */
-               bb_perror_msg_and_die("vfork");
+       pid = xvfork();
        if (pid) /* parent */
                exit(EXIT_SUCCESS);
        /* child - re-exec ourself */
index dc3179dac20add33b8464041321d9433e8e7a246..4bba9fb44e9245dc3b47d356650f676c6235d542 100644 (file)
@@ -38,10 +38,8 @@ static void change_user(const struct passwd *pas)
 static void edit_file(const struct passwd *pas, const char *file)
 {
        const char *ptr;
-       int pid = vfork();
+       int pid = xvfork();
 
-       if (pid < 0) /* failure */
-               bb_perror_msg_and_die("vfork");
        if (pid) { /* parent */
                wait4pid(pid);
                return;
@@ -65,9 +63,7 @@ static int open_as_user(const struct passwd *pas, const char *file)
        pid_t pid;
        char c;
 
-       pid = vfork();
-       if (pid < 0) /* ERROR */
-               bb_perror_msg_and_die("vfork");
+       pid = xvfork();
        if (pid) { /* PARENT */
                if (wait4pid(pid) == 0) {
                        /* exitcode 0: child says it can read */
index a6d158c53dc25e14397616a802b46c058a12c6fd..104548c2369bc2042239fb248c52f365a9f78a9c 100644 (file)
@@ -372,9 +372,7 @@ static void run_command(char *const *cmd, resource_t *resp)
        void (*quit_signal)(int);
 
        resp->elapsed_ms = monotonic_us() / 1000;
-       pid = vfork();          /* Run CMD as child process.  */
-       if (pid < 0)
-               bb_error_msg_and_die("cannot fork");
+       pid = xvfork();         /* Run CMD as child process.  */
        if (pid == 0) { /* If child.  */
                /* Don't cast execvp arguments; that causes errors on some systems,
                   versus merely warnings if the cast is left off.  */
index c12391863acef2ec95e998c56c32b2715a925433..8caff3f4d80f555eb7267e3416505b6e5e14e505 100644 (file)
@@ -1008,12 +1008,9 @@ static int popen2(FILE **in, FILE **out, char *command, char *param)
        xpiped_pair(outfd);
 
        fflush(NULL);
-       pid = vfork();
+       pid = xvfork();
 
-       switch (pid) {
-       case -1:  /* failure */
-               bb_perror_msg_and_die("vfork");
-       case 0:  /* child */
+       if (pid == 0) { /* child */
                /* NB: close _first_, then move fds! */
                close(infd.wr);
                close(outfd.rd);
index 1c23ca290f758c9733136a2317443e6365f7a1ee..c195cc021b732bdee0f60aefd35edd12778c0814 100644 (file)
@@ -120,15 +120,6 @@ static void signal_handler(int signo)
 #undef err
 }
 
-/* libbb candidate */
-static pid_t vfork_or_die(void)
-{
-       pid_t pid = vfork();
-       if (pid < 0)
-               bb_perror_msg_and_die("vfork");
-       return pid;
-}
-
 static void launch_helper(const char **argv)
 {
        // setup vanilla unidirectional pipes interchange
@@ -137,7 +128,7 @@ static void launch_helper(const char **argv)
 
        xpipe(pipes);
        xpipe(pipes+2);
-       helper_pid = vfork_or_die();
+       helper_pid = xvfork();
        idx = (!helper_pid) * 2;
        xdup2(pipes[idx], STDIN_FILENO);
        xdup2(pipes[3-idx], STDOUT_FILENO);
index 72186f9704bea3566e14aef7a89b76421d6ade70..59d8f3f990135745c1fd11529a76276cae1c65ac 100644 (file)
@@ -3096,9 +3096,11 @@ static FILE *generate_stream_from_list(struct pipe *head)
  * huge=`cat TESTFILE` # will block here forever
  * echo OK
  */
-       pid = BB_MMU ? fork() : vfork();
+       pid = BB_MMU ? fork() : xvfork();
+#if BB_MMU
        if (pid < 0)
-               bb_perror_msg_and_die(BB_MMU ? "fork" : "vfork");
+               bb_perror_msg_and_die("fork");
+#endif
        if (pid == 0) { /* child */
                if (ENABLE_HUSH_JOB)
                        die_sleep = 0; /* let nofork's xfuncs die */
index e70294e6cbd229e17952219f5ad92564c9882cae..a6c1ab88a359a97314941d6727e1a91279253018 100644 (file)
@@ -87,10 +87,7 @@ int script_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        /* TODO: SIGWINCH? pass window size changes down to slave? */
 
-       child_pid = vfork();
-       if (child_pid < 0) {
-               bb_perror_msg_and_die("vfork");
-       }
+       child_pid = xvfork();
 
        if (child_pid) {
                /* parent */