/* mountlist.c -- return a list of mounted filesystems
- Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
-#include <config.h>
+# include <config.h>
#endif
#include <stdio.h>
#include "mountlist.h"
#ifdef STDC_HEADERS
-#include <stdlib.h>
+# include <stdlib.h>
#else
void free ();
#endif
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
-#include <string.h>
+# include <string.h>
#else
-#include <strings.h>
+# include <strings.h>
#endif
char *strstr ();
void error ();
#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
+# include <sys/param.h>
#endif
#if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */
-# include <sys/mount.h>
-# include <sys/fs_types.h>
+# include <sys/mount.h>
+# include <sys/fs_types.h>
#endif /* MOUNTED_GETFSSTAT */
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
-#include <mntent.h>
-#if !defined(MOUNTED)
+# include <mntent.h>
+# if !defined(MOUNTED)
# if defined(MNT_MNTTAB) /* HP-UX. */
-# define MOUNTED MNT_MNTTAB
+# define MOUNTED MNT_MNTTAB
# endif
# if defined(MNTTABNAME) /* Dynix. */
-# define MOUNTED MNTTABNAME
+# define MOUNTED MNTTABNAME
# endif
-#endif
+# endif
#endif
#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
-#include <sys/mount.h>
+# include <sys/mount.h>
#endif
#ifdef MOUNTED_GETMNT /* Ultrix. */
-#include <sys/mount.h>
-#include <sys/fs_types.h>
+# include <sys/mount.h>
+# include <sys/fs_types.h>
#endif
#ifdef MOUNTED_FREAD /* SVR2. */
-#include <mnttab.h>
+# include <mnttab.h>
#endif
#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */
-#include <mnttab.h>
-#include <sys/fstyp.h>
-#include <sys/statfs.h>
+# include <mnttab.h>
+# include <sys/fstyp.h>
+# include <sys/statfs.h>
+#endif
+
+#ifdef MOUNTED_LISTMNTENT
+# include <mntent.h>
#endif
#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
-#include <sys/mnttab.h>
+# include <sys/mnttab.h>
#endif
#ifdef MOUNTED_VMOUNT /* AIX. */
-#include <fshelp.h>
-#include <sys/vfs.h>
+# include <fshelp.h>
+# include <sys/vfs.h>
#endif
#ifdef DOLPHIN
/* So special that it's not worth putting this in autoconf. */
-#undef MOUNTED_FREAD_FSTYP
-#define MOUNTED_GETMNTTBL
+# undef MOUNTED_FREAD_FSTYP
+# define MOUNTED_GETMNTTBL
+#endif
+
+#ifdef HAVE_SYS_MNTENT_H
+/* This is to get MNTOPT_IGNORE on e.g. SVR4. */
+# include <sys/mntent.h>
+#endif
+
+#if defined (MNTOPT_IGNORE) && defined (HAVE_HASMNTOPT)
+# define MNT_IGNORE(M) hasmntopt ((M), MNTOPT_IGNORE)
+#else
+# define MNT_IGNORE(M) 0
#endif
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
}
#endif /* MOUNTED_GETMNTENT1. */
-#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__)
+#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__) && !defined (__OpenBSD__)
static char *
fstype_to_string (t)
short t;
{
switch (t)
{
- case MOUNT_UFS:
- return "ufs";
- case MOUNT_NFS:
- return "nfs";
-#ifdef MOUNT_PC
+# ifdef MOUNT_PC
case MOUNT_PC:
return "pc";
-#endif
-#ifdef MOUNT_MFS
+# endif
+# ifdef MOUNT_MFS
case MOUNT_MFS:
return "mfs";
-#endif
-#ifdef MOUNT_LO
+# endif
+# ifdef MOUNT_LO
case MOUNT_LO:
return "lo";
-#endif
-#ifdef MOUNT_TFS
+# endif
+# ifdef MOUNT_TFS
case MOUNT_TFS:
return "tfs";
-#endif
-#ifdef MOUNT_TMP
+# endif
+# ifdef MOUNT_TMP
case MOUNT_TMP:
return "tmp";
-#endif
+# endif
+# ifdef MOUNT_UFS
+ case MOUNT_UFS:
+ return "ufs" ;
+# endif
+# ifdef MOUNT_NFS
+ case MOUNT_NFS:
+ return "nfs" ;
+# endif
+# ifdef MOUNT_MSDOS
+ case MOUNT_MSDOS:
+ return "msdos" ;
+# endif
+# ifdef MOUNT_LFS
+ case MOUNT_LFS:
+ return "lfs" ;
+# endif
+# ifdef MOUNT_LOFS
+ case MOUNT_LOFS:
+ return "lofs" ;
+# endif
+# ifdef MOUNT_FDESC
+ case MOUNT_FDESC:
+ return "fdesc" ;
+# endif
+# ifdef MOUNT_PORTAL
+ case MOUNT_PORTAL:
+ return "portal" ;
+# endif
+# ifdef MOUNT_NULL
+ case MOUNT_NULL:
+ return "null" ;
+# endif
+# ifdef MOUNT_UMAP
+ case MOUNT_UMAP:
+ return "umap" ;
+# endif
+# ifdef MOUNT_KERNFS
+ case MOUNT_KERNFS:
+ return "kernfs" ;
+# endif
+# ifdef MOUNT_PROCFS
+ case MOUNT_PROCFS:
+ return "procfs" ;
+# endif
+# ifdef MOUNT_AFS
+ case MOUNT_AFS:
+ return "afs" ;
+# endif
+# ifdef MOUNT_CD9660
+ case MOUNT_CD9660:
+ return "cd9660" ;
+# endif
+# ifdef MOUNT_UNION
+ case MOUNT_UNION:
+ return "union" ;
+# endif
+# ifdef MOUNT_DEVFS
+ case MOUNT_DEVFS:
+ return "devfs" ;
+# endif
+# ifdef MOUNT_EXT2FS
+ case MOUNT_EXT2FS:
+ return "ext2fs" ;
+# endif
default:
return "?";
}
me->me_next = NULL;
mount_list = mtail = me;
+#ifdef MOUNTED_LISTMNTENT
+ {
+ struct tabmntent *mntlist, *p;
+ struct mntent *mnt;
+ struct mount_entry *me;
+
+ /* the third and fourth arguments could be used to filter mounts,
+ but Crays doesn't seem to have any mounts that we want to
+ remove. Specifically, automount create normal NFS mounts.
+ */
+
+ if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0)
+ return NULL;
+ p = mntlist;
+ while(p){
+ mnt = p->ment;
+ me = (struct mount_entry*) xmalloc(sizeof (struct mount_entry));
+ me->me_devname = xstrdup(mnt->mnt_fsname);
+ me->me_mountdir = xstrdup(mnt->mnt_dir);
+ me->me_type = xstrdup(mnt->mnt_type);
+ me->me_dev = -1;
+ me->me_next = NULL;
+ mtail->me_next = me;
+ mtail = me;
+ p = p->next;
+ }
+ freemntlist(mntlist);
+ }
+#endif
+
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
{
struct mntent *mnt;
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (fsp->f_mntfromname);
me->me_mountdir = xstrdup (fsp->f_mntonname);
-#ifdef __NetBSD__
+# if defined (__NetBSD__) || defined (__OpenBSD__)
me->me_type = xstrdup (fsp->f_fstypename);
-#else
+# else
me->me_type = fstype_to_string (fsp->f_type);
-#endif
+# endif
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_next = NULL;
while (fread (&mnt, sizeof mnt, 1, fp) > 0)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
-#ifdef GETFSTYP /* SVR3. */
+# ifdef GETFSTYP /* SVR3. */
me->me_devname = xstrdup (mnt.mt_dev);
-#else
+# else
me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6);
strcpy (me->me_devname, "/dev/");
strcpy (me->me_devname + 5, mnt.mt_dev);
-#endif
+# endif
me->me_mountdir = xstrdup (mnt.mt_filsys);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_type = "";
-#ifdef GETFSTYP /* SVR3. */
+# ifdef GETFSTYP /* SVR3. */
if (need_fs_type)
{
struct statfs fsd;
&& sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
me->me_type = xstrdup (typebuf);
}
-#endif
+# endif
me->me_next = NULL;
/* Add to the linked list. */
while ((ret = getmntent (fp, &mnt)) == 0)
{
+ /* Don't show automounted filesystems twice on e.g., Solaris. */
+ if (!all_fs && MNT_IGNORE (&mnt))
+ continue;
+
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (mnt.mnt_special);
me->me_mountdir = xstrdup (mnt.mnt_mountp);