2 # How to list mounted file systems.
4 # Copyright (C) 1998-2004, 2006, 2009-2018 Free Software Foundation, Inc.
6 # This file is free software; the Free Software Foundation
7 # gives unlimited permission to copy and/or distribute it,
8 # with or without modifications, as long as this notice is preserved.
10 dnl From Jim Meyering.
12 dnl This is not pretty. I've just taken the autoconf code and wrapped
13 dnl it in an AC_DEFUN and made some other fixes.
16 # Replace Autoconf's AC_FUNC_GETMNTENT to work around a bug in Autoconf
17 # through Autoconf 2.59. We can remove this once we assume Autoconf 2.60
19 AC_DEFUN([AC_FUNC_GETMNTENT],
20 [# getmntent is in the standard C library on UNICOS, in -lsun on Irix 4,
21 # -lseq on Dynix/PTX, -lgen on Unixware.
22 AC_SEARCH_LIBS([getmntent], [sun seq gen])
23 AC_CHECK_FUNCS([getmntent])
26 # gl_LIST_MOUNTED_FILE_SYSTEMS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
27 AC_DEFUN([gl_LIST_MOUNTED_FILE_SYSTEMS],
29 AC_REQUIRE([AC_CANONICAL_HOST])
30 AC_CHECK_FUNCS([listmntent getmntinfo])
31 AC_CHECK_HEADERS_ONCE([sys/param.h sys/statvfs.h])
33 # We must include grp.h before ucred.h on OSF V4.0, since ucred.h uses
34 # NGROUPS (as the array dimension for a struct member) without a definition.
35 AC_CHECK_HEADERS([sys/ucred.h], [], [], [#include <grp.h>])
37 AC_CHECK_HEADERS([sys/mount.h], [], [],
40 #include <sys/param.h>
43 AC_CHECK_HEADERS([mntent.h sys/fs_types.h])
47 # include <sys/param.h> /* needed by powerpc-apple-darwin1.3.7 */
50 # include <grp.h> /* needed for definition of NGROUPS */
51 # include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
54 # include <sys/mount.h>
56 #if HAVE_SYS_FS_TYPES_H
57 # include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */
60 AC_CHECK_MEMBERS([struct fsstat.f_fstypename],,,[$getfsstat_includes])
62 # Determine how to get the list of mounted file systems.
65 # If the getmntent function is available but not in the standard library,
66 # make sure LIBS contains the appropriate -l option.
69 # This test must precede the ones for getmntent because Unicos-9 is
70 # reported to have the getmntent function, but its support is incompatible
71 # with other getmntent implementations.
73 # NOTE: Normally, I wouldn't use a check for system type as I've done for
74 # 'CRAY' below since that goes against the whole autoconf philosophy. But
75 # I think there is too great a chance that some non-Cray system has a
76 # function named listmntent to risk the false positive.
78 if test -z "$ac_list_mounted_fs"; then
79 # (obsolete) Cray UNICOS 9
80 AC_MSG_CHECKING([for listmntent of Cray/Unicos-9])
81 AC_CACHE_VAL([fu_cv_sys_mounted_cray_listmntent],
82 [fu_cv_sys_mounted_cray_listmntent=no
87 ], [test $ac_cv_func_listmntent = yes \
88 && fu_cv_sys_mounted_cray_listmntent=yes]
92 AC_MSG_RESULT([$fu_cv_sys_mounted_cray_listmntent])
93 if test $fu_cv_sys_mounted_cray_listmntent = yes; then
94 ac_list_mounted_fs=found
95 AC_DEFINE([MOUNTED_LISTMNTENT], [1],
96 [Define if there is a function named listmntent that can be used to
97 list all mounted file systems. (UNICOS)])
101 if test -z "$ac_list_mounted_fs"; then
103 AC_MSG_CHECKING([for mntctl function and struct vmount])
104 AC_CACHE_VAL([fu_cv_sys_mounted_vmount],
105 [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <fshelp.h>]])],
106 [fu_cv_sys_mounted_vmount=yes],
107 [fu_cv_sys_mounted_vmount=no])])
108 AC_MSG_RESULT([$fu_cv_sys_mounted_vmount])
109 if test $fu_cv_sys_mounted_vmount = yes; then
110 ac_list_mounted_fs=found
111 AC_DEFINE([MOUNTED_VMOUNT], [1],
112 [Define if there is a function named mntctl that can be used to read
113 the list of mounted file systems, and there is a system header file
114 that declares 'struct vmount'. (AIX)])
118 if test $ac_cv_func_getmntent = yes; then
120 # This system has the getmntent function.
121 # Determine whether it's the one-argument variant or the two-argument one.
123 if test -z "$ac_list_mounted_fs"; then
124 # glibc, HP-UX, IRIX, Cygwin, Android, also (obsolete) 4.3BSD, SunOS, Dynix.
125 AC_MSG_CHECKING([for one-argument getmntent function])
126 AC_CACHE_VAL([fu_cv_sys_mounted_getmntent1],
127 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
128 /* SunOS 4.1.x /usr/include/mntent.h needs this for FILE */
133 # if defined _PATH_MOUNTED /* GNU libc */
134 # define MOUNTED _PATH_MOUNTED
136 # if defined MNT_MNTTAB /* HP-UX. */
137 # define MOUNTED MNT_MNTTAB
139 # if defined MNTTABNAME /* Dynix. */
140 # define MOUNTED MNTTABNAME
144 [[ struct mntent *mnt = 0; char *table = MOUNTED;
145 if (sizeof mnt && sizeof table) return 0;]])],
146 [fu_cv_sys_mounted_getmntent1=yes],
147 [fu_cv_sys_mounted_getmntent1=no])])
148 AC_MSG_RESULT([$fu_cv_sys_mounted_getmntent1])
149 if test $fu_cv_sys_mounted_getmntent1 = yes; then
150 ac_list_mounted_fs=found
151 AC_DEFINE([MOUNTED_GETMNTENT1], [1],
152 [Define if there is a function named getmntent for reading the list
153 of mounted file systems, and that function takes a single argument.
154 (4.3BSD, SunOS, HP-UX, Dynix, Irix)])
155 AC_CHECK_FUNCS([hasmntopt])
159 if test -z "$ac_list_mounted_fs"; then
160 # Solaris, also (obsolete) SVR4.
161 AC_MSG_CHECKING([for two-argument getmntent function])
162 AC_CACHE_VAL([fu_cv_sys_mounted_getmntent2],
163 [AC_EGREP_HEADER([getmntent], [sys/mnttab.h],
164 fu_cv_sys_mounted_getmntent2=yes,
165 fu_cv_sys_mounted_getmntent2=no)])
166 AC_MSG_RESULT([$fu_cv_sys_mounted_getmntent2])
167 if test $fu_cv_sys_mounted_getmntent2 = yes; then
168 ac_list_mounted_fs=found
169 AC_DEFINE([MOUNTED_GETMNTENT2], [1],
170 [Define if there is a function named getmntent for reading the list of
171 mounted file systems, and that function takes two arguments. (SVR4)])
172 AC_CHECK_FUNCS([hasmntopt])
178 if test -z "$ac_list_mounted_fs"; then
179 # OSF/1, also (obsolete) Apple Darwin 1.3.
180 # powerpc-apple-darwin1.3.7 needs sys/param.h sys/ucred.h sys/fs_types.h
182 AC_MSG_CHECKING([for getfsstat function])
183 AC_CACHE_VAL([fu_cv_sys_mounted_getfsstat],
184 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
185 #include <sys/types.h>
186 #if HAVE_STRUCT_FSSTAT_F_FSTYPENAME
187 # define FS_TYPE(Ent) ((Ent).f_fstypename)
189 # define FS_TYPE(Ent) mnt_names[(Ent).f_type]
191 $getfsstat_includes]]
193 [[struct statfs *stats;
194 int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
195 char *t = FS_TYPE (*stats); ]])],
196 [fu_cv_sys_mounted_getfsstat=yes],
197 [fu_cv_sys_mounted_getfsstat=no])])
198 AC_MSG_RESULT([$fu_cv_sys_mounted_getfsstat])
199 if test $fu_cv_sys_mounted_getfsstat = yes; then
200 ac_list_mounted_fs=found
201 AC_DEFINE([MOUNTED_GETFSSTAT], [1],
202 [Define if there is a function named getfsstat for reading the
203 list of mounted file systems. (DEC Alpha running OSF/1)])
207 if test -z "$ac_list_mounted_fs"; then
209 AC_MSG_CHECKING([for FIXME existence of three headers])
210 AC_CACHE_VAL([fu_cv_sys_mounted_fread_fstyp],
211 [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
212 #include <sys/statfs.h>
213 #include <sys/fstyp.h>
214 #include <mnttab.h>]])],
215 [fu_cv_sys_mounted_fread_fstyp=yes],
216 [fu_cv_sys_mounted_fread_fstyp=no])])
217 AC_MSG_RESULT([$fu_cv_sys_mounted_fread_fstyp])
218 if test $fu_cv_sys_mounted_fread_fstyp = yes; then
219 ac_list_mounted_fs=found
220 AC_DEFINE([MOUNTED_FREAD_FSTYP], [1],
221 [Define if (like SVR2) there is no specific function for reading the
222 list of mounted file systems, and your system has these header files:
223 <sys/fstyp.h> and <sys/statfs.h>. (SVR3)])
227 if test -z "$ac_list_mounted_fs"; then
228 # Mac OS X, FreeBSD, NetBSD, OpenBSD, also (obsolete) 4.4BSD.
229 # OSF/1 also has getmntinfo but is already handled above.
230 AC_MSG_CHECKING([for getmntinfo function])
231 AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo],
233 test "$ac_cv_func_getmntinfo" = yes \
234 && fu_cv_sys_mounted_getmntinfo=yes \
235 || fu_cv_sys_mounted_getmntinfo=no
237 AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo])
238 if test $fu_cv_sys_mounted_getmntinfo = yes; then
239 AC_MSG_CHECKING([whether getmntinfo returns statvfs structures])
240 AC_CACHE_VAL([fu_cv_sys_mounted_getmntinfo2],
242 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
244 # include <sys/param.h>
246 #include <sys/types.h>
248 # include <sys/mount.h>
250 #if HAVE_SYS_STATVFS_H
251 # include <sys/statvfs.h>
257 int getmntinfo (struct statfs **, int);
259 [fu_cv_sys_mounted_getmntinfo2=no],
260 [fu_cv_sys_mounted_getmntinfo2=yes])
262 AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo2])
263 if test $fu_cv_sys_mounted_getmntinfo2 = no; then
264 # Mac OS X, FreeBSD, OpenBSD, also (obsolete) 4.4BSD.
265 ac_list_mounted_fs=found
266 AC_DEFINE([MOUNTED_GETMNTINFO], [1],
267 [Define if there is a function named getmntinfo for reading the
268 list of mounted file systems and it returns an array of
269 'struct statfs'. (4.4BSD, Darwin)])
272 ac_list_mounted_fs=found
273 AC_DEFINE([MOUNTED_GETMNTINFO2], [1],
274 [Define if there is a function named getmntinfo for reading the
275 list of mounted file systems and it returns an array of
276 'struct statvfs'. (NetBSD 3.0)])
281 if test -z "$ac_list_mounted_fs"; then
283 AC_MSG_CHECKING([for getmnt function])
284 AC_CACHE_VAL([fu_cv_sys_mounted_getmnt],
285 [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
286 #include <sys/fs_types.h>
287 #include <sys/mount.h>]])],
288 [fu_cv_sys_mounted_getmnt=yes],
289 [fu_cv_sys_mounted_getmnt=no])])
290 AC_MSG_RESULT([$fu_cv_sys_mounted_getmnt])
291 if test $fu_cv_sys_mounted_getmnt = yes; then
292 ac_list_mounted_fs=found
293 AC_DEFINE([MOUNTED_GETMNT], [1],
294 [Define if there is a function named getmnt for reading the list of
295 mounted file systems. (Ultrix)])
299 if test -z "$ac_list_mounted_fs"; then
300 # Haiku, also (obsolete) BeOS.
301 AC_CHECK_FUNCS([next_dev fs_stat_dev])
302 AC_CHECK_HEADERS([fs_info.h])
303 AC_MSG_CHECKING([for BEOS mounted file system support functions])
304 if test $ac_cv_header_fs_info_h = yes \
305 && test $ac_cv_func_next_dev = yes \
306 && test $ac_cv_func_fs_stat_dev = yes; then
311 AC_MSG_RESULT([$fu_result])
312 if test $fu_result = yes; then
313 ac_list_mounted_fs=found
314 AC_DEFINE([MOUNTED_FS_STAT_DEV], [1],
315 [Define if there are functions named next_dev and fs_stat_dev for
316 reading the list of mounted file systems. (BeOS)])
320 if test -z "$ac_list_mounted_fs"; then
322 AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab])
323 AC_CACHE_VAL([fu_cv_sys_mounted_fread],
324 [AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <mnttab.h>]])],
325 [fu_cv_sys_mounted_fread=yes],
326 [fu_cv_sys_mounted_fread=no])])
327 AC_MSG_RESULT([$fu_cv_sys_mounted_fread])
328 if test $fu_cv_sys_mounted_fread = yes; then
329 ac_list_mounted_fs=found
330 AC_DEFINE([MOUNTED_FREAD], [1],
331 [Define if there is no specific function for reading the list of
332 mounted file systems. fread will be used to read /etc/mnttab.
337 if test -z "$ac_list_mounted_fs"; then
338 # Interix / BSD alike statvfs
339 # the code is really interix specific, so make sure, we're on it.
342 AC_CHECK_FUNCS([statvfs])
343 if test $ac_cv_func_statvfs = yes; then
344 ac_list_mounted_fs=found
345 AC_DEFINE([MOUNTED_INTERIX_STATVFS], [1],
346 [Define if we are on interix, and ought to use statvfs plus
347 some special knowledge on where mounted file systems can be
354 if test -z "$ac_list_mounted_fs"; then
355 AC_MSG_ERROR([could not determine how to read list of mounted file systems])
356 # FIXME -- no need to abort building the whole package
357 # Can't build mountlist.c or anything that needs its functions
360 AS_IF([test $ac_list_mounted_fs = found], [$1], [$2])