setsid: implement -c

function                                             old     new   delta
setsid_main                                           53      96     +43
packed_usage                                       30846   30833     -13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-01-17 01:09:36 +01:00
parent 6a70db85cf
commit ccf7f0e4d3

View File

@ -15,19 +15,22 @@
*/ */
//usage:#define setsid_trivial_usage //usage:#define setsid_trivial_usage
//usage: "PROG ARGS" //usage: "[-c] PROG ARGS"
//usage:#define setsid_full_usage "\n\n" //usage:#define setsid_full_usage "\n\n"
//usage: "Run PROG in a new session. PROG will have no controlling terminal\n" //usage: "Run PROG in a new session. PROG will have no controlling terminal\n"
//usage: "and will not be affected by keyboard signals (Ctrl-C etc).\n" //usage: "and will not be affected by keyboard signals (^C etc).\n"
//usage: "See setsid(2) for details." //usage: "\n -c Set controlling terminal to stdin"
#include "libbb.h" #include "libbb.h"
int setsid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int setsid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int setsid_main(int argc UNUSED_PARAM, char **argv) int setsid_main(int argc UNUSED_PARAM, char **argv)
{ {
if (!argv[1]) unsigned opt;
bb_show_usage();
opt_complementary = "-1"; /* at least one arg */
opt = getopt32(argv, "c");
argv += optind;
/* setsid() is allowed only when we are not a process group leader. /* setsid() is allowed only when we are not a process group leader.
* Otherwise our PID serves as PGID of some existing process group * Otherwise our PID serves as PGID of some existing process group
@ -61,6 +64,10 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
setsid(); setsid();
} }
argv++; if (opt) {
/* -c: set (with stealing) controlling tty */
ioctl(0, TIOCSCTTY, 1);
}
BB_EXECVP_or_die(argv); BB_EXECVP_or_die(argv);
} }