Blame sysdeps/common/mountlist.c

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