From: Lennart Poettering Date: Thu, 2 Nov 2023 10:31:13 +0000 (+0100) Subject: fd-util: add new FORMAT_PROC_PID_FD_PATH() helper X-Git-Tag: v255-rc1~43^2~11 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=61c062f896a9a59cab6899d3c8ba3e3d1e4e0c61;p=thirdparty%2Fsystemd.git fd-util: add new FORMAT_PROC_PID_FD_PATH() helper This is just like FORMAT_PROC_FD_PATH() but goes via the PID number rather than the "self" symlink. This is useful whenever we want to generate a path that is useful outside of our local scope. --- diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index f2b606ea9b4..32289cfd09e 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -988,3 +988,11 @@ const char *accmode_to_string(int flags) { return NULL; } } + +char *format_proc_pid_fd_path(char buf[static PROC_PID_FD_PATH_MAX], pid_t pid, int fd) { + assert(buf); + assert(fd >= 0); + assert(pid >= 0); + assert_se(snprintf_ok(buf, PROC_PID_FD_PATH_MAX, "/proc/" PID_FMT "/fd/%i", pid == 0 ? getpid_cached() : pid, fd)); + return buf; +} diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index aba8f5f5af9..5061e32196a 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -131,6 +131,16 @@ static inline char *format_proc_fd_path(char buf[static PROC_FD_PATH_MAX], int f #define FORMAT_PROC_FD_PATH(fd) \ format_proc_fd_path((char[PROC_FD_PATH_MAX]) {}, (fd)) +/* The maximum length a buffer for a /proc//fd/ path needs */ +#define PROC_PID_FD_PATH_MAX \ + (STRLEN("/proc//fd/") + DECIMAL_STR_MAX(pid_t) + DECIMAL_STR_MAX(int)) + +char *format_proc_pid_fd_path(char buf[static PROC_PID_FD_PATH_MAX], pid_t pid, int fd); + +/* Kinda the same as FORMAT_PROC_FD_PATH(), but goes by PID rather than "self" symlink */ +#define FORMAT_PROC_PID_FD_PATH(pid, fd) \ + format_proc_pid_fd_path((char[PROC_PID_FD_PATH_MAX]) {}, (pid), (fd)) + const char *accmode_to_string(int flags); /* Like ASSERT_PTR, but for fds */