/* setsid.c - Run program in a new session ID. * * Copyright 2006 Rob Landley USE_SETSID(NEWTOY(setsid, "^<1wcd[!dc]", TOYFLAG_USR|TOYFLAG_BIN)) config SETSID bool "setsid" default y help usage: setsid [-cdw] command [args...] Run process in a new session. -d Detach from tty -c Control tty (become foreground process & receive keyboard signals) -w Wait for child (and exit with its status) */ #define FOR_setsid #include "toys.h" void setsid_main(void) { int i; // setsid() fails if we're already session leader, ala "exec setsid" from sh. // Second call can't fail, so loop won't continue endlessly. while (setsid()<0) { pid_t pid; // This must be before vfork() or tcsetpgrp() will hang waiting for parent. setpgid(0, 0); pid = XVFORK(); if (pid) { i = 0; if (FLAG(w)) { i = 127; if (pid>0) i = xwaitpid(pid); } _exit(i); } } if (FLAG(c)) tcsetpgrp(0, getpid()); if (FLAG(d) && (i = open("/dev/tty", O_RDONLY)) != -1) { ioctl(i, TIOCNOTTY); close(i); } xexec(toys.optargs); }