diff options
author | Lennart Poettering <lennart@poettering.net> | 2008-07-28 23:36:27 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2008-07-28 23:36:27 +0200 |
commit | 734330e76f64d64da283fdfe72eea936b2081c4f (patch) | |
tree | a794cf891e13a9e6aec8bb01b2196c28741cf4ed | |
parent | a7be9a981c5c792310a45abbdc89878c5acaabbe (diff) |
save/restore errno where applicable
-rw-r--r-- | libdaemon/dexec.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/libdaemon/dexec.c b/libdaemon/dexec.c index 4831ede..4cf162b 100644 --- a/libdaemon/dexec.c +++ b/libdaemon/dexec.c @@ -50,6 +50,7 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) { static char buf[256]; int sigfd, r; fd_set fds; + int saved_errno; assert(daemon_signal_fd() >= 0); @@ -60,6 +61,12 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) { if ((pid = fork()) < 0) { daemon_log(LOG_ERR, "fork() failed: %s", strerror(errno)); + + saved_errno = errno; + close(p[0]); + close(p[1]); + errno = saved_errno; + return -1; } else if (pid == 0) { @@ -102,6 +109,8 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) { daemon_log(LOG_ERR, "execv(%s) failed: %s", prog, strerror(errno)); + fail: + _exit(EXIT_FAILURE); } @@ -123,6 +132,10 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) { continue; daemon_log(LOG_ERR, "select() failed: %s", strerror(errno)); + + saved_errno = errno; + close(p[0]); + errno = saved_errno; return -1; } @@ -150,8 +163,10 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) { int sig; if ((sig = daemon_signal_next()) < 0) { - daemon_log(LOG_ERR, "daemon_signal_next(): %s", strerror(errno)); - break; + saved_errno = errno; + close(p[0]); + errno = saved_errno; + return -1; } if (sig != SIGCHLD) { |