summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-02-21 05:08:35 -0500
committerMartin Pitt <martinpitt@users.noreply.github.com>2017-02-21 11:08:35 +0100
commit012f2b7de7137afbe7d1529ad670f51e4448b363 (patch)
treed47cec2f63a411d8044eb542606e713362b53b9a
parent1ebfd03bd9d3fb8ccb5d17fd741b04914479df28 (diff)
coredumpctl: print a hint if any coredumps are in flight (#5393)
Fixes #4685.
-rw-r--r--src/coredump/coredumpctl.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c
index 6abd99430b..29fb71c8dd 100644
--- a/src/coredump/coredumpctl.c
+++ b/src/coredump/coredumpctl.c
@@ -24,10 +24,13 @@
#include <string.h>
#include <unistd.h>
+#include "sd-bus.h"
#include "sd-journal.h"
#include "sd-messages.h"
#include "alloc-util.h"
+#include "bus-error.h"
+#include "bus-util.h"
#include "compress.h"
#include "fd-util.h"
#include "fileio.h"
@@ -871,9 +874,65 @@ finish:
return r;
}
+static int check_units_active(void) {
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ int c = 0, r;
+ const char *state;
+
+ r = sd_bus_default_system(&bus);
+ if (r < 0)
+ return log_error_errno(r, "Failed to acquire bus: %m");
+
+ r = sd_bus_message_new_method_call(
+ bus,
+ &m,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "ListUnitsByPatterns");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append_strv(m, NULL);
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append_strv(m, STRV_MAKE("systemd-coredump@*.service"));
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_call(bus, m, 0, &error, &reply);
+ if (r < 0)
+ return log_error_errno(r, "Failed to check if any systemd-coredump@.service units are running: %s",
+ bus_error_message(&error, r));
+
+ r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssssssouso)");
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ while ((r = sd_bus_message_read(
+ reply, "(ssssssouso)",
+ NULL, NULL, NULL, &state, NULL,
+ NULL, NULL, NULL, NULL, NULL) > 0))
+ if (!STR_IN_SET(state, "dead", "failed"))
+ c++;
+
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ return c;
+}
+
int main(int argc, char *argv[]) {
_cleanup_(sd_journal_closep) sd_journal*j = NULL;
- int r = 0;
+ int r = 0, units_active;
setlocale(LC_ALL, "");
log_parse_environment();
@@ -913,6 +972,8 @@ int main(int argc, char *argv[]) {
log_debug("Journal filter: %s", filter);
}
+ units_active = check_units_active(); /* error is treated the same as 0 */
+
switch(arg_action) {
case ACTION_LIST:
@@ -933,6 +994,11 @@ int main(int argc, char *argv[]) {
assert_not_reached("Shouldn't be here");
}
+ if (units_active > 0)
+ printf("%s-- Notice: %d systemd-coredump@.service %s, output may be incomplete.%s\n",
+ ansi_highlight_red(),
+ units_active, units_active == 1 ? "unit is running" : "units are running",
+ ansi_normal());
end:
pager_close();