From: Lennart Poettering Date: Mon, 18 Nov 2024 10:23:07 +0000 (+0100) Subject: process-util: add helper for getting our own pidfdid X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=221d6e54c60389f26c2c79dbfa4e83204d2775d7;p=thirdparty%2Fsystemd.git process-util: add helper for getting our own pidfdid --- diff --git a/src/basic/process-util.c b/src/basic/process-util.c index adc576a84f8..a8578a0c402 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -11,6 +12,9 @@ #include #include #include +#if HAVE_PIDFD_OPEN +#include +#endif #include #include #include @@ -40,6 +44,7 @@ #include "log.h" #include "macro.h" #include "memory-util.h" +#include "missing_magic.h" #include "missing_sched.h" #include "missing_syscall.h" #include "missing_threads.h" @@ -2262,3 +2267,42 @@ _noreturn_ void report_errno_and_exit(int errno_fd, int error) { _exit(EXIT_FAILURE); } + +int getpidfdid_cached(uint64_t *ret) { + static uint64_t cached = 0; + static int initialized = 0; + int r; + + assert(ret); + + if (initialized > 0) { + *ret = cached; + return 0; + } + if (initialized < 0) + return initialized; + + _cleanup_close_ int fd = pidfd_open(getpid_cached(), 0); + if (fd < 0) { + if (ERRNO_IS_NOT_SUPPORTED(errno)) + return (initialized = -EOPNOTSUPP); + + return -errno; + } + + r = fd_is_fs_type(fd, PID_FS_MAGIC); + if (r < 0) + return r; + if (r == 0) + return (initialized = -EOPNOTSUPP); + + struct stat st; + if (fstat(fd, &st) < 0) + return -errno; + if (st.st_ino == 0) + return (initialized = -EOPNOTSUPP); + + *ret = cached = st.st_ino; + initialized = 1; + return 0; +} diff --git a/src/basic/process-util.h b/src/basic/process-util.h index 0763b64cff0..a97ae387cec 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -275,3 +275,5 @@ int proc_dir_read(DIR *d, pid_t *ret); int proc_dir_read_pidref(DIR *d, PidRef *ret); _noreturn_ void report_errno_and_exit(int errno_fd, int error); + +int getpidfdid_cached(uint64_t *ret); diff --git a/src/test/test-process-util.c b/src/test/test-process-util.c index e6ba6fea707..e517d6b467d 100644 --- a/src/test/test-process-util.c +++ b/src/test/test-process-util.c @@ -994,6 +994,21 @@ TEST(pid_get_start_time) { ASSERT_GE(start_time2, start_time); } +TEST(getpidfdid_cached) { + int r; + + log_info("pid=" PID_FMT, getpid_cached()); + + uint64_t id; + r = getpidfdid_cached(&id); + if (ERRNO_IS_NEG_NOT_SUPPORTED(r)) + log_info("pidfdid not supported"); + else { + assert(r >= 0); + log_info("pidfdid=%" PRIu64, id); + } +} + static int intro(void) { log_show_color(true); return EXIT_SUCCESS;