summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--manager.c11
-rw-r--r--util.c27
-rw-r--r--util.h4
3 files changed, 39 insertions, 3 deletions
diff --git a/manager.c b/manager.c
index 7adaa4ed0b..9e4fbbbaed 100644
--- a/manager.c
+++ b/manager.c
@@ -1414,8 +1414,6 @@ unsigned manager_dispatch_dbus_queue(Manager *m) {
static int manager_dispatch_sigchld(Manager *m) {
assert(m);
- log_debug("dispatching SIGCHLD");
-
for (;;) {
siginfo_t si;
Unit *u;
@@ -1469,9 +1467,16 @@ static int manager_process_signal_fd(Manager *m, bool *quit) {
switch (sfsi.ssi_signo) {
- case SIGCHLD:
+ case SIGCHLD: {
+ char *name = NULL;
+
+ get_process_name(sfsi.ssi_pid, &name);
+ log_debug("Got SIGCHLD for process %llu (%s)", (unsigned long long) sfsi.ssi_pid, strna(name));
+ free(name);
+
sigchld = true;
break;
+ }
case SIGINT:
case SIGTERM:
diff --git a/util.c b/util.c
index 69a26a2d08..b4d6eefbd2 100644
--- a/util.c
+++ b/util.c
@@ -438,6 +438,33 @@ finish:
return r;
}
+char *truncate_nl(char *s) {
+ assert(s);
+
+ s[strcspn(s, NEWLINE)] = 0;
+ return s;
+}
+
+int get_process_name(pid_t pid, char **name) {
+ char *p;
+ int r;
+
+ assert(pid >= 1);
+ assert(name);
+
+ if (asprintf(&p, "/proc/%llu/comm", (unsigned long long) pid) < 0)
+ return -ENOMEM;
+
+ r = read_one_line_file(p, name);
+ free(p);
+
+ if (r < 0)
+ return r;
+
+ truncate_nl(*name);
+ return 0;
+}
+
char *strappend(const char *s, const char *suffix) {
size_t a, b;
char *r;
diff --git a/util.h b/util.h
index 14f1a7a177..30a0616d54 100644
--- a/util.h
+++ b/util.h
@@ -39,6 +39,7 @@ typedef uint64_t usec_t;
/* What is interpreted as whitespace? */
#define WHITESPACE " \t\n\r"
+#define NEWLINE "\n\r"
usec_t now(clockid_t clock);
@@ -130,10 +131,13 @@ int reset_all_signal_handlers(void);
char *strstrip(char *s);
char *delete_chars(char *s, const char *bad);
+char *truncate_nl(char *s);
char *file_in_same_dir(const char *path, const char *filename);
int mkdir_parents(const char *path, mode_t mode);
+int get_process_name(pid_t pid, char **name);
+
char hexchar(int x);
int unhexchar(char c);
char octchar(int x);