From: Ed Maste <emaste(a)adaranet.com>
Signed-off-by: Ed Maste <emaste(a)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