| /* vi: set sw=4 ts=4 : */ |
| /* 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> |
| |
| char *path_mounts = "/proc/mounts"; |
| |
| // Get a list of mount points from /etc/mtab or /proc/mounts, including |
| // statvfs() information. This returns a reversed list, which is good for |
| // finding overmounts and such. |
| |
| struct mtab_list *getmountlist(int die) |
| { |
| FILE *fp; |
| struct mtab_list *mtlist, *mt; |
| struct mntent me; |
| char evilbuf[2*PATH_MAX]; |
| |
| mtlist = 0; |
| if (!(fp = setmntent(path_mounts, "r"))) { |
| if (die) error_exit("cannot open %s", path_mounts); |
| } else { |
| while (getmntent_r(fp, &me, evilbuf, sizeof(evilbuf))) { |
| mt = xzalloc(sizeof(struct mtab_list) + strlen(me.mnt_fsname) + |
| strlen(me.mnt_dir) + strlen(me.mnt_type) + 3); |
| mt->next = mtlist; |
| // Get information about this filesystem. Yes, we need both. |
| stat(me.mnt_dir, &(mt->stat)); |
| statvfs(me.mnt_dir, &(mt->statvfs)); |
| // Remember information from /proc/mounts |
| strcpy(mt->type, me.mnt_type); |
| mt->dir = mt->type + strlen(mt->type) + 1; |
| strcpy(mt->dir, me.mnt_dir); |
| mt->device = mt->dir + strlen(mt->dir) + 1; |
| strcpy(mt->device, me.mnt_fsname); |
| mtlist = mt; |
| } |
| } |
| return mtlist; |
| } |