From: Lennart Poettering Date: Mon, 19 Sep 2022 14:51:08 +0000 (+0200) Subject: stat-util: add statx_inode_same() helper to check if two statx structs refer to same... X-Git-Tag: v252-rc1~132^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2bd315fb2be91654839e148c02d96a837f87a38b;p=thirdparty%2Fsystemd.git stat-util: add statx_inode_same() helper to check if two statx structs refer to same inode The same as stat_inode_same(), but for struct statx rather than struct stat. --- diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index c31b4d89d02..cb6fe9ebdb6 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -360,6 +360,19 @@ bool stat_inode_unmodified(const struct stat *a, const struct stat *b) { (!(S_ISCHR(a->st_mode) || S_ISBLK(a->st_mode)) || a->st_rdev == b->st_rdev); /* if device node, also compare major/minor, because we can */ } +bool statx_inode_same(const struct statx *a, const struct statx *b) { + + /* Same as stat_inode_same() but for struct statx */ + + return a && b && + FLAGS_SET(a->stx_mask, STATX_TYPE|STATX_INO) && FLAGS_SET(b->stx_mask, STATX_TYPE|STATX_INO) && + (a->stx_mode & S_IFMT) != 0 && + ((a->stx_mode ^ b->stx_mode) & S_IFMT) == 0 && + a->stx_dev_major == b->stx_dev_major && + a->stx_dev_minor == b->stx_dev_minor && + a->stx_ino == b->stx_ino; +} + int statx_fallback(int dfd, const char *path, int flags, unsigned mask, struct statx *sx) { static bool avoid_statx = false; struct stat st; diff --git a/src/basic/stat-util.h b/src/basic/stat-util.h index 56f15534aa2..4972af0c695 100644 --- a/src/basic/stat-util.h +++ b/src/basic/stat-util.h @@ -73,6 +73,8 @@ int proc_mounted(void); bool stat_inode_same(const struct stat *a, const struct stat *b); bool stat_inode_unmodified(const struct stat *a, const struct stat *b); +bool statx_inode_same(const struct statx *a, const struct statx *b); + int statx_fallback(int dfd, const char *path, int flags, unsigned mask, struct statx *sx); #if HAS_FEATURE_MEMORY_SANITIZER