setsid.c - randomcrap - random crap programs of varying quality
(HTM) git clone git://git.codemadness.org/randomcrap
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
setsid.c (834B)
---
1 /* portable setsid implementation, useful for running programs in a new session */
2 #include <stdio.h>
3 #include <unistd.h>
4
5 int
6 main(int argc, char *argv[])
7 {
8 int fflag = 0;
9
10 if (argc <= 1)
11 goto usage; /* gotos are evil, so use them >:) */
12 if (argv[1][0] == '-') {
13 if (argv[1][1] == 'f')
14 fflag = 1; /* force */
15 else
16 goto usage;
17 }
18 if (argc <= fflag + 1)
19 goto usage; /* setsid [-f] without a command is invalid */
20
21 if (fflag || getpgrp() == getpid()) {
22 switch (fork()) {
23 case -1:
24 perror("fork");
25 return 1;
26 case 0:
27 break;
28 default:
29 return 0;
30 }
31 }
32 if (setsid() < 0) {
33 perror("setsid");
34 return 1;
35 }
36 execvp(argv[fflag + 1], argv + fflag + 1); /* all arguments after setsid [-f] */
37 perror("execvp");
38 return 1;
39
40 usage:
41 fprintf(stderr, "usage: %s [-f] cmd [arg ...]\n", argv[0]);
42 return 1;
43 }