*: introduce and use xfork()
No binary (build failed)
—
(log yok)
| @@ -20,14 +20,7 @@ int FAST_FUNC open_transformer(int src_fd, | |
| xpiped_pair(fd_pipe); | |
| - | #if BB_MMU |
| - | pid = fork(); |
| - | if (pid == -1) |
| - | bb_perror_msg_and_die("can't fork"); |
| - | #else |
| - | pid = xvfork(); |
| - | #endif |
| - | |
| + | pid = BB_MMU ? xfork() : xvfork(); |
| if (pid == 0) { | |
| /* child process */ | |
| close(fd_pipe.rd); /* We don't want to read from the parent */ | |
| @@ -719,6 +719,9 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC; | |
| #define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__) | |
| #endif | |
| + | #if BB_MMU |
| + | pid_t xfork(void) FAST_FUNC; |
| + | #endif |
| pid_t xvfork(void) FAST_FUNC; | |
| /* NOMMU friendy fork+exec */ | |
| @@ -238,9 +238,7 @@ void FAST_FUNC forkexit_or_rexec(char **argv) | |
| void FAST_FUNC forkexit_or_rexec(void) | |
| { | |
| pid_t pid; | |
| - | pid = fork(); |
| - | if (pid < 0) /* wtf? */ |
| - | bb_perror_msg_and_die("fork"); |
| + | pid = xfork(); |
| if (pid) /* parent */ | |
| exit(EXIT_SUCCESS); | |
| /* child */ | |
| @@ -16,3 +16,13 @@ pid_t FAST_FUNC xvfork(void) | |
| bb_perror_msg_and_die("vfork"); | |
| return pid; | |
| } | |
| + | |
| + | #if BB_MMU |
| + | pid_t FAST_FUNC xfork(void) |
| + | { |
| + | pid_t pid = fork(); |
| + | if (pid < 0) |
| + | bb_perror_msg_and_die("vfork" + 1); |
| + | return pid; |
| + | } |
| + | #endif |
| @@ -1303,7 +1303,7 @@ int inetd_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| pid = vfork(); | |
| if (pid < 0) { /* fork error */ | |
| - | bb_perror_msg("fork"); |
| + | bb_perror_msg(BB_MMU ? "vfork" + 1 : "vfork"); |
| sleep(1); | |
| restore_sigmask(&omask); | |
| maybe_close(accepted_fd); | |
| @@ -1902,7 +1902,7 @@ static int run_pipe(struct pipe *pi) | |
| #endif | |
| if (child->pid < 0) { /* [v]fork failed */ | |
| /* Clearly indicate, was it fork or vfork */ | |
| - | bb_perror_msg(BB_MMU ? "fork" : "vfork"); |
| + | bb_perror_msg(BB_MMU ? "vfork" + 1 : "vfork"); |
| } else { | |
| pi->alive_progs++; | |
| #if ENABLE_HUSH_JOB | |
| @@ -3096,11 +3096,7 @@ static FILE *generate_stream_from_list(struct pipe *head) | |
| * huge=`cat TESTFILE` # will block here forever | |
| * echo OK | |
| */ | |
| - | pid = BB_MMU ? fork() : xvfork(); |
| - | #if BB_MMU |
| - | if (pid < 0) |
| - | bb_perror_msg_and_die("fork"); |
| - | #endif |
| + | pid = BB_MMU ? xfork() : xvfork(); |
| if (pid == 0) { /* child */ | |
| if (ENABLE_HUSH_JOB) | |
| die_sleep = 0; /* let nofork's xfuncs die */ | |
| @@ -890,6 +890,7 @@ get_mountport(struct pmap *pm_mnt, | |
| } | |
| #if BB_MMU | |
| + | /* Unlike bb_daemonize(), parent does NOT exit here, but returns 0 */ |
| static int daemonize(void) | |
| { | |
| int fd; | |