__attribute__((returns_twice)) instead of noinline.
Yes LLVM supports it: https://llvm.org/bugs/show_bug.cgi?id=6287
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.
// 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");
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.
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().