1#define _GNU_SOURCE
2#include <fcntl.h>
3#include <unistd.h>
4
5int 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