xref: /aosp_15_r20/external/musl/src/legacy/daemon.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <fcntl.h>
3*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
4*c9945492SAndroid Build Coastguard Worker 
daemon(int nochdir,int noclose)5*c9945492SAndroid Build Coastguard Worker int daemon(int nochdir, int noclose)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	if (!nochdir && chdir("/"))
8*c9945492SAndroid Build Coastguard Worker 		return -1;
9*c9945492SAndroid Build Coastguard Worker 	if (!noclose) {
10*c9945492SAndroid Build Coastguard Worker 		int fd, failed = 0;
11*c9945492SAndroid Build Coastguard Worker 		if ((fd = open("/dev/null", O_RDWR)) < 0) return -1;
12*c9945492SAndroid Build Coastguard Worker 		if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0)
13*c9945492SAndroid Build Coastguard Worker 			failed++;
14*c9945492SAndroid Build Coastguard Worker 		if (fd > 2) close(fd);
15*c9945492SAndroid Build Coastguard Worker 		if (failed) return -1;
16*c9945492SAndroid Build Coastguard Worker 	}
17*c9945492SAndroid Build Coastguard Worker 
18*c9945492SAndroid Build Coastguard Worker 	switch(fork()) {
19*c9945492SAndroid Build Coastguard Worker 	case 0: break;
20*c9945492SAndroid Build Coastguard Worker 	case -1: return -1;
21*c9945492SAndroid Build Coastguard Worker 	default: _exit(0);
22*c9945492SAndroid Build Coastguard Worker 	}
23*c9945492SAndroid Build Coastguard Worker 
24*c9945492SAndroid Build Coastguard Worker 	if (setsid() < 0) return -1;
25*c9945492SAndroid Build Coastguard Worker 
26*c9945492SAndroid Build Coastguard Worker 	switch(fork()) {
27*c9945492SAndroid Build Coastguard Worker 	case 0: break;
28*c9945492SAndroid Build Coastguard Worker 	case -1: return -1;
29*c9945492SAndroid Build Coastguard Worker 	default: _exit(0);
30*c9945492SAndroid Build Coastguard Worker 	}
31*c9945492SAndroid Build Coastguard Worker 
32*c9945492SAndroid Build Coastguard Worker 	return 0;
33*c9945492SAndroid Build Coastguard Worker }
34