# HG changeset patch # User Rob Landley # Date 1401557604 18000 # Node ID 85f297591693160843c9cbac25e4e26092c04ba5 # Parent 78a3eaf5555f7a480ba97cd5906f0a44c9956698 Introduce xfork() and make commands use it, and make some WEXITSTATUS() use WIFEXITED() and WTERMSIG()+127. diff -r 78a3eaf5555f -r 85f297591693 lib/lib.h --- a/lib/lib.h Thu May 29 08:21:48 2014 -0500 +++ b/lib/lib.h Sat May 31 12:33:24 2014 -0500 @@ -91,6 +91,7 @@ void xputs(char *s); void xputc(char c); void xflush(void); +pid_t xfork(void); void xexec_optargs(int skip); void xexec(char **argv); void xaccess(char *path, int flags); diff -r 78a3eaf5555f -r 85f297591693 lib/xwrap.c --- a/lib/xwrap.c Thu May 29 08:21:48 2014 -0500 +++ b/lib/xwrap.c Sat May 31 12:33:24 2014 -0500 @@ -113,6 +113,15 @@ if (fflush(stdout) || ferror(stdout)) perror_exit("write");; } +pid_t xfork(void) +{ + pid_t pid = fork(); + + if (pid < 0) perror_exit("fork"); + + return pid; +} + // Call xexec with a chunk of optargs, starting at skip. (You can't just // call xexec() directly because toy_init() frees optargs.) void xexec_optargs(int skip) diff -r 78a3eaf5555f -r 85f297591693 toys/other/netcat.c --- a/toys/other/netcat.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/other/netcat.c Sat May 31 12:33:24 2014 -0500 @@ -140,7 +140,7 @@ // Do we need to return immediately because -l has arguments? if ((toys.optflags & FLAG_l) && toys.optc) { - if (fork()) goto cleanup; + if (xfork()) goto cleanup; close(0); close(1); close(2); @@ -149,7 +149,7 @@ for (;;) { pid_t child = 0; - // For -l, call accept from the _new_ thread. + // For -l, call accept from the _new_ process. pollfds[0].fd = accept(sockfd, (struct sockaddr *)&address, &len); if (pollfds[0].fd<0) perror_exit("accept"); diff -r 78a3eaf5555f -r 85f297591693 toys/other/timeout.c --- a/toys/other/timeout.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/other/timeout.c Sat May 31 12:33:24 2014 -0500 @@ -60,15 +60,14 @@ if (TT.s_signal && -1 == (TT.nextsig = sig_to_num(TT.s_signal))) error_exit("bad -s: '%s'", TT.s_signal); - if (!(TT.pid = fork())) xexec_optargs(1); + if (!(TT.pid = xfork())) xexec_optargs(1); else { int status; signal(SIGALRM, handler); setitimer(ITIMER_REAL, &TT.itv, (void *)&toybuf); while (-1 == waitpid(TT.pid, &status, 0) && errno == EINTR); - if (WIFEXITED(status)) toys.exitval = WEXITSTATUS(status); - else if (WIFSIGNALED(status)) toys.exitval = WTERMSIG(status); - else toys.exitval = 1; + toys.exitval = WIFEXITED(status) + ? WEXITSTATUS(status) : WTERMSIG(status) + 127; } } diff -r 78a3eaf5555f -r 85f297591693 toys/pending/bootchartd.c --- a/toys/pending/bootchartd.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/bootchartd.c Sat May 31 12:33:24 2014 -0500 @@ -281,7 +281,7 @@ parse_config_file("/etc/bootchartd.conf"); memset(toybuf, 0, sizeof(toybuf)); - if (!(lgr_pid = fork())) { + if (!(lgr_pid = xfork())) { char *tmp_dir = create_tmp_dir(); sigatexit(generic_signal); @@ -306,7 +306,7 @@ if (bchartd_opt == 1 && toys.optargs[1]) { pid_t prog_pid; - if (!(prog_pid = fork())) xexec_optargs(1); + if (!(prog_pid = xfork())) xexec_optargs(1); waitpid(prog_pid, NULL, 0); kill(lgr_pid, SIGUSR1); } diff -r 78a3eaf5555f -r 85f297591693 toys/pending/dhcp.c --- a/toys/pending/dhcp.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/dhcp.c Sat May 31 12:33:24 2014 -0500 @@ -318,10 +318,8 @@ { int fd = open("/dev/null", O_RDWR); if (fd < 0) fd = xcreate("/", O_RDONLY, 0666); - pid_t pid = fork(); - if (pid < 0) perror_exit("DAEMON: failed to fork"); - if (pid) exit(EXIT_SUCCESS); + if (xfork()) exit(0); setsid(); dup2(fd, 0); diff -r 78a3eaf5555f -r 85f297591693 toys/pending/find.c --- a/toys/pending/find.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/find.c Sat May 31 12:33:24 2014 -0500 @@ -94,7 +94,7 @@ arg_array[filter->data.e.arg_path_index] = path; } - if (!(pid = fork())) xexec(arg_array); + if (!(pid = xfork())) xexec(arg_array); free(path); waitpid(pid, &status, 0); diff -r 78a3eaf5555f -r 85f297591693 toys/pending/inotifyd.c --- a/toys/pending/inotifyd.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/inotifyd.c Sat May 31 12:33:24 2014 -0500 @@ -55,11 +55,10 @@ static int exec_wait(char **args) { int status = 0; - pid_t pid = fork(); + pid_t pid = xfork(); if (!pid) xexec(args); - else if (pid > 0) waitpid(pid, &status, 0); - else perror_exit("fork"); + else waitpid(pid, &status, 0); return WEXITSTATUS(status); } diff -r 78a3eaf5555f -r 85f297591693 toys/pending/nbd_client.c --- a/toys/pending/nbd_client.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/nbd_client.c Sat May 31 12:33:24 2014 -0500 @@ -100,7 +100,7 @@ if (toys.optflags & FLAG_s) mlockall(MCL_CURRENT|MCL_FUTURE); // Open the device to force reread of the partition table. - if ((toys.optflags & FLAG_n) || !fork()) { + if ((toys.optflags & FLAG_n) || !xfork()) { char *s = strrchr(device, '/'); int i; diff -r 78a3eaf5555f -r 85f297591693 toys/pending/openvt.c --- a/toys/pending/openvt.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/openvt.c Sat May 31 12:33:24 2014 -0500 @@ -110,9 +110,8 @@ while (vt_fd > 2) close(vt_fd--); - pid = vfork(); - if (pid < 0) perror_exit("Fork failed"); - else if (!pid) { + pid = xfork(); + if (!pid) { setsid(); ioctl(vt_fd, TIOCSCTTY, 0); xexec(toys.optargs); diff -r 78a3eaf5555f -r 85f297591693 toys/pending/tcpsvd.c --- a/toys/pending/tcpsvd.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/tcpsvd.c Sat May 31 12:33:24 2014 -0500 @@ -14,7 +14,7 @@ default n help usage: tcpsvd [-hEv] [-c N] [-C N[:MSG]] [-b N] [-u User] [-l Name] IP Port Prog - udpsvd [-hEv] [-c N] [-u User] [-l Name] IP Port Prog + usage: udpsvd [-hEv] [-c N] [-u User] [-l Name] IP Port Prog Create TCP/UDP socket, bind to IP:PORT and listen for incoming connection. Run PROG for each connection. @@ -350,7 +350,7 @@ h[hash].head->count++; } - if (!(pid = fork())) { + if (!(pid = xfork())) { char *serv = NULL, *clie = NULL; char *client = sock_to_address((struct sockaddr*)buf, NI_NUMERICHOST | NI_NUMERICSERV); if (toys.optflags & FLAG_h) { //lookup name @@ -393,11 +393,11 @@ dup2(newfd, 0); dup2(newfd, 1); xexec_optargs(2); //skip IP PORT - } else if(pid > 0) { + } else { insert(&pids, pid, addr); xclose(newfd); //close and reopen for next client. if (TT.udp) fd = create_bind_sock(toys.optargs[0], (struct sockaddr*)&haddr); - } else error_msg(" fork failed"); + } } //while(1) } diff -r 78a3eaf5555f -r 85f297591693 toys/pending/useradd.c --- a/toys/pending/useradd.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/pending/useradd.c Sat May 31 12:33:24 2014 -0500 @@ -58,12 +58,12 @@ static int exec_wait(char **args) { int status = 0; - pid_t pid = fork(); + pid_t pid = xfork(); if (!pid) xexec(args); - else if (pid > 0) waitpid(pid, &status, 0); - else perror_exit("fork failed"); - return WEXITSTATUS(status); + else if waitpid(pid, &status, 0); + + return WIFEXITED(status) ? WEXITSTATUS(status) : WTERMSIG(status)+127; } /* create_copy_skel(), This function will create the home directory of the diff -r 78a3eaf5555f -r 85f297591693 toys/posix/time.c --- a/toys/posix/time.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/posix/time.c Sat May 31 12:33:24 2014 -0500 @@ -27,7 +27,7 @@ struct timeval tv, tv2; gettimeofday(&tv, NULL); - if (!(pid = fork())) xexec_optargs(0); + if (!(pid = xfork())) xexec_optargs(0); else { int stat; struct rusage ru; diff -r 78a3eaf5555f -r 85f297591693 toys/posix/xargs.c --- a/toys/posix/xargs.c Thu May 29 08:21:48 2014 -0500 +++ b/toys/posix/xargs.c Sat May 31 12:33:24 2014 -0500 @@ -166,14 +166,14 @@ for (dtemp = dlist; dtemp; dtemp = dtemp->next) handle_entries(dtemp->data, out+entries); - pid_t pid=fork(); + pid_t pid=xfork(); if (!pid) { xclose(0); open("/dev/null", O_RDONLY); xexec(out); } waitpid(pid, &status, 0); - status = WEXITSTATUS(status); + status = WIFEXITED(status) ? WEXITSTATUS(status) : WTERMSIG(status)+127; // Abritrary number of execs, can't just leak memory each time... while (dlist) {