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