aboutsummaryrefslogtreecommitdiff
path: root/toys/nohup.c
blob: e11fb09462975c48333c9718967252eb2e9c2f74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* vi: set sw=4 ts=4:
 *
 * nohup.c - run commandline with SIGHUP blocked.
 *
 * Copyright 2011 Rob Landley <rob@landley.net>
 *
 * See http://opengroup.org/onlinepubs/9699919799/utilities/nohup.html

USE_NOHUP(NEWTOY(nohup, "<1", TOYFLAG_USR|TOYFLAG_BIN))

config NOHUP
	bool "nohup"
	default y
	help
	  usage: nohup COMMAND [ARGS...]

	  Run a command that survives the end of its terminal.
	  If stdin is a tty, redirect from /dev/null
	  If stdout is a tty, redirect to file "nohup.out"
*/

#include "toys.h"

void nohup_main(void)
{
	signal(SIGHUP, SIG_IGN);
	if (isatty(1)) {
		close(1);
		if (-1 == open("nohup.out", O_CREAT|O_APPEND|O_WRONLY,
				S_IRUSR|S_IWUSR ))
		{
			char *temp = getenv("HOME");
			temp = xmsprintf("%s/%s", temp ? temp : "", "nohup.out");
			xcreate(temp, O_CREAT|O_APPEND|O_WRONLY, S_IRUSR|S_IWUSR);
		}
	}
	if (isatty(0)) {
		close(0);
		open("/dev/null", O_RDONLY);
	}
	xexec(toys.optargs);
}