1/* vi: set sw=4 ts=4: */ 2/* 3 * setsid.c -- execute a command in a new session 4 * Rick Sladkey <jrs@world.std.com> 5 * In the public domain. 6 * 7 * 1999-02-22 Arkadiusz Mickiewicz <misiek@pld.ORG.PL> 8 * - added Native Language Support 9 * 10 * 2001-01-18 John Fremlin <vii@penguinpowered.com> 11 * - fork in case we are process group leader 12 * 13 * 2004-11-12 Paul Fox 14 * - busyboxed 15 */ 16 17#include "libbb.h" 18 19int setsid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 20int setsid_main(int argc UNUSED_PARAM, char **argv) 21{ 22 if (!argv[1]) 23 bb_show_usage(); 24 25 /* setsid() is allowed only when we are not a process group leader. 26 * Otherwise our PID serves as PGID of some existing process group 27 * and cannot be used as PGID of a new process group. */ 28 if (setsid() < 0) { 29 pid_t pid = fork_or_rexec(argv); 30 if (pid != 0) { 31 /* parent */ 32 /* TODO: 33 * we can waitpid(pid, &status, 0) and then even 34 * emulate exitcode, making the behavior consistent 35 * in both forked and non forked cases. 36 * However, the code is larger and upstream 37 * does not do such trick. 38 */ 39 exit(EXIT_SUCCESS); 40 } 41 42 /* child */ 43 /* now there should be no error: */ 44 setsid(); 45 } 46 47 argv++; 48 BB_EXECVP_or_die(argv); 49} 50