summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Kozina <okozina@redhat.com>2015-04-21 10:25:52 +0200
committerOndrej Kozina <okozina@redhat.com>2015-05-07 15:50:29 +0200
commitb01a2a85b00b200ff7361450cddbf4a056ee68da (patch)
tree49ce66b30894ce2b8866b988a99fe17a050188ce
parent62cd3c6d794701d9f1ee6cb043840a3c09f24820 (diff)
downloadlvm2-b01a2a85b00b200ff7361450cddbf4a056ee68da.tar.gz
lvmpolld: improve syscal errors logging
-rw-r--r--daemons/lvmpolld/lvmpolld-core.c35
-rw-r--r--daemons/lvmpolld/lvmpolld-data-utils.h1
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;