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 }