various: use xstatx()
This commit is contained in:
+12
-19
@@ -1077,30 +1077,23 @@ int path_is_root_at(int dir_fd, const char *path) {
|
||||
}
|
||||
|
||||
int fds_are_same_mount(int fd1, int fd2) {
|
||||
struct statx sx1 = {}, sx2 = {}; /* explicitly initialize the struct to make msan silent. */
|
||||
struct statx sx1, sx2;
|
||||
int r;
|
||||
|
||||
assert(fd1 >= 0 || IN_SET(fd1, AT_FDCWD, XAT_FDROOT));
|
||||
assert(fd2 >= 0 || IN_SET(fd2, AT_FDCWD, XAT_FDROOT));
|
||||
|
||||
const char *fn1;
|
||||
if (fd1 == XAT_FDROOT) {
|
||||
fd1 = AT_FDCWD;
|
||||
fn1 = "/";
|
||||
} else
|
||||
fn1 = "";
|
||||
r = xstatx(fd1, /* path = */ NULL, AT_EMPTY_PATH,
|
||||
STATX_TYPE|STATX_INO|STATX_MNT_ID,
|
||||
&sx1);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (statx(fd1, fn1, AT_EMPTY_PATH, STATX_TYPE|STATX_INO|STATX_MNT_ID, &sx1) < 0)
|
||||
return -errno;
|
||||
|
||||
const char *fn2;
|
||||
if (fd2 == XAT_FDROOT) {
|
||||
fd2 = AT_FDCWD;
|
||||
fn2 = "/";
|
||||
} else
|
||||
fn2 = "";
|
||||
|
||||
if (statx(fd2, fn2, AT_EMPTY_PATH, STATX_TYPE|STATX_INO|STATX_MNT_ID, &sx2) < 0)
|
||||
return -errno;
|
||||
r = xstatx(fd2, /* path = */ NULL, AT_EMPTY_PATH,
|
||||
STATX_TYPE|STATX_INO|STATX_MNT_ID,
|
||||
&sx2);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return statx_inode_same(&sx1, &sx2) && statx_mount_same(&sx1, &sx2);
|
||||
}
|
||||
|
||||
@@ -419,9 +419,6 @@ int getcrtime_at(
|
||||
assert(fd >= 0 || fd == AT_FDCWD);
|
||||
assert((at_flags & ~(AT_SYMLINK_FOLLOW|AT_EMPTY_PATH)) == 0);
|
||||
|
||||
if (isempty(path))
|
||||
at_flags |= AT_EMPTY_PATH;
|
||||
|
||||
/* So here's the deal: the creation/birth time (crtime/btime) of a file is a relatively newly supported concept
|
||||
* on Linux (or more strictly speaking: a concept that only recently got supported in the API, it was
|
||||
* implemented on various file systems on the lower level since a while, but never was accessible). However, we
|
||||
@@ -432,11 +429,13 @@ int getcrtime_at(
|
||||
* concept is useful for determining how "old" a file really is, and hence using the older of the two makes
|
||||
* most sense. */
|
||||
|
||||
if (statx(fd, strempty(path),
|
||||
at_flags_normalize_nofollow(at_flags)|AT_STATX_DONT_SYNC,
|
||||
STATX_BTIME,
|
||||
&sx) >= 0 &&
|
||||
FLAGS_SET(sx.stx_mask, STATX_BTIME) && sx.stx_btime.tv_sec != 0)
|
||||
r = xstatx_full(fd, path,
|
||||
at_flags_normalize_nofollow(at_flags)|AT_STATX_DONT_SYNC,
|
||||
/* mandatory_mask = */ 0,
|
||||
STATX_BTIME,
|
||||
/* mandatory_attributes = */ 0,
|
||||
&sx);
|
||||
if (r > 0 && sx.stx_btime.tv_sec != 0) /* > 0: all optional masks are supported */
|
||||
a = statx_timestamp_load(&sx.stx_btime);
|
||||
else
|
||||
a = USEC_INFINITY;
|
||||
|
||||
Reference in New Issue
Block a user