Avoid new build failure on FreeBSD 6.0.
[gnulib.git] / m4 / ls-mntd-fs.m4
1 #serial 24
2 # How to list mounted file systems.
3
4 # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006 Free Software
5 # Foundation, Inc.
6 #
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.
10
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
16
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)
25 ])
26
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)
32
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>])
36
37 AC_CHECK_HEADERS(sys/mount.h, [], [],
38   [AC_INCLUDES_DEFAULT
39    [#if HAVE_SYS_PARAM_H
40      #include <sys/param.h>
41     #endif]])
42
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
59 "
60 AC_CHECK_MEMBERS([struct fsstat.f_fstypename],,,[$getfsstat_includes])
61
62 # Determine how to get the list of mounted file systems.
63 ac_list_mounted_fs=
64
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
68
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.
72
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.
77
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
99 fi
100
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
116 fi
117
118 if test $ac_cv_func_getmntent = yes; then
119
120   # This system has the getmntent function.
121   # Determine whether it's the one-argument variant or the two-argument one.
122
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>
130
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
143 ],
144                     [ struct mntent *mnt = 0; char *table = MOUNTED; ],
145                     fu_cv_sys_mounted_getmntent1=yes,
146                     fu_cv_sys_mounted_getmntent1=no)])
147     AC_MSG_RESULT($fu_cv_sys_mounted_getmntent1)
148     if test $fu_cv_sys_mounted_getmntent1 = yes; then
149       ac_list_mounted_fs=found
150       AC_DEFINE(MOUNTED_GETMNTENT1, 1,
151         [Define if there is a function named getmntent for reading the list
152          of mounted file systems, and that function takes a single argument.
153          (4.3BSD, SunOS, HP-UX, Dynix, Irix)])
154     fi
155   fi
156
157   if test -z "$ac_list_mounted_fs"; then
158     # SVR4
159     AC_MSG_CHECKING([for two-argument getmntent function])
160     AC_CACHE_VAL(fu_cv_sys_mounted_getmntent2,
161     [AC_EGREP_HEADER(getmntent, sys/mnttab.h,
162       fu_cv_sys_mounted_getmntent2=yes,
163       fu_cv_sys_mounted_getmntent2=no)])
164     AC_MSG_RESULT($fu_cv_sys_mounted_getmntent2)
165     if test $fu_cv_sys_mounted_getmntent2 = yes; then
166       ac_list_mounted_fs=found
167       AC_DEFINE(MOUNTED_GETMNTENT2, 1,
168         [Define if there is a function named getmntent for reading the list of
169          mounted file systems, and that function takes two arguments.  (SVR4)])
170       AC_CHECK_FUNCS(hasmntopt)
171     fi
172   fi
173
174 fi
175
176 if test -z "$ac_list_mounted_fs"; then
177   # DEC Alpha running OSF/1, and Apple Darwin 1.3.
178   # powerpc-apple-darwin1.3.7 needs sys/param.h sys/ucred.h sys/fs_types.h
179
180   AC_MSG_CHECKING([for getfsstat function])
181   AC_CACHE_VAL(fu_cv_sys_mounted_getfsstat,
182   [AC_TRY_LINK([
183 #include <sys/types.h>
184 #if HAVE_STRUCT_FSSTAT_F_FSTYPENAME
185 # define FS_TYPE(Ent) ((Ent).f_fstypename)
186 #else
187 # define FS_TYPE(Ent) mnt_names[(Ent).f_type]
188 #endif
189 ]$getfsstat_includes
190 ,
191   [struct statfs *stats;
192    int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
193    char *t = FS_TYPE (*stats); ],
194     fu_cv_sys_mounted_getfsstat=yes,
195     fu_cv_sys_mounted_getfsstat=no)])
196   AC_MSG_RESULT($fu_cv_sys_mounted_getfsstat)
197   if test $fu_cv_sys_mounted_getfsstat = yes; then
198     ac_list_mounted_fs=found
199     AC_DEFINE(MOUNTED_GETFSSTAT, 1,
200               [Define if there is a function named getfsstat for reading the
201                list of mounted file systems.  (DEC Alpha running OSF/1)])
202   fi
203 fi
204
205 if test -z "$ac_list_mounted_fs"; then
206   # SVR3
207   AC_MSG_CHECKING([for FIXME existence of three headers])
208   AC_CACHE_VAL(fu_cv_sys_mounted_fread_fstyp,
209     [AC_TRY_CPP([
210 #include <sys/statfs.h>
211 #include <sys/fstyp.h>
212 #include <mnttab.h>],
213                 fu_cv_sys_mounted_fread_fstyp=yes,
214                 fu_cv_sys_mounted_fread_fstyp=no)])
215   AC_MSG_RESULT($fu_cv_sys_mounted_fread_fstyp)
216   if test $fu_cv_sys_mounted_fread_fstyp = yes; then
217     ac_list_mounted_fs=found
218     AC_DEFINE(MOUNTED_FREAD_FSTYP, 1,
219       [Define if (like SVR2) there is no specific function for reading the
220        list of mounted file systems, and your system has these header files:
221        <sys/fstyp.h> and <sys/statfs.h>.  (SVR3)])
222   fi
223 fi
224
225 if test -z "$ac_list_mounted_fs"; then
226   # 4.4BSD and DEC OSF/1.
227   AC_MSG_CHECKING([for getmntinfo function])
228   AC_CACHE_VAL(fu_cv_sys_mounted_getmntinfo,
229     [
230       test "$ac_cv_func_getmntinfo" = yes \
231           && fu_cv_sys_mounted_getmntinfo=yes \
232           || fu_cv_sys_mounted_getmntinfo=no
233     ])
234   AC_MSG_RESULT($fu_cv_sys_mounted_getmntinfo)
235   if test $fu_cv_sys_mounted_getmntinfo = yes; then
236     AC_MSG_CHECKING([whether getmntinfo returns statvfs structures])
237     AC_CACHE_VAL(fu_cv_sys_mounted_getmntinfo2,
238       [
239         AC_TRY_COMPILE([
240 #if HAVE_SYS_PARAM_H
241 # include <sys/param.h>
242 #endif
243 #include <sys/types.h>
244 #if HAVE_SYS_MOUNT_H
245 # include <sys/mount.h>
246 #endif
247 #if HAVE_SYS_STATVFS_H
248 # include <sys/statvfs.h>
249 #endif
250 extern int getmntinfo (struct statfs **, int);
251           ], [],
252           [fu_cv_sys_mounted_getmntinfo2=no],
253           [fu_cv_sys_mounted_getmntinfo2=yes])
254       ])
255     AC_MSG_RESULT([$fu_cv_sys_mounted_getmntinfo2])
256     if test $fu_cv_sys_mounted_getmntinfo2 = no; then
257       ac_list_mounted_fs=found
258       AC_DEFINE(MOUNTED_GETMNTINFO, 1,
259                 [Define if there is a function named getmntinfo for reading the
260                  list of mounted file systems and it returns an array of
261                  'struct statfs'.  (4.4BSD, Darwin)])
262     else
263       ac_list_mounted_fs=found
264       AC_DEFINE(MOUNTED_GETMNTINFO2, 1,
265                 [Define if there is a function named getmntinfo for reading the
266                  list of mounted file systems and it returns an array of
267                  'struct statvfs'.  (NetBSD 3.0)])
268     fi
269   fi
270 fi
271
272 if test -z "$ac_list_mounted_fs"; then
273   # Ultrix
274   AC_MSG_CHECKING([for getmnt function])
275   AC_CACHE_VAL(fu_cv_sys_mounted_getmnt,
276     [AC_TRY_CPP([
277 #include <sys/fs_types.h>
278 #include <sys/mount.h>],
279                 fu_cv_sys_mounted_getmnt=yes,
280                 fu_cv_sys_mounted_getmnt=no)])
281   AC_MSG_RESULT($fu_cv_sys_mounted_getmnt)
282   if test $fu_cv_sys_mounted_getmnt = yes; then
283     ac_list_mounted_fs=found
284     AC_DEFINE(MOUNTED_GETMNT, 1,
285       [Define if there is a function named getmnt for reading the list of
286        mounted file systems.  (Ultrix)])
287   fi
288 fi
289
290 if test -z "$ac_list_mounted_fs"; then
291   # BeOS
292   AC_CHECK_FUNCS(next_dev fs_stat_dev)
293   AC_CHECK_HEADERS(fs_info.h)
294   AC_MSG_CHECKING([for BEOS mounted file system support functions])
295   if test $ac_cv_header_fs_info_h = yes \
296       && test $ac_cv_func_next_dev = yes \
297         && test $ac_cv_func_fs_stat_dev = yes; then
298     fu_result=yes
299   else
300     fu_result=no
301   fi
302   AC_MSG_RESULT($fu_result)
303   if test $fu_result = yes; then
304     ac_list_mounted_fs=found
305     AC_DEFINE(MOUNTED_FS_STAT_DEV, 1,
306       [Define if there are functions named next_dev and fs_stat_dev for
307        reading the list of mounted file systems.  (BeOS)])
308   fi
309 fi
310
311 if test -z "$ac_list_mounted_fs"; then
312   # SVR2
313   AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab])
314   AC_CACHE_VAL(fu_cv_sys_mounted_fread,
315     [AC_TRY_CPP([#include <mnttab.h>],
316                 fu_cv_sys_mounted_fread=yes,
317                 fu_cv_sys_mounted_fread=no)])
318   AC_MSG_RESULT($fu_cv_sys_mounted_fread)
319   if test $fu_cv_sys_mounted_fread = yes; then
320     ac_list_mounted_fs=found
321     AC_DEFINE(MOUNTED_FREAD, 1,
322               [Define if there is no specific function for reading the list of
323                mounted file systems.  fread will be used to read /etc/mnttab.
324                (SVR2) ])
325   fi
326 fi
327
328 if test -z "$ac_list_mounted_fs"; then
329   AC_MSG_ERROR([could not determine how to read list of mounted file systems])
330   # FIXME -- no need to abort building the whole package
331   # Can't build mountlist.c or anything that needs its functions
332 fi
333
334 AS_IF([test $ac_list_mounted_fs = found], [$1], [$2])
335
336   ])