* lib/mc.ext.in:
[midnight-commander.git] / m4 / ls-mntd-fs.m4
blob21ac4e743b804adfdf32ed33ae7c1b31f8b66c48
1 #serial 26
2 # How to list mounted file systems.
4 # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006 Free Software
5 # Foundation, Inc.
7 # This file is free software; the Free Software Foundation
8 # gives unlimited permission to copy and/or distribute it,
9 # with or without modifications, as long as this notice is preserved.
11 dnl From Jim Meyering.
12 dnl
13 dnl This is not pretty.  I've just taken the autoconf code and wrapped
14 dnl it in an AC_DEFUN and made some other fixes.
15 dnl
17 # Replace Autoconf's AC_FUNC_GETMNTENT to work around a bug in Autoconf
18 # through Autoconf 2.59.  We can remove this once we assume Autoconf 2.60
19 # or later.
20 AC_DEFUN([AC_FUNC_GETMNTENT],
21 [# getmntent is in the standard C library on UNICOS, in -lsun on Irix 4,
22 # -lseq on Dynix/PTX, -lgen on Unixware.
23 AC_SEARCH_LIBS(getmntent, [sun seq gen])
24 AC_CHECK_FUNCS(getmntent)
27 # gl_LIST_MOUNTED_FILE_SYSTEMS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
28 AC_DEFUN([gl_LIST_MOUNTED_FILE_SYSTEMS],
29   [
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   # 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_TRY_CPP([#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     # 4.3BSD, SunOS, HP-UX, Dynix, Irix
125     AC_MSG_CHECKING([for one-argument getmntent function])
126     AC_CACHE_VAL(fu_cv_sys_mounted_getmntent1,
127                  [AC_TRY_COMPILE([
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     fi
156   fi
158   if test -z "$ac_list_mounted_fs"; then
159     # SVR4
160     AC_MSG_CHECKING([for two-argument getmntent function])
161     AC_CACHE_VAL(fu_cv_sys_mounted_getmntent2,
162     [AC_EGREP_HEADER(getmntent, sys/mnttab.h,
163       fu_cv_sys_mounted_getmntent2=yes,
164       fu_cv_sys_mounted_getmntent2=no)])
165     AC_MSG_RESULT($fu_cv_sys_mounted_getmntent2)
166     if test $fu_cv_sys_mounted_getmntent2 = yes; then
167       ac_list_mounted_fs=found
168       AC_DEFINE(MOUNTED_GETMNTENT2, 1,
169         [Define if there is a function named getmntent for reading the list of
170          mounted file systems, and that function takes two arguments.  (SVR4)])
171       AC_CHECK_FUNCS(hasmntopt)
172     fi
173   fi
177 if test -z "$ac_list_mounted_fs"; then
178   # DEC Alpha running OSF/1, and Apple Darwin 1.3.
179   # powerpc-apple-darwin1.3.7 needs sys/param.h sys/ucred.h sys/fs_types.h
181   AC_MSG_CHECKING([for getfsstat function])
182   AC_CACHE_VAL(fu_cv_sys_mounted_getfsstat,
183   [AC_TRY_LINK([
184 #include <sys/types.h>
185 #if HAVE_STRUCT_FSSTAT_F_FSTYPENAME
186 # define FS_TYPE(Ent) ((Ent).f_fstypename)
187 #else
188 # define FS_TYPE(Ent) mnt_names[(Ent).f_type]
189 #endif
190 ]$getfsstat_includes
192   [struct statfs *stats;
193    int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
194    char *t = FS_TYPE (*stats); ],
195     fu_cv_sys_mounted_getfsstat=yes,
196     fu_cv_sys_mounted_getfsstat=no)])
197   AC_MSG_RESULT($fu_cv_sys_mounted_getfsstat)
198   if test $fu_cv_sys_mounted_getfsstat = yes; then
199     ac_list_mounted_fs=found
200     AC_DEFINE(MOUNTED_GETFSSTAT, 1,
201               [Define if there is a function named getfsstat for reading the
202                list of mounted file systems.  (DEC Alpha running OSF/1)])
203   fi
206 if test -z "$ac_list_mounted_fs"; then
207   # SVR3
208   AC_MSG_CHECKING([for FIXME existence of three headers])
209   AC_CACHE_VAL(fu_cv_sys_mounted_fread_fstyp,
210     [AC_TRY_CPP([
211 #include <sys/statfs.h>
212 #include <sys/fstyp.h>
213 #include <mnttab.h>],
214                 fu_cv_sys_mounted_fread_fstyp=yes,
215                 fu_cv_sys_mounted_fread_fstyp=no)])
216   AC_MSG_RESULT($fu_cv_sys_mounted_fread_fstyp)
217   if test $fu_cv_sys_mounted_fread_fstyp = yes; then
218     ac_list_mounted_fs=found
219     AC_DEFINE(MOUNTED_FREAD_FSTYP, 1,
220       [Define if (like SVR2) there is no specific function for reading the
221        list of mounted file systems, and your system has these header files:
222        <sys/fstyp.h> and <sys/statfs.h>.  (SVR3)])
223   fi
226 if test -z "$ac_list_mounted_fs"; then
227   # 4.4BSD and DEC OSF/1.
228   AC_MSG_CHECKING([for getmntinfo function])
229   AC_CACHE_VAL(fu_cv_sys_mounted_getmntinfo,
230     [
231       test "$ac_cv_func_getmntinfo" = yes \
232           && fu_cv_sys_mounted_getmntinfo=yes \
233           || fu_cv_sys_mounted_getmntinfo=no
234     ])
235   AC_MSG_RESULT($fu_cv_sys_mounted_getmntinfo)
236   if test $fu_cv_sys_mounted_getmntinfo = yes; then
237     AC_MSG_CHECKING([whether getmntinfo returns statvfs structures])
238     AC_CACHE_VAL(fu_cv_sys_mounted_getmntinfo2,
239       [
240         AC_TRY_COMPILE([
241 #if HAVE_SYS_PARAM_H
242 # include <sys/param.h>
243 #endif
244 #include <sys/types.h>
245 #if HAVE_SYS_MOUNT_H
246 # include <sys/mount.h>
247 #endif
248 #if HAVE_SYS_STATVFS_H
249 # include <sys/statvfs.h>
250 #endif
251 extern int getmntinfo (struct statfs **, int);
252           ], [],
253           [fu_cv_sys_mounted_getmntinfo2=no],
254           [fu_cv_sys_mounted_getmntinfo2=yes])
255       ])
256     AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo2])
257     if test $fu_cv_sys_mounted_getmntinfo2 = no; then
258       ac_list_mounted_fs=found
259       AC_DEFINE(MOUNTED_GETMNTINFO, 1,
260                 [Define if there is a function named getmntinfo for reading the
261                  list of mounted file systems and it returns an array of
262                  'struct statfs'.  (4.4BSD, Darwin)])
263     else
264       ac_list_mounted_fs=found
265       AC_DEFINE(MOUNTED_GETMNTINFO2, 1,
266                 [Define if there is a function named getmntinfo for reading the
267                  list of mounted file systems and it returns an array of
268                  'struct statvfs'.  (NetBSD 3.0)])
269     fi
270   fi
273 if test -z "$ac_list_mounted_fs"; then
274   # Ultrix
275   AC_MSG_CHECKING([for getmnt function])
276   AC_CACHE_VAL(fu_cv_sys_mounted_getmnt,
277     [AC_TRY_CPP([
278 #include <sys/fs_types.h>
279 #include <sys/mount.h>],
280                 fu_cv_sys_mounted_getmnt=yes,
281                 fu_cv_sys_mounted_getmnt=no)])
282   AC_MSG_RESULT($fu_cv_sys_mounted_getmnt)
283   if test $fu_cv_sys_mounted_getmnt = yes; then
284     ac_list_mounted_fs=found
285     AC_DEFINE(MOUNTED_GETMNT, 1,
286       [Define if there is a function named getmnt for reading the list of
287        mounted file systems.  (Ultrix)])
288   fi
291 if test -z "$ac_list_mounted_fs"; then
292   # BeOS
293   AC_CHECK_FUNCS(next_dev fs_stat_dev)
294   AC_CHECK_HEADERS(fs_info.h)
295   AC_MSG_CHECKING([for BEOS mounted file system support functions])
296   if test $ac_cv_header_fs_info_h = yes \
297       && test $ac_cv_func_next_dev = yes \
298         && test $ac_cv_func_fs_stat_dev = yes; then
299     fu_result=yes
300   else
301     fu_result=no
302   fi
303   AC_MSG_RESULT($fu_result)
304   if test $fu_result = yes; then
305     ac_list_mounted_fs=found
306     AC_DEFINE(MOUNTED_FS_STAT_DEV, 1,
307       [Define if there are functions named next_dev and fs_stat_dev for
308        reading the list of mounted file systems.  (BeOS)])
309   fi
312 if test -z "$ac_list_mounted_fs"; then
313   # SVR2
314   AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab])
315   AC_CACHE_VAL(fu_cv_sys_mounted_fread,
316     [AC_TRY_CPP([#include <mnttab.h>],
317                 fu_cv_sys_mounted_fread=yes,
318                 fu_cv_sys_mounted_fread=no)])
319   AC_MSG_RESULT($fu_cv_sys_mounted_fread)
320   if test $fu_cv_sys_mounted_fread = yes; then
321     ac_list_mounted_fs=found
322     AC_DEFINE(MOUNTED_FREAD, 1,
323               [Define if there is no specific function for reading the list of
324                mounted file systems.  fread will be used to read /etc/mnttab.
325                (SVR2) ])
326   fi
329 if test -z "$ac_list_mounted_fs"; then
330   AC_MSG_ERROR([could not determine how to read list of mounted file systems])
331   # FIXME -- no need to abort building the whole package
332   # Can't build mountlist.c or anything that needs its functions
335 AS_IF([test $ac_list_mounted_fs = found], [$1], [$2])
337   ])