1# serial 15 2dnl Copyright (C) 2002-2006, 2009-2021 Free Software Foundation, Inc. 3dnl This file is free software; the Free Software Foundation 4dnl gives unlimited permission to copy and/or distribute it, 5dnl with or without modifications, as long as this notice is preserved. 6 7dnl From Jim Meyering. 8 9AC_PREREQ([2.60]) 10 11AC_DEFUN([gl_MOUNTLIST], 12[ 13 AC_REQUIRE([AC_CANONICAL_HOST]) 14 AC_CHECK_FUNCS([listmntent]) 15 AC_CHECK_HEADERS_ONCE([sys/param.h sys/statvfs.h]) 16 17 # We must include grp.h before ucred.h on OSF V4.0, since ucred.h uses 18 # NGROUPS (as the array dimension for a struct member) without a definition. 19 AC_CHECK_HEADERS([sys/ucred.h], [], [], [#include <grp.h>]) 20 21 AC_CHECK_HEADERS([sys/mount.h], [], [], 22 [AC_INCLUDES_DEFAULT 23 [#if HAVE_SYS_PARAM_H 24 #include <sys/param.h> 25 #endif 26 ]]) 27 28 AC_CHECK_HEADERS([mntent.h sys/fs_types.h]) 29 getfsstat_includes="\ 30$ac_includes_default 31#if HAVE_SYS_PARAM_H 32# include <sys/param.h> /* needed by powerpc-apple-darwin1.3.7 */ 33#endif 34#if HAVE_SYS_UCRED_H 35# include <grp.h> /* needed for definition of NGROUPS */ 36# include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */ 37#endif 38#if HAVE_SYS_MOUNT_H 39# include <sys/mount.h> 40#endif 41#if HAVE_SYS_FS_TYPES_H 42# include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */ 43#endif 44" 45 AC_CHECK_MEMBERS([struct fsstat.f_fstypename],,,[$getfsstat_includes]) 46 47 # Determine how to get the list of mounted file systems. 48 ac_list_mounted_fs= 49 50 # If the getmntent function is available but not in the standard library, 51 # make sure LIBS contains the appropriate -l option. 52 AC_FUNC_GETMNTENT 53 54 if test -z "$ac_list_mounted_fs"; then 55 # AIX. 56 AC_CACHE_CHECK([for mntctl function and struct vmount], 57 [fu_cv_sys_mounted_vmount], 58 [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <fshelp.h>]])], 59 [fu_cv_sys_mounted_vmount=yes], 60 [fu_cv_sys_mounted_vmount=no])]) 61 if test $fu_cv_sys_mounted_vmount = yes; then 62 ac_list_mounted_fs=found 63 AC_DEFINE([MOUNTED_VMOUNT], [1], 64 [Define if there is a function named mntctl that can be used to read 65 the list of mounted file systems, and there is a system header file 66 that declares 'struct vmount'. (AIX)]) 67 fi 68 fi 69 70 if test $ac_cv_func_getmntent = yes; then 71 72 # This system has the getmntent function. 73 # Determine whether it's the one-argument variant or the two-argument one. 74 75 if test -z "$ac_list_mounted_fs"; then 76 # glibc, HP-UX, IRIX, Cygwin, Android, also (obsolete) 4.3BSD, SunOS. 77 AC_CACHE_CHECK([for one-argument getmntent function], 78 [fu_cv_sys_mounted_getmntent1], 79 [AC_COMPILE_IFELSE( 80 [AC_LANG_PROGRAM([[ 81/* SunOS 4.1.x /usr/include/mntent.h needs this for FILE */ 82#include <stdio.h> 83 84#include <mntent.h> 85#if defined __ANDROID__ /* Android */ 86# undef MOUNTED 87# define MOUNTED "/proc/mounts" 88#elif !defined MOUNTED 89# if defined _PATH_MOUNTED /* GNU libc */ 90# define MOUNTED _PATH_MOUNTED 91# endif 92# if defined MNT_MNTTAB /* HP-UX. */ 93# define MOUNTED MNT_MNTTAB 94# endif 95#endif 96]], 97 [[struct mntent *mnt = 0; char *table = MOUNTED; 98 if (sizeof mnt && sizeof table) return 0; 99 ]])], 100 [fu_cv_sys_mounted_getmntent1=yes], 101 [fu_cv_sys_mounted_getmntent1=no]) 102 ]) 103 if test $fu_cv_sys_mounted_getmntent1 = yes; then 104 ac_list_mounted_fs=found 105 AC_DEFINE([MOUNTED_GETMNTENT1], [1], 106 [Define if there is a function named getmntent for reading the list 107 of mounted file systems, and that function takes a single argument. 108 (4.3BSD, SunOS, HP-UX, Irix)]) 109 AC_CHECK_FUNCS([setmntent endmntent hasmntopt]) 110 fi 111 fi 112 113 if test -z "$ac_list_mounted_fs"; then 114 # Solaris >= 8. 115 AC_CACHE_CHECK([for getextmntent function], 116 [fu_cv_sys_mounted_getextmntent], 117 [AC_EGREP_HEADER([getextmntent], [sys/mnttab.h], 118 [fu_cv_sys_mounted_getextmntent=yes], 119 [fu_cv_sys_mounted_getextmntent=no])]) 120 if test $fu_cv_sys_mounted_getextmntent = yes; then 121 ac_list_mounted_fs=found 122 AC_DEFINE([MOUNTED_GETEXTMNTENT], [1], 123 [Define if there is a function named getextmntent for reading the list 124 of mounted file systems. (Solaris)]) 125 fi 126 fi 127 128 if test -z "$ac_list_mounted_fs"; then 129 # Solaris < 8, also (obsolete) SVR4. 130 # Solaris >= 8 has the two-argument getmntent but is already handled above. 131 AC_CACHE_CHECK([for two-argument getmntent function], 132 [fu_cv_sys_mounted_getmntent2], 133 [AC_EGREP_HEADER([getmntent], [sys/mnttab.h], 134 [fu_cv_sys_mounted_getmntent2=yes], 135 [fu_cv_sys_mounted_getmntent2=no]) 136 ]) 137 if test $fu_cv_sys_mounted_getmntent2 = yes; then 138 ac_list_mounted_fs=found 139 AC_DEFINE([MOUNTED_GETMNTENT2], [1], 140 [Define if there is a function named getmntent for reading the list of 141 mounted file systems, and that function takes two arguments. (SVR4)]) 142 AC_CHECK_FUNCS([hasmntopt]) 143 fi 144 fi 145 146 fi 147 148 if test -z "$ac_list_mounted_fs"; then 149 # OSF/1, also (obsolete) Apple Darwin 1.3. 150 # powerpc-apple-darwin1.3.7 needs sys/param.h sys/ucred.h sys/fs_types.h 151 152 AC_CACHE_CHECK([for getfsstat function], 153 [fu_cv_sys_mounted_getfsstat], 154 [AC_LINK_IFELSE( 155 [AC_LANG_PROGRAM([[ 156#include <sys/types.h> 157#if HAVE_STRUCT_FSSTAT_F_FSTYPENAME 158# define FS_TYPE(Ent) ((Ent).f_fstypename) 159#else 160# define FS_TYPE(Ent) mnt_names[(Ent).f_type] 161#endif 162$getfsstat_includes 163 ]], 164 [[struct statfs *stats; 165 int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); 166 char *t = FS_TYPE (*stats); 167 ]])], 168 [fu_cv_sys_mounted_getfsstat=yes], 169 [fu_cv_sys_mounted_getfsstat=no]) 170 ]) 171 if test $fu_cv_sys_mounted_getfsstat = yes; then 172 ac_list_mounted_fs=found 173 AC_DEFINE([MOUNTED_GETFSSTAT], [1], 174 [Define if there is a function named getfsstat for reading the 175 list of mounted file systems. (DEC Alpha running OSF/1)]) 176 fi 177 fi 178 179 if test -z "$ac_list_mounted_fs"; then 180 # (obsolete) SVR3 181 AC_CACHE_CHECK([for FIXME existence of three headers], 182 [fu_cv_sys_mounted_fread_fstyp], 183 [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ 184#include <sys/statfs.h> 185#include <sys/fstyp.h> 186#include <mnttab.h> 187]])], 188 [fu_cv_sys_mounted_fread_fstyp=yes], 189 [fu_cv_sys_mounted_fread_fstyp=no]) 190 ]) 191 if test $fu_cv_sys_mounted_fread_fstyp = yes; then 192 ac_list_mounted_fs=found 193 AC_DEFINE([MOUNTED_FREAD_FSTYP], [1], 194 [Define if (like SVR2) there is no specific function for reading the 195 list of mounted file systems, and your system has these header files: 196 <sys/fstyp.h> and <sys/statfs.h>. (SVR3)]) 197 fi 198 fi 199 200 if test -z "$ac_list_mounted_fs"; then 201 # Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, also (obsolete) 4.4BSD. 202 # OSF/1 also has getmntinfo but is already handled above. 203 # We cannot use AC_CHECK_FUNCS([getmntinfo]) here, because at the linker 204 # level the function is sometimes called getmntinfo64 or getmntinfo$INODE64 205 # on Mac OS X, __getmntinfo13 on NetBSD and Minix, _F64_getmntinfo on OSF/1. 206 AC_CACHE_CHECK([for getmntinfo function], 207 [fu_cv_sys_mounted_getmntinfo], 208 [AC_LINK_IFELSE( 209 [AC_LANG_PROGRAM([[ 210#if HAVE_SYS_PARAM_H 211# include <sys/param.h> 212#endif 213#include <sys/types.h> 214#if HAVE_SYS_MOUNT_H 215# include <sys/mount.h> 216#endif 217#if HAVE_SYS_STATVFS_H 218# include <sys/statvfs.h> 219#endif 220#include <stdlib.h> 221 ]], 222 [[int count = getmntinfo (NULL, MNT_WAIT); 223 ]])], 224 [fu_cv_sys_mounted_getmntinfo=yes], 225 [fu_cv_sys_mounted_getmntinfo=no]) 226 ]) 227 if test $fu_cv_sys_mounted_getmntinfo = yes; then 228 AC_CACHE_CHECK([whether getmntinfo returns statvfs structures], 229 [fu_cv_sys_mounted_getmntinfo2], 230 [AC_COMPILE_IFELSE( 231 [AC_LANG_PROGRAM([[ 232#if HAVE_SYS_PARAM_H 233# include <sys/param.h> 234#endif 235#include <sys/types.h> 236#if HAVE_SYS_MOUNT_H 237# include <sys/mount.h> 238#endif 239#if HAVE_SYS_STATVFS_H 240# include <sys/statvfs.h> 241#endif 242extern 243#ifdef __cplusplus 244"C" 245#endif 246int getmntinfo (struct statfs **, int); 247 ]], [[]])], 248 [fu_cv_sys_mounted_getmntinfo2=no], 249 [fu_cv_sys_mounted_getmntinfo2=yes]) 250 ]) 251 if test $fu_cv_sys_mounted_getmntinfo2 = no; then 252 # Mac OS X, FreeBSD, OpenBSD, also (obsolete) 4.4BSD. 253 ac_list_mounted_fs=found 254 AC_DEFINE([MOUNTED_GETMNTINFO], [1], 255 [Define if there is a function named getmntinfo for reading the 256 list of mounted file systems and it returns an array of 257 'struct statfs'. (4.4BSD, Darwin)]) 258 else 259 # NetBSD, Minix. 260 ac_list_mounted_fs=found 261 AC_DEFINE([MOUNTED_GETMNTINFO2], [1], 262 [Define if there is a function named getmntinfo for reading the 263 list of mounted file systems and it returns an array of 264 'struct statvfs'. (NetBSD 3.0)]) 265 fi 266 fi 267 fi 268 269 if test -z "$ac_list_mounted_fs"; then 270 # Haiku, also (obsolete) BeOS. 271 AC_CHECK_FUNCS([next_dev fs_stat_dev]) 272 AC_CHECK_HEADERS([fs_info.h]) 273 AC_CACHE_CHECK([for BEOS mounted file system support functions], 274 [fu_cv_sys_mounted_fs_stat_dev], 275 [if test $ac_cv_header_fs_info_h = yes \ 276 && test $ac_cv_func_next_dev = yes \ 277 && test $ac_cv_func_fs_stat_dev = yes; then 278 fu_cv_sys_mounted_fs_stat_dev=yes 279 else 280 fu_cv_sys_mounted_fs_stat_dev=no 281 fi 282 ]) 283 if test $fu_cv_sys_mounted_fs_stat_dev = yes; then 284 ac_list_mounted_fs=found 285 AC_DEFINE([MOUNTED_FS_STAT_DEV], [1], 286 [Define if there are functions named next_dev and fs_stat_dev for 287 reading the list of mounted file systems. (BeOS)]) 288 fi 289 fi 290 291 if test -z "$ac_list_mounted_fs"; then 292 # Interix / BSD alike statvfs 293 # the code is really interix specific, so make sure, we're on it. 294 case "$host" in 295 *-interix*) 296 AC_CHECK_FUNCS([statvfs]) 297 if test $ac_cv_func_statvfs = yes; then 298 ac_list_mounted_fs=found 299 AC_DEFINE([MOUNTED_INTERIX_STATVFS], [1], 300 [Define if we are on interix, and ought to use statvfs plus 301 some special knowledge on where mounted file systems can be 302 found. (Interix)]) 303 fi 304 ;; 305 esac 306 fi 307 308 if test -z "$ac_list_mounted_fs"; then 309 AC_MSG_ERROR([could not determine how to read list of mounted file systems]) 310 # FIXME -- no need to abort building the whole package 311 # Can't build mountlist.c or anything that needs its functions 312 fi 313 314 if test $ac_list_mounted_fs = found; then 315 gl_cv_list_mounted_fs=yes 316 else 317 gl_cv_list_mounted_fs=no 318 fi 319]) 320 321# Prerequisites of lib/mountlist.c not done by gl_MOUNTLIST. 322AC_DEFUN([gl_PREREQ_MOUNTLIST_EXTRA], 323[ 324 dnl Note gl_MOUNTLIST checks for mntent.h, not sys/mntent.h. 325 AC_CHECK_HEADERS([sys/mntent.h]) 326 AC_HEADER_MAJOR()dnl for use of makedev () 327 gl_FSTYPENAME 328]) 329 330# Replace Autoconf's AC_FUNC_GETMNTENT to omit checks that are unnecessary 331# nowadays. 332AC_DEFUN([AC_FUNC_GETMNTENT], 333[ 334 # getmntent is in the standard C library on most systems, but in -lgen on 335 # Unixware. 336 AC_SEARCH_LIBS([getmntent], [gen]) 337 AC_CHECK_FUNCS([getmntent]) 338]) 339