Currently, lock_and_daemon() always returns 0 as its exit status. But this behavior is confusing because users cannot detect errors during locking a base directory via the exit status. This patch modifies lock_and_daemon() for returning correct exit status.
Signed-off-by: Hitoshi Mitake <[email protected]> --- sheep/sheep.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 files changed, 37 insertions(+), 12 deletions(-) diff --git a/sheep/sheep.c b/sheep/sheep.c index a7e3820..64f04ca 100644 --- a/sheep/sheep.c +++ b/sheep/sheep.c @@ -392,7 +392,12 @@ static void check_host_env(void) static int lock_and_daemon(bool daemonize, const char *base_dir) { - int ret, devnull_fd = 0; + int ret, devnull_fd = 0, status = 0; + int pipefd[2]; + + ret = pipe(pipefd); + if (ret < 0) + panic("pipe() for passing exit status failed: %m"); if (daemonize) { switch (fork()) { @@ -402,36 +407,51 @@ static int lock_and_daemon(bool daemonize, const char *base_dir) panic("fork() failed during daemonize: %m"); break; default: - exit(0); + ret = read(pipefd[0], &status, sizeof(status)); + if (ret != sizeof(status)) + panic("read exit status failed: %m"); + + exit(status); break; } - if (setsid() == -1) - panic("becoming a leader of a new session failed: %m"); + if (setsid() == -1) { + sd_eprintf("becoming a leader of a new session" + " failed: %m"); + status = 1; + goto end; + } switch (fork()) { case 0: break; case -1: - panic("fork() failed during daemonize: %m"); - break; + sd_eprintf("fork() failed during daemonize: %m"); + goto end; default: exit(0); break; } - if (chdir("/")) - panic("chdir to / failed: %m"); + if (chdir("/")) { + sd_eprintf("chdir to / failed: %m"); + status = 1; + goto end; + } devnull_fd = open("/dev/null", O_RDWR); - if (devnull_fd < 0) - panic("opening /dev/null failed: %m"); + if (devnull_fd < 0) { + sd_eprintf("opening /dev/null failed: %m"); + status = 1; + goto end; + } } ret = lock_base_dir(base_dir); if (ret < 0) { sd_eprintf("locking directory: %s failed", base_dir); - return -1; + status = 1; + goto end; } if (daemonize) { @@ -446,7 +466,12 @@ static int lock_and_daemon(bool daemonize, const char *base_dir) close(devnull_fd); } - return 0; +end: + ret = write(pipefd[1], &status, sizeof(status)); + if (ret != sizeof(status)) + panic("writing exit status failed: %m"); + + return status; } int main(int argc, char **argv) -- 1.7.5.1 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
