mountlist: Modernize platform lists.
[gnulib.git] / m4 / ls-mntd-fs.m4
blob6e8d30889ab11499069ba6126f7c152c53a2e59b
1 # serial 33
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.
11 dnl
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.
14 dnl
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
18 # or later.
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],
28   [
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], [], [],
38   [AC_INCLUDES_DEFAULT
39    [#if HAVE_SYS_PARAM_H
40      #include <sys/param.h>
41     #endif]])
43 AC_CHECK_HEADERS([mntent.h sys/fs_types.h])
44     getfsstat_includes="\
45 $ac_includes_default
46 #if HAVE_SYS_PARAM_H
47 # include <sys/param.h> /* needed by powerpc-apple-darwin1.3.7 */
48 #endif
49 #if HAVE_SYS_UCRED_H
50 # include <grp.h> /* needed for definition of NGROUPS */
51 # include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
52 #endif
53 #if HAVE_SYS_MOUNT_H
54 # include <sys/mount.h>
55 #endif
56 #if HAVE_SYS_FS_TYPES_H
57 # include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */
58 #endif
60 AC_CHECK_MEMBERS([struct fsstat.f_fstypename],,,[$getfsstat_includes])
62 # Determine how to get the list of mounted file systems.
63 ac_list_mounted_fs=
65 # If the getmntent function is available but not in the standard library,
66 # make sure LIBS contains the appropriate -l option.
67 AC_FUNC_GETMNTENT
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
83       AC_EGREP_CPP([yes],
84         [#ifdef _CRAY
85 yes
86 #endif
87         ], [test $ac_cv_func_listmntent = yes \
88             && fu_cv_sys_mounted_cray_listmntent=yes]
89       )
90     ]
91   )
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)])
98   fi
101 if test -z "$ac_list_mounted_fs"; then
102   # AIX.
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)])
115   fi
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 */
129 #include <stdio.h>
131 #include <mntent.h>
132 #if !defined MOUNTED
133 # if defined _PATH_MOUNTED      /* GNU libc  */
134 #  define MOUNTED _PATH_MOUNTED
135 # endif
136 # if defined MNT_MNTTAB /* HP-UX.  */
137 #  define MOUNTED MNT_MNTTAB
138 # endif
139 # if defined MNTTABNAME /* Dynix.  */
140 #  define MOUNTED MNTTABNAME
141 # endif
142 #endif
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])
156     fi
157   fi
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])
173     fi
174   fi
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)
188 #else
189 # define FS_TYPE(Ent) mnt_names[(Ent).f_type]
190 #endif
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)])
204   fi
207 if test -z "$ac_list_mounted_fs"; then
208   # (obsolete) SVR3
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)])
224   fi
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],
232     [
233       test "$ac_cv_func_getmntinfo" = yes \
234           && fu_cv_sys_mounted_getmntinfo=yes \
235           || fu_cv_sys_mounted_getmntinfo=no
236     ])
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],
241       [
242         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
243 #if HAVE_SYS_PARAM_H
244 # include <sys/param.h>
245 #endif
246 #include <sys/types.h>
247 #if HAVE_SYS_MOUNT_H
248 # include <sys/mount.h>
249 #endif
250 #if HAVE_SYS_STATVFS_H
251 # include <sys/statvfs.h>
252 #endif
253 extern
254 #ifdef __cplusplus
256 #endif
257 int getmntinfo (struct statfs **, int);
258             ]], [])],
259           [fu_cv_sys_mounted_getmntinfo2=no],
260           [fu_cv_sys_mounted_getmntinfo2=yes])
261       ])
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)])
270     else
271       # NetBSD.
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)])
277     fi
278   fi
281 if test -z "$ac_list_mounted_fs"; then
282   # (obsolete) Ultrix.
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)])
296   fi
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
307     fu_result=yes
308   else
309     fu_result=no
310   fi
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)])
317   fi
320 if test -z "$ac_list_mounted_fs"; then
321   # (obsolete) SVR2.
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.
333                (SVR2) ])
334   fi
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.
340   case "$host" in
341   *-interix*)
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
348                  found. (Interix)])
349     fi
350     ;;
351   esac
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])
362   ])