diff options
| -rw-r--r-- | sinit.c | 15 | 
1 files changed, 11 insertions, 4 deletions
| @@ -34,7 +34,7 @@ main(void)  	sigset_t set;  	pid_t pid;  	fd_set rfds; -	int c, fd, n; +	int status, fd, n;  	if (getpid() != 1)  		return EXIT_FAILURE; @@ -48,7 +48,7 @@ main(void)  		return EXIT_FAILURE;  	if (pid > 0)  		for (;;) -			wait(&c); +			wait(&status);  	sigprocmask(SIG_UNBLOCK, &set, 0); @@ -102,17 +102,24 @@ dispatchcmd(int fd)  static void  spawn(const Arg *arg)  { +	int status;  	pid_t pid;  	char *const *p = arg->v;  	pid = fork(); -	if (pid < 0) +	if (pid < 0) {  		weprintf("sinit: fork:"); -	if (pid == 0) { +	} else if (pid == 0) { +		pid = fork(); +		if (pid < 0) +			weprintf("sinit: fork:"); +		else if (pid > 0) +			exit(0);  		setsid();  		setpgid(0, 0);  		execvp(*p, p);  		weprintf("sinit: execvp %s:", p);  		_exit(errno == ENOENT ? 127 : 126);  	} +	waitpid(pid, &status, 0);  } | 
