• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #define _GNU_SOURCE
2 #include <fcntl.h>
3 #include <unistd.h>
4 
daemon(int nochdir,int noclose)5 int daemon(int nochdir, int noclose)
6 {
7 	if (!nochdir && chdir("/"))
8 		return -1;
9 	if (!noclose) {
10 		int fd, failed = 0;
11 		if ((fd = open("/dev/null", O_RDWR)) < 0) return -1;
12 		if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0)
13 			failed++;
14 		if (fd > 2) close(fd);
15 		if (failed) return -1;
16 	}
17 
18 	switch(fork()) {
19 	case 0: break;
20 	case -1: return -1;
21 	default: _exit(0);
22 	}
23 
24 	if (setsid() < 0) return -1;
25 
26 	switch(fork()) {
27 	case 0: break;
28 	case -1: return -1;
29 	default: _exit(0);
30 	}
31 
32 	return 0;
33 }
34