X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmountlist.c;h=de3e078c164e9654b24d8548b5ad487f42f928da;hb=ef1a7364a77f86eb148a6f0bec2fedf26ba1c11d;hp=5933f76881e2c7a2b1eddbb33e23f23781426c06;hpb=aa5959b9b07f6667b916f8a3d84ca0b29b6933b8;p=gnulib.git diff --git a/lib/mountlist.c b/lib/mountlist.c index 5933f7688..de3e078c1 100644 --- a/lib/mountlist.c +++ b/lib/mountlist.c @@ -1,5 +1,5 @@ /* 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 @@ -12,11 +12,11 @@ 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 +# include #endif #include @@ -24,14 +24,14 @@ #include "mountlist.h" #ifdef STDC_HEADERS -#include +# include #else void free (); #endif #if defined(STDC_HEADERS) || defined(HAVE_STRING_H) -#include +# include #else -#include +# include #endif char *strstr (); @@ -41,58 +41,73 @@ char *xstrdup (); void error (); #ifdef HAVE_SYS_PARAM_H -#include +# include #endif #if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */ -# include -# include +# include +# include #endif /* MOUNTED_GETFSSTAT */ #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ -#include -#if !defined(MOUNTED) +# include +# 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 +# include #endif #ifdef MOUNTED_GETMNT /* Ultrix. */ -#include -#include +# include +# include #endif #ifdef MOUNTED_FREAD /* SVR2. */ -#include +# include #endif #ifdef MOUNTED_FREAD_FSTYP /* SVR3. */ -#include -#include -#include +# include +# include +# include +#endif + +#ifdef MOUNTED_LISTMNTENT +# include #endif #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ -#include +# include #endif #ifdef MOUNTED_VMOUNT /* AIX. */ -#include -#include +# include +# include #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 +#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. */ @@ -123,37 +138,97 @@ xatoi (cp) } #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 "?"; } @@ -195,6 +270,36 @@ read_filesystem_list (need_fs_type, all_fs) 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; @@ -251,11 +356,11 @@ read_filesystem_list (need_fs_type, all_fs) 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; @@ -342,17 +447,17 @@ read_filesystem_list (need_fs_type, all_fs) 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; @@ -362,7 +467,7 @@ read_filesystem_list (need_fs_type, all_fs) && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1) me->me_type = xstrdup (typebuf); } -#endif +# endif me->me_next = NULL; /* Add to the linked list. */ @@ -408,6 +513,10 @@ read_filesystem_list (need_fs_type, all_fs) 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);