1/* See LICENSE file for copyright and license details. */
2
3
4#include <errno.h>
5#include <unistd.h>
6
7#include "util.h"
8
9static int fflag = 0;
10
11static void
12usage(void)
13{
14 eprintf("usage: %s [-f] cmd [arg ...]\n", argv0);
15}
16
17// ?man setsid: run in new session
18// ?man arguments: cmd [arg ...
19// ?man run a program in a new session
20int
21main(int argc, char *argv[])
22{
23 int savederrno;
24
25 ARGBEGIN {
26 // ?man -f: force the operation
27 case 'f':
28 fflag = 1;
29 break;
30 default:
31 usage();
32 } ARGEND
33
34 if (!argc)
35 usage();
36
37 if (fflag || getpgrp() == getpid()) {
38 switch (fork()) {
39 case -1:
40 eprintf("fork:");
41 case 0:
42 break;
43 default:
44 return 0;
45 }
46 }
47 if (setsid() < 0)
48 eprintf("setsid:");
49 execvp(argv[0], argv);
50 savederrno = errno;
51 weprintf("execvp %s:", argv[0]);
52
53 _exit(126 + (savederrno == ENOENT));
54}