pidref: copy fd id in pidref_copy() too

This commit is contained in:
Lennart Poettering
2025-01-08 10:53:00 +01:00
parent 8e3347f3bd
commit 06744cbb52
2 changed files with 11 additions and 16 deletions

View File

@@ -219,37 +219,32 @@ PidRef* pidref_free(PidRef *pidref) {
return mfree(pidref);
}
int pidref_copy(const PidRef *pidref, PidRef *dest) {
_cleanup_close_ int dup_fd = -EBADF;
pid_t dup_pid = 0;
int pidref_copy(const PidRef *pidref, PidRef *ret) {
_cleanup_(pidref_done) PidRef copy = PIDREF_NULL;
/* If NULL is passed we'll generate a PidRef that refers to no process. This makes it easy to
* copy pidref fields that might or might not reference a process yet. */
assert(dest);
assert(ret);
if (pidref) {
if (pidref_is_remote(pidref)) /* Propagate remote flag */
dup_fd = -EREMOTE;
copy.fd = -EREMOTE;
else if (pidref->fd >= 0) {
dup_fd = fcntl(pidref->fd, F_DUPFD_CLOEXEC, 3);
if (dup_fd < 0) {
copy.fd = fcntl(pidref->fd, F_DUPFD_CLOEXEC, 3);
if (copy.fd < 0) {
if (!ERRNO_IS_RESOURCE(errno))
return -errno;
dup_fd = -EBADF;
copy.fd = -EBADF;
}
}
if (pidref->pid > 0)
dup_pid = pidref->pid;
copy.pid = pidref->pid;
copy.fd_id = pidref->fd_id;
}
*dest = (PidRef) {
.fd = TAKE_FD(dup_fd),
.pid = dup_pid,
};
*ret = TAKE_PIDREF(copy);
return 0;
}

View File

@@ -83,7 +83,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_copy(const PidRef *pidref, PidRef *ret);
int pidref_dup(const PidRef *pidref, PidRef **ret);
int pidref_new_from_pid(pid_t pid, PidRef **ret);