]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: fix statx() includes
authorKarel Zak <kzak@redhat.com>
Wed, 23 Aug 2023 09:50:37 +0000 (11:50 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 31 Aug 2023 08:26:24 +0000 (10:26 +0200)
Using sys/stat.h and linux/stat is too tricky.h together. It seems
better to rely on libc and use sys/stat.h only. Users affected
by old libc must update to use recent util-linux.

Fixes: https://github.com/util-linux/util-linux/issues/2448
Signed-off-by: Karel Zak <kzak@redhat.com>
configure.ac
include/fileutils.h
libmount/src/hook_mount.c
libmount/src/utils.c
meson.build

index 738b369ee81bc2e784e1d5da14f90e1a568a56e0..e6114aac364cc529ff5e5cf5771243799469e526 100644 (file)
@@ -326,7 +326,6 @@ AC_CHECK_HEADERS([ \
        linux/nsfs.h \
        linux/pr.h \
        linux/raw.h \
-       linux/stat.h \
        linux/securebits.h \
        linux/tiocl.h \
        linux/version.h \
@@ -518,7 +517,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 ])
 
 AC_CHECK_TYPES([struct mount_attr], [], [], [[#include <linux/mount.h>]])
-AC_CHECK_TYPES([struct statx], [], [], [[#include <linux/stat.h>]])
 AC_CHECK_TYPES([enum fsconfig_command], [], [], [[#include <linux/mount.h>]])
 
 AC_CHECK_MEMBERS([struct termios.c_line],,,
@@ -527,8 +525,9 @@ AC_CHECK_MEMBERS([struct termios.c_line],,,
 AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec],,,
     [[#include <sys/stat.h>]])
 
+AC_CHECK_TYPES([struct statx], [], [], [[#include <sys/stat.h>]])
 AC_CHECK_MEMBERS([struct statx.stx_mnt_id],,,
-    [[#include <linux/stat.h>]])
+    [[#include <sys/stat.h>]])
 
 AC_CHECK_DECLS([_NL_TIME_WEEK_1STDAY],[],[],[[#include <langinfo.h>]])
 
index a5fe517266f516b4f19d2e5961bbf29dbf90e646..538eab0b74eb250f767926290728a053396a63ca 100644 (file)
@@ -94,13 +94,13 @@ static inline int close_range(unsigned int first, unsigned int last, int flags)
 #  define HAVE_CLOSE_RANGE 1
 # endif        /* SYS_close_range */
 
-# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx) && defined(HAVE_LINUX_STAT_H)
-#  include <linux/stat.h>
+# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx)
 static inline int statx(int fd, const char *restrict path, int flags,
                    unsigned int mask, struct statx *stx)
 {
        return syscall(SYS_statx, fd, path, flags, mask, stx);
 }
+#  define HAVE_STATX 1
 # endif /* SYS_statx */
 
 #endif /* HAVE_SYS_SYSCALL_H */
index 056338c491424b5d68528a9c7e4259cc6346cdec..0ebb8299853974acdbb4d28e5aced4339126481e 100644 (file)
@@ -294,7 +294,7 @@ static int hook_create_mount(struct libmnt_context *cxt,
                /* cleanup after fail (libmount may only try the FS type) */
                close_sysapi_fds(api);
 
-#if defined(HAVE_STRUCT_STATX) && defined(HAVE_STRUCT_STATX_STX_MNT_ID)
+#if defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(HAVE_STRUCT_STATX_STX_MNT_ID)
        if (!rc && cxt->fs) {
                struct statx st;
 
index 1d3f4abcecec73d2be5708ee0c07b6ba749312cd..3817b392711c89e3f272749d34fe853f0f6da729 100644 (file)
@@ -111,7 +111,7 @@ static int safe_stat(const char *target, struct stat *st, int nofollow)
 
        memset(st, 0, sizeof(struct stat));
 
-#if defined(AT_STATX_DONT_SYNC) && defined (HAVE_STRUCT_STATX)
+#if defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(AT_STATX_DONT_SYNC)
        {
                int rc;
                struct statx stx = { 0 };
index 221ae373b6446449bd041fe1dea8b07c4168be2a..6beb9dbaba85e37943f39bfb0f29d85a4b63db34 100644 (file)
@@ -79,7 +79,7 @@ have_mountfd_api = cc.sizeof('struct mount_attr', prefix : '#include <linux/moun
 conf.set('HAVE_STRUCT_MOUNT_ATTR', have_mountfd_api ? 1 : false)
 conf.set('HAVE_MOUNTFD_API', have_mountfd_api ? 1 : false)
 
-have_struct_statx = cc.sizeof('struct statx', prefix : '#include <linux/stat.h>') > 0
+have_struct_statx = cc.sizeof('struct statx', prefix : '#include <sys/stat.h>') > 0
 conf.set('HAVE_STRUCT_STATX', have_struct_statx ? 1 : false)
 
 build_libmount = not get_option('build-libmount').disabled()
@@ -177,7 +177,6 @@ headers = '''
         linux/nsfs.h
         linux/mount.h
         linux/pr.h
-        linux/stat.h
         linux/securebits.h
         linux/tiocl.h
         linux/version.h
@@ -640,7 +639,7 @@ have = cc.has_member('struct stat', 'st_mtim.tv_nsec',
 conf.set('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC', have ? 1 : false)
 
 have = cc.has_member('struct statx', 'stx_mnt_id',
-                     prefix : '#include <linux/stat.h>')
+                     prefix : '#include <sys/stat.h>')
 conf.set('HAVE_STRUCT_STATX_STX_MNT_ID', have ? 1 : false)
 
 # replacement for AC_STRUCT_TIMEZONE