view lib/getmountlist.c @ 897:849e14fecf2b

Convert getmountlist() to xgetmountlist().
author Rob Landley <rob@landley.net>
date Fri, 10 May 2013 18:57:01 -0500
parents ae7a0fd5363f
children c44dff160d65
line wrap: on
line source

/* getmountlist.c - Get a linked list of mount points, with stat information.
 *
 * Copyright 2006 Rob Landley <rob@landley.net>
 */

#include "toys.h"

#include <mntent.h>

// Get list of mounted filesystems, including stat and statvfs info.
// Returns a reversed list, which is good for finding overmounts and such.

struct mtab_list *xgetmountlist(void)
{
  struct mtab_list *mtlist, *mt;
  struct mntent *me;
  FILE *fp;

  if (!(fp = setmntent("/proc/mounts", "r"))) perror_exit("bad /proc/mounts");

  for (mtlist = 0; me = getmntent(fp); mtlist = mt) {
    mt = xzalloc(sizeof(struct mtab_list) + strlen(me->mnt_fsname) +
      strlen(me->mnt_dir) + strlen(me->mnt_type) + 3);
    mt->next = mtlist;

    // Collect details about mounted filesystem (don't bother for /etc/fstab).
    stat(me->mnt_dir, &(mt->stat));
    statvfs(me->mnt_dir, &(mt->statvfs));

    // Remember information from /proc/mounts
    mt->dir = stpcpy(mt->type, me->mnt_type) + 1;
    mt->device = stpcpy(mt->dir, me->mnt_dir) + 1;
    strcpy(mt->device, me->mnt_fsname);
  }
  endmntent(fp);

  return mtlist;
}