]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/core/killall.c
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / core / killall.c
index b3aa22adc55d7af5a5d882e9fc1240d65f066fc8..e77763e161c6fb09a08e6061f84c68dac79b8182 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
 /***
   This file is part of systemd.
 
@@ -66,29 +67,26 @@ static bool ignore_proc(pid_t pid, bool warn_rootfs) {
         if (count <= 0)
                 return true;
 
-        /* Processes with argv[0][0] = '@' we ignore from the killing
-         * spree.
+        /* Processes with argv[0][0] = '@' we ignore from the killing spree.
          *
          * http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons */
-        if (c == '@' && warn_rootfs) {
-                _cleanup_free_ char *comm = NULL;
+        if (c != '@')
+                return false;
 
-                r = pid_from_same_root_fs(pid);
-                if (r < 0)
-                        return true;
+        if (warn_rootfs &&
+            pid_from_same_root_fs(pid) == 0) {
+
+                _cleanup_free_ char *comm = NULL;
 
                 get_process_comm(pid, &comm);
 
-                if (r)
-                        log_notice("Process " PID_FMT " (%s) has been marked to be excluded from killing. It is "
-                                   "running from the root file system, and thus likely to block re-mounting of the "
-                                   "root file system to read-only. Please consider moving it into an initrd file "
-                                   "system instead.", pid, strna(comm));
-                return true;
-        } else if (c == '@')
-                return true;
+                log_notice("Process " PID_FMT " (%s) has been marked to be excluded from killing. It is "
+                           "running from the root file system, and thus likely to block re-mounting of the "
+                           "root file system to read-only. Please consider moving it into an initrd file "
+                           "system instead.", pid, strna(comm));
+        }
 
-        return false;
+        return true;
 }
 
 static void wait_for_children(Set *pids, sigset_t *mask) {
@@ -132,9 +130,9 @@ static void wait_for_children(Set *pids, sigset_t *mask) {
                  * might not be our child. */
                 SET_FOREACH(p, pids, i) {
 
-                        /* We misuse getpgid as a check whether a
-                         * process still exists. */
-                        if (getpgid(PTR_TO_PID(p)) >= 0)
+                        /* kill(pid, 0) sends no signal, but it tells
+                         * us whether the process still exists. */
+                        if (kill(PTR_TO_PID(p), 0) == 0)
                                 continue;
 
                         if (errno != ESRCH)
@@ -177,8 +175,7 @@ static int killall(int sig, Set *pids, bool send_sighup) {
                 pid_t pid;
                 int r;
 
-                if (d->d_type != DT_DIR &&
-                    d->d_type != DT_UNKNOWN)
+                if (!IN_SET(d->d_type, DT_DIR, DT_UNKNOWN))
                         continue;
 
                 if (parse_pid(d->d_name, &pid) < 0)
@@ -216,7 +213,8 @@ static int killall(int sig, Set *pids, bool send_sighup) {
 
 
                         if (get_ctty_devnr(pid, NULL) >= 0)
-                                kill(pid, SIGHUP);
+                                /* it's OK if the process is gone, just ignore the result */
+                                (void) kill(pid, SIGHUP);
                 }
         }