]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
importd: port to PidRef
authorLennart Poettering <lennart@poettering.net>
Sun, 20 Jul 2025 06:56:28 +0000 (08:56 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 19 Sep 2025 06:45:46 +0000 (15:45 +0900)
src/import/export-tar.c
src/import/import-common.c
src/import/import-common.h
src/import/import-tar.c
src/import/pull-tar.c

index 5b907769a070ce97c9adbb4ffbb7f1887ed2c39b..70a6914fe145952f82cdbac2990d8f256aeddb5e 100644 (file)
@@ -12,6 +12,7 @@
 #include "format-util.h"
 #include "import-common.h"
 #include "log.h"
+#include "pidref.h"
 #include "pretty-print.h"
 #include "process-util.h"
 #include "ratelimit.h"
@@ -45,7 +46,7 @@ typedef struct TarExport {
         uint64_t written_compressed;
         uint64_t written_uncompressed;
 
-        pid_t tar_pid;
+        PidRef tar_pid;
 
         struct stat st;
         uint64_t quota_referenced;
@@ -63,8 +64,7 @@ TarExport *tar_export_unref(TarExport *e) {
 
         sd_event_source_unref(e->output_event_source);
 
-        if (e->tar_pid > 1)
-                sigkill_wait(e->tar_pid);
+        pidref_done_sigkill_wait(&e->tar_pid);
 
         if (e->temp_path) {
                 (void) btrfs_subvol_remove(e->temp_path, BTRFS_REMOVE_QUOTA);
@@ -105,6 +105,7 @@ int tar_export_new(
                 .quota_referenced = UINT64_MAX,
                 .last_percent = UINT_MAX,
                 .progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
+                .tar_pid = PIDREF_NULL,
         };
 
         if (event)
@@ -160,10 +161,13 @@ static int tar_export_finish(TarExport *e) {
         assert(e);
         assert(e->tar_fd >= 0);
 
-        if (e->tar_pid > 0) {
-                r = wait_for_terminate_and_check("tar", TAKE_PID(e->tar_pid), WAIT_LOG);
+        if (pidref_is_set(&e->tar_pid)) {
+                r = pidref_wait_for_terminate_and_check("tar", &e->tar_pid, WAIT_LOG);
                 if (r < 0)
                         return r;
+
+                pidref_done(&e->tar_pid);
+
                 if (r != EXIT_SUCCESS)
                         return -EPROTO;
         }
index bab81d596f923158967092a37902c52d6c6da61c..c55dad179f900870813321fb04f518e5d14a4f07 100644 (file)
 #include "import-common.h"
 #include "log.h"
 #include "os-util.h"
+#include "pidref.h"
 #include "process-util.h"
 #include "selinux-util.h"
 #include "stat-util.h"
 #include "tmpfile-util.h"
 
-int import_fork_tar_x(const char *path, pid_t *ret) {
+int import_fork_tar_x(const char *path, PidRef *ret) {
+        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
         _cleanup_close_pair_ int pipefd[2] = EBADF_PAIR;
         bool use_selinux;
-        pid_t pid;
         int r;
 
         assert(path);
@@ -34,10 +35,12 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
 
         use_selinux = mac_selinux_use();
 
-        r = safe_fork_full("(tar)",
-                           (int[]) { pipefd[0], -EBADF, STDERR_FILENO },
-                           NULL, 0,
-                           FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG_SIGTERM|FORK_REARRANGE_STDIO|FORK_LOG, &pid);
+        r = pidref_safe_fork_full(
+                        "(tar)",
+                        (int[]) { pipefd[0], -EBADF, STDERR_FILENO },
+                        NULL, 0,
+                        FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG_SIGTERM|FORK_REARRANGE_STDIO|FORK_LOG,
+                        &pid);
         if (r < 0)
                 return r;
         if (r == 0) {
@@ -84,15 +87,15 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
                 _exit(EXIT_FAILURE);
         }
 
-        *ret = pid;
+        *ret = TAKE_PIDREF(pid);
 
         return TAKE_FD(pipefd[1]);
 }
 
-int import_fork_tar_c(const char *path, pid_t *ret) {
+int import_fork_tar_c(const char *path, PidRef *ret) {
         _cleanup_close_pair_ int pipefd[2] = EBADF_PAIR;
+        _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
         bool use_selinux;
-        pid_t pid;
         int r;
 
         assert(path);
@@ -103,10 +106,12 @@ int import_fork_tar_c(const char *path, pid_t *ret) {
 
         use_selinux = mac_selinux_use();
 
-        r = safe_fork_full("(tar)",
-                           (int[]) { -EBADF, pipefd[1], STDERR_FILENO },
-                           NULL, 0,
-                           FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG_SIGTERM|FORK_REARRANGE_STDIO|FORK_LOG, &pid);
+        r = pidref_safe_fork_full(
+                        "(tar)",
+                        (int[]) { -EBADF, pipefd[1], STDERR_FILENO },
+                        NULL, 0,
+                        FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG_SIGTERM|FORK_REARRANGE_STDIO|FORK_LOG,
+                        &pid);
         if (r < 0)
                 return r;
         if (r == 0) {
@@ -139,7 +144,7 @@ int import_fork_tar_c(const char *path, pid_t *ret) {
                 _exit(EXIT_FAILURE);
         }
 
-        *ret = pid;
+        *ret = TAKE_PIDREF(pid);
 
         return TAKE_FD(pipefd[0]);
 }
index bb7d5614f01c49532a9b23044722c911cd568eb7..cf2760ef0f63175af13d4087bd06e5be6694d6b6 100644 (file)
@@ -33,8 +33,8 @@ typedef enum ImportFlags {
         _IMPORT_FLAGS_INVALID = -EINVAL,
 } ImportFlags;
 
-int import_fork_tar_c(const char *path, pid_t *ret);
-int import_fork_tar_x(const char *path, pid_t *ret);
+int import_fork_tar_c(const char *path, PidRef *ret);
+int import_fork_tar_x(const char *path, PidRef *ret);
 
 int import_mangle_os_tree(const char *path);
 
index b4b9b8dc99789f0e0c86a564e13568caecf1303b..4f31da53de3dfd66db84d5c7dfc532d850a6d397 100644 (file)
@@ -19,6 +19,7 @@
 #include "log.h"
 #include "mkdir-label.h"
 #include "path-util.h"
+#include "pidref.h"
 #include "pretty-print.h"
 #include "process-util.h"
 #include "ratelimit.h"
@@ -57,7 +58,7 @@ typedef struct TarImport {
 
         struct stat input_stat;
 
-        pid_t tar_pid;
+        PidRef tar_pid;
 
         unsigned last_percent;
         RateLimit progress_ratelimit;
@@ -69,8 +70,7 @@ TarImport* tar_import_unref(TarImport *i) {
 
         sd_event_source_unref(i->input_event_source);
 
-        if (i->tar_pid > 1)
-                sigkill_wait(i->tar_pid);
+        pidref_done_sigkill_wait(&i->tar_pid);
 
         rm_rf_subvolume_and_free(i->temp_path);
 
@@ -116,6 +116,7 @@ int tar_import_new(
                 .last_percent = UINT_MAX,
                 .image_root = TAKE_PTR(root),
                 .progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
+                .tar_pid = PIDREF_NULL,
         };
 
         if (event)
@@ -174,10 +175,13 @@ static int tar_import_finish(TarImport *i) {
 
         i->tar_fd = safe_close(i->tar_fd);
 
-        if (i->tar_pid > 0) {
-                r = wait_for_terminate_and_check("tar", TAKE_PID(i->tar_pid), WAIT_LOG);
+        if (pidref_is_set(&i->tar_pid)) {
+                r = pidref_wait_for_terminate_and_check("tar", &i->tar_pid, WAIT_LOG);
                 if (r < 0)
                         return r;
+
+                pidref_done(&i->tar_pid);
+
                 if (r != EXIT_SUCCESS)
                         return -EPROTO;
         }
index b4b5c690a0fbac22f9d3741ce5cda90982327820..922449b980b3ac53e485bdfacd83f265b65c28b5 100644 (file)
@@ -17,6 +17,7 @@
 #include "log.h"
 #include "mkdir-label.h"
 #include "path-util.h"
+#include "pidref.h"
 #include "process-util.h"
 #include "pull-common.h"
 #include "pull-job.h"
@@ -51,7 +52,7 @@ typedef struct TarPull {
 
         char *local;
 
-        pid_t tar_pid;
+        PidRef tar_pid;
 
         char *final_path;
         char *temp_path;
@@ -66,8 +67,7 @@ TarPull* tar_pull_unref(TarPull *i) {
         if (!i)
                 return NULL;
 
-        if (i->tar_pid > 1)
-                sigkill_wait(i->tar_pid);
+        pidref_done_sigkill_wait(&i->tar_pid);
 
         pull_job_unref(i->tar_job);
         pull_job_unref(i->checksum_job);
@@ -131,6 +131,7 @@ int tar_pull_new(
                 .image_root = TAKE_PTR(root),
                 .event = TAKE_PTR(e),
                 .glue = TAKE_PTR(g),
+                .tar_pid = PIDREF_NULL,
         };
 
         i->glue->on_finished = pull_job_curl_on_finished;
@@ -377,10 +378,11 @@ static void tar_pull_job_on_finished(PullJob *j) {
         pull_job_close_disk_fd(i->tar_job);
         pull_job_close_disk_fd(i->settings_job);
 
-        if (i->tar_pid > 0) {
-                r = wait_for_terminate_and_check("tar", TAKE_PID(i->tar_pid), WAIT_LOG);
+        if (pidref_is_set(&i->tar_pid)) {
+                r = pidref_wait_for_terminate_and_check("tar", &i->tar_pid, WAIT_LOG);
                 if (r < 0)
                         goto finish;
+                pidref_done(&i->tar_pid);
                 if (r != EXIT_SUCCESS) {
                         r = -EIO;
                         goto finish;
@@ -509,7 +511,7 @@ static int tar_pull_job_on_open_disk_tar(PullJob *j) {
 
         i = j->userdata;
         assert(i->tar_job == j);
-        assert(i->tar_pid <= 0);
+        assert(!pidref_is_set(&i->tar_pid));
 
         if (i->flags & IMPORT_DIRECT)
                 where = i->local;