From 938901d7e2738be29b83331fb60a670afc20c602 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 4 Feb 2017 00:34:31 -0600 Subject: Switch oneit to use xopen_stdio() for -c (oops) and switch XVFORK() to use __attribute__((returns_twice)) instead of noinline. Yes LLVM supports it: https://llvm.org/bugs/show_bug.cgi?id=6287 --- lib/lib.h | 2 +- lib/xwrap.c | 2 +- toys/other/oneit.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/lib.h b/lib/lib.h index 2cb0c07a..e90e79f2 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -322,7 +322,7 @@ void mode_to_string(mode_t mode, char *buf); char *getbasename(char *name); void names_to_pid(char **names, int (*callback)(pid_t pid, char *name)); -pid_t xvforkwrap(pid_t pid); +pid_t __attribute__((returns_twice)) xvforkwrap(pid_t pid); #define XVFORK() xvforkwrap(vfork()) // Wrapper to make xfuncs() return (via longjmp) instead of exiting. diff --git a/lib/xwrap.c b/lib/xwrap.c index 611bdb52..2e52d6b4 100644 --- a/lib/xwrap.c +++ b/lib/xwrap.c @@ -163,7 +163,7 @@ void xflush(void) // share a stack, so child returning from a function would stomp the return // address parent would need. Solution: make vfork() an argument so processes // diverge before function gets called. -pid_t __attribute__((noinline)) xvforkwrap(pid_t pid) +pid_t __attribute__((returns_twice)) xvforkwrap(pid_t pid) { if (pid == -1) perror_exit("vfork"); diff --git a/toys/other/oneit.c b/toys/other/oneit.c index 9be67c05..68b5bd8c 100644 --- a/toys/other/oneit.c +++ b/toys/other/oneit.c @@ -79,7 +79,7 @@ void oneit_main(void) while (!toys.signal) { // Create a new child process. - pid = vfork(); + pid = XVFORK(); if (pid) { // pid 1 reaps zombies until it gets its child, then halts system. @@ -96,7 +96,7 @@ void oneit_main(void) for (i=0; i<3; i++) { close(i); // Remember, O_CLOEXEC is backwards for xopen() - xopen(TT.console ? TT.console : "/dev/tty0", O_RDWR|O_CLOEXEC); + xopen_stdio(TT.console ? TT.console : "/dev/tty0", O_RDWR|O_CLOEXEC); } // Can't xexec() here, we vforked so we don't want to error_exit(). -- cgit v1.2.3