]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: check for struct statx
authorMarkus Mayer <mmayer@broadcom.com>
Tue, 1 Aug 2023 19:59:27 +0000 (12:59 -0700)
committerKarel Zak <kzak@redhat.com>
Wed, 16 Aug 2023 09:28:19 +0000 (11:28 +0200)
Let's ensure struct statx exists before we try to use it. Checking for
the existence of linux/stat.h is not sufficient. This is because
[uapi/]linux/stat.h has existed since Linux 3.7, however struct statx
was only introduced with Linux 4.11.

The problem arises if one happens ot be using kernel headers from within
the aforementioned range, such as Linux 4.9.

  CC       libmount/src/la-utils.lo
In file included from libmount/src/utils.c:31:
./include/fileutils.h:100:33: warning: declaration of 'struct statx' will not
be visible outside of this function [-Wvisibility]
                    unsigned int mask, struct statx *stx)
                                              ^
libmount/src/utils.c:117:16: error: variable has incomplete type 'struct statx'
                struct statx stx = { 0 };
                             ^
libmount/src/utils.c:117:10: note: forward declaration of 'struct statx'
                struct statx stx = { 0 };
                       ^
libmount/src/utils.c:125:5: error: use of undeclared identifier 'STATX_TYPE'
                                STATX_TYPE
                                ^
libmount/src/utils.c:126:8: error: use of undeclared identifier 'STATX_MODE'
                                        | STATX_MODE
                                          ^
libmount/src/utils.c:127:8: error: use of undeclared identifier 'STATX_INO'
                                        | STATX_INO,
                                          ^
1 warning and 4 errors generated.
make[4]: *** [Makefile:11269: libmount/src/la-utils.lo] Error 1

Checking for the presence of struct statx explicitly avoids this
problem.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
configure.ac
include/fileutils.h
libmount/src/utils.c

index 0c1d06b447ba46447eeb0b025f5539b8e042e415..13eb6c1e6ddcc8aa477e718071e33d27b3595697 100644 (file)
@@ -507,6 +507,7 @@ 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],,,
index 13d2bdf0c6e588d49a2e94d8d72b0ab7a0d0252d..a5fe517266f516b4f19d2e5961bbf29dbf90e646 100644 (file)
@@ -94,7 +94,7 @@ 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(SYS_statx) && defined(HAVE_LINUX_STAT_H)
+# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx) && defined(HAVE_LINUX_STAT_H)
 #  include <linux/stat.h>
 static inline int statx(int fd, const char *restrict path, int flags,
                    unsigned int mask, struct statx *stx)
index 410ded4aa27bd2f4cca04a07bd06263c16d170bc..1d3f4abcecec73d2be5708ee0c07b6ba749312cd 100644 (file)
@@ -111,7 +111,7 @@ static int safe_stat(const char *target, struct stat *st, int nofollow)
 
        memset(st, 0, sizeof(struct stat));
 
-#ifdef AT_STATX_DONT_SYNC
+#if defined(AT_STATX_DONT_SYNC) && defined (HAVE_STRUCT_STATX)
        {
                int rc;
                struct statx stx = { 0 };