tar: support -T - and -X -
[oweals/busybox.git] / miscutils / setsid.c
index 014de51e514c68061b68b0dc582dfcef13cb238f..c573fae343fa63bc350ebc726e72ab95b792f42b 100644 (file)
@@ -17,7 +17,7 @@
 #include "libbb.h"
 
 int setsid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int setsid_main(int argc ATTRIBUTE_UNUSED, char **argv)
+int setsid_main(int argc UNUSED_PARAM, char **argv)
 {
        if (!argv[1])
                bb_show_usage();
@@ -25,11 +25,25 @@ int setsid_main(int argc ATTRIBUTE_UNUSED, char **argv)
        /* setsid() is allowed only when we are not a process group leader.
         * Otherwise our PID serves as PGID of some existing process group
         * and cannot be used as PGID of a new process group. */
-       if (getpgrp() == getpid())
-               forkexit_or_rexec(argv);
+       if (setsid() < 0) {
+               pid_t pid = fork_or_rexec(argv);
+               if (pid != 0) {
+                       /* parent */
+                       /* TODO:
+                        * we can waitpid(pid, &status, 0) and then even
+                        * emulate exitcode, making the behavior consistent
+                        * in both forked and non forked cases.
+                        * However, the code is larger and upstream
+                        * does not do such trick.
+                        */
+                       exit(EXIT_SUCCESS);
+               }
 
-       setsid();  /* no error possible */
+               /* child */
+               /* now there should be no error: */
+               setsid();
+       }
 
-       BB_EXECVP(argv[1], argv + 1);
-       bb_simple_perror_msg_and_die(argv[1]);
+       argv++;
+       BB_EXECVP_or_die(argv);
 }