diff options
| author | Rich Felker <dalias@aerifal.cx> | 2011-02-17 10:30:00 -0500 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2011-02-17 10:30:00 -0500 | 
| commit | 187fe29d5b89644b68cade75a34257a1c32a75f6 (patch) | |
| tree | 563471dc8d0e4294ea3cd68338f3ff8e5470e3d6 | |
| parent | 19e35c500bd2b5e6146e42705ab9b69c155a2006 (diff) | |
| download | musl-187fe29d5b89644b68cade75a34257a1c32a75f6.tar.gz | |
make daemon try the operations that might fail before fork rather than after
| -rw-r--r-- | src/linux/daemon.c | 22 | 
1 files changed, 10 insertions, 12 deletions
| diff --git a/src/linux/daemon.c b/src/linux/daemon.c index 3750fc34..afb8019f 100644 --- a/src/linux/daemon.c +++ b/src/linux/daemon.c @@ -3,7 +3,16 @@  int daemon(int nochdir, int noclose)  { -	int fd; +	if (!nochdir && chdir("/")) +		return -1; +	if (!noclose) { +		int fd, failed = 0; +		if ((fd = open("/dev/null", O_RDWR)) < 0) return -1; +		if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0) +			failed++; +		if (fd > 2) close(fd); +		if (failed) return -1; +	}  	switch(fork()) {  	case 0: break; @@ -19,16 +28,5 @@ int daemon(int nochdir, int noclose)  	default: _exit(0);  	} -	if (!nochdir && chdir("/")) -		return -1; -	if (!noclose) { -		int failed = 0; -		if ((fd = open("/dev/null", O_RDWR)) < 0) return -1; -		if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0) -			failed++; -		if (fd > 2) close(fd); -		if (failed) return -1; -	} -  	return 0;  } | 
