1# serial 27
2# How to list mounted file systems.
3
4# Copyright (C) 1998-2004, 2006, 2009 Free Software Foundation, Inc.
5#
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.
9
10dnl From Jim Meyering.
11dnl
12dnl This is not pretty.  I've just taken the autoconf code and wrapped
13dnl it in an AC_DEFUN and made some other fixes.
14dnl
15
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.
19AC_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.
22AC_SEARCH_LIBS([getmntent], [sun seq gen])
23AC_CHECK_FUNCS([getmntent])
24])
25
26# gl_LIST_MOUNTED_FILE_SYSTEMS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
27AC_DEFUN([gl_LIST_MOUNTED_FILE_SYSTEMS],
28  [
29AC_CHECK_FUNCS([listmntent getmntinfo])
30AC_CHECK_HEADERS_ONCE([sys/param.h sys/statvfs.h])
31
32# We must include grp.h before ucred.h on OSF V4.0, since ucred.h uses
33# NGROUPS (as the array dimension for a struct member) without a definition.
34AC_CHECK_HEADERS([sys/ucred.h], [], [], [#include <grp.h>])
35
36AC_CHECK_HEADERS([sys/mount.h], [], [],
37  [AC_INCLUDES_DEFAULT
38   [#if HAVE_SYS_PARAM_H
39     #include <sys/param.h>
40    #endif]])
41
42AC_CHECK_HEADERS([mntent.h sys/fs_types.h])
43    getfsstat_includes="\
44$ac_includes_default
45#if HAVE_SYS_PARAM_H
46# include <sys/param.h> /* needed by powerpc-apple-darwin1.3.7 */
47#endif
48#if HAVE_SYS_UCRED_H
49# include <grp.h> /* needed for definition of NGROUPS */
50# include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
51#endif
52#if HAVE_SYS_MOUNT_H
53# include <sys/mount.h>
54#endif
55#if HAVE_SYS_FS_TYPES_H
56# include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */
57#endif
58"
59AC_CHECK_MEMBERS([struct fsstat.f_fstypename],,,[$getfsstat_includes])
60
61# Determine how to get the list of mounted file systems.
62ac_list_mounted_fs=
63
64# If the getmntent function is available but not in the standard library,
65# make sure LIBS contains the appropriate -l option.
66AC_FUNC_GETMNTENT
67
68# This test must precede the ones for getmntent because Unicos-9 is
69# reported to have the getmntent function, but its support is incompatible
70# with other getmntent implementations.
71
72# NOTE: Normally, I wouldn't use a check for system type as I've done for
73# `CRAY' below since that goes against the whole autoconf philosophy.  But
74# I think there is too great a chance that some non-Cray system has a
75# function named listmntent to risk the false positive.
76
77if test -z "$ac_list_mounted_fs"; then
78  # Cray UNICOS 9
79  AC_MSG_CHECKING([for listmntent of Cray/Unicos-9])
80  AC_CACHE_VAL([fu_cv_sys_mounted_cray_listmntent],
81    [fu_cv_sys_mounted_cray_listmntent=no
82      AC_EGREP_CPP([yes],
83        [#ifdef _CRAY
84yes
85#endif
86        ], [test $ac_cv_func_listmntent = yes \
87	    && fu_cv_sys_mounted_cray_listmntent=yes]
88      )
89    ]
90  )
91  AC_MSG_RESULT([$fu_cv_sys_mounted_cray_listmntent])
92  if test $fu_cv_sys_mounted_cray_listmntent = yes; then
93    ac_list_mounted_fs=found
94    AC_DEFINE([MOUNTED_LISTMNTENT], [1],
95      [Define if there is a function named listmntent that can be used to
96       list all mounted file systems.  (UNICOS)])
97  fi
98fi
99
100if test -z "$ac_list_mounted_fs"; then
101  # AIX.
102  AC_MSG_CHECKING([for mntctl function and struct vmount])
103  AC_CACHE_VAL([fu_cv_sys_mounted_vmount],
104  [AC_TRY_CPP([#include <fshelp.h>],
105    fu_cv_sys_mounted_vmount=yes,
106    fu_cv_sys_mounted_vmount=no)])
107  AC_MSG_RESULT([$fu_cv_sys_mounted_vmount])
108  if test $fu_cv_sys_mounted_vmount = yes; then
109    ac_list_mounted_fs=found
110    AC_DEFINE([MOUNTED_VMOUNT], [1],
111	[Define if there is a function named mntctl that can be used to read
112         the list of mounted file systems, and there is a system header file
113         that declares `struct vmount.'  (AIX)])
114  fi
115fi
116
117if test $ac_cv_func_getmntent = yes; then
118
119  # This system has the getmntent function.
120  # Determine whether it's the one-argument variant or the two-argument one.
121
122  if test -z "$ac_list_mounted_fs"; then
123    # 4.3BSD, SunOS, HP-UX, Dynix, Irix
124    AC_MSG_CHECKING([for one-argument getmntent function])
125    AC_CACHE_VAL([fu_cv_sys_mounted_getmntent1],
126		 [AC_TRY_COMPILE([
127/* SunOS 4.1.x /usr/include/mntent.h needs this for FILE */
128#include <stdio.h>
129
130#include <mntent.h>
131#if !defined MOUNTED
132# if defined _PATH_MOUNTED	/* GNU libc  */
133#  define MOUNTED _PATH_MOUNTED
134# endif
135# if defined MNT_MNTTAB	/* HP-UX.  */
136#  define MOUNTED MNT_MNTTAB
137# endif
138# if defined MNTTABNAME	/* Dynix.  */
139#  define MOUNTED MNTTABNAME
140# endif
141#endif
142],
143                    [ struct mntent *mnt = 0; char *table = MOUNTED;
144		      if (sizeof mnt && sizeof table) return 0;],
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
174fi
175
176if 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
203fi
204
205if 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
223fi
224
225if 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
250extern 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
270fi
271
272if 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
288fi
289
290if 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
309fi
310
311if 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
326fi
327
328dnl if test -z "$ac_list_mounted_fs"; then
329dnl   AC_MSG_ERROR([could not determine how to read list of mounted file systems])
330dnl   # FIXME -- no need to abort building the whole package
331dnl   # Can't build mountlist.c or anything that needs its functions
332dnl fi
333
334AS_IF([test $ac_list_mounted_fs = found], [$1], [$2])
335
336  ])
337