return mfree(pidref);
}
-int pidref_dup(const PidRef *pidref, PidRef **ret) {
+int pidref_copy(const PidRef *pidref, PidRef *dest) {
_cleanup_close_ int dup_fd = -EBADF;
pid_t dup_pid = 0;
- assert(ret);
+ assert(dest);
/* Allocates a new PidRef on the heap, making it a copy of the specified pidref. This does not try to
* acquire a pidfd if we don't have one yet!
dup_pid = pidref->pid;
}
- PidRef *dup_pidref = new(PidRef, 1);
- if (!dup_pidref)
- return -ENOMEM;
-
- *dup_pidref = (PidRef) {
+ *dest = (PidRef) {
.fd = TAKE_FD(dup_fd),
.pid = dup_pid,
};
+ return 0;
+}
+
+int pidref_dup(const PidRef *pidref, PidRef **ret) {
+ _cleanup_(pidref_freep) PidRef *dup_pidref = NULL;
+ int r;
+
+ assert(ret);
+
+ dup_pidref = newdup(PidRef, &PIDREF_NULL, 1);
+ if (!dup_pidref)
+ return -ENOMEM;
+
+ r = pidref_copy(pidref, dup_pidref);
+ if (r < 0)
+ return r;
+
*ret = TAKE_PTR(dup_pidref);
return 0;
}
PidRef *pidref_free(PidRef *pidref);
DEFINE_TRIVIAL_CLEANUP_FUNC(PidRef*, pidref_free);
+int pidref_copy(const PidRef *pidref, PidRef *dest);
int pidref_dup(const PidRef *pidref, PidRef **ret);
int pidref_new_from_pid(pid_t pid, PidRef **ret);
assert_se(!pidref_is_self(&PIDREF_MAKE_FROM_PID(getpid_cached()+1)));
}
+TEST(pidref_copy) {
+ _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
+ int r;
+
+ assert_se(pidref_copy(NULL, &pidref) >= 0);
+ assert_se(!pidref_is_set(&pidref));
+
+ assert_se(pidref_copy(&PIDREF_NULL, &pidref) >= 0);
+ assert_se(!pidref_is_set(&pidref));
+
+ assert_se(pidref_copy(&PIDREF_MAKE_FROM_PID(getpid_cached()), &pidref) >= 0);
+ assert_se(pidref_is_self(&pidref));
+ pidref_done(&pidref);
+
+ r = pidref_copy(&PIDREF_MAKE_FROM_PID(1), &pidref);
+ if (r == -ESRCH)
+ return (void) log_tests_skipped_errno(r, "PID1 does not exist");
+ assert_se(r >= 0);
+ assert_se(pidref_equal(&pidref, &PIDREF_MAKE_FROM_PID(1)));
+}
+
TEST(pidref_dup) {
_cleanup_(pidref_freep) PidRef *pidref = NULL;
int r;