/* Given the name NAME, try to find it in mtab. */ struct mntentchn *getmntfile(const char *name) { struct mntentchn *mc; for (mc = mtab_head()->nxt; mc; mc = mc->nxt) if (streq(mc->mnt_dir, name) || (streq(mc->mnt_fsname, name))) break; return mc; }
/* Given the name NAME, try to find it in mtab. */ struct mntentchn * getmntfile (const char *name) { struct mntentchn *mc, *mc0; mc0 = mtab_head(); for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) if (streq(mc->m.mnt_dir, name) || streq(mc->m.mnt_fsname, name)) return mc; return NULL; }
/* * Given the device name NAME, and the place MCPREV we found it last time, * try to find more occurrences. */ struct mntentchn * getmntdevbackward (const char *name, struct mntentchn *mcprev) { struct mntentchn *mc, *mc0; mc0 = mtab_head(); if (!mcprev) mcprev = mc0; for (mc = mcprev->prev; mc && mc != mc0; mc = mc->prev) if (streq(mc->m.mnt_fsname, name)) return mc; return NULL; }
/* * Given the name NAME, check that it occurs precisely once as dir or dev. */ int is_mounted_once(const char *name) { struct mntentchn *mc, *mc0; int ct = 0; mc0 = mtab_head(); for (mc = mc0->prev; mc && mc != mc0; mc = mc->prev) if (streq(mc->m.mnt_dir, name) || streq(mc->m.mnt_fsname, name)) ct++; return (ct == 1); }
/* Unmount all filesystems of type VFSTYPES found in mtab. Since we are concurrently updating mtab after every succesful umount, we have to slurp in the entire file before we start. This isn't too bad, because in any case it's important to umount mtab entries in reverse order to mount, e.g. /usr/spool before /usr. */ int umount_all (string_list types) { struct mntentchn *mc, *hd; int errors = 0; hd = mtab_head(); if (!hd->prev) die (2, "umount: cannot find list of filesystems to unmount"); for (mc = hd->prev; mc != hd; mc = mc->prev) { if (matching_type (mc->mnt_type, types)) { errors |= umount_one (mc->mnt_fsname, mc->mnt_dir, mc->mnt_type, mc->mnt_opts); } } sync (); return errors; }
/* Unmount all filesystems of type VFSTYPES found in mtab. Since we are concurrently updating mtab after every successful umount, we have to slurp in the entire file before we start. This isn't too bad, because in any case it's important to umount mtab entries in reverse order to mount, e.g. /usr/spool before /usr. */ static int umount_all (char *types, char *test_opts) { struct mntentchn *mc, *hd; int errors = 0; hd = mtab_head(); if (!hd->prev) die (2, _("umount: cannot find list of filesystems to unmount")); for (mc = hd->prev; mc != hd; mc = mc->prev) { if (matching_type (mc->m.mnt_type, types) && matching_opts (mc->m.mnt_opts, test_opts)) { errors |= umount_one (mc->m.mnt_fsname, mc->m.mnt_dir, mc->m.mnt_type, mc->m.mnt_opts, mc); } } sync (); return errors; }
/* Given the name FILE, try to find the option "loop=FILE" in mtab. */ struct mntentchn *getmntoptfile(const char *file) { struct mntentchn *mc; char *opts, *s; int l; if (!file) return NULL; l = strlen(file); for (mc = mtab_head()->nxt; mc; mc = mc->nxt) if ((opts = mc->mnt_opts) != NULL && (s = strstr(opts, "loop=")) && !strncmp(s + 5, file, l) && (s == opts || s[-1] == ',') && (s[l + 5] == 0 || s[l + 5] == ',')) return mc; return NULL; }