From: Ed Maste <ema...@adaranet.com>
Signed-off-by: Ed Maste <ema...@adaranet.com> --- bootstrap.conf | 1 + src/dutil_posix.c | 36 +++++++++++++++++++----------------- src/internal.h | 9 +++++++++ 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/bootstrap.conf b/bootstrap.conf index 95a84aa..fd1c8f7 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -37,6 +37,7 @@ sigprocmask socket spawn stddef +strerror_r-posix string sys_ioctl sys_socket diff --git a/src/dutil_posix.c b/src/dutil_posix.c index 609d7bd..115b2bd 100644 --- a/src/dutil_posix.c +++ b/src/dutil_posix.c @@ -76,9 +76,10 @@ exec_program(struct netcf *ncf, /* create a pipe to receive stdout+stderr from child */ if (outfd) { if (pipe(pipeout) < 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); report_error(ncf, NETCF_EEXEC, "failed to create pipe while forking for '%s': %s", - commandline, strerror_r(errno, errbuf, sizeof(errbuf))); + commandline, errbuf); goto error; } *outfd = pipeout[0]; @@ -90,24 +91,25 @@ exec_program(struct netcf *ncf, */ sigfillset(&newmask); if (pthread_sigmask(SIG_SETMASK, &newmask, &oldmask) != 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); report_error(ncf, NETCF_EEXEC, "failed to set signal mask while forking for '%s': %s", - commandline, strerror_r(errno, errbuf, sizeof(errbuf))); + commandline, errbuf); goto error; } *pid = fork(); - ERR_THROW(*pid < 0, ncf, EEXEC, "failed to fork for '%s': %s", - commandline, strerror_r(errno, errbuf, sizeof(errbuf))); + ERR_THROW_STRERROR(*pid < 0, ncf, EEXEC, "failed to fork for '%s': %s", + commandline, errbuf); if (*pid) { /* parent */ /* Restore our original signal mask now that the child is safely running */ - ERR_THROW(pthread_sigmask(SIG_SETMASK, &oldmask, NULL) != 0, - ncf, EEXEC, - "failed to restore signal mask while forking for '%s': %s", - commandline, strerror_r(errno, errbuf, sizeof(errbuf))); + ERR_THROW_STRERROR(pthread_sigmask(SIG_SETMASK, &oldmask, NULL) != 0, + ncf, EEXEC, + "failed to restore signal mask while forking for '%s': %s", + commandline, errbuf); /* parent doesn't use write side of the pipe */ if (pipeout[1] >= 0) @@ -208,14 +210,14 @@ int run_program(struct netcf *ncf, const char *const *argv, char **output) ERR_BAIL(ncf); outfile = fdopen(outfd, "r"); - ERR_THROW(outfile == NULL, ncf, EEXEC, - "Failed to create file stream for output while executing '%s': %s", - argv_str, strerror_r(errno, errbuf, sizeof(errbuf))); + ERR_THROW_STRERROR(outfile == NULL, ncf, EEXEC, + "Failed to create file stream for output while executing '%s': %s", + argv_str, errbuf); *output = fread_file(outfile, &outlen); - ERR_THROW(*output == NULL, ncf, EEXEC, - "Error while reading output from execution of '%s': %s", - argv_str, strerror_r(errno, errbuf, sizeof(errbuf))); + ERR_THROW_STRERROR(*output == NULL, ncf, EEXEC, + "Error while reading output from execution of '%s': %s", + argv_str, errbuf); /* finished with the stream. Close it so the child can exit. */ fclose(outfile); @@ -226,9 +228,9 @@ int run_program(struct netcf *ncf, const char *const *argv, char **output) /* empty loop */ } - ERR_THROW(waitret == -1, ncf, EEXEC, - "Failed waiting for completion of '%s': %s", - argv_str, strerror_r(errno, errbuf, sizeof(errbuf))); + ERR_THROW_STRERROR(waitret == -1, ncf, EEXEC, + "Failed waiting for completion of '%s': %s", + argv_str, errbuf); ERR_THROW(!WIFEXITED(exitstatus) && WIFSIGNALED(exitstatus), ncf, EEXEC, "'%s' terminated by signal: %d", argv_str, WTERMSIG(exitstatus)); diff --git a/src/internal.h b/src/internal.h index cca7a46..0354fb7 100644 --- a/src/internal.h +++ b/src/internal.h @@ -133,6 +133,15 @@ } \ } while(0) +#define ERR_THROW_STRERROR(cond, ncf, err, fmt ...) \ + do { \ + if (cond) { \ + strerror_r(errno, errbuf, sizeof(errbuf)); \ + report_error(ncf, NETCF_##err, ## fmt); \ + goto error; \ + } \ + } while(0) + /* Clear error code and details */ #define API_ENTRY(ncf) \ do { \ -- 1.7.11.5 _______________________________________________ netcf-devel mailing list netcf-devel@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/netcf-devel