fd-util: add generic resolve_xat_fdroot()

As suggested in
https://github.com/systemd/systemd/pull/40500#discussion_r2740921215
This commit is contained in:
Mike Yuan
2026-02-05 14:14:39 +01:00
parent 3065bc80cb
commit 539e2b75aa
3 changed files with 31 additions and 13 deletions
+26
View File
@@ -1105,6 +1105,32 @@ int fds_are_same_mount(int fd1, int fd2) {
return statx_inode_same(&sx1, &sx2) && statx_mount_same(&sx1, &sx2);
}
int resolve_xat_fdroot(int *fd, const char **path, char **ret_buffer) {
assert(fd);
assert(path);
assert(ret_buffer);
if (*fd != XAT_FDROOT) {
*ret_buffer = NULL;
return 0;
}
if (isempty(*path)) {
*path = "/";
*ret_buffer = NULL;
} else if (!path_is_absolute(*path)) {
char *p = strjoin("/", *path);
if (!p)
return -ENOMEM;
*path = *ret_buffer = p;
}
*fd = AT_FDCWD;
return 1;
}
char* format_proc_fd_path(char buf[static PROC_FD_PATH_MAX], int fd) {
assert(buf);
assert(fd >= 0);
+2
View File
@@ -181,6 +181,8 @@ static inline int dir_fd_is_root_or_cwd(int dir_fd) {
int fds_are_same_mount(int fd1, int fd2);
int resolve_xat_fdroot(int *fd, const char **path, char **ret_buffer);
/* The maximum length a buffer for a /proc/self/fd/<fd> path needs */
#define PROC_FD_PATH_MAX \
(STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int))
+3 -13
View File
@@ -36,19 +36,9 @@ static int verify_stat_at(
assert(verify_func);
_cleanup_free_ char *p = NULL;
if (fd == XAT_FDROOT) {
fd = AT_FDCWD;
if (isempty(path))
path = "/";
else if (!path_is_absolute(path)) {
p = strjoin("/", path);
if (!p)
return -ENOMEM;
path = p;
}
}
r = resolve_xat_fdroot(&fd, &path, &p);
if (r < 0)
return r;
if (fstatat(fd, strempty(path), &st,
(isempty(path) ? AT_EMPTY_PATH : 0) | (follow ? 0 : AT_SYMLINK_NOFOLLOW)) < 0)