Blame sysdeps/common/mountlist.c

Packit d37888
/* mountlist.c -- return a list of mounted filesystems
Packit d37888
   Copyright (C) 1991, 1992 Free Software Foundation, Inc.
Packit d37888
Packit d37888
   This program is free software; you can redistribute it and/or modify
Packit d37888
   it under the terms of the GNU General Public License as published by
Packit d37888
   the Free Software Foundation; either version 2, or (at your option)
Packit d37888
   any later version.
Packit d37888
Packit d37888
   This program is distributed in the hope that it will be useful,
Packit d37888
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d37888
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit d37888
   GNU General Public License for more details.
Packit d37888
Packit d37888
   You should have received a copy of the GNU General Public License
Packit d37888
   along with this program; if not, write to the Free Software Foundation,
Packit d37888
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
Packit d37888
Packit d37888
#ifdef HAVE_CONFIG_H
Packit d37888
#include <config.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#include <glib.h>
Packit d37888
#include <stdio.h>
Packit d37888
#include <stdlib.h>
Packit d37888
#include <sys/types.h>
Packit d37888
Packit d37888
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
Packit d37888
#include <string.h>
Packit d37888
#else
Packit d37888
#include <strings.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#include <glibtop.h>
Packit d37888
#include <glibtop/mountlist.h>
Packit d37888
Packit d37888
/* A mount table entry. */
Packit d37888
struct mount_entry
Packit d37888
{
Packit d37888
  char *me_devname;             /* Device node pathname, including "/dev/". */
Packit d37888
  char *me_mountdir;            /* Mount point directory pathname. */
Packit d37888
  char *me_type;                /* "nfs", "4.2", etc. */
Packit d37888
  dev_t me_dev;                 /* Device number of me_mountdir. */
Packit d37888
  struct mount_entry *me_next;
Packit d37888
};
Packit d37888
Packit d37888
Packit d37888
static struct mount_entry *read_filesystem_list (void);
Packit d37888
Packit d37888
#ifdef HAVE_SYS_PARAM_H
Packit d37888
#include <sys/param.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#if defined (MOUNTED_GETFSSTAT)	/* __alpha running OSF_1 */
Packit d37888
#  include <sys/mount.h>
Packit d37888
#  include <sys/fs_types.h>
Packit d37888
#endif /* MOUNTED_GETFSSTAT */
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTENT1	/* 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
Packit d37888
#include <mntent.h>
Packit d37888
#if !defined(MOUNTED)
Packit d37888
#  if defined(MNT_MNTTAB)	/* HP-UX.  */
Packit d37888
#    define MOUNTED MNT_MNTTAB
Packit d37888
#  endif
Packit d37888
#  if defined(MNTTABNAME)	/* Dynix.  */
Packit d37888
#    define MOUNTED MNTTABNAME
Packit d37888
#  endif
Packit d37888
#endif
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTINFO	/* 4.4BSD.  */
Packit d37888
#include <sys/mount.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNT		/* Ultrix.  */
Packit d37888
#include <sys/mount.h>
Packit d37888
#include <sys/fs_types.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_FREAD		/* SVR2.  */
Packit d37888
#include <mnttab.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_FREAD_FSTYP	/* SVR3.  */
Packit d37888
#include <mnttab.h>
Packit d37888
#include <sys/fstyp.h>
Packit d37888
#include <sys/statfs.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_LISTMNTENT
Packit d37888
#include <mntent.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTENT2	/* SVR4.  */
Packit d37888
#include <sys/mnttab.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_VMOUNT		/* AIX.  */
Packit d37888
#include <fshelp.h>
Packit d37888
#include <sys/vfs.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef DOLPHIN
Packit d37888
/* So special that it's not worth putting this in autoconf.  */
Packit d37888
#undef MOUNTED_FREAD_FSTYP
Packit d37888
#define MOUNTED_GETMNTTBL
Packit d37888
#endif
Packit d37888
Packit d37888
Packit d37888
#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__) && !defined (__OpenBSD__) && !defined(__FreeBSD__)
Packit d37888
static const char *
Packit d37888
fstype_to_string (short t)
Packit d37888
{
Packit d37888
  switch (t)
Packit d37888
    {
Packit d37888
#ifdef MOUNT_PC
Packit d37888
    case MOUNT_PC:
Packit d37888
      return "pc";
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_MFS
Packit d37888
    case MOUNT_MFS:
Packit d37888
      return "mfs";
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_LO
Packit d37888
    case MOUNT_LO:
Packit d37888
      return "lo";
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_TFS
Packit d37888
    case MOUNT_TFS:
Packit d37888
      return "tfs";
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_TMP
Packit d37888
    case MOUNT_TMP:
Packit d37888
      return "tmp";
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_UFS
Packit d37888
   case MOUNT_UFS:
Packit d37888
     return "ufs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_NFS
Packit d37888
   case MOUNT_NFS:
Packit d37888
     return "nfs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_MSDOS
Packit d37888
   case MOUNT_MSDOS:
Packit d37888
     return "msdos" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_LFS
Packit d37888
   case MOUNT_LFS:
Packit d37888
     return "lfs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_LOFS
Packit d37888
   case MOUNT_LOFS:
Packit d37888
     return "lofs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_FDESC
Packit d37888
   case MOUNT_FDESC:
Packit d37888
     return "fdesc" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_PORTAL
Packit d37888
   case MOUNT_PORTAL:
Packit d37888
     return "portal" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_NULL
Packit d37888
   case MOUNT_NULL:
Packit d37888
     return "null" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_UMAP
Packit d37888
   case MOUNT_UMAP:
Packit d37888
     return "umap" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_KERNFS
Packit d37888
   case MOUNT_KERNFS:
Packit d37888
     return "kernfs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_PROCFS
Packit d37888
   case MOUNT_PROCFS:
Packit d37888
     return "procfs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_AFS
Packit d37888
   case MOUNT_AFS:
Packit d37888
     return "afs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_CD9660
Packit d37888
   case MOUNT_CD9660:
Packit d37888
     return "cd9660" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_UNION
Packit d37888
   case MOUNT_UNION:
Packit d37888
     return "union" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_DEVFS
Packit d37888
   case MOUNT_DEVFS:
Packit d37888
     return "devfs" ;
Packit d37888
#endif
Packit d37888
#ifdef MOUNT_EXT2FS
Packit d37888
   case MOUNT_EXT2FS:
Packit d37888
     return "ext2fs" ;
Packit d37888
#endif
Packit d37888
    default:
Packit d37888
      return "?";
Packit d37888
    }
Packit d37888
}
Packit d37888
#endif /* MOUNTED_GETMNTINFO */
Packit d37888
Packit d37888
#ifdef MOUNTED_VMOUNT		/* AIX.  */
Packit d37888
static const char *
Packit d37888
fstype_to_string (int t)
Packit d37888
{
Packit d37888
  struct vfs_ent *e;
Packit d37888
Packit d37888
  e = getvfsbytype (t);
Packit d37888
  if (!e || !e->vfsent_name)
Packit d37888
    return "none";
Packit d37888
  else
Packit d37888
    return e->vfsent_name;
Packit d37888
}
Packit d37888
#endif /* MOUNTED_VMOUNT */
Packit d37888
Packit d37888
/* Return a list of the currently mounted filesystems, or NULL on error.
Packit d37888
   Add each entry to the tail of the list so that they stay in order.
Packit d37888
*/
Packit d37888
Packit d37888
static struct mount_entry *
Packit d37888
read_filesystem_list (void)
Packit d37888
{
Packit d37888
  struct mount_entry *mount_list;
Packit d37888
  struct mount_entry *me;
Packit d37888
  struct mount_entry *mtail;
Packit d37888
Packit d37888
  /* Start the list off with a dummy entry. */
Packit d37888
  me = g_new (struct mount_entry, 1);
Packit d37888
  me->me_next = NULL;
Packit d37888
  mount_list = mtail = me;
Packit d37888
Packit d37888
#ifdef MOUNTED_LISTMNTENT
Packit d37888
  {
Packit d37888
    struct tabmntent *mntlist, *p;
Packit d37888
    struct mntent *mnt;
Packit d37888
    struct mount_entry *me;
Packit d37888
Packit d37888
    /* the third and fourth arguments could be used to filter mounts,
Packit d37888
       but Crays doesn't seem to have any mounts that we want to
Packit d37888
       remove. Specifically, automount create normal NFS mounts.
Packit d37888
       */
Packit d37888
Packit d37888
    if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0)
Packit d37888
      return NULL;
Packit d37888
    p = mntlist;
Packit d37888
    while(p){
Packit d37888
      mnt = p->ment;
Packit d37888
      me = (struct mount_entry*) g_malloc(sizeof (struct mount_entry));
Packit d37888
      me->me_devname = g_strdup(mnt->mnt_fsname);
Packit d37888
      me->me_mountdir = g_strdup(mnt->mnt_dir);
Packit d37888
      me->me_type = g_strdup(mnt->mnt_type);
Packit d37888
      me->me_dev = -1;
Packit d37888
      me->me_next = NULL;
Packit d37888
      mtail->me_next = me;
Packit d37888
      mtail = me;
Packit d37888
      p = p->next;
Packit d37888
    }
Packit d37888
    freemntlist(mntlist);
Packit d37888
  }
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTENT1   /* Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
Packit d37888
  {
Packit d37888
    const struct mntent *mnt;
Packit d37888
    FILE *fp;
Packit d37888
    const char *devopt;
Packit d37888
Packit d37888
    fp = setmntent (MOUNTED, "r");
Packit d37888
    if (fp == NULL)
Packit d37888
      return NULL;
Packit d37888
Packit d37888
    while ((mnt = getmntent (fp)))
Packit d37888
      {
Packit d37888
	me = g_new(struct mount_entry, 1);
Packit d37888
	me->me_devname = g_strdup (mnt->mnt_fsname);
Packit d37888
	me->me_mountdir = g_strdup (mnt->mnt_dir);
Packit d37888
	me->me_type = g_strdup (mnt->mnt_type);
Packit d37888
	devopt = strstr (mnt->mnt_opts, "dev=");
Packit d37888
	if (devopt)
Packit d37888
	    me->me_dev = (dev_t) strtoull( devopt + 4, NULL, 0);
Packit d37888
	else
Packit d37888
	    me->me_dev = (dev_t) -1;	/* Magic; means not known yet. */
Packit d37888
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
Packit d37888
    if (endmntent (fp) == 0)
Packit d37888
      return NULL;
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_GETMNTENT1. */
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTINFO	/* 4.4BSD.  */
Packit d37888
  {
Packit d37888
    struct statfs *fsp;
Packit d37888
    int entries;
Packit d37888
Packit d37888
    entries = getmntinfo (&fsp, MNT_NOWAIT);
Packit d37888
    if (entries < 0)
Packit d37888
      return NULL;
Packit d37888
    while (entries-- > 0)
Packit d37888
      {
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
	me->me_devname = g_strdup (fsp->f_mntfromname);
Packit d37888
	me->me_mountdir = g_strdup (fsp->f_mntonname);
Packit d37888
#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)
Packit d37888
	me->me_type = g_strdup (fsp->f_fstypename);
Packit d37888
#else
Packit d37888
	me->me_type = g_strdup (fstype_to_string (fsp->f_type));
Packit d37888
#endif
Packit d37888
	me->me_dev = (dev_t) -1;	/* Magic; means not known yet. */
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
	fsp++;
Packit d37888
      }
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_GETMNTINFO */
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNT		/* Ultrix.  */
Packit d37888
  {
Packit d37888
    int offset = 0;
Packit d37888
    int val;
Packit d37888
    struct fs_data fsd;
Packit d37888
Packit d37888
    while ((val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY,
Packit d37888
			  (char *) 0)) > 0)
Packit d37888
      {
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
	me->me_devname = g_strdup (fsd.fd_req.devname);
Packit d37888
	me->me_mountdir = g_strdup (fsd.fd_req.path);
Packit d37888
	me->me_type = g_strdup (gt_names[fsd.fd_req.fstype]);
Packit d37888
	me->me_dev = fsd.fd_req.dev;
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
    if (val < 0)
Packit d37888
      return NULL;
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_GETMNT. */
Packit d37888
Packit d37888
#if defined (MOUNTED_GETFSSTAT)	/* __alpha running OSF_1 */
Packit d37888
  {
Packit d37888
    int numsys, counter, bufsize;
Packit d37888
    struct statfs *stats;
Packit d37888
Packit d37888
    numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
Packit d37888
    if (numsys < 0)
Packit d37888
      return (NULL);
Packit d37888
Packit d37888
    bufsize = (1 + numsys) * sizeof (struct statfs);
Packit d37888
    stats = (struct statfs *) g_malloc (bufsize);
Packit d37888
    numsys = getfsstat (stats, bufsize, MNT_WAIT);
Packit d37888
Packit d37888
    if (numsys < 0)
Packit d37888
      {
Packit d37888
	g_free (stats);
Packit d37888
	return (NULL);
Packit d37888
      }
Packit d37888
Packit d37888
    for (counter = 0; counter < numsys; counter++)
Packit d37888
      {
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
	me->me_devname = g_strdup (stats[counter].f_mntfromname);
Packit d37888
	me->me_mountdir = g_strdup (stats[counter].f_mntonname);
Packit d37888
	me->me_type = g_strdup (mnt_names[stats[counter].f_type]);
Packit d37888
	me->me_dev = (dev_t) -1;	/* Magic; means not known yet. */
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
Packit d37888
    g_free (stats);
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_GETFSSTAT */
Packit d37888
Packit d37888
#if defined (MOUNTED_FREAD) || defined (MOUNTED_FREAD_FSTYP) /* SVR[23].  */
Packit d37888
  {
Packit d37888
    struct mnttab mnt;
Packit d37888
    FILE *fp;
Packit d37888
    fp = fopen ("/etc/mnttab", "r");
Packit d37888
    if (fp == NULL)
Packit d37888
      return NULL;
Packit d37888
Packit d37888
    while (fread (&mnt, sizeof mnt, 1, fp) > 0)
Packit d37888
      {
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
#ifdef GETFSTYP			/* SVR3.  */
Packit d37888
	me->me_devname = g_strdup (mnt.mt_dev);
Packit d37888
#else
Packit d37888
	me->me_devname = g_strdup_printf("/dev/%s", mnt.mt_dev);
Packit d37888
#endif
Packit d37888
	me->me_mountdir = g_strdup (mnt.mt_filsys);
Packit d37888
	me->me_dev = (dev_t) -1;	/* Magic; means not known yet. */
Packit d37888
Packit d37888
#ifdef GETFSTYP			/* SVR3.  */
Packit d37888
	  {
Packit d37888
	    struct statfs fsd;
Packit d37888
	    char typebuf[FSTYPSZ];
Packit d37888
Packit d37888
	    if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1
Packit d37888
		&& sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
Packit d37888
	      me->me_type = g_strdup (typebuf);
Packit d37888
	  }
Packit d37888
#else
Packit d37888
	me->me_type = g_strdup ("");
Packit d37888
#endif
Packit d37888
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
Packit d37888
    if (fclose (fp) == EOF)
Packit d37888
      return NULL;
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP.  */
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTTBL	/* DolphinOS goes it's own way */
Packit d37888
  {
Packit d37888
    struct mntent **mnttbl=getmnttbl(),**ent;
Packit d37888
    for (ent=mnttbl;*ent;ent++)
Packit d37888
      {
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
	me->me_devname = g_strdup ( (*ent)->mt_resource);
Packit d37888
	me->me_mountdir = g_strdup( (*ent)->mt_directory);
Packit d37888
	me->me_type =  g_strdup ((*ent)->mt_fstype);
Packit d37888
	me->me_dev = (dev_t) -1;	/* Magic; means not known yet. */
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
    endmnttbl();
Packit d37888
  }
Packit d37888
#endif
Packit d37888
Packit d37888
#ifdef MOUNTED_GETMNTENT2	/* SVR4.  */
Packit d37888
  {
Packit d37888
    struct mnttab mnt;
Packit d37888
    FILE *fp;
Packit d37888
    int ret;
Packit d37888
Packit d37888
    fp = fopen (MNTTAB, "r");
Packit d37888
    if (fp == NULL)
Packit d37888
      return NULL;
Packit d37888
Packit d37888
    while ((ret = getmntent (fp, &mnt)) == 0)
Packit d37888
      {
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
	me->me_devname = g_strdup (mnt.mnt_special);
Packit d37888
	me->me_mountdir = g_strdup (mnt.mnt_mountp);
Packit d37888
	me->me_type = g_strdup (mnt.mnt_fstype);
Packit d37888
	me->me_dev = (dev_t) -1;	/* Magic; means not known yet. */
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
Packit d37888
   if (fclose (fp) == EOF)
Packit d37888
      return NULL;
Packit d37888
    if (ret > 0)
Packit d37888
      return NULL;
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_GETMNTENT2.  */
Packit d37888
Packit d37888
#ifdef MOUNTED_VMOUNT		/* AIX.  */
Packit d37888
  {
Packit d37888
    int bufsize;
Packit d37888
    char *entries, *thisent;
Packit d37888
    struct vmount *vmp;
Packit d37888
Packit d37888
    /* Ask how many bytes to allocate for the mounted filesystem info.  */
Packit d37888
    mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize);
Packit d37888
    entries = g_malloc (bufsize);
Packit d37888
Packit d37888
    /* Get the list of mounted filesystems.  */
Packit d37888
    mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
Packit d37888
Packit d37888
    for (thisent = entries; thisent < entries + bufsize;
Packit d37888
	 thisent += vmp->vmt_length)
Packit d37888
      {
Packit d37888
	vmp = (struct vmount *) thisent;
Packit d37888
	me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
Packit d37888
	if (vmp->vmt_flags & MNT_REMOTE)
Packit d37888
	  {
Packit d37888
	    /* Prepend the remote pathname.  */
Packit d37888
	    me->me_devname = \
Packit d37888
	      g_strdup_printf("%s:%s",
Packit d37888
			      thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off
Packit d37888
			      thisent + vmp->vmt_data[VMT_OBJECT  ].vmt_off);
Packit d37888
	  }
Packit d37888
	else
Packit d37888
	  {
Packit d37888
	    me->me_devname = g_strdup (thisent +
Packit d37888
				      vmp->vmt_data[VMT_OBJECT].vmt_off);
Packit d37888
	  }
Packit d37888
	me->me_mountdir = g_strdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
Packit d37888
	me->me_type = g_strdup (fstype_to_string (vmp->vmt_gfstype));
Packit d37888
	me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want.  */
Packit d37888
	me->me_next = NULL;
Packit d37888
Packit d37888
	/* Add to the linked list. */
Packit d37888
	mtail->me_next = me;
Packit d37888
	mtail = me;
Packit d37888
      }
Packit d37888
    g_free (entries);
Packit d37888
  }
Packit d37888
#endif /* MOUNTED_VMOUNT. */
Packit d37888
Packit d37888
  /* Free the dummy head. */
Packit d37888
  me = mount_list;
Packit d37888
  mount_list = mount_list->me_next;
Packit d37888
  g_free (me);
Packit d37888
  return mount_list;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
static gboolean ignore_mount_entry(const struct mount_entry *me)
Packit d37888
{
Packit d37888
	/* keep sorted */
Packit d37888
	static const char ignored[][12] = {
Packit d37888
		"autofs",
Packit d37888
		"binfmt_misc",
Packit d37888
		"ctfs",
Packit d37888
		"devfs",
Packit d37888
		"devpts",
Packit d37888
		"fusectl",
Packit d37888
		"linprocfs",
Packit d37888
		"mfs",
Packit d37888
		"mntfs",
Packit d37888
		"mqueue",
Packit d37888
		"none",
Packit d37888
		"nsfd",
Packit d37888
		"objfs",
Packit d37888
		"openpromfs",
Packit d37888
		"proc",
Packit d37888
		"procfs",
Packit d37888
		"rpc_pipefs",
Packit d37888
		"securityfs",
Packit d37888
		"supermount",
Packit d37888
		"sysfs",
Packit d37888
		"tmpfs",
Packit d37888
		"unknown",
Packit d37888
		"usbdevfs",
Packit d37888
		"usbfs"
Packit d37888
	};
Packit d37888
Packit d37888
	typedef int (*Comparator)(const void*, const void*);
Packit d37888
Packit d37888
	return bsearch(me->me_type,
Packit d37888
		       ignored, G_N_ELEMENTS(ignored), sizeof ignored[0],
Packit d37888
		       (Comparator) strcmp) != NULL;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
glibtop_mountentry *
Packit d37888
glibtop_get_mountlist_s (glibtop *server, glibtop_mountlist *buf, int all_fs)
Packit d37888
{
Packit d37888
	struct mount_entry *entries, *cur, *next;
Packit d37888
Packit d37888
	GArray *mount_array = g_array_new(FALSE, FALSE,
Packit d37888
					  sizeof(glibtop_mountentry));
Packit d37888
Packit d37888
	glibtop_init_r (&server, 0, 0);
Packit d37888
Packit d37888
	memset (buf, 0, sizeof (glibtop_mountlist));
Packit d37888
Packit d37888
	/* Read filesystem list. */
Packit d37888
Packit d37888
	if((entries = read_filesystem_list ()) == NULL)
Packit d37888
		return NULL;
Packit d37888
Packit d37888
	for (cur = &entries[0]; cur != NULL; cur = next) {
Packit d37888
Packit d37888
		if(all_fs || !ignore_mount_entry(cur)) {
Packit d37888
			/* add a new glibtop_mountentry */
Packit d37888
			glibtop_mountentry e;
Packit d37888
Packit d37888
			g_strlcpy(e.devname,  cur->me_devname,  sizeof e.devname);
Packit d37888
			g_strlcpy(e.mountdir, cur->me_mountdir, sizeof e.mountdir);
Packit d37888
			g_strlcpy(e.type,     cur->me_type,     sizeof e.type);
Packit d37888
			e.dev = cur->me_dev;
Packit d37888
Packit d37888
			g_array_append_val(mount_array, e);
Packit d37888
		}
Packit d37888
Packit d37888
		/* free current mount_entry and move to the next */
Packit d37888
		next = cur->me_next;
Packit d37888
		g_free(cur->me_devname);
Packit d37888
		g_free(cur->me_mountdir);
Packit d37888
		g_free(cur->me_type);
Packit d37888
		g_free(cur);
Packit d37888
	}
Packit d37888
Packit d37888
	buf->size   = sizeof (glibtop_mountentry);
Packit d37888
	buf->number = mount_array->len;
Packit d37888
	buf->total  = buf->number * buf->size;
Packit d37888
Packit d37888
	buf->flags  = (1 << GLIBTOP_MOUNTLIST_SIZE)
Packit d37888
	  | (1 << GLIBTOP_MOUNTLIST_NUMBER)
Packit d37888
	  | (1 << GLIBTOP_MOUNTLIST_TOTAL);
Packit d37888
Packit d37888
	return (glibtop_mountentry*) g_array_free(mount_array, FALSE);
Packit d37888
}