Blame sysdeps/cygwin/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 file is a fork of sysdeps/common/mountlist.c.
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
Packit d37888
/*
Packit d37888
Local Variables:
Packit d37888
mode: C
Packit d37888
c-file-style: "gnu"
Packit d37888
End:
Packit d37888
*/
Packit d37888
Packit d37888
#include <config.h>
Packit d37888
Packit d37888
#include <stdio.h>
Packit d37888
#include <mntent.h>
Packit d37888
Packit d37888
#include <glibtop.h>
Packit d37888
#include <glibtop/mountlist.h>
Packit d37888
#include <glibtop/error.h>
Packit d37888
Packit d37888
Packit d37888
/* IgnoreList */
Packit d37888
Packit d37888
Packit d37888
typedef struct
Packit d37888
{
Packit d37888
  GHashTable *table;
Packit d37888
} IgnoreList;
Packit d37888
Packit d37888
Packit d37888
static IgnoreList*
Packit d37888
ignore_list_new(void)
Packit d37888
{
Packit d37888
  IgnoreList* ig;
Packit d37888
  ig = g_new(IgnoreList, 1);
Packit d37888
  ig->table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
Packit d37888
  return ig;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
static void
Packit d37888
ignore_list_delete(IgnoreList* ig)
Packit d37888
{
Packit d37888
  if (ig) {
Packit d37888
    g_hash_table_destroy(ig->table);
Packit d37888
    g_free(ig);
Packit d37888
  }
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
static void
Packit d37888
ignore_list_add(IgnoreList* ig, const char* fs)
Packit d37888
{
Packit d37888
  g_hash_table_insert(ig->table, g_strdup(fs), GINT_TO_POINTER(1));
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
static gboolean
Packit d37888
ignore_list_has(IgnoreList* ig, const char* fs)
Packit d37888
{
Packit d37888
  gpointer data;
Packit d37888
  data = g_hash_table_lookup(ig->table, fs);
Packit d37888
  return data != NULL;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
/* ~IgnoreList */
Packit d37888
Packit d37888
Packit d37888
static gboolean
Packit d37888
ignore_fs(const char *fstype, IgnoreList** ig)
Packit d37888
{
Packit d37888
  if (!*ig) {
Packit d37888
    FILE* fs;
Packit d37888
    char line[128];
Packit d37888
Packit d37888
    *ig = ignore_list_new();
Packit d37888
Packit d37888
    ignore_list_add(*ig, "none");
Packit d37888
Packit d37888
    if ((fs = fopen("/proc/filesystems", "r")) != NULL) {
Packit d37888
      while (fgets(line, sizeof line, fs)) {
Packit d37888
	if (!strncmp(line, "nodev", 5)) {
Packit d37888
	  char *type;
Packit d37888
	  type = g_strstrip(line + 5);
Packit d37888
	  ignore_list_add(*ig, type);
Packit d37888
	}
Packit d37888
      }
Packit d37888
      fclose(fs);
Packit d37888
    }
Packit d37888
  }
Packit d37888
Packit d37888
  return ignore_list_has(*ig, fstype);
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
  const struct mntent *mnt;
Packit d37888
  FILE *fp;
Packit d37888
  GArray* entries;
Packit d37888
  IgnoreList* ig = NULL;
Packit d37888
Packit d37888
  memset(buf, 0, sizeof(glibtop_mountlist));
Packit d37888
Packit d37888
  /* wild guess, preallocate 8 entries
Packit d37888
     on a desktop, almost everyone has / and a tmpfs for udev
Packit d37888
     if all_fs, there are also proc, sys, fuse, binfmt, etc */
Packit d37888
  entries = g_array_sized_new(FALSE, FALSE, sizeof(glibtop_mountentry), 8);
Packit d37888
Packit d37888
  if (!(fp = setmntent(MOUNTED, "r"))) {
Packit d37888
      glibtop_warn_io_r(server, "Could not open %s", MOUNTED);
Packit d37888
      goto out;
Packit d37888
    }
Packit d37888
Packit d37888
  while ((mnt = getmntent(fp)))
Packit d37888
    {
Packit d37888
      glibtop_mountentry *me;
Packit d37888
      gsize len;
Packit d37888
Packit d37888
      if (!all_fs && ignore_fs(mnt->mnt_type, &ig))
Packit d37888
	continue;
Packit d37888
Packit d37888
      len = entries->len;
Packit d37888
      g_array_set_size(entries, len + 1);
Packit d37888
      me = &g_array_index(entries, glibtop_mountentry, len);
Packit d37888
Packit d37888
      g_strlcpy(me->devname, mnt->mnt_fsname, sizeof me->devname);
Packit d37888
      g_strlcpy(me->mountdir, mnt->mnt_dir, sizeof me->mountdir);
Packit d37888
      g_strlcpy(me->type, mnt->mnt_type, sizeof me->type);
Packit d37888
    }
Packit d37888
Packit d37888
    endmntent(fp);
Packit d37888
Packit d37888
Packit d37888
  out:
Packit d37888
    ignore_list_delete(ig);
Packit d37888
Packit d37888
    buf->size = sizeof(glibtop_mountentry);
Packit d37888
    buf->number = entries->len;
Packit d37888
    buf->total = buf->number * buf->size;
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(entries, FALSE);
Packit d37888
}