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 Workerint 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