#include "fileio.h"
#include "macro.h"
#include "memory-util.h"
+#include "missing_magic.h"
#include "parse-util.h"
#include "path-util.h"
#include "pidfd-util.h"
+#include "process-util.h"
+#include "stat-util.h"
#include "string-util.h"
+static int have_pidfs = -1;
+
+static int pidfd_check_pidfs(void) {
+
+ if (have_pidfs >= 0)
+ return have_pidfs;
+
+ _cleanup_close_ int fd = pidfd_open(getpid_cached(), 0);
+ if (fd < 0) {
+ if (ERRNO_IS_NOT_SUPPORTED(errno))
+ return (have_pidfs = false);
+
+ return -errno;
+ }
+
+ return (have_pidfs = fd_is_fs_type(fd, PID_FS_MAGIC));
+}
+
int pidfd_get_pid(int fd, pid_t *ret) {
char path[STRLEN("/proc/self/fdinfo/") + DECIMAL_STR_MAX(int)];
_cleanup_free_ char *fdinfo = NULL;
return current_pid != pid ? -ESRCH : 0;
}
+
+int pidfd_get_inode_id(int fd, uint64_t *ret) {
+ int r;
+
+ assert(fd >= 0);
+
+ r = pidfd_check_pidfs();
+ if (r < 0)
+ return r;
+ if (r == 0)
+ return -EOPNOTSUPP;
+
+ struct stat st;
+ if (fstat(fd, &st) < 0)
+ return -errno;
+
+ if (ret)
+ *ret = (uint64_t) st.st_ino;
+ return 0;
+}
int pidfd_get_pid(int fd, pid_t *ret);
int pidfd_verify_pid(int pidfd, pid_t pid);
+
+int pidfd_get_inode_id(int fd, uint64_t *ret);
#include "errno-util.h"
#include "fd-util.h"
-#include "missing_magic.h"
#include "missing_syscall.h"
#include "missing_wait.h"
#include "parse-util.h"
#include "pidref.h"
#include "process-util.h"
#include "signal-util.h"
-#include "stat-util.h"
-
-static int pidfd_inode_ids_supported(void) {
- static int cached = -1;
-
- if (cached >= 0)
- return cached;
-
- _cleanup_close_ int fd = pidfd_open(getpid_cached(), 0);
- if (fd < 0) {
- if (ERRNO_IS_NOT_SUPPORTED(errno))
- return (cached = false);
-
- return -errno;
- }
-
- return (cached = fd_is_fs_type(fd, PID_FS_MAGIC));
-}
int pidref_acquire_pidfd_id(PidRef *pidref) {
int r;
if (pidref->fd_id > 0)
return 0;
- r = pidfd_inode_ids_supported();
- if (r < 0)
+ r = pidfd_get_inode_id(pidref->fd, &pidref->fd_id);
+ if (r < 0) {
+ if (!ERRNO_IS_NEG_NOT_SUPPORTED(r))
+ log_debug_errno(r, "Failed to get inode number of pidfd for pid " PID_FMT ": %m",
+ pidref->pid);
return r;
- if (r == 0)
- return -EOPNOTSUPP;
-
- struct stat st;
-
- if (fstat(pidref->fd, &st) < 0)
- return log_debug_errno(errno, "Failed to get inode number of pidfd for pid " PID_FMT ": %m",
- pidref->pid);
+ }
- pidref->fd_id = (uint64_t) st.st_ino;
return 0;
}