diff options
author | Ondrej Kozina <okozina@redhat.com> | 2015-04-21 10:25:52 +0200 |
---|---|---|
committer | Ondrej Kozina <okozina@redhat.com> | 2015-05-07 15:50:29 +0200 |
commit | b01a2a85b00b200ff7361450cddbf4a056ee68da (patch) | |
tree | 49ce66b30894ce2b8866b988a99fe17a050188ce | |
parent | 62cd3c6d794701d9f1ee6cb043840a3c09f24820 (diff) | |
download | lvm2-b01a2a85b00b200ff7361450cddbf4a056ee68da.tar.gz |
lvmpolld: improve syscal errors logging
-rw-r--r-- | daemons/lvmpolld/lvmpolld-core.c | 35 | ||||
-rw-r--r-- | daemons/lvmpolld/lvmpolld-data-utils.h | 1 |
2 files changed, 27 insertions, 9 deletions
diff --git a/daemons/lvmpolld/lvmpolld-core.c b/daemons/lvmpolld/lvmpolld-core.c index 9461ac23e..4c1977fb5 100644 --- a/daemons/lvmpolld/lvmpolld-core.c +++ b/daemons/lvmpolld/lvmpolld-core.c @@ -59,6 +59,18 @@ typedef struct lvmpolld_state { static pthread_key_t key; +static const char *_strerror_r(int errnum, lvmpolld_thread_data_t *data) +{ +#ifdef _GNU_SOURCE + return strerror_r(errnum, data->buf, sizeof(data->buf)); +#elif (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) + return strerror_r(errnum, data->buf, sizeof(data->buf)) ? NULL : data->buf; +#else +# warning "Can't decide strerror_r implementation to use. lvmpolld will not issue more specific error messages" + return NULL; +#endif +} + static void usage(const char *prog, FILE *file) { fprintf(file, "Usage:\n" @@ -216,7 +228,8 @@ static int poll_for_output(lvmpolld_lv_t *pdlv, lvmpolld_thread_data_t *data) { .fd = data->errpipe[0], .events = POLLIN } }; if (!(data->fout = fdopen(data->outpipe[0], "r")) || !(data->ferr = fdopen(data->errpipe[0], "r"))) { - ERROR(pdlv->ls, "%s: %s", PD_LOG_PREFIX, "failed to open file stream"); + ERROR(pdlv->ls, "%s: %s: (%d) %s", PD_LOG_PREFIX, "failed to open file stream", + errno, _strerror_r(errno, data) ?: ""); goto out; } @@ -227,9 +240,9 @@ static int poll_for_output(lvmpolld_lv_t *pdlv, lvmpolld_thread_data_t *data) DEBUGLOG(pdlv->ls, "%s: %s %d", PD_LOG_PREFIX, "poll() returned", r); if (r < 0) { - ERROR(pdlv->ls, "%s: %s (PID %d) %s (%d): %s", + ERROR(pdlv->ls, "%s: %s (PID %d) failed: (%d) %s", PD_LOG_PREFIX, "poll() for LVM2 cmd", pdlv->cmd_pid, - "ended with error", errno, "(strerror())"); + errno, _strerror_r(errno, data) ?: ""); goto out; } else if (!r) { timeout++; @@ -295,9 +308,10 @@ static int poll_for_output(lvmpolld_lv_t *pdlv, lvmpolld_thread_data_t *data) if (wait4) { if (wait4 < 0) { - ERROR(pdlv->ls, "%s: %s (PID %d) %s", PD_LOG_PREFIX, - "waitpid() for lvm2 cmd", pdlv->cmd_pid, - "resulted in error"); + ERROR(pdlv->ls, "%s: %s (PID %d) failed: (%d) %s", + PD_LOG_PREFIX, "waitpid() for lvm2 cmd", + pdlv->cmd_pid, errno, + _strerror_r(errno, data) ?: ""); goto out; } DEBUGLOG(pdlv->ls, "%s: %s", PD_LOG_PREFIX, "child exited"); @@ -395,7 +409,8 @@ static void *fork_and_poll(void *args) } else { /* parent */ if (r == -1) { - ERROR(ls, "%s: %s", PD_LOG_PREFIX, "fork failed"); + ERROR(ls, "%s: %s: (%d) %s", PD_LOG_PREFIX, "fork failed", + errno, _strerror_r(errno, data) ?: ""); goto err; } @@ -405,13 +420,15 @@ static void *fork_and_poll(void *args) /* failure to close write end of any pipe will result in broken polling */ if (close(data->outpipe[1])) { - ERROR(ls, "%s: %s", PD_LOG_PREFIX, "failed to close write end of pipe"); + ERROR(ls, "%s: %s: (%d) %s", PD_LOG_PREFIX, "failed to close write end of pipe", + errno, _strerror_r(errno, data) ?: ""); goto err; } data->outpipe[1] = -1; if (close(data->errpipe[1])) { - ERROR(ls, "%s: %s", PD_LOG_PREFIX, "failed to close write end of err pipe"); + ERROR(ls, "%s: %s: (%d) %s", PD_LOG_PREFIX, "failed to close write end of err pipe", + errno, _strerror_r(errno, data) ?: ""); goto err; } data->errpipe[1] = -1; diff --git a/daemons/lvmpolld/lvmpolld-data-utils.h b/daemons/lvmpolld/lvmpolld-data-utils.h index 834b6ab58..3940fee6d 100644 --- a/daemons/lvmpolld/lvmpolld-data-utils.h +++ b/daemons/lvmpolld/lvmpolld-data-utils.h @@ -89,6 +89,7 @@ typedef struct { int errpipe[2]; FILE *fout; FILE *ferr; + char buf[1024]; lvmpolld_lv_t *pdlv; } lvmpolld_thread_data_t; |