mirror of
https://github.com/systemd/systemd.git
synced 2025-01-20 18:04:03 +03:00
pidref: split out pidref_copy() from pidref_dup()
This commit is contained in:
parent
d203659a13
commit
232e66217d
@ -156,11 +156,11 @@ PidRef *pidref_free(PidRef *pidref) {
|
||||
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!
|
||||
@ -183,15 +183,28 @@ int pidref_dup(const PidRef *pidref, PidRef **ret) {
|
||||
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;
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ void pidref_done(PidRef *pidref);
|
||||
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);
|
||||
|
@ -86,6 +86,27 @@ TEST(pidref_is_self) {
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user