setsid.c (618B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <errno.h> 3 #include <unistd.h> 4 5 #include "util.h" 6 7 static void 8 usage(void) 9 { 10 eprintf("usage: %s cmd [arg ...]\n", argv0); 11 } 12 13 int 14 main(int argc, char *argv[]) 15 { 16 int savederrno; 17 18 argv0 = *argv, argv0 ? (argc--, argv++) : (void *)0; 19 20 if (!argc) 21 usage(); 22 23 if (getpgrp() == getpid()) { 24 switch (fork()) { 25 case -1: 26 eprintf("fork:"); 27 case 0: 28 break; 29 default: 30 return 0; 31 } 32 } 33 if (setsid() < 0) 34 eprintf("setsid:"); 35 execvp(argv[0], argv); 36 savederrno = errno; 37 weprintf("execvp %s:", argv[0]); 38 39 _exit(126 + (savederrno == ENOENT)); 40 }