#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"
uint64_t written_compressed;
uint64_t written_uncompressed;
- pid_t tar_pid;
+ PidRef tar_pid;
struct stat st;
uint64_t quota_referenced;
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);
.quota_referenced = UINT64_MAX,
.last_percent = UINT_MAX,
.progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
+ .tar_pid = PIDREF_NULL,
};
if (event)
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;
}
#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);
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) {
_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);
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) {
_exit(EXIT_FAILURE);
}
- *ret = pid;
+ *ret = TAKE_PIDREF(pid);
return TAKE_FD(pipefd[0]);
}
_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);
#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"
struct stat input_stat;
- pid_t tar_pid;
+ PidRef tar_pid;
unsigned last_percent;
RateLimit progress_ratelimit;
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);
.last_percent = UINT_MAX,
.image_root = TAKE_PTR(root),
.progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
+ .tar_pid = PIDREF_NULL,
};
if (event)
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;
}
#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"
char *local;
- pid_t tar_pid;
+ PidRef tar_pid;
char *final_path;
char *temp_path;
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);
.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;
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;
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;