Blame sysdeps/freebsd/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
#include <config.h>
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
#include <sys/param.h>
Packit d37888
#include <sys/mount.h>
Packit d37888
Packit d37888
#include <string.h>
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
static struct mount_entry *read_filesystem_list (void);
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
    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
	me->me_type = g_strdup (fsp->f_fstypename);
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
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
static gboolean ignore_mount_entry(const struct mount_entry *me)
Packit d37888
{
Packit d37888
	/* keep sorted */
Packit d37888
	static const char ignored[][17] = {
Packit d37888
		"autofs",
Packit d37888
		"devfs",
Packit d37888
		"fdescfs",
Packit d37888
		"fusectl",
Packit d37888
		"linprocfs",
Packit d37888
		"linsysfs",
Packit d37888
		"mfs",
Packit d37888
		"none",
Packit d37888
		"nfs",
Packit d37888
		"nullfs",
Packit d37888
		"nwfs",
Packit d37888
		"portalfs",
Packit d37888
		"proc",
Packit d37888
		"procfs",
Packit d37888
		"smbfs",
Packit d37888
		"tmpfs",
Packit d37888
		"unionfs",
Packit d37888
		"unknown"
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
	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
}