master xplshn/aruu / cmd / pseudo / setsid.c
 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}