]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
build-sys: remove deprecated-mount/
authorKarel Zak <kzak@redhat.com>
Wed, 5 Mar 2014 12:19:19 +0000 (13:19 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 5 Mar 2014 12:19:19 +0000 (13:19 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
23 files changed:
Makefile.am
configure.ac
mount-deprecated/Makemodule.am [deleted file]
mount-deprecated/devname.c [deleted file]
mount-deprecated/devname.h [deleted file]
mount-deprecated/fsprobe.c [deleted file]
mount-deprecated/fsprobe.h [deleted file]
mount-deprecated/fstab.c [deleted file]
mount-deprecated/fstab.h [deleted file]
mount-deprecated/getusername.c [deleted file]
mount-deprecated/getusername.h [deleted file]
mount-deprecated/mount.8 [deleted file]
mount-deprecated/mount.c [deleted file]
mount-deprecated/mount_constants.h [deleted file]
mount-deprecated/mount_mntent.c [deleted file]
mount-deprecated/mount_mntent.h [deleted file]
mount-deprecated/sundries.c [deleted file]
mount-deprecated/sundries.h [deleted file]
mount-deprecated/umount.8 [deleted file]
mount-deprecated/umount.c [deleted file]
tests/expected/build-sys/config-old-mount [deleted file]
tests/ts/mount/shared-subtree
tools/config-gen.d/old-mount.conf [deleted file]

index 17f4c339d6970b4b3ff7c5ead9f012959e043b23..5eb76ac9572c6c2234f7c6c2df7a9cc5c0b56538 100644 (file)
@@ -83,7 +83,6 @@ include schedutils/Makemodule.am
 include text-utils/Makemodule.am
 include term-utils/Makemodule.am
 include login-utils/Makemodule.am
-include mount-deprecated/Makemodule.am
 include sys-utils/Makemodule.am
 include misc-utils/Makemodule.am
 include disk-utils/Makemodule.am
index 2e47bacab2d5c189509cffa14a79649b64622155..59830e71f832f871574e05bfca98003bcd91e390 100644 (file)
@@ -791,23 +791,12 @@ UL_REQUIRES_BUILD([fdisk], [libfdisk])
 AM_CONDITIONAL([BUILD_FDISK], [test "x$build_fdisk" = xyes])
 
 
-AC_ARG_ENABLE([deprecated-mount],
-  AS_HELP_STRING([--enable-deprecated-mount], [build old mount utilities]),
-  [], [enable_deprecated_mount=no]
-)
-UL_BUILD_INIT([deprecated_mount])
-UL_REQUIRES_LINUX([deprecated_mount])
-UL_REQUIRES_BUILD([deprecated_mount], [libblkid])
-AM_CONDITIONAL([BUILD_DEPRECATED_MOUNT], [test "x$build_deprecated_mount" = xyes])
-
-
 AC_ARG_ENABLE([mount],
   AS_HELP_STRING([--disable-mount], [do not build mount(8) and umount(8)]),
   [], [enable_mount=check]
 )
 UL_BUILD_INIT([mount])
 UL_REQUIRES_BUILD([mount], [libmount])
-UL_CONFLICTS_BUILD([mount], [deprecated_mount], [old deprecated mount version])
 AM_CONDITIONAL([BUILD_MOUNT], [test "x$build_mount" = xyes])
 
 
diff --git a/mount-deprecated/Makemodule.am b/mount-deprecated/Makemodule.am
deleted file mode 100644 (file)
index ac47914..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-if BUILD_DEPRECATED_MOUNT
-
-mount_common_sources = \
-       mount-deprecated/sundries.c \
-       mount-deprecated/sundries.h \
-       mount-deprecated/fstab.h \
-       mount-deprecated/mount_mntent.h \
-       mount-deprecated/mount_constants.h \
-       mount-deprecated/getusername.h \
-       mount-deprecated/fsprobe.h \
-       mount-deprecated/devname.c \
-       mount-deprecated/devname.h \
-       mount-deprecated/fstab.c \
-       mount-deprecated/getusername.c \
-       mount-deprecated/mount_mntent.c \
-       mount-deprecated/fsprobe.c
-
-#
-# mount
-#
-bin_PROGRAMS += mount
-dist_man_MANS += mount-deprecated/mount.8
-mount_SOURCES = mount-deprecated/mount.c $(mount_common_sources)
-mount_CFLAGS = $(SUID_CFLAGS) $(AM_CFLAGS) -I$(ul_libblkid_incdir)
-mount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
-mount_LDADD = $(LDADD) libblkid.la libcommon.la
-
-if HAVE_SELINUX
-mount_LDADD += $(SELINUX_LIBS)
-endif
-
-if HAVE_STATIC_MOUNT
-bin_PROGRAMS += mount.static
-mount_static_SOURCES = $(mount_SOURCES)
-mount_static_CFLAGS = $(mount_CFLAGS)
-mount_static_LDFLAGS = -all-static
-mount_static_LDADD = $(LDADD) libblkid.la libcommon.la
-if HAVE_SELINUX
-mount_static_LDADD += $(SELINUX_LIBS_STATIC)
-endif
-endif # HAVE_STATIC_MOUNT
-
-#
-# umount
-#
-bin_PROGRAMS += umount
-dist_man_MANS += mount-deprecated/umount.8
-umount_SOURCES = mount-deprecated/umount.c $(mount_common_sources)
-umount_CFLAGS = $(SUID_CFLAGS) $(AM_CFLAGS) -I$(ul_libblkid_incdir)
-umount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
-umount_LDADD = $(LDADD) libblkid.la libcommon.la
-
-if HAVE_STATIC_UMOUNT
-bin_PROGRAMS += umount.static
-umount_static_SOURCES = $(umount_SOURCES)
-umount_static_CFLAGS = $(umount_CFLAGS)
-umount_static_LDFLAGS = -all-static
-umount_static_LDADD = $(LDADD) libblkid.la libcommon.la
-endif
-
-
-if MAKEINSTALL_DO_SETUID
-install-exec-hook-mount:
-       chmod 4755 $(DESTDIR)$(bindir)/mount
-       chmod 4755 $(DESTDIR)$(bindir)/umount
-
-INSTALL_EXEC_HOOKS += install-exec-hook-mount
-endif
-
-endif # BUILD_DEPRECATED_MOUNT
diff --git a/mount-deprecated/devname.c b/mount-deprecated/devname.c
deleted file mode 100644 (file)
index 76dfe91..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "fsprobe.h"
-
-#include "devname.h"
-#include "sundries.h"          /* for xstrdup */
-
-const char *
-spec_to_devname(const char *spec)
-{
-       if (!spec)
-               return NULL;
-       if (nocanonicalize || is_pseudo_fs(spec))
-               return xstrdup(spec);
-       return fsprobe_get_devname_by_spec(spec);
-}
diff --git a/mount-deprecated/devname.h b/mount-deprecated/devname.h
deleted file mode 100644 (file)
index d6adeff..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef MOUNT_DEVNAME_H
-#define MOUNT_DEVNAME_H
-
-extern const char *spec_to_devname(const char *spec);
-
-#endif
diff --git a/mount-deprecated/fsprobe.c b/mount-deprecated/fsprobe.c
deleted file mode 100644 (file)
index 80c2566..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <stdlib.h>
-
-#include <blkid.h>
-
-#include "blkdev.h"
-#include "canonicalize.h"
-#include "pathnames.h"
-#include "fsprobe.h"
-
-/*
- * THIS IS DEPRECATED -- use blkid_evaluate_* API rather than this extra layer
- */
-
-
-static blkid_cache blcache;
-static blkid_probe blprobe;
-
-void
-fsprobe_init(void)
-{
-       blcache = NULL;
-       blprobe = NULL;
-}
-
-void
-fsprobe_exit(void)
-{
-       if (blprobe)
-               blkid_free_probe(blprobe);
-       if (blcache)
-               blkid_put_cache(blcache);
-}
-
-/*
- * Parses NAME=value, returns -1 on parse error, 0 success. The success is also
- * when the 'spec' doesn't contain name=value pair (because the spec could be
- * a devname too). In particular case the pointer 'name' is set to NULL.
- */
-int
-fsprobe_parse_spec(const char *spec, char **name, char **value)
-{
-       *name = NULL;
-       *value = NULL;
-
-       if (strchr(spec, '='))
-               return blkid_parse_tag_string(spec, name, value);
-
-       return 0;
-}
-
-char *
-fsprobe_get_devname_by_spec(const char *spec)
-{
-       return blkid_evaluate_spec(spec, &blcache);
-}
-
-int
-fsprobe_known_fstype(const char *fstype)
-{
-       return blkid_known_fstype(fstype);
-}
-
-
-/* returns device LABEL, UUID, FSTYPE, ... by low-level
- * probing interface
- */
-static char *
-fsprobe_get_value(const char *name, const char *devname, int *ambi)
-{
-       int fd, rc;
-       const char *data = NULL;
-
-       if (!devname || !name)
-               return NULL;
-       fd = open(devname, O_RDONLY);
-       if (fd < 0)
-               return NULL;
-       if (!blprobe)
-               blprobe = blkid_new_probe();
-       if (!blprobe)
-               goto done;
-       if (blkid_probe_set_device(blprobe, fd, 0, 0))
-               goto done;
-
-       blkid_probe_enable_superblocks(blprobe, 1);
-
-       blkid_probe_set_superblocks_flags(blprobe,
-               BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID | BLKID_SUBLKS_TYPE);
-
-       rc = blkid_do_safeprobe(blprobe);
-       if (ambi)
-               *ambi = rc == -2 ? 1 : 0;       /* ambivalent probing result */
-       if (!rc)
-               blkid_probe_lookup_value(blprobe, name, &data, NULL);
-done:
-       close(fd);
-       return data ? strdup((char *) data) : NULL;
-}
-
-char *
-fsprobe_get_label_by_devname(const char *devname)
-{
-       return fsprobe_get_value("LABEL", devname, NULL);
-}
-
-char *
-fsprobe_get_uuid_by_devname(const char *devname)
-{
-       return fsprobe_get_value("UUID", devname, NULL);
-}
-
-char *
-fsprobe_get_fstype_by_devname(const char *devname)
-{
-       return fsprobe_get_value("TYPE", devname, NULL);
-}
-
-char *
-fsprobe_get_fstype_by_devname_ambi(const char *devname, int *ambi)
-{
-       return fsprobe_get_value("TYPE", devname, ambi);
-}
-
-char *
-fsprobe_get_devname_by_uuid(const char *uuid)
-{
-       return blkid_evaluate_tag("UUID", uuid, &blcache);
-}
-
-char *
-fsprobe_get_devname_by_label(const char *label)
-{
-       return blkid_evaluate_tag("LABEL", label, &blcache);
-}
diff --git a/mount-deprecated/fsprobe.h b/mount-deprecated/fsprobe.h
deleted file mode 100644 (file)
index d9c1dc4..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef FSPROBE_H
-#define FSPROBE_H
-/*
- * THIS IS DEPRECATED -- use blkid_evaluate_* API rather than this extra layer
- *
- * This is the generic interface for filesystem guessing libraries.
- * Implementations are provided by
- */
-extern void fsprobe_init(void);
-extern void fsprobe_exit(void);
-
-extern int fsprobe_parse_spec(const char *spec, char **name, char **value);
-
-/* all routines return newly allocated string */
-extern char *fsprobe_get_devname_by_uuid(const char *uuid);
-extern char *fsprobe_get_devname_by_label(const char *label);
-extern char *fsprobe_get_devname_by_spec(const char *spec);
-
-extern char *fsprobe_get_label_by_devname(const char *devname);
-extern char *fsprobe_get_uuid_by_devname(const char *devname);
-extern char *fsprobe_get_fstype_by_devname(const char *devname);
-extern char *fsprobe_get_fstype_by_devname_ambi(const char *devname, int *ambi);
-
-
-extern int fsprobe_known_fstype(const char *fstype);
-
-#endif /* FSPROBE_H */
diff --git a/mount-deprecated/fstab.c b/mount-deprecated/fstab.c
deleted file mode 100644 (file)
index 176a16b..0000000
+++ /dev/null
@@ -1,988 +0,0 @@
-/* 1999-02-22 Arkadiusz Miƛkiewicz <misiek@pld.ORG.PL>
- * - added Native Language Support
- * Sun Mar 21 1999 - Arnaldo Carvalho de Melo <acme@conectiva.com.br>
- * - fixed strerr(errno) in gettext calls
- */
-
-#include <unistd.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <time.h>
-#include <mntent.h>
-
-#include "mount_mntent.h"
-#include "fstab.h"
-#include "sundries.h"
-#include "fsprobe.h"
-#include "pathnames.h"
-#include "nls.h"
-#include "strutils.h"
-#include "c.h"
-
-#define streq(s, t)    (strcmp ((s), (t)) == 0)
-
-/* Information about mtab. ------------------------------------*/
-static int have_mtab_info = 0;
-static int var_mtab_does_not_exist = 0;
-static int var_mtab_is_a_symlink = 0;
-
-static void
-get_mtab_info(void) {
-       if (!have_mtab_info) {
-               struct stat mtab_stat;
-
-               var_mtab_does_not_exist = 0;
-               var_mtab_is_a_symlink = 0;
-
-               if (lstat(_PATH_MOUNTED, &mtab_stat))
-                       var_mtab_does_not_exist = 1;
-               else if (S_ISLNK(mtab_stat.st_mode))
-                       var_mtab_is_a_symlink = 1;
-               have_mtab_info = 1;
-       }
-}
-
-void
-reset_mtab_info(void) {
-        have_mtab_info = 0;
-}
-
-int
-mtab_does_not_exist(void) {
-       get_mtab_info();
-       return var_mtab_does_not_exist;
-}
-
-int
-mtab_is_a_symlink(void) {
-       get_mtab_info();
-       return var_mtab_is_a_symlink;
-}
-
-int
-mtab_is_writable() {
-       int fd;
-
-       /* Should we write to /etc/mtab upon an update?
-          Probably not if it is a symlink to /proc/mounts, since that
-          would create a file /proc/mounts in case the proc filesystem
-          is not mounted. */
-       if (mtab_is_a_symlink())
-               return 0;
-
-       fd = open(_PATH_MOUNTED, O_RDWR | O_CREAT, 0644);
-       if (fd >= 0) {
-               close(fd);
-               return 1;
-       } else
-               return 0;
-}
-
-/* Contents of mtab and fstab ---------------------------------*/
-
-struct mntentchn mounttable, fstab;
-static int got_mtab = 0;
-static int got_fstab = 0;
-
-static void read_mounttable(void), read_fstab(void);
-
-struct mntentchn *
-mtab_head() {
-       if (!got_mtab)
-               read_mounttable();
-       return &mounttable;
-}
-
-struct mntentchn *
-fstab_head() {
-       if (!got_fstab)
-               read_fstab();
-       return &fstab;
-}
-
-static void
-my_free_mc(struct mntentchn *mc) {
-       if (mc) {
-               my_free(mc->m.mnt_fsname);
-               my_free(mc->m.mnt_dir);
-               my_free(mc->m.mnt_type);
-               my_free(mc->m.mnt_opts);
-               free(mc);
-       }
-}
-
-
-static void
-discard_mntentchn(struct mntentchn *mc0) {
-       struct mntentchn *mc, *mc1;
-
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc1) {
-               mc1 = mc->nxt;
-               my_free_mc(mc);
-       }
-}
-
-static void
-read_mntentchn(mntFILE *mfp, const char *fnam, struct mntentchn *mc0) {
-       struct mntentchn *mc = mc0;
-       struct my_mntent *mnt;
-
-       while ((mnt = my_getmntent(mfp)) != NULL) {
-               if (!streq(mnt->mnt_type, MNTTYPE_IGNORE)) {
-                       mc->nxt = (struct mntentchn *) xmalloc(sizeof(*mc));
-                       mc->nxt->prev = mc;
-                       mc = mc->nxt;
-                       mc->m = *mnt;
-                       mc->nxt = mc0;
-               }
-       }
-       mc0->prev = mc;
-       if (ferror(mfp->mntent_fp)) {
-               int errsv = errno;
-               error(_("warning: error reading %s: %s"),
-                     fnam, strerror (errsv));
-               mc0->nxt = mc0->prev = NULL;
-       }
-       my_endmntent(mfp);
-}
-
-/*
- * Read /etc/mtab.  If that fails, try /proc/mounts.
- * This produces a linked list. The list head mounttable is a dummy.
- */
-static void
-read_mounttable() {
-       mntFILE *mfp;
-       const char *fnam;
-       struct mntentchn *mc = &mounttable;
-
-       got_mtab = 1;
-       mc->nxt = mc->prev = NULL;
-
-       fnam = _PATH_MOUNTED;
-       mfp = my_setmntent (fnam, "r");
-       if (mfp == NULL || mfp->mntent_fp == NULL) {
-               int errsv = errno;
-               fnam = _PATH_PROC_MOUNTS;
-               mfp = my_setmntent (fnam, "r");
-               if (mfp == NULL || mfp->mntent_fp == NULL) {
-                       error(_("warning: can't open %s: %s"),
-                             _PATH_MOUNTED, strerror (errsv));
-                       return;
-               }
-               if (verbose)
-                       printf (_("mount: could not open %s - "
-                                 "using %s instead\n"),
-                               _PATH_MOUNTED, _PATH_PROC_MOUNTS);
-       }
-       read_mntentchn(mfp, fnam, mc);
-}
-
-static void
-read_fstab() {
-       mntFILE *mfp = NULL;
-       const char *fnam;
-       struct mntentchn *mc = &fstab;
-
-       got_fstab = 1;
-       mc->nxt = mc->prev = NULL;
-
-       fnam = _PATH_MNTTAB;
-       mfp = my_setmntent (fnam, "r");
-       if (mfp == NULL || mfp->mntent_fp == NULL) {
-               int errsv = errno;
-               error(_("warning: can't open %s: %s"),
-                     _PATH_MNTTAB, strerror (errsv));
-               return;
-       }
-       read_mntentchn(mfp, fnam, 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 name NAME, and the place MCPREV we found it last time,
- * try to find it in mtab.
- */
-struct mntentchn *
-getmntfilebackward (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_dir, name))
-                       return mc;
-
-       for (mc = mcprev->prev; mc && mc != mc0; mc = mc->prev)
-               if (streq(mc->m.mnt_fsname, name))
-                       return mc;
-
-       return NULL;
-}
-
-/*
- * Given the directory name NAME, and the place MCPREV we found it last time,
- * try to find more occurrences.
- */
-struct mntentchn *
-getmntdirbackward (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_dir, 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;
-
-       /* canonical names in mtab */
-       for (mc = mcprev->prev; mc && mc != mc0; mc = mc->prev) {
-               if (streq(mc->m.mnt_fsname, name))
-                       return mc;
-       }
-
-       /* non-canonical names in mtab (this is BAD THING!) */
-       for (mc = mcprev->prev; mc && mc != mc0; mc = mc->prev) {
-               char *cn = canonicalize(mc->m.mnt_fsname);
-               int res = cn ? streq(cn, name) : 0;
-
-               free(cn);
-               if (res)
-                       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);
-}
-
-/* Given the name FILE, try to find the option "loop=FILE" in mtab.  */
-struct mntentchn *
-getmntoptfile (const char *file) {
-       struct mntentchn *mc, *mc0;
-       const char *opts, *s;
-       int l;
-
-       if (!file)
-               return NULL;
-
-       l = strlen(file);
-
-       mc0 = mtab_head();
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
-               if ((opts = mc->m.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;
-}
-
-/* compares "quoted" or 'quoted' with unquoted */
-static int
-streq_quoted(const char *quoted, const char *unquoted)
-{
-       if (*quoted == '"' || *quoted == '\'')
-               return !strncmp(quoted + 1, unquoted, strlen(quoted) - 2);
-
-       return streq(quoted, unquoted);
-}
-
-static int
-has_label(const char *device, const char *label) {
-       const char *devlabel;
-       int ret;
-
-       devlabel = fsprobe_get_label_by_devname(device);
-       if (!devlabel)
-               return 0;
-
-       ret = streq_quoted(label, devlabel);
-       my_free(devlabel);
-       return ret;
-}
-
-static int
-has_uuid(const char *device, const char *uuid){
-       const char *devuuid;
-       int ret;
-
-       devuuid = fsprobe_get_uuid_by_devname(device);
-       if (!devuuid)
-               return 0;
-
-       ret = streq_quoted(uuid, devuuid);
-       my_free(devuuid);
-       return ret;
-}
-
-/* Find the entry (DEV,DIR) in fstab -- spec and dir must be canonicalized! */
-struct mntentchn *
-getfs_by_devdir (const char *dev, const char *dir) {
-       struct mntentchn *mc, *mc0;
-
-       mc0 = fstab_head();
-
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) {
-               int ok = 1;
-
-               /* dir */
-               if (!streq(mc->m.mnt_dir, dir)) {
-                       char *dr = canonicalize(mc->m.mnt_dir);
-                       ok = streq(dr, dir);
-                       my_free(dr);
-               }
-
-               /* spec */
-               if (ok && !streq(mc->m.mnt_fsname, dev)) {
-                       const char *fs = mc->m.mnt_fsname;
-
-                       if (strncmp (fs, "LABEL=", 6) == 0) {
-                               ok = has_label(dev, fs + 6);
-                       } else if (strncmp (fs, "UUID=", 5) == 0) {
-                               ok = has_uuid(dev, fs + 5);
-                       } else {
-                               fs = canonicalize_spec(mc->m.mnt_fsname);
-                               ok = streq_except_trailing_slash(fs, dev);
-                               my_free(fs);
-                       }
-               }
-               if (ok)
-                       return mc;
-       }
-
-       return NULL;
-}
-
-/* Find the dir DIR in fstab.  */
-struct mntentchn *
-getfs_by_dir (const char *dir) {
-       struct mntentchn *mc, *mc0;
-       char *cdir;
-
-       mc0 = fstab_head();
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
-               if (streq(mc->m.mnt_dir, dir))
-                       return mc;
-
-       cdir = canonicalize(dir);
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) {
-               int ok = streq(mc->m.mnt_dir, cdir);
-               if (!ok) {
-                       char *dr = canonicalize(mc->m.mnt_dir);
-                       ok = dr ? streq(dr, cdir) : 0;
-                       free(dr);
-               }
-               if (ok) {
-                       free(cdir);
-                       return mc;
-               }
-       }
-       free(cdir);
-       return NULL;
-}
-
-/* Find the device SPEC in fstab.  */
-struct mntentchn *
-getfs_by_spec (const char *spec) {
-       char *name = NULL, *value = NULL, *cspec;
-       struct mntentchn *mc = NULL;
-
-       if (!spec)
-               return NULL;
-
-       if (fsprobe_parse_spec(spec, &name, &value) != 0)
-               return NULL;                            /* parse error */
-
-       if (name) {
-               if (!strcmp(name,"LABEL"))
-                       mc = getfs_by_label (value);
-               else if (!strcmp(name,"UUID"))
-                       mc = getfs_by_uuid (value);
-
-               free(name);
-               free(value);
-               return mc;
-       }
-
-       cspec = canonicalize_spec(spec);
-       mc = getfs_by_devname(cspec);
-       free(cspec);
-
-       if (!mc)
-               /* noncanonical name  like /dev/cdrom */
-               mc = getfs_by_devname(spec);
-
-       return mc;
-}
-
-/* Find the device in fstab.  */
-struct mntentchn *
-getfs_by_devname (const char *devname) {
-       struct mntentchn *mc, *mc0;
-
-       mc0 = fstab_head();
-
-       /* canonical devname in fstab */
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
-               if (streq(mc->m.mnt_fsname, devname))
-                       return mc;
-
-       /* noncanonical devname in fstab */
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) {
-               char *fs;
-
-               if (strncmp(mc->m.mnt_fsname, "LABEL=", 6) == 0 ||
-                               strncmp(mc->m.mnt_fsname, "UUID=", 5) == 0)
-                       continue;
-
-               fs = canonicalize_spec(mc->m.mnt_fsname);
-               if (streq(fs, devname)) {
-                       free(fs);
-                       return mc;
-               }
-               free(fs);
-       }
-
-       return NULL;
-}
-
-
-/* Find the uuid UUID in fstab. */
-struct mntentchn *
-getfs_by_uuid (const char *uuid) {
-       struct mntentchn *mc, *mc0;
-
-       mc0 = fstab_head();
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
-               if (strncmp (mc->m.mnt_fsname, "UUID=", 5) == 0
-                   && streq_quoted(mc->m.mnt_fsname + 5, uuid))
-                       return mc;
-       return NULL;
-}
-
-/* Find the label LABEL in fstab. */
-struct mntentchn *
-getfs_by_label (const char *label) {
-       struct mntentchn *mc, *mc0;
-
-       mc0 = fstab_head();
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
-               if (strncmp (mc->m.mnt_fsname, "LABEL=", 6) == 0
-                   && streq_quoted(mc->m.mnt_fsname + 6, label))
-                       return mc;
-       return NULL;
-}
-
-/* Updating mtab ----------------------------------------------*/
-
-/* Flag for already existing lock file. */
-static int we_created_lockfile = 0;
-static int lockfile_fd = -1;
-
-/* Flag to indicate that signals have been set up. */
-static int signals_have_been_setup = 0;
-
-/* Ensure that the lock is released if we are interrupted.  */
-#ifndef HAVE_STRSIGNAL_DECL
-extern char *strsignal(int sig);       /* not always in <string.h> */
-#endif
-
-static void
-handler (int sig) {
-     die(EX_USER, "%s", strsignal(sig));
-}
-
-static void
-setlkw_timeout (int sig __attribute__ ((__unused__))) {
-     /* nothing, fcntl will fail anyway */
-}
-
-/* Remove lock file.  */
-void
-unlock_mtab (void) {
-       if (we_created_lockfile) {
-               close(lockfile_fd);
-               lockfile_fd = -1;
-               unlink (_PATH_MOUNTED_LOCK);
-               we_created_lockfile = 0;
-       }
-}
-
-/* Create the lock file.
-   The lock file will be removed if we catch a signal or when we exit. */
-/* The old code here used flock on a lock file /etc/mtab~ and deleted
-   this lock file afterwards. However, as rgooch remarks, that has a
-   race: a second mount may be waiting on the lock and proceed as
-   soon as the lock file is deleted by the first mount, and immediately
-   afterwards a third mount comes, creates a new /etc/mtab~, applies
-   flock to that, and also proceeds, so that the second and third mount
-   now both are scribbling in /etc/mtab.
-   The new code uses a link() instead of a creat(), where we proceed
-   only if it was us that created the lock, and hence we always have
-   to delete the lock afterwards. Now the use of flock() is in principle
-   superfluous, but avoids an arbitrary sleep(). */
-
-/* Where does the link point to? Obvious choices are mtab and mtab~~.
-   HJLu points out that the latter leads to races. Right now we use
-   mtab~.<pid> instead. Use 20 as upper bound for the length of %d. */
-#define MOUNTLOCK_LINKTARGET           _PATH_MOUNTED_LOCK "%d"
-#define MOUNTLOCK_LINKTARGET_LTH       (sizeof(_PATH_MOUNTED_LOCK)+20)
-
-/*
- * The original mount locking code has used sleep(1) between attempts and
- * maximal number of attemps has been 5.
- *
- * There was very small number of attempts and extremely long waiting (1s)
- * that is useless on machines with large number of concurret mount processes.
- *
- * Now we wait few thousand microseconds between attempts and we have global
- * time limit (30s) rather than limit for number of attempts. The advantage
- * is that this method also counts time which we spend in fcntl(F_SETLKW) and
- * number of attempts is not so much restricted.
- *
- * -- kzak@redhat.com [2007-Mar-2007]
- */
-
-/* maximum seconds between first and last attempt */
-#define MOUNTLOCK_MAXTIME              30
-
-/* sleep time (in microseconds, max=999999) between attempts */
-#define MOUNTLOCK_WAITTIME             5000
-
-void
-lock_mtab (void) {
-       int i;
-       struct timespec waittime;
-       struct timeval maxtime;
-       char linktargetfile[MOUNTLOCK_LINKTARGET_LTH];
-
-       if (!signals_have_been_setup) {
-               int sig = 0;
-               struct sigaction sa;
-
-               sa.sa_handler = handler;
-               sa.sa_flags = 0;
-               sigfillset (&sa.sa_mask);
-
-               while (sigismember (&sa.sa_mask, ++sig) != -1
-                      && sig != SIGCHLD) {
-                       if (sig == SIGALRM)
-                               sa.sa_handler = setlkw_timeout;
-                       else
-                               sa.sa_handler = handler;
-                       sigaction (sig, &sa, (struct sigaction *) 0);
-               }
-               signals_have_been_setup = 1;
-       }
-
-       sprintf(linktargetfile, MOUNTLOCK_LINKTARGET, getpid ());
-
-       i = open (linktargetfile, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
-       if (i < 0) {
-               int errsv = errno;
-               /* linktargetfile does not exist (as a file)
-                  and we cannot create it. Read-only filesystem?
-                  Too many files open in the system?
-                  Filesystem full? */
-               die (EX_FILEIO, _("can't create lock file %s: %s "
-                                                 "(use -n flag to override)"),
-                        linktargetfile, strerror (errsv));
-       }
-       close(i);
-
-       gettimeofday(&maxtime, NULL);
-       maxtime.tv_sec += MOUNTLOCK_MAXTIME;
-
-       waittime.tv_sec = 0;
-       waittime.tv_nsec = (1000 * MOUNTLOCK_WAITTIME);
-
-       /* Repeat until it was us who made the link */
-       while (!we_created_lockfile) {
-               struct timeval now;
-               struct flock flock;
-               int errsv, j;
-
-               j = link(linktargetfile, _PATH_MOUNTED_LOCK);
-               errsv = errno;
-
-               if (j == 0)
-                       we_created_lockfile = 1;
-
-               if (j < 0 && errsv != EEXIST) {
-                       (void) unlink(linktargetfile);
-                       die (EX_FILEIO, _("can't link lock file %s: %s "
-                            "(use -n flag to override)"),
-                            _PATH_MOUNTED_LOCK, strerror (errsv));
-               }
-
-               lockfile_fd = open (_PATH_MOUNTED_LOCK, O_WRONLY);
-
-               if (lockfile_fd < 0) {
-                       /* Strange... Maybe the file was just deleted? */
-                       int errsv = errno;
-                       gettimeofday(&now, NULL);
-                       if (errno == ENOENT && now.tv_sec < maxtime.tv_sec) {
-                               we_created_lockfile = 0;
-                               continue;
-                       }
-                       (void) unlink(linktargetfile);
-                       die (EX_FILEIO, _("can't open lock file %s: %s "
-                            "(use -n flag to override)"),
-                            _PATH_MOUNTED_LOCK, strerror (errsv));
-               }
-
-               flock.l_type = F_WRLCK;
-               flock.l_whence = SEEK_SET;
-               flock.l_start = 0;
-               flock.l_len = 0;
-
-               if (j == 0) {
-                       /* We made the link. Now claim the lock. */
-                       if (fcntl (lockfile_fd, F_SETLK, &flock) == -1) {
-                               if (verbose) {
-                                   int errsv = errno;
-                                   printf(_("Can't lock lock file %s: %s\n"),
-                                          _PATH_MOUNTED_LOCK, strerror (errsv));
-                               }
-                               /* proceed, since it was us who created the lockfile anyway */
-                       }
-                       (void) unlink(linktargetfile);
-               } else {
-                       /* Someone else made the link. Wait. */
-                       gettimeofday(&now, NULL);
-                       if (now.tv_sec < maxtime.tv_sec) {
-                               alarm(maxtime.tv_sec - now.tv_sec);
-                               if (fcntl (lockfile_fd, F_SETLKW, &flock) == -1) {
-                                       int errsv = errno;
-                                       (void) unlink(linktargetfile);
-                                       die (EX_FILEIO, _("can't lock lock file %s: %s"),
-                                            _PATH_MOUNTED_LOCK, (errno == EINTR) ?
-                                            _("timed out") : strerror (errsv));
-                               }
-                               alarm(0);
-
-                               nanosleep(&waittime, NULL);
-                       } else {
-                               (void) unlink(linktargetfile);
-                               die (EX_FILEIO, _("Cannot create link %s\n"
-                                                 "Perhaps there is a stale lock file?\n"),
-                                        _PATH_MOUNTED_LOCK);
-                       }
-                       close(lockfile_fd);
-               }
-       }
-}
-
-/* returns whole option with name @optname from @src list */
-char *
-get_option(const char *optname, const char *src, size_t *len)
-{
-       char *opt, *end;
-       size_t sz;
-
-       if (!src)
-               return NULL;
-
-       opt = strstr(src, optname);
-       if (!opt)
-               return NULL;
-
-       end = strchr(opt, ',');
-       sz = end && end > opt ? (size_t) (end - opt) : strlen(opt);
-
-       if (len)
-               *len = sz;
-
-       if ((opt == src || *(opt - 1) == ',') &&
-           (*(opt + sz) == '\0' || *(opt + sz) == ','))
-               return opt;
-
-       return NULL;
-}
-
- /* If @list contains "user=peter" and @s is "user=", return "peter" */
-char *
-get_option_value(const char *list, const char *s)
-{
-       const char *t;
-       size_t n = strlen(s);
-
-       while (list && *list) {
-               if (strncmp(list, s, n) == 0) {
-                       s = t = list + n;
-                       while (*s && *s != ',')
-                               s++;
-                       return xstrndup(t, s-t);
-               }
-               while (*list && *list++ != ',') ;
-       }
-       return NULL;
-}
-
-static int
-cpy_option(const char *optname, char *dest, const char *src)
-{
-       char *opt;
-       size_t sz;
-
-       opt = get_option(optname, src, &sz);
-       if (!opt)
-               /* the option doesn't exist */
-               return 0;
-
-       if (get_option(optname, dest, NULL))
-               /* the options is already in dest */
-               return 0;
-
-       if (*dest) {
-               dest = dest + strlen(dest);
-               *dest++ = ',';          /* separator */
-       }
-       memcpy(dest, opt, sz);  /* copy option */
-       *(dest + sz) = '\0';    /* terminator */
-
-       return 1;
-}
-
-/* Generates (and allocates) new options for remount
- *
- * We cannot blindly replace the old options, otherwise we will lost some
- * internally generated stuff (e.g loop=).
- */
-static char *
-mk_remount_opts(const char *old, const char *instead)
-{
-       char *new;
-       size_t sz;
-
-       if (old == NULL && instead == NULL)
-               return NULL;
-       if (!old)
-               return xstrdup(instead);
-
-       /* max size of new options is:
-        * old + new + '\0' + separator (for each copied option)
-        */
-       sz = strlen(old) + (instead ? strlen(instead) : 0) + 2;
-       new = xmalloc(sz);
-       if (instead && *instead)
-               strncpy(new, instead, sz);
-       else
-               *new = '\0';
-
-       cpy_option("loop=", new, old);
-
-       return new;
-}
-
-/*
- * Update the mtab.
- *  Used by umount with null INSTEAD: remove the last DIR entry.
- *  Used by mount upon a remount: update option part,
- *   and complain if a wrong device or type was given.
- *   [Note that often a remount will be a rw remount of /
- *    where there was no entry before, and we'll have to believe
- *    the values given in INSTEAD.]
- */
-
-void
-update_mtab (const char *dir, struct my_mntent *instead) {
-       mntFILE *mfp, *mftmp;
-       const char *fnam = _PATH_MOUNTED;
-       struct mntentchn mtabhead;      /* dummy */
-       struct mntentchn *mc, *mc0 = NULL, *absent = NULL;
-       struct stat sbuf;
-       int fd;
-
-       if (mtab_does_not_exist() || !mtab_is_writable())
-               return;
-
-       lock_mtab();
-
-       /* having locked mtab, read it again */
-       mc0 = mc = &mtabhead;
-       mc->nxt = mc->prev = NULL;
-
-       mfp = my_setmntent(fnam, "r");
-       if (mfp == NULL || mfp->mntent_fp == NULL) {
-               int errsv = errno;
-               error (_("cannot open %s (%s) - mtab not updated"),
-                      fnam, strerror (errsv));
-               goto leave;
-       }
-
-       read_mntentchn(mfp, fnam, mc);
-
-       /* find last occurrence of dir */
-       if (dir) {
-               for (mc = mc0->prev; mc && mc != mc0; mc = mc->prev)
-                       if (streq(mc->m.mnt_dir, dir))
-                               break;
-       }
-       if (dir && mc && mc != mc0) {
-               if (instead == NULL) {
-                       /* An umount - remove entry */
-                       if (mc && mc != mc0) {
-                               mc->prev->nxt = mc->nxt;
-                               mc->nxt->prev = mc->prev;
-                               my_free_mc(mc);
-                       }
-               } else if (!strcmp(mc->m.mnt_dir, instead->mnt_dir)) {
-                       /* A remount */
-                       char *opts = mk_remount_opts(mc->m.mnt_opts,
-                                       instead->mnt_opts);
-                       my_free(mc->m.mnt_opts);
-                       mc->m.mnt_opts = opts;
-               } else {
-                       /* A move */
-                       my_free(mc->m.mnt_dir);
-                       mc->m.mnt_dir = xstrdup(instead->mnt_dir);
-               }
-       } else if (instead) {
-               /* not found, add a new entry */
-               absent = xmalloc(sizeof(*absent));
-               absent->m.mnt_fsname = xstrdup(instead->mnt_fsname);
-               absent->m.mnt_dir = xstrdup(instead->mnt_dir);
-               absent->m.mnt_type = xstrdup(instead->mnt_type);
-               absent->m.mnt_opts = xstrdup(instead->mnt_opts);
-               absent->m.mnt_freq = instead->mnt_freq;
-               absent->m.mnt_passno = instead->mnt_passno;
-               absent->nxt = mc0;
-               if (mc0->prev != NULL) {
-                       absent->prev = mc0->prev;
-                       mc0->prev->nxt = absent;
-               } else {
-                       absent->prev = mc0;
-               }
-               mc0->prev = absent;
-               if (mc0->nxt == NULL)
-                       mc0->nxt = absent;
-       }
-
-       /* write chain to mtemp */
-       mftmp = my_setmntent (_PATH_MOUNTED_TMP, "w");
-       if (mftmp == NULL || mftmp->mntent_fp == NULL) {
-               int errsv = errno;
-               error (_("cannot open %s (%s) - mtab not updated"),
-                      _PATH_MOUNTED_TMP, strerror (errsv));
-               goto leave;
-       }
-
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) {
-               if (my_addmntent(mftmp, &(mc->m)) == 1) {
-                       int errsv = errno;
-                       error(_("error writing %s: %s"),
-                            _PATH_MOUNTED_TMP, strerror (errsv));
-                       goto leave;
-               }
-       }
-
-       discard_mntentchn(mc0);
-       mc0 = NULL;
-
-       /*
-        * We have to be paranoid with write() to avoid incomplete
-        * /etc/mtab. Users are able to control writing by RLIMIT_FSIZE.
-        */
-       if (fflush(mftmp->mntent_fp) != 0) {
-               int errsv = errno;
-               error (_("%s: cannot fflush changes: %s"),
-                               _PATH_MOUNTED_TMP, strerror (errsv));
-               goto leave;
-       }
-
-       fd = fileno(mftmp->mntent_fp);
-
-       /*
-        * It seems that better is incomplete and broken /etc/mtab that
-        * /etc/mtab that is writeable for non-root users.
-        *
-        * We always skip rename() when chown() and chmod() failed.
-        * -- kzak, 11-Oct-2007
-        */
-
-       if (fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) {
-               int errsv = errno;
-               fprintf(stderr, _("error changing mode of %s: %s\n"),
-                       _PATH_MOUNTED_TMP, strerror (errsv));
-               goto leave;
-       }
-
-       /*
-        * If mount is setuid and some non-root user mounts sth,
-        * then mtab.tmp might get the group of this user. Copy uid/gid
-        * from the present mtab before renaming.
-        */
-       if (stat(_PATH_MOUNTED, &sbuf) == 0) {
-               if (fchown(fd, sbuf.st_uid, sbuf.st_gid) < 0) {
-                       int errsv = errno;
-                       fprintf (stderr, _("error changing owner of %s: %s\n"),
-                               _PATH_MOUNTED_TMP, strerror(errsv));
-                       goto leave;
-               }
-       }
-
-       my_endmntent (mftmp);
-
-       /* rename mtemp to mtab */
-       if (rename (_PATH_MOUNTED_TMP, _PATH_MOUNTED) < 0) {
-               int errsv = errno;
-               fprintf(stderr, _("can't rename %s to %s: %s\n"),
-                       _PATH_MOUNTED_TMP, _PATH_MOUNTED, strerror(errsv));
-       }
-
- leave:
-       if (mc0)
-               discard_mntentchn(mc0);
-       unlink(_PATH_MOUNTED_TMP);
-       unlock_mtab();
-}
-
diff --git a/mount-deprecated/fstab.h b/mount-deprecated/fstab.h
deleted file mode 100644 (file)
index 4c01fd4..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef MOUNT_FSTAB_H
-#define MOUNT_FSTAB_H
-
-#include "mount_mntent.h"
-
-int mtab_is_writable(void);
-int mtab_is_a_symlink(void);
-int mtab_does_not_exist(void);
-void reset_mtab_info(void);
-int is_mounted_once(const char *name);
-
-struct mntentchn {
-       struct mntentchn *nxt, *prev;
-       struct my_mntent m;
-};
-
-struct mntentchn *mtab_head (void);
-struct mntentchn *getmntfile (const char *name);
-struct mntentchn *getmntfilebackward (const char *name, struct mntentchn *mcprev);
-struct mntentchn *getmntoptfile (const char *file);
-struct mntentchn *getmntdirbackward (const char *dir, struct mntentchn *mc);
-struct mntentchn *getmntdevbackward (const char *dev, struct mntentchn *mc);
-
-struct mntentchn *fstab_head (void);
-struct mntentchn *getfs_by_dir (const char *dir);
-struct mntentchn *getfs_by_spec (const char *spec);
-struct mntentchn *getfs_by_devname (const char *devname);
-struct mntentchn *getfs_by_devdir (const char *dev, const char *dir);
-struct mntentchn *getfs_by_uuid (const char *uuid);
-struct mntentchn *getfs_by_label (const char *label);
-
-void lock_mtab (void);
-void unlock_mtab (void);
-void update_mtab (const char *special, struct my_mntent *with);
-
-char *get_option(const char *optname, const char *src, size_t *len);
-char *get_option_value(const char *list, const char *s);
-
-#endif /* MOUNT_FSTAB_H */
diff --git a/mount-deprecated/getusername.c b/mount-deprecated/getusername.c
deleted file mode 100644 (file)
index 9835768..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <unistd.h>
-#include <pwd.h>
-#include <sys/types.h>
-#include "getusername.h"
-
-char *
-getusername() {
-       char *user = 0;
-       struct passwd *pw = getpwuid(getuid());
-
-       if (pw)
-               user = pw->pw_name;
-       return user;
-}
diff --git a/mount-deprecated/getusername.h b/mount-deprecated/getusername.h
deleted file mode 100644 (file)
index 808ac9b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-extern char *getusername(void);
diff --git a/mount-deprecated/mount.8 b/mount-deprecated/mount.8
deleted file mode 100644 (file)
index 8708fca..0000000
+++ /dev/null
@@ -1,2849 +0,0 @@
-.\" Copyright (c) 1996-2004 Andries Brouwer
-.\"
-.\" This page is somewhat derived from a page that was
-.\" (c) 1980, 1989, 1991 The Regents of the University of California
-.\" and had been heavily modified by Rik Faith and myself.
-.\" (Probably no BSD text remains.)
-.\" Fragments of text were written by Werner Almesberger, Remy Card,
-.\" Stephen Tweedie and Eric Youngdale.
-.\"
-.\" This is free documentation; you can redistribute it and/or
-.\" modify it under the terms of the GNU General Public License as
-.\" published by the Free Software Foundation; either version 2 of
-.\" the License, or (at your option) any later version.
-.\"
-.\" The GNU General Public License's references to "object code"
-.\" and "executables" are to be interpreted as the output of any
-.\" document formatting or typesetting system, including
-.\" intermediate and printed output.
-.\"
-.\" This manual is distributed in the hope that it will be useful,
-.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\" GNU General Public License for more details.
-.\"
-.\" You should have received a copy of the GNU General Public License along
-.\" with this program; if not, write to the Free Software Foundation, Inc.,
-.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-.\"
-.\" 960705, aeb: version for mount-2.7g
-.\" 970114, aeb: xiafs and ext are dead; romfs is new
-.\" 970623, aeb: -F option
-.\" 970914, reg: -s option
-.\" 981111, K.Garloff: /etc/filesystems
-.\" 990111, aeb: documented /sbin/mount.smbfs
-.\" 990730, Yann Droneaud <lch@multimania.com>: updated page
-.\" 991214, Elrond <Elrond@Wunder-Nett.org>: added some docs on devpts
-.\" 010714, Michael K. Johnson <johnsonm@redhat.com> added -O
-.\" 010725, Nikita Danilov <NikitaDanilov@Yahoo.COM>: reiserfs options
-.\" 011124, Karl Eichwalder <ke@gnu.franken.de>: tmpfs options
-.\"
-.TH MOUNT 8 "December 2004" "util-linux" "System Administration"
-.SH NAME
-mount \- mount a filesystem
-.SH SYNOPSIS
-.B mount
-.RB [ \-lhV ]
-.LP
-.BI "mount \-a
-.RB [ \-fFnrsvw ]
-.RB [ \-t
-.IR vfstype ]
-.RB [ \-O
-.IR optlist ]
-.LP
-.B mount
-.RB [ \-fnrsvw ]
-.RB [ \-o
-.IR option [ \fB,\fPoption ]...]
-.IR device | dir
-.LP
-.B mount
-.RB [ \-fnrsvw ]
-.RB [ \-t
-.IB vfstype ]
-.RB [ \-o
-.IR options ]
-.I device dir
-.SH DESCRIPTION
-All files accessible in a Unix system are arranged in one big
-tree, the file hierarchy, rooted at
-.BR / .
-These files can be spread out over several devices. The
-.B mount
-command serves to attach the filesystem found on some device
-to the big file tree. Conversely, the
-.BR umount (8)
-command will detach it again.
-
-The standard form of the
-.B mount
-command, is
-.RS
-
-.br
-.BI "mount \-t" " type device dir"
-.br
-
-.RE
-This tells the kernel to attach the filesystem found on
-.I device
-(which is of type
-.IR type )
-at the directory
-.IR dir .
-The previous contents (if any) and owner and mode of
-.I dir
-become invisible, and as long as this filesystem remains mounted,
-the pathname
-.I dir
-refers to the root of the filesystem on
-.IR device .
-
-If only directory or device is given, for example:
-.RS
-
-.br
-.BI "mount /dir"
-.br
-
-.RE
-then mount looks for a mountpoint and if not found then for a device in the
-/etc/fstab file.
-
-.B The listing and help.
-.RS
-Three forms of invocation do not actually mount anything:
-.TP
-.B "mount \-h"
-prints a help message
-.TP
-.B "mount \-V"
-prints a version string
-.TP
-.BR "mount " [ -l "] [" "-t \fItype\fP" ]
-lists all mounted filesystems (of type
-.IR type ).
-The option \-l adds the labels in this listing.
-See below.
-.RE
-
-.B The device indication.
-.RS
-Most devices are indicated by a file name (of a block special device), like
-.IR /dev/sda1 ,
-but there are other possibilities. For example, in the case of an NFS mount,
-.I device
-may look like
-.IR knuth.cwi.nl:/dir .
-It is possible to indicate a block special device using its
-volume
-.B LABEL
-or
-.B UUID
-(see the \-L and \-U options below).
-
-The recommended setup is to use LABEL=<label> or UUID=<uuid> tags rather than
-.B /dev/disk/by-{label,uuid}
-udev symlinks in the /etc/fstab file. The tags are
-more readable, robust and portable. The
-.BR mount (8)
-command internally uses udev
-symlinks, so use the symlinks in /etc/fstab has no advantage over LABEL=/UUID=.
-For more details see
-.BR libblkid (3).
-
-Note that
-.BR mount (8)
-uses UUIDs as strings. The UUIDs from command line or
-.BR fstab (5)
-are not converted to internal binary representation. The string representation
-of the UUID should be based on lower case characters.
-
-The
-.I proc
-filesystem is not associated with a special device, and when
-mounting it, an arbitrary keyword, such as
-.I proc
-can be used instead of a device specification.
-(The customary choice
-.I none
-is less fortunate: the error message `none busy' from
-.B umount
-can be confusing.)
-.RE
-
-.B The /etc/fstab, /etc/mtab and /proc/mounts files.
-.RS
-The file
-.I /etc/fstab
-(see
-.BR fstab (5)),
-may contain lines describing what devices are usually
-mounted where, using which options.
-.LP
-The command
-.RS
-.sp
-.B mount \-a
-.RB [ \-t
-.IR type ]
-.RB [ \-O
-.IR optlist ]
-.sp
-.RE
-(usually given in a bootscript) causes all filesystems mentioned in
-.I fstab
-(of the proper type and/or having or not having the proper options)
-to be mounted as indicated, except for those whose line contains the
-.B noauto
-keyword. Adding the
-.B \-F
-option will make mount fork, so that the
-filesystems are mounted simultaneously.
-.LP
-When mounting a filesystem mentioned in
-.IR fstab
-or
-.IR mtab ,
-it suffices to give only the device, or only the mount point.
-
-
-The programs
-.B mount
-and
-.B umount
-maintain a list of currently mounted filesystems in the file
-.IR /etc/mtab .
-If no arguments are given to
-.BR mount ,
-this list is printed.
-
-The
-.B mount
-program does not read the
-.I /etc/fstab
-file if
-.I device
-(or LABEL/UUID) and
-.I dir
-are specified. For example:
-.RS
-.sp
-.B "mount /dev/foo /dir"
-.sp
-.RE
-If you want to override mount options from
-.I /etc/fstab
-you have to use:
-.RS
-.sp
-.B "mount device|dir -o <options>"
-.sp
-.RE
-and then the mount options from command line will be appended to
-the list of options from
-.IR /etc/fstab .
-The usual behaviour is that the last option wins if there is more duplicated
-options.
-
-When the
-.I proc
-filesystem is mounted (say at
-.IR /proc ),
-the files
-.I /etc/mtab
-and
-.I /proc/mounts
-have very similar contents. The former has somewhat
-more information, such as the mount options used,
-but is not necessarily up-to-date (cf. the
-.B \-n
-option below). It is possible to replace
-.I /etc/mtab
-by a symbolic link to
-.IR /proc/mounts ,
-and especially when you have very large numbers of mounts
-things will be much faster with that symlink,
-but some information is lost that way, and in particular
-using the "user" option will fail.
-.RE
-
-.B The non-superuser mounts.
-.RS
-Normally, only the superuser can mount filesystems.
-However, when
-.I fstab
-contains the
-.B user
-option on a line, anybody can mount the corresponding system.
-.LP
-Thus, given a line
-.RS
-.sp
-.B "/dev/cdrom  /cd  iso9660  ro,user,noauto,unhide"
-.sp
-.RE
-any user can mount the iso9660 filesystem found on his CDROM
-using the command
-.RS
-.sp
-.B "mount /dev/cdrom"
-.sp
-.RE
-or
-.RS
-.sp
-.B "mount /cd"
-.sp
-.RE
-For more details, see
-.BR fstab (5).
-Only the user that mounted a filesystem can unmount it again.
-If any user should be able to unmount, then use
-.B users
-instead of
-.B user
-in the
-.I fstab
-line.
-The
-.B owner
-option is similar to the
-.B user
-option, with the restriction that the user must be the owner
-of the special file. This may be useful e.g. for
-.I /dev/fd
-if a login script makes the console user owner of this device.
-The
-.B group
-option is similar, with the restriction that the user must be
-member of the group of the special file.
-.RE
-
-
-.B The bind mounts.
-.RS
-.\" In fact since 2.3.99. At first the syntax was mount -t bind.
-Since Linux 2.4.0 it is possible to remount part of the
-file hierarchy somewhere else. The call is
-.RS
-.br
-.B mount --bind
-.I olddir newdir
-.RE
-or shortoption
-.RS
-.br
-.B mount -B
-.I olddir newdir
-.RE
-or fstab entry is:
-.RS
-.br
-.I /olddir
-.I /newdir
-.B  none  bind
-.RE
-
-After this call the same contents is accessible in two places.
-One can also remount a single file (on a single file). It's also
-possible to use the bind mount to create a mountpoint from a regular
-directory, for example:
-
-.RS
-.br
-.B mount --bind
-.I foo foo
-.RE
-
-The bind mount call attaches only (part of) a single filesystem, not possible
-submounts. The entire file hierarchy including submounts is attached
-a second place using
-
-.RS
-.br
-.B mount --rbind
-.I olddir newdir
-.RE
-
-or shortoption
-
-.RS
-.br
-.B mount -R
-.I olddir newdir
-.RE
-.\" available since Linux 2.4.11.
-
-Note that the filesystem mount options will remain the same as those
-on the original mount point, and cannot be changed by passing the -o
-option along with --bind/--rbind. The mount options can be
-changed by a separate remount command, for example:
-
-.RS
-.br
-.B mount --bind
-.I olddir newdir
-.br
-.B mount -o remount,ro
-.I newdir
-.RE
-
-Note that behavior of the remount operation depends on the /etc/mtab file. The
-first command stores the 'bind' flag to the /etc/mtab file and the second
-command reads the flag from the file.  If you have a system without the
-/etc/mtab file or if you explicitly define source and target for the remount
-command (then mount(8) does not read /etc/mtab), then you have to use bind flag
-(or option) for the remount command too. For example:
-
-.RS
-.br
-.B mount --bind
-.I olddir newdir
-.br
-.B mount -o remount,ro,bind
-.I olddir newdir
-.RE
-.RE
-
-.B The move operation.
-.RS
-Since Linux 2.5.1 it is possible to atomically move a
-.B mounted tree
-to another place. The call is
-.RS
-.br
-.B mount --move
-.I olddir newdir
-.RE
-or shortoption
-.RS
-.br
-.B mount -M
-.I olddir newdir
-.RE
-This will cause the contents which previously appeared under olddir to be
-accessed under newdir.  The physical location of the files is not changed.
-Note that the
-.I olddir
-has to be a mountpoint.
-.RE
-
-.B The shared subtrees operations.
-.RS
-Since Linux 2.6.15 it is possible to mark a mount and its submounts as shared,
-private, slave or unbindable. A shared mount provides ability to create mirrors
-of that mount such that mounts and umounts within any of the mirrors propagate
-to the other mirror. A slave mount receives propagation from its master, but
-any not vice-versa.  A private mount carries no propagation abilities.  A
-unbindable mount is a private mount which cannot be cloned through a bind
-operation. Detailed semantics is documented in Documentation/filesystems/sharedsubtree.txt
-file in the kernel source tree.
-
-.RS
-.nf
-.BI "mount --make-shared " mountpoint
-.BI "mount --make-slave " mountpoint
-.BI "mount --make-private " mountpoint
-.BI "mount --make-unbindable " mountpoint
-.fi
-.RE
-
-The following commands allows one to recursively change the type of all the
-mounts under a given mountpoint.
-
-.RS
-.nf
-.BI "mount --make-rshared " mountpoint
-.BI "mount --make-rslave " mountpoint
-.BI "mount --make-rprivate " mountpoint
-.BI "mount --make-runbindable " mountpoint
-.fi
-.RE
-.RE
-
-.SH COMMAND LINE OPTIONS
-The full set of mount options used by an invocation of
-.B mount
-is determined by first extracting the
-mount options for the filesystem from the
-.I fstab
-table, then applying any options specified by the
-.B \-o
-argument, and finally applying a
-.BR \-r " or " \-w
-option, when present.
-
-Command line options available for the
-.B mount
-command:
-.IP "\fB\-V, \-\-version\fP"
-Display version information and exit.
-.IP "\fB\-h, \-\-help\fP"
-Display help text and exit.
-.IP "\fB\-v, \-\-verbose\fP"
-Verbose mode.
-.IP "\fB\-a, \-\-all\fP"
-Mount all filesystems (of the given types) mentioned in
-.IR fstab .
-.IP "\fB\-F, \-\-fork\fP"
-(Used in conjunction with
-.BR \-a .)
-Fork off a new incarnation of mount for each device.
-This will do the mounts on different devices or different NFS servers
-in parallel.
-This has the advantage that it is faster; also NFS timeouts go in
-parallel. A disadvantage is that the mounts are done in undefined order.
-Thus, you cannot use this option if you want to mount both
-.I /usr
-and
-.IR /usr/spool .
-.IP "\fB\-f, \-\-fake\fP"
-Causes everything to be done except for the actual system call; if it's not
-obvious, this ``fakes'' mounting the filesystem.  This option is useful in
-conjunction with the
-.B \-v
-flag to determine what the
-.B mount
-command is trying to do. It can also be used to add entries for devices
-that were mounted earlier with the -n option. The -f option checks for
-existing record in /etc/mtab and fails when the record already
-exists (with regular non-fake mount, this check is done by kernel).
-.IP "\fB\-i, \-\-internal\-only\fP"
-Don't call the /sbin/mount.<filesystem> helper even if it exists.
-.IP "\fB\-l\fP"
-Add the labels in the mount output. Mount must have
-permission to read the disk device (e.g. be suid root) for this to work.
-One can set such a label for ext2, ext3 or ext4 using the
-.BR e2label (8)
-utility, or for XFS using
-.BR xfs_admin (8),
-or for reiserfs using
-.BR reiserfstune (8).
-.IP "\fB\-n, \-\-no\-mtab\fP"
-Mount without writing in
-.IR /etc/mtab .
-This is necessary for example when
-.I /etc
-is on a read-only filesystem.
-.IP "\fB\-\-no\-canonicalize\fP"
-Don't canonicalize paths. The mount command canonicalizes all paths
-(from command line or fstab) and stores canonicalized paths to the
-.IR /etc/mtab
-file. This option can be used together with the
-.B \-f
-flag for already canonicalized absolute paths.
-.IP "\fB\-s\fP"
-Tolerate sloppy mount options rather than failing. This will ignore
-mount options not supported by a filesystem type. Not all filesystems
-support this option. This option exists for support of the Linux
-autofs\-based automounter.
-.IP "\fB\-r, \-\-read\-only\fP"
-Mount the filesystem read-only. A synonym is
-.BR "\-o ro" .
-
-Note that, depending on the filesystem type, state and kernel behavior, the
-system may still write to the device. For example, Ext3 or ext4 will replay its
-journal if the filesystem is dirty. To prevent this kind of write access, you
-may want to mount ext3 or ext4 filesystem with "ro,noload" mount options or
-set the block device to read-only mode, see command
-.BR blockdev (8).
-.IP "\fB\-w, \-\-rw\fP"
-Mount the filesystem read/write. This is the default. A synonym is
-.BR "\-o rw" .
-.IP "\fB\-L \fIlabel\fP"
-Mount the partition that has the specified
-.IR label .
-.IP "\fB\-U \fIuuid\fP"
-Mount the partition that has the specified
-.IR uuid .
-These two options require the file
-.I /proc/partitions
-(present since Linux 2.1.116) to exist.
-.IP "\fB\-t, \-\-types \fIvfstype\fP"
-The argument following the
-.B \-t
-is used to indicate the filesystem type.  The filesystem types which are
-currently supported include:
-.IR adfs ,
-.IR affs ,
-.IR autofs ,
-.IR cifs ,
-.IR coda ,
-.IR coherent ,
-.IR cramfs ,
-.IR debugfs ,
-.IR devpts ,
-.IR efs ,
-.IR ext ,
-.IR ext2 ,
-.IR ext3 ,
-.IR ext4 ,
-.IR hfs ,
-.IR hfsplus ,
-.IR hpfs ,
-.IR iso9660 ,
-.IR jfs ,
-.IR minix ,
-.IR msdos ,
-.IR ncpfs ,
-.IR nfs ,
-.IR nfs4 ,
-.IR ntfs ,
-.IR proc ,
-.IR qnx4 ,
-.IR ramfs ,
-.IR reiserfs ,
-.IR romfs ,
-.IR squashfs ,
-.IR smbfs ,
-.IR sysv ,
-.IR tmpfs ,
-.IR ubifs ,
-.IR udf ,
-.IR ufs ,
-.IR umsdos ,
-.IR usbfs ,
-.IR vfat ,
-.IR xenix ,
-.IR xfs ,
-.IR xiafs .
-Note that coherent, sysv and xenix are equivalent and that
-.I xenix
-and
-.I coherent
-will be removed at some point in the future \(em use
-.I sysv
-instead. Since kernel version 2.1.21 the types
-.I ext
-and
-.I xiafs
-do not exist anymore. Earlier,
-.I usbfs
-was known as
-.IR usbdevfs .
-Note, the real list of all supported filesystems depends on your
-kernel.
-
-The programs
-.B mount
-and
-.B umount
-support filesystem subtypes.  The subtype is defined by '.subtype' suffix.  For
-example  'fuse.sshfs'. It's recommended to use subtype notation rather than add
-any prefix to the mount source (for example 'sshfs#example.com' is
-depreacated).
-
-For most types all the
-.B mount
-program has to do is issue a simple
-.IR mount (2)
-system call, and no detailed knowledge of the filesystem type is required.
-For a few types however (like nfs, nfs4, cifs, smbfs, ncpfs) ad hoc code is
-necessary. The nfs, nfs4, cifs, smbfs, and ncpfs filesystems
-have a separate mount program. In order to make it possible to
-treat all types in a uniform way, mount will execute the program
-.BI /sbin/mount. TYPE
-(if that exists) when called with type
-.IR TYPE .
-Since various versions of the
-.B smbmount
-program have different calling conventions,
-.B /sbin/mount.smbfs
-may have to be a shell script that sets up the desired call.
-
-If no
-.B \-t
-option is given, or if the
-.B auto
-type is specified, mount will try to guess the desired type.
-Mount uses the blkid library for guessing the filesystem
-type; if that does not turn up anything that looks familiar,
-mount will try to read the file
-.IR /etc/filesystems ,
-or, if that does not exist,
-.IR /proc/filesystems .
-All of the filesystem types listed there will be tried,
-except for those that are labeled "nodev" (e.g.,
-.IR devpts ,
-.I proc
-and
-.IR nfs ).
-If
-.I /etc/filesystems
-ends in a line with a single * only, mount will read
-.I /proc/filesystems
-afterwards.
-
-The
-.B auto
-type may be useful for user-mounted floppies.
-Creating a file
-.I /etc/filesystems
-can be useful to change the probe order (e.g., to try vfat before msdos
-or ext3 before ext2) or if you use a kernel module autoloader.
-
-More than one type may be specified in a comma separated
-list.  The list of filesystem types can be prefixed with
-.B no
-to specify the filesystem types on which no action should be taken.
-(This can be meaningful with the
-.B \-a
-option.) For example, the command:
-.RS
-.RS
-.sp
-.B "mount \-a \-t nomsdos,ext"
-.sp
-.RE
-mounts all filesystems except those of type
-.I msdos
-and
-.IR ext .
-.RE
-.IP "\fB\-O, \-\-test-opts \fIopts\fP"
-Used in conjunction with
-.BR \-a ,
-to limit the set of filesystems to which the
-.B \-a
-is applied.  Like
-.B \-t
-in this regard except that it is useless except in the context of
-.BR \-a .
-For example, the command:
-.RS
-.RS
-.sp
-.B "mount \-a \-O no_netdev"
-.sp
-.RE
-mounts all filesystems except those which have the option
-.I _netdev
-specified in the options field in the
-.I /etc/fstab
-file.
-
-It is different from
-.B \-t
-in that each option is matched exactly; a leading
-.B no
-at the beginning of one option does not negate the rest.
-
-The
-.B \-t
-and
-.B \-O
-options are cumulative in effect; that is, the command
-.RS
-.sp
-.B "mount \-a \-t ext2 \-O _netdev"
-.sp
-.RE
-mounts all ext2 filesystems with the _netdev option, not all filesystems
-that are either ext2 or have the _netdev option specified.
-.RE
-.IP "\fB\-o, \-\-options \fIopts\fP"
-Options are specified with a
-.B \-o
-flag followed by a comma separated string of options. For example:
-.RS
-.RS
-.sp
-.B "mount LABEL=mydisk \-o noatime,nouser"
-.sp
-.RE
-
-For more details, see
-.B FILESYSTEM INDEPENDENT MOUNT OPTIONS
-and
-.B FILESYSTEM SPECIFIC MOUNT OPTIONS
-sections.
-.RE
-.IP "\fB\-B, \-\-bind\fP"
-Remount a subtree somewhere else (so that its contents are available
-in both places). See above.
-.IP "\fB\-R, \-\-rbind\fP"
-Remount a subtree and all possible submounts somewhere else (so that its
-contents are available in both places). See above.
-.IP "\fB\-M, \-\-move\fP"
-Move a subtree to some other place. See above.
-
-.SH FILESYSTEM INDEPENDENT MOUNT OPTIONS
-Some of these options are only useful when they appear in the
-.I /etc/fstab
-file.
-
-Some of these options could be enabled or disabled by default
-in the system kernel. To check the current setting see the options
-in /proc/mounts.
-
-The following options apply to any filesystem that is being
-mounted (but not every filesystem actually honors them - e.g., the
-.B sync
-option today has effect only for ext2, ext3, fat, vfat and ufs):
-
-.TP
-.B async
-All I/O to the filesystem should be done asynchronously. (See also the
-.B sync
-option.)
-.TP
-.B atime
-Do not use noatime feature, then the inode access time is controlled by kernel
-defaults. See also the description for
-.B strictatime
-and
-.B relatime
-mount options.
-.TP
-.B noatime
-Do not update inode access times on this filesystem (e.g., for faster
-access on the news spool to speed up news servers).
-.TP
-.B auto
-Can be mounted with the
-.B \-a
-option.
-.TP
-.B noauto
-Can only be mounted explicitly (i.e., the
-.B \-a
-option will not cause the filesystem to be mounted).
-.TP
-\fBcontext=\fP\fIcontext\fP, \fBfscontext=\fP\fIcontext\fP, \fBdefcontext=\fP\fIcontext\fP and \fBrootcontext=\fP\fIcontext\fP
-The
-.BR context=
-option is useful when mounting filesystems that do not support
-extended attributes, such as a floppy or hard disk formatted with VFAT, or
-systems that are not normally running under SELinux, such as an ext3 formatted
-disk from a non-SELinux workstation. You can also use
-.BR context=
-on filesystems you do not trust, such as a floppy. It also helps in compatibility with
-xattr-supporting filesystems on earlier 2.4.<x> kernel versions. Even where
-xattrs are supported, you can save time not having to label every file by
-assigning the entire disk one security context.
-
-A commonly used option for removable media is
-.BR context="system_u:object_r:removable_t" .
-
-Two other options are
-.BR fscontext=
-and
-.BR defcontext= ,
-both of which are mutually exclusive of the context option. This means you
-can use fscontext and defcontext with each other, but neither can be used with
-context.
-
-The
-.BR fscontext=
-option works for all filesystems, regardless of their xattr
-support. The fscontext option sets the overarching filesystem label to a
-specific security context. This filesystem label is separate from the
-individual labels on the files. It represents the entire filesystem for
-certain kinds of permission checks, such as during mount or file creation.
-Individual file labels are still obtained from the xattrs on the files
-themselves. The context option actually sets the aggregate context that
-fscontext provides, in addition to supplying the same label for individual
-files.
-
-You can set the default security context for unlabeled files using
-.BR defcontext=
-option. This overrides the value set for unlabeled files in the policy and requires a
-filesystem that supports xattr labeling.
-
-The
-.BR rootcontext=
-option allows you to explicitly label the root inode of a FS being mounted
-before that FS or inode because visible to userspace. This was found to be
-useful for things like stateless linux.
-
-Note that kernel rejects any remount request that includes the context
-option even if unchanged from the current context.
-
-.B Warning that \fIcontext\fP value might contains comma
-and in this case the value has to be properly quoted otherwise
-.BR mount (8)
-will interpret the comma as separator between mount options. Don't forget that
-shell strips off quotes and
-.BR "double quoting is required" ,
-for example:
-.RS
-.RS
-.sp
-mount -t tmpfs none /mnt \-o 'context="system_u:object_r:tmp_t:s0:c127,c456",noexec'
-.sp
-.RE
-
-For more details, see
-.BR selinux (8)
-.RE
-
-.TP
-.B defaults
-Use default options:
-.BR rw ", " suid ", " dev ", " exec ", " auto ", " nouser ", and " async.
-.TP
-.B dev
-Interpret character or block special devices on the filesystem.
-.TP
-.B nodev
-Do not interpret character or block special devices on the file
-system.
-.TP
-.B diratime
-Update directory inode access times on this filesystem. This is the default.
-.TP
-.B nodiratime
-Do not update directory inode access times on this filesystem.
-.TP
-.B dirsync
-All directory updates within the filesystem should be done synchronously.
-This affects the following system calls: creat, link, unlink, symlink,
-mkdir, rmdir, mknod and rename.
-.TP
-.B exec
-Permit execution of binaries.
-.TP
-.B noexec
-Do not allow direct execution of any binaries on the mounted filesystem.
-(Until recently it was possible to run binaries anyway using a command like
-/lib/ld*.so /mnt/binary. This trick fails since Linux 2.4.25 / 2.6.0.)
-.TP
-.B group
-Allow an ordinary (i.e., non-root) user to mount the filesystem if one
-of his groups matches the group of the device.
-This option implies the options
-.BR nosuid " and " nodev
-(unless overridden by subsequent options, as in the option line
-.BR group,dev,suid ).
-.TP
-.B iversion
-Every time the inode is modified, the i_version field will be incremented.
-.TP
-.B noiversion
-Do not increment the i_version inode field.
-.TP
-.B mand
-Allow mandatory locks on this filesystem. See
-.BR fcntl (2).
-.TP
-.B nomand
-Do not allow mandatory locks on this filesystem.
-.TP
-.B _netdev
-The filesystem resides on a device that requires network access
-(used to prevent the system from attempting to mount these filesystems
-until the network has been enabled on the system).
-.TP
-.B nofail
-Do not report errors for this device if it does not exist.
-.TP
-.B relatime
-Update inode access times relative to modify or change time.  Access
-time is only updated if the previous access time was earlier than the
-current modify or change time. (Similar to noatime, but doesn't break
-mutt or other applications that need to know if a file has been read
-since the last time it was modified.)
-
-Since Linux 2.6.30, the kernel defaults to the behavior provided by this
-option (unless
-.B noatime
-was  specified), and the
-.B strictatime
-option is required to obtain traditional semantics. In addition, since Linux
-2.6.30, the file's last access time is always  updated  if  it  is more than 1
-day old.
-.TP
-.B norelatime
-Do not use
-.B relatime
-feature. See also the
-.B strictatime
-mount option.
-.TP
-.B strictatime
-Allows to explicitly requesting full atime updates. This makes it
-possible for kernel to defaults to
-.B relatime
-or
-.B noatime
-but still allow userspace to override it. For more details about the default
-system mount options see /proc/mounts.
-.TP
-.B nostrictatime
-Use the kernel's default behaviour for inode access time updates.
-.TP
-.B suid
-Allow set-user-identifier or set-group-identifier bits to take
-effect.
-.TP
-.B nosuid
-Do not allow set-user-identifier or set-group-identifier bits to take
-effect. (This seems safe, but is in fact rather unsafe if you have
-suidperl(1) installed.)
-.TP
-.B silent
-Turn on the silent flag.
-.TP
-.B loud
-Turn off the silent flag.
-.TP
-.B owner
-Allow an ordinary (i.e., non-root) user to mount the filesystem if he
-is the owner of the device.
-This option implies the options
-.BR nosuid " and " nodev
-(unless overridden by subsequent options, as in the option line
-.BR owner,dev,suid ).
-.TP
-.B remount
-Attempt to remount an already-mounted filesystem.  This is commonly
-used to change the mount flags for a filesystem, especially to make a
-readonly filesystem writable. It does not change device or mount point.
-
-The remount functionality follows the standard way how the mount command works
-with options from fstab. It means the mount command doesn't read fstab (or
-mtab) only when a
-.IR device
-and
-.IR dir
-are fully specified.
-
-.BR "mount -o remount,rw /dev/foo /dir"
-
-After this call all old mount options are replaced and arbitrary stuff from
-fstab is ignored, except the loop= option which is internally generated and
-maintained by the mount command.
-
-.BR "mount -o remount,rw  /dir"
-
-After this call mount reads fstab (or mtab) and merges these options with
-options from command line (
-.B -o
-).
-.TP
-.B ro
-Mount the filesystem read-only.
-.TP
-.B rw
-Mount the filesystem read-write.
-.TP
-.B sync
-All I/O to the filesystem should be done synchronously. In case of media with limited number of write cycles
-(e.g. some flash drives) "sync" may cause life-cycle shortening.
-.TP
-.B user
-Allow an ordinary user to mount the filesystem.
-The name of the mounting user is written to mtab so that he can unmount
-the filesystem again.
-This option implies the options
-.BR noexec ", " nosuid ", and " nodev
-(unless overridden by subsequent options, as in the option line
-.BR user,exec,dev,suid ).
-.TP
-.B nouser
-Forbid an ordinary (i.e., non-root) user to mount the filesystem.
-This is the default.
-.TP
-.B users
-Allow every user to mount and unmount the filesystem.
-This option implies the options
-.BR noexec ", " nosuid ", and " nodev
-(unless overridden by subsequent options, as in the option line
-.BR users,exec,dev,suid ).
-
-.SH "FILESYSTEM SPECIFIC MOUNT OPTIONS"
-The following options apply only to certain filesystems.
-We sort them by filesystem. They all follow the
-.B \-o
-flag.
-
-What options are supported depends a bit on the running kernel.
-More info may be found in the kernel source subdirectory
-.IR Documentation/filesystems .
-
-.SH "Mount options for adfs"
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-Set the owner and group of the files in the filesystem (default: uid=gid=0).
-.TP
-\fBownmask=\fP\fIvalue\fP and \fBothmask=\fP\fIvalue\fP
-Set the permission mask for ADFS 'owner' permissions and 'other' permissions,
-respectively (default: 0700 and 0077, respectively).
-See also
-.IR /usr/src/linux/Documentation/filesystems/adfs.txt .
-.SH "Mount options for affs"
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-Set the owner and group of the root of the filesystem (default: uid=gid=0,
-but with option
-.B uid
-or
-.B gid
-without specified value, the uid and gid of the current process are taken).
-.TP
-\fBsetuid=\fP\fIvalue\fP and \fBsetgid=\fP\fIvalue\fP
-Set the owner and group of all files.
-.TP
-.BI mode= value
-Set the mode of all files to
-.IR value " & 0777"
-disregarding the original permissions.
-Add search permission to directories that have read permission.
-The value is given in octal.
-.TP
-.B protect
-Do not allow any changes to the protection bits on the filesystem.
-.TP
-.B usemp
-Set uid and gid of the root of the filesystem to the uid and gid
-of the mount point upon the first sync or umount, and then
-clear this option. Strange...
-.TP
-.B verbose
-Print an informational message for each successful mount.
-.TP
-.BI prefix= string
-Prefix used before volume name, when following a link.
-.TP
-.BI volume= string
-Prefix (of length at most 30) used before '/' when following a symbolic link.
-.TP
-.BI reserved= value
-(Default: 2.) Number of unused blocks at the start of the device.
-.TP
-.BI root= value
-Give explicitly the location of the root block.
-.TP
-.BI bs= value
-Give blocksize. Allowed values are 512, 1024, 2048, 4096.
-.TP
-.BR grpquota | noquota | quota | usrquota
-These options are accepted but ignored.
-(However, quota utilities may react to such strings in
-.IR /etc/fstab .)
-
-.SH "Mount options for cifs"
-See the options section of the
-.BR mount.cifs (8)
-man page (cifs-utils package must be installed).
-
-.SH "Mount options for coherent"
-None.
-
-.SH "Mount options for debugfs"
-The debugfs filesystem is a pseudo filesystem, traditionally mounted on
-.IR /sys/kernel/debug .
-.\" or just /debug
-.\" present since 2.6.11
-There are no mount options.
-
-.SH "Mount options for devpts"
-The devpts filesystem is a pseudo filesystem, traditionally mounted on
-.IR /dev/pts .
-In order to acquire a pseudo terminal, a process opens
-.IR /dev/ptmx ;
-the number of the pseudo terminal is then made available to the process
-and the pseudo terminal slave can be accessed as
-.IR /dev/pts/ <number>.
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-This sets the owner or the group of newly created PTYs to
-the specified values. When nothing is specified, they will
-be set to the UID and GID of the creating process.
-For example, if there is a tty group with GID 5, then
-.B gid=5
-will cause newly created PTYs to belong to the tty group.
-.TP
-.BI mode= value
-Set the mode of newly created PTYs to the specified value.
-The default is 0600.
-A value of
-.B mode=620
-and
-.B gid=5
-makes "mesg y" the default on newly created PTYs.
-.TP
-\fBnewinstance
-Create a private instance of devpts filesystem, such that
-indices of ptys allocated in this new instance are
-independent of indices created in other instances of devpts.
-
-All mounts of devpts without this
-.B newinstance
-option share the same set of pty indices (i.e legacy mode).
-Each mount of devpts with the
-.B newinstance
-option has a private set of pty indices.
-
-This option is mainly used to support containers in the
-linux kernel. It is implemented in linux kernel versions
-starting with 2.6.29.  Further, this mount option is valid
-only if CONFIG_DEVPTS_MULTIPLE_INSTANCES is enabled in the
-kernel configuration.
-
-To use this option effectively,
-.IR /dev/ptmx
-must be a symbolic link to
-.IR pts/ptmx.
-See
-.IR Documentation/filesystems/devpts.txt
-in the linux kernel source tree for details.
-.TP
-.BI ptmxmode= value
-
-Set the mode for the new
-.IR ptmx
-device node in the devpts filesystem.
-
-With the support for multiple instances of devpts (see
-.B newinstance
-option above), each instance has a private
-.IR ptmx
-node in the root of the devpts filesystem (typically
-.IR /dev/pts/ptmx).
-
-For compatibility with older versions of the kernel, the
-default mode of the new
-.IR ptmx
-node is 0000.
-.BI ptmxmode= value
-specifies a more useful mode for the
-.IR ptmx
-node and is highly recommended when the
-.B newinstance
-option is specified.
-
-This option is only implemented in linux kernel versions
-starting with 2.6.29. Further this option is valid only if
-CONFIG_DEVPTS_MULTIPLE_INSTANCES is enabled in the kernel
-configuration.
-
-.SH "Mount options for ext"
-None.
-Note that the `ext' filesystem is obsolete. Don't use it.
-Since Linux version 2.1.21 extfs is no longer part of the kernel source.
-
-.SH "Mount options for ext2"
-The `ext2' filesystem is the standard Linux filesystem.
-.\" Due to a kernel bug, it may be mounted with random mount options
-.\" (fixed in Linux 2.0.4).
-Since Linux 2.5.46, for most mount options the default
-is determined by the filesystem superblock. Set them with
-.BR tune2fs (8).
-.TP
-.BR acl | noacl
-Support POSIX Access Control Lists (or not).
-.\" requires CONFIG_EXT2_FS_POSIX_ACL
-.TP
-.BR bsddf | minixdf
-Set the behaviour for the
-.I statfs
-system call. The
-.B minixdf
-behaviour is to return in the
-.I f_blocks
-field the total number of blocks of the filesystem, while the
-.B bsddf
-behaviour (which is the default) is to subtract the overhead blocks
-used by the ext2 filesystem and not available for file storage. Thus
-.nf
-
-% mount /k -o minixdf; df /k; umount /k
-Filesystem   1024-blocks  Used Available Capacity Mounted on
-/dev/sda6      2630655   86954  2412169      3%   /k
-% mount /k -o bsddf; df /k; umount /k
-Filesystem   1024-blocks  Used Available Capacity Mounted on
-/dev/sda6      2543714      13  2412169      0%   /k
-
-.fi
-(Note that this example shows that one can add command line options
-to the options given in
-.IR /etc/fstab .)
-
-.TP
-.BR check=none " or " nocheck
-No checking is done at mount time. This is the default. This is fast.
-It is wise to invoke
-.BR e2fsck (8)
-every now and then, e.g. at boot time. The non-default behavior is unsupported
-(check=normal and check=strict options have been removed). Note that these mount options
-don't have to be supported if ext4 kernel driver is used for ext2 and ext3 filesystems.
-.TP
-.B debug
-Print debugging info upon each (re)mount.
-.TP
-.BR errors= { continue | remount-ro | panic }
-Define the behaviour when an error is encountered.
-(Either ignore errors and just mark the filesystem erroneous and continue,
-or remount the filesystem read-only, or panic and halt the system.)
-The default is set in the filesystem superblock, and can be
-changed using
-.BR tune2fs (8).
-.TP
-.BR grpid | bsdgroups " and " nogrpid | sysvgroups
-These options define what group id a newly created file gets.
-When
-.BR grpid
-is set, it takes the group id of the directory in which it is created;
-otherwise (the default) it takes the fsgid of the current process, unless
-the directory has the setgid bit set, in which case it takes the gid
-from the parent directory, and also gets the setgid bit set
-if it is a directory itself.
-.TP
-.BR grpquota | noquota | quota | usrquota
-These options are accepted but ignored.
-.TP
-.BR nouid32
-Disables 32-bit UIDs and GIDs.  This is for interoperability with older
-kernels which only store and expect 16-bit values.
-.TP
-.BR oldalloc " or " orlov
-Use old allocator or Orlov allocator for new inodes. Orlov is default.
-.TP
-\fBresgid=\fP\fIn\fP and \fBresuid=\fP\fIn\fP
-The ext2 filesystem reserves a certain percentage of the available
-space (by default 5%, see
-.BR mke2fs (8)
-and
-.BR tune2fs (8)).
-These options determine who can use the reserved blocks.
-(Roughly: whoever has the specified uid, or belongs to the specified group.)
-.TP
-.BI sb= n
-Instead of block 1, use block
-.I n
-as superblock. This could be useful when the filesystem has been damaged.
-(Earlier, copies of the superblock would be made every 8192 blocks: in
-block 1, 8193, 16385, ... (and one got thousands of copies on
-a big filesystem). Since version 1.08,
-.B mke2fs
-has a \-s (sparse superblock) option to reduce the number of backup
-superblocks, and since version 1.15 this is the default. Note
-that this may mean that ext2 filesystems created by a recent
-.B mke2fs
-cannot be mounted r/w under Linux 2.0.*.)
-The block number here uses 1k units. Thus, if you want to use logical
-block 32768 on a filesystem with 4k blocks, use "sb=131072".
-.TP
-.BR user_xattr | nouser_xattr
-Support "user." extended attributes (or not).
-.\" requires CONFIG_EXT2_FS_XATTR
-
-
-.SH "Mount options for ext3"
-The ext3 filesystem is a version of the ext2 filesystem which has been
-enhanced with journaling.  It supports the same options as ext2 as
-well as the following additions:
-.\" .TP
-.\" .BR abort
-.\" Mount the filesystem in abort mode, as if a fatal error has occurred.
-.TP
-.BR journal=update
-Update the ext3 filesystem's journal to the current format.
-.TP
-.BR journal=inum
-When a journal already exists, this option is ignored. Otherwise, it
-specifies the number of the inode which will represent the ext3 filesystem's
-journal file;  ext3 will create a new journal, overwriting the old contents
-of the file whose inode number is
-.IR inum .
-.TP
-.BR journal_dev=devnum
-When the external journal device's major/minor numbers
-have changed, this option allows the user to specify
-the new journal location.  The journal device is
-identified through its new major/minor numbers encoded
-in devnum.
-.TP
-.BR norecovery / noload
-Don't load the journal on mounting.  Note that
-if the filesystem was not unmounted cleanly,
-skipping the journal replay will lead to the
-filesystem containing inconsistencies that can
-lead to any number of problems.
-.TP
-.BR data= { journal | ordered | writeback }
-Specifies the journaling mode for file data.  Metadata is always journaled.
-To use modes other than
-.B ordered
-on the root filesystem, pass the mode to the kernel as boot parameter, e.g.
-.IR rootflags=data=journal .
-.RS
-.TP
-.B journal
-All data is committed into the journal prior to being written into the
-main filesystem.
-.TP
-.B ordered
-This is the default mode.  All data is forced directly out to the main file
-system prior to its metadata being committed to the journal.
-.TP
-.B writeback
-Data ordering is not preserved - data may be written into the main
-filesystem after its metadata has been committed to the journal.
-This is rumoured to be the highest-throughput option.  It guarantees
-internal filesystem integrity, however it can allow old data to appear
-in files after a crash and journal recovery.
-.RE
-.TP
-.BR barrier=0 " / "  barrier=1 "
-This enables/disables barriers.  barrier=0 disables it, barrier=1 enables it.
-Write barriers enforce proper on-disk ordering of journal commits, making
-volatile disk write caches safe to use, at some performance penalty.  The ext3
-filesystem does not enable write barriers by default.  Be sure to enable
-barriers unless your disks are battery-backed one way or another.  Otherwise
-you risk filesystem corruption in case of power failure.
-.TP
-.BI commit= nrsec
-Sync all data and metadata every
-.I nrsec
-seconds. The default value is 5 seconds. Zero means default.
-.TP
-.BR user_xattr
-Enable Extended User Attributes. See the
-.BR attr (5)
-manual page.
-.TP
-.BR acl
-Enable POSIX Access Control Lists. See the
-.BR acl (5)
-manual page.
-
-.SH "Mount options for ext4"
-The ext4 filesystem is an advanced level of the ext3 filesystem which
-incorporates scalability and reliability enhancements for supporting large
-filesystem.
-
-The options
-.B journal_dev, noload, data, commit, orlov, oldalloc, [no]user_xattr
-.B [no]acl, bsddf, minixdf, debug, errors, data_err, grpid, bsdgroups, nogrpid
-.B sysvgroups, resgid, resuid, sb, quota, noquota, grpquota and usrquota
-are backwardly compatible with ext3 or ext2.
-.TP
-.BR journal_checksum
-Enable checksumming of the journal transactions.  This will allow the recovery
-code in e2fsck and the kernel to detect corruption in the kernel.  It is a
-compatible change and will be ignored by older kernels.
-.TP
-.BR journal_async_commit
-Commit block can be written to disk without waiting for descriptor blocks. If
-enabled older kernels cannot mount the device.
-This will enable 'journal_checksum' internally.
-.TP
-.BR barrier=0 " / "  barrier=1 " / " barrier " / " nobarrier
-This enables/disables the use of write barriers in the jbd code.  barrier=0
-disables, barrier=1 enables.  This also requires an IO stack which can support
-barriers, and if jbd gets an error on a barrier write, it will disable again
-with a warning.  Write barriers enforce proper on-disk ordering of journal
-commits, making volatile disk write caches safe to use, at some performance
-penalty.  If your disks are battery-backed in one way or another, disabling
-barriers may safely improve performance.  The mount options "barrier" and
-"nobarrier" can also be used to enable or disable barriers, for consistency
-with other ext4 mount options.
-
-The ext4 filesystem enables write barriers by default.
-.TP
-.BI inode_readahead= n
-This tuning parameter controls the maximum number of inode table blocks that
-ext4's inode table readahead algorithm will pre-read into the buffer cache.
-The default value is 32 blocks.
-.TP
-.BI stripe= n
-Number of filesystem blocks that mballoc will try to use for allocation size
-and alignment. For RAID5/6 systems this should be the number of data disks *
-RAID chunk size in filesystem blocks.
-.TP
-.BR delalloc
-Deferring block allocation until write-out time.
-.TP
-.BR nodelalloc
-Disable delayed allocation. Blocks are allocated when data is copied from user
-to page cache.
-.TP
-.BI max_batch_time= usec
-Maximum amount of time ext4 should wait for additional filesystem operations to
-be batch together with a synchronous write operation. Since a synchronous
-write operation is going to force a commit and then a wait for the I/O
-complete, it doesn't cost much, and can be a huge throughput win, we wait for a
-small amount of time to see if any other transactions can piggyback on the
-synchronous write. The algorithm used is designed to automatically tune for
-the speed of the disk, by measuring the amount of time (on average) that it
-takes to finish committing a transaction. Call this time the "commit time".
-If the time that the transaction has been running is less than the commit time,
-ext4 will try sleeping for the commit time to see if other operations will join
-the transaction. The commit time is capped by the max_batch_time, which
-defaults to 15000us (15ms). This optimization can be turned off entirely by
-setting max_batch_time to 0.
-.TP
-.BI min_batch_time= usec
-This parameter sets the commit time (as described above) to be at least
-min_batch_time. It defaults to zero microseconds. Increasing this parameter
-may improve the throughput of multi-threaded, synchronous workloads on very
-fast disks, at the cost of increasing latency.
-.TP
-.BI journal_ioprio= prio
-The I/O priority (from 0 to 7, where 0 is the highest priority) which should be
-used for I/O operations submitted by kjournald2 during a commit operation.
-This defaults to 3, which is a slightly higher priority than the default I/O
-priority.
-.TP
-.BR abort
-Simulate the effects of calling ext4_abort() for
-debugging purposes.  This is normally used while
-remounting a filesystem which is already mounted.
-.TP
-.BR auto_da_alloc | noauto_da_alloc
-Many broken applications don't use fsync() when
-replacing existing files via patterns such as
-
-fd = open("foo.new")/write(fd,..)/close(fd)/ rename("foo.new", "foo")
-
-or worse yet
-
-fd = open("foo", O_TRUNC)/write(fd,..)/close(fd).
-
-If auto_da_alloc is enabled, ext4 will detect the replace-via-rename and
-replace-via-truncate patterns and force that any delayed allocation blocks are
-allocated such that at the next journal commit, in the default data=ordered
-mode, the data blocks of the new file are forced to disk before the rename()
-operation is committed.  This provides roughly the same level of guarantees as
-ext3, and avoids the "zero-length" problem that can happen when a system
-crashes before the delayed allocation blocks are forced to disk.
-.TP
-.BR discard / nodiscard
-Controls whether ext4 should issue discard/TRIM commands to the underlying
-block device when blocks are freed.  This is useful for SSD devices and
-sparse/thinly-provisioned LUNs, but it is off by default until sufficient
-testing has been done.
-.TP
-.BR nouid32
-Disables 32-bit UIDs and GIDs.  This is for
-interoperability  with  older kernels which only
-store and expect 16-bit values.
-.TP
-.BR resize
-Allows to resize filesystem to the end of the last
-existing block group, further resize has to be done
-with resize2fs either online, or offline. It can be
-used only with conjunction with remount.
-.TP
-.BR block_validity / noblock_validity
-This options allows to enables/disables the in-kernel facility for tracking
-filesystem metadata blocks within internal data structures. This allows multi-
-block allocator and other routines to quickly locate extents which might
-overlap with filesystem metadata blocks. This option is intended for debugging
-purposes and since it negatively affects the performance, it is off by default.
-.TP
-.BR dioread_lock / dioread_nolock
-Controls whether or not ext4 should use the DIO read locking. If the
-dioread_nolock option is specified ext4 will allocate uninitialized extent
-before buffer write and convert the extent to initialized after IO completes.
-This approach allows ext4 code to avoid using inode mutex, which improves
-scalability on high speed storages. However this does not work with data
-journaling and dioread_nolock option will be ignored with kernel warning.
-Note that dioread_nolock code path is only used for extent-based files.
-Because of the restrictions this options comprises it is off by default
-(e.g. dioread_lock).
-.TP
-.BR i_version
-Enable 64-bit inode version support. This option is off by default.
-
-.SH "Mount options for fat"
-(Note:
-.I fat
-is not a separate filesystem, but a common part of the
-.IR msdos ,
-.I umsdos
-and
-.I vfat
-filesystems.)
-.TP
-.BR blocksize= { 512 | 1024 | 2048 }
-Set blocksize (default 512). This option is obsolete.
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-Set the owner and group of all files.
-(Default: the uid and gid of the current process.)
-.TP
-.BI umask= value
-Set the umask (the bitmask of the permissions that are
-.B not
-present). The default is the umask of the current process.
-The value is given in octal.
-.TP
-.BI dmask= value
-Set the umask applied to directories only.
-The default is the umask of the current process.
-The value is given in octal.
-.\" Present since Linux 2.5.43.
-.TP
-.BI fmask= value
-Set the umask applied to regular files only.
-The default is the umask of the current process.
-The value is given in octal.
-.\" Present since Linux 2.5.43.
-.TP
-.BI allow_utime= value
-This option controls the permission check of mtime/atime.
-.RS
-.TP
-.B 20
-If current process is in group of file's group ID, you can change timestamp.
-.TP
-.B 2
-Other users can change timestamp.
-.PP
-The default is set from `dmask' option. (If the directory is writable,
-.BR utime (2)
-is also allowed. I.e. ~dmask & 022)
-
-Normally
-.BR utime (2)
-checks current process is owner of the file, or it has
-CAP_FOWNER capability.  But FAT filesystem doesn't have uid/gid on disk, so
-normal check is too inflexible. With this option you can relax it.
-.RE
-.TP
-.BI check= value
-Three different levels of pickyness can be chosen:
-.RS
-.TP
-.BR r [ elaxed ]
-Upper and lower case are accepted and equivalent, long name parts are
-truncated (e.g.
-.I verylongname.foobar
-becomes
-.IR verylong.foo ),
-leading and embedded spaces are accepted in each name part (name and extension).
-.TP
-.BR n [ ormal ]
-Like "relaxed", but many special characters (*, ?, <, spaces, etc.) are
-rejected.  This is the default.
-.TP
-.BR s [ trict ]
-Like "normal", but names may not contain long parts and special characters
-that are sometimes used on Linux, but are not accepted by MS-DOS are
-rejected. (+, =, spaces, etc.)
-.RE
-.TP
-.BI codepage= value
-Sets the codepage for converting to shortname characters on FAT
-and VFAT filesystems. By default, codepage 437 is used.
-.TP
-.BR conv= {b [ inary ]| t [ ext ]| a [ uto ]}
-The
-.I fat
-filesystem can perform CRLF<-->NL (MS-DOS text format to UNIX text
-format) conversion in the kernel. The following conversion modes are
-available:
-.RS
-.TP
-.B binary
-no translation is performed.  This is the default.
-.TP
-.B text
-CRLF<-->NL translation is performed on all files.
-.TP
-.B auto
-CRLF<-->NL translation is performed on all files that don't have a
-"well-known binary" extension. The list of known extensions can be found at
-the beginning of
-.I fs/fat/misc.c
-(as of 2.0, the list is: exe, com, bin, app, sys, drv, ovl, ovr, obj,
-lib, dll, pif, arc, zip, lha, lzh, zoo, tar, z, arj, tz, taz, tzp, tpz,
-gz, tgz, deb, gif, bmp, tif, gl, jpg, pcx, tfm, vf, gf, pk, pxl, dvi).
-.PP
-Programs that do computed lseeks won't like in-kernel text conversion.
-Several people have had their data ruined by this translation. Beware!
-
-For filesystems mounted in binary mode, a conversion tool
-(fromdos/todos) is available. This option is obsolete.
-.RE
-.TP
-.BI cvf_format= module
-Forces the driver to use the CVF (Compressed Volume File) module
-.RI cvf_ module
-instead of auto-detection. If the kernel supports kmod, the
-cvf_format=xxx option also controls on-demand CVF module loading.
-This option is obsolete.
-.TP
-.BI cvf_option= option
-Option passed to the CVF module. This option is obsolete.
-.TP
-.B debug
-Turn on the
-.I debug
-flag.  A version string and a list of filesystem parameters will be
-printed (these data are also printed if the parameters appear to be
-inconsistent).
-.TP
-.BR fat= {12 | 16 | 32 }
-Specify a 12, 16 or 32 bit fat.  This overrides
-the automatic FAT type detection routine.  Use with caution!
-.TP
-.BI iocharset= value
-Character set to use for converting between 8 bit characters
-and 16 bit Unicode characters. The default is iso8859-1.
-Long filenames are stored on disk in Unicode format.
-.TP
-.BI tz=UTC
-This option disables the conversion of timestamps
-between local time (as used by Windows on FAT) and UTC
-(which Linux uses internally).  This is particularly
-useful when mounting devices (like digital cameras)
-that are set to UTC in order to avoid the pitfalls of
-local time.
-.TP
-.B quiet
-Turn on the
-.I quiet
-flag.  Attempts to chown or chmod files do not return errors,
-although they fail. Use with caution!
-.TP
-.B showexec
-If set, the execute permission bits of the file will be allowed only if
-the extension part of the name is .EXE, .COM, or .BAT. Not set by default.
-.TP
-.B sys_immutable
-If set, ATTR_SYS attribute on FAT is handled as IMMUTABLE flag on Linux.
-Not set by default.
-.TP
-.B flush
-If set, the filesystem will try to flush to disk more early than normal.
-Not set by default.
-.TP
-.B usefree
-Use the "free clusters" value stored on FSINFO. It'll
-be used to determine number of free clusters without
-scanning disk. But it's not used by default, because
-recent Windows don't update it correctly in some
-case. If you are sure the "free clusters" on FSINFO is
-correct, by this option you can avoid scanning disk.
-.TP
-.BR dots ", " nodots ", " dotsOK= [ yes | no ]
-Various misguided attempts to force Unix or DOS conventions
-onto a FAT filesystem.
-
-.SH "Mount options for hfs"
-.TP
-.BI creator= cccc ", type=" cccc
-Set the creator/type values as shown by the MacOS finder
-used for creating new files.  Default values: '????'.
-.TP
-.BI uid= n ", gid=" n
-Set the owner and group of all files.
-(Default: the uid and gid of the current process.)
-.TP
-.BI dir_umask= n ", file_umask=" n ", umask=" n
-Set the umask used for all directories, all regular files, or all
-files and directories.  Defaults to the umask of the current process.
-.TP
-.BI session= n
-Select the CDROM session to mount.
-Defaults to leaving that decision to the CDROM driver.
-This option will fail with anything but a CDROM as underlying device.
-.TP
-.BI part= n
-Select partition number n from the device.
-Only makes sense for CDROMs.
-Defaults to not parsing the partition table at all.
-.TP
-.B quiet
-Don't complain about invalid mount options.
-
-.SH "Mount options for hpfs"
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-Set the owner and group of all files. (Default: the uid and gid
-of the current process.)
-.TP
-.BI umask= value
-Set the umask (the bitmask of the permissions that are
-.B not
-present). The default is the umask of the current process.
-The value is given in octal.
-.TP
-.BR case= { lower | asis }
-Convert all files names to lower case, or leave them.
-(Default:
-.BR case=lower .)
-.TP
-.BR conv= { binary | text | auto }
-For
-.BR conv=text ,
-delete some random CRs (in particular, all followed by NL)
-when reading a file.
-For
-.BR conv=auto ,
-choose more or less at random between
-.BR conv=binary " and " conv=text .
-For
-.BR conv=binary ,
-just read what is in the file. This is the default.
-.TP
-.B nocheck
-Do not abort mounting when certain consistency checks fail.
-
-.SH "Mount options for iso9660"
-ISO 9660 is a standard describing a filesystem structure to be used
-on CD-ROMs. (This filesystem type is also seen on some DVDs. See also the
-.I udf
-filesystem.)
-
-Normal
-.I iso9660
-filenames appear in a 8.3 format (i.e., DOS-like restrictions on filename
-length), and in addition all characters are in upper case.  Also there is
-no field for file ownership, protection, number of links, provision for
-block/character devices, etc.
-
-Rock Ridge is an extension to iso9660 that provides all of these UNIX-like
-features.  Basically there are extensions to each directory record that
-supply all of the additional information, and when Rock Ridge is in use,
-the filesystem is indistinguishable from a normal UNIX filesystem (except
-that it is read-only, of course).
-.TP
-.B norock
-Disable the use of Rock Ridge extensions, even if available. Cf.\&
-.BR map .
-.TP
-.B nojoliet
-Disable the use of Microsoft Joliet extensions, even if available. Cf.\&
-.BR map .
-.TP
-.BR check= { r [ elaxed ]| s [ trict ]}
-With
-.BR check=relaxed ,
-a filename is first converted to lower case before doing the lookup.
-This is probably only meaningful together with
-.B norock
-and
-.BR map=normal .
-(Default:
-.BR check=strict .)
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-Give all files in the filesystem the indicated user or group id,
-possibly overriding the information found in the Rock Ridge extensions.
-(Default:
-.BR uid=0,gid=0 .)
-.TP
-.BR map= { n [ ormal ]| o [ ff ]| a [ corn ]}
-For non-Rock Ridge volumes, normal name translation maps upper
-to lower case ASCII, drops a trailing `;1', and converts `;' to `.'.
-With
-.B map=off
-no name translation is done. See
-.BR norock .
-(Default:
-.BR map=normal .)
-.B map=acorn
-is like
-.BR map=normal
-but also apply Acorn extensions if present.
-.TP
-.BI mode= value
-For non-Rock Ridge volumes, give all files the indicated mode.
-(Default: read permission for everybody.)
-Since Linux 2.1.37 one no longer needs to specify the mode in
-decimal. (Octal is indicated by a leading 0.)
-.TP
-.B unhide
-Also show hidden and associated files.
-(If the ordinary files and the associated or hidden files have
-the same filenames, this may make the ordinary files inaccessible.)
-.TP
-.BR block= { 512 | 1024 | 2048 }
-Set the block size to the indicated value.
-(Default:
-.BR block=1024 .)
-.TP
-.BR conv= { a [ uto ]| b [ inary ]| m [ text ]| t [ ext ]}
-(Default:
-.BR conv=binary .)
-Since Linux 1.3.54 this option has no effect anymore.
-(And non-binary settings used to be very dangerous,
-possibly leading to silent data corruption.)
-.TP
-.B cruft
-If the high byte of the file length contains other garbage,
-set this mount option to ignore the high order bits of the file length.
-This implies that a file cannot be larger than 16MB.
-.TP
-.BI session= x
-Select number of session on multisession CD. (Since 2.3.4.)
-.TP
-.BI sbsector= xxx
-Session begins from sector xxx. (Since 2.3.4.)
-.LP
-The following options are the same as for vfat and specifying them only makes
-sense when using discs encoded using Microsoft's Joliet extensions.
-.TP
-.BI iocharset= value
-Character set to use for converting 16 bit Unicode characters on CD
-to 8 bit characters. The default is iso8859-1.
-.TP
-.B utf8
-Convert 16 bit Unicode characters on CD to UTF-8.
-
-.SH "Mount options for jfs"
-.TP
-.BI iocharset= name
-Character set to use for converting from Unicode to ASCII.  The default is
-to do no conversion.  Use
-.B iocharset=utf8
-for UTF8 translations.  This requires CONFIG_NLS_UTF8 to be set in
-the kernel
-.I ".config"
-file.
-.TP
-.BI resize= value
-Resize the volume to
-.I value
-blocks. JFS only supports growing a volume, not shrinking it. This option
-is only valid during a remount, when the volume is mounted read-write. The
-.B resize
-keyword with no value will grow the volume to the full size of the partition.
-.TP
-.B nointegrity
-Do not write to the journal.  The primary use of this option is to allow
-for higher performance when restoring a volume from backup media. The
-integrity of the volume is not guaranteed if the system abnormally ends.
-.TP
-.B integrity
-Default.  Commit metadata changes to the journal.  Use this option to remount
-a volume where the
-.B nointegrity
-option was previously specified in order to restore normal behavior.
-.TP
-.BR errors= { continue | remount-ro | panic }
-Define the behaviour when an error is encountered.
-(Either ignore errors and just mark the filesystem erroneous and continue,
-or remount the filesystem read-only, or panic and halt the system.)
-.TP
-.BR noquota | quota | usrquota | grpquota
-These options are accepted but ignored.
-
-.SH "Mount options for minix"
-None.
-
-.SH "Mount options for msdos"
-See mount options for fat.
-If the
-.I msdos
-filesystem detects an inconsistency, it reports an error and sets the file
-system read-only. The filesystem can be made writable again by remounting
-it.
-
-.SH "Mount options for ncpfs"
-Just like
-.IR nfs ", the " ncpfs
-implementation expects a binary argument (a
-.IR "struct ncp_mount_data" )
-to the mount system call. This argument is constructed by
-.BR ncpmount (8)
-and the current version of
-.B mount
-(2.12) does not know anything about ncpfs.
-
-.SH "Mount options for nfs and nfs4"
-See the options section of the
-.BR nfs (5)
-man page (nfs-utils package must be installed).
-
-The
-.IR nfs " and " nfs4
-implementation expects a binary argument (a
-.IR "struct nfs_mount_data" )
-to the mount system call. This argument is constructed by
-.BR mount.nfs (8)
-and the current version of
-.B mount
-(2.13) does not know anything about nfs and nfs4.
-
-.SH "Mount options for ntfs"
-.TP
-.BI iocharset= name
-Character set to use when returning file names.
-Unlike VFAT, NTFS suppresses names that contain
-nonconvertible characters. Deprecated.
-.\" since 2.5.11
-.TP
-.BI nls= name
-New name for the option earlier called
-.IR iocharset .
-.\" since 2.5.11
-.TP
-.BR utf8
-Use UTF-8 for converting file names.
-.TP
-.BR uni_xlate= { 0 | 1 | 2 }
-For 0 (or `no' or `false'), do not use escape sequences
-for unknown Unicode characters.
-For 1 (or `yes' or `true') or 2, use vfat-style 4-byte escape sequences
-starting with ":". Here 2 give a little-endian encoding
-and 1 a byteswapped bigendian encoding.
-.TP
-.B posix=[0|1]
-If enabled (posix=1), the filesystem distinguishes between
-upper and lower case. The 8.3 alias names are presented as
-hard links instead of being suppressed. This option is obsolete.
-.TP
-\fBuid=\fP\fIvalue\fP, \fBgid=\fP\fIvalue\fP and \fBumask=\fP\fIvalue\fP
-Set the file permission on the filesystem.
-The umask value is given in octal.
-By default, the files are owned by root and not readable by somebody else.
-
-.SH "Mount options for proc"
-.TP
-\fBuid=\fP\fIvalue\fP and \fBgid=\fP\fIvalue\fP
-These options are recognized, but have no effect as far as I can see.
-
-.SH "Mount options for ramfs"
-Ramfs is a memory based filesystem. Mount it and you have it. Unmount it
-and it is gone. Present since Linux 2.3.99pre4.
-There are no mount options.
-
-.SH "Mount options for reiserfs"
-Reiserfs is a journaling filesystem.
-.TP
-.BR conv
-Instructs version 3.6 reiserfs software to mount a version 3.5 filesystem,
-using the 3.6 format for newly created objects. This filesystem will no
-longer be compatible with reiserfs 3.5 tools.
-.TP
-.BR hash= { rupasov | tea | r5 | detect }
-Choose which hash function reiserfs will use to find files within directories.
-.RS
-.TP
-.B rupasov
-A hash invented by Yury Yu. Rupasov.  It is fast and preserves locality,
-mapping lexicographically close file names to close hash values.
-This option should not be used, as it causes a high probability of hash
-collisions.
-.TP
-.B tea
-A Davis-Meyer function implemented by Jeremy Fitzhardinge.
-It uses hash permuting bits in the name.  It gets high randomness
-and, therefore, low probability of hash collisions at some CPU cost.
-This may be used if EHASHCOLLISION errors are experienced with the r5 hash.
-.TP
-.B r5
-A modified version of the rupasov hash. It is used by default and is
-the best choice unless the filesystem has huge directories and
-unusual file-name patterns.
-.TP
-.B detect
-Instructs
-.IR mount
-to detect which hash function is in use by examining
-the filesystem being mounted,  and to write this information into
-the reiserfs superblock. This is only useful on the first mount of
-an old format filesystem.
-.RE
-.TP
-.BR hashed_relocation
-Tunes the block allocator. This may provide performance improvements
-in some situations.
-.TP
-.BR no_unhashed_relocation
-Tunes the block allocator. This may provide performance improvements
-in some situations.
-.TP
-.BR noborder
-Disable the border allocator algorithm invented by Yury Yu. Rupasov.
-This may provide performance improvements in some situations.
-.TP
-.BR nolog
-Disable journaling. This will provide slight performance improvements in
-some situations at the cost of losing reiserfs's fast recovery from crashes.
-Even with this option turned on, reiserfs still performs all journaling
-operations, save for actual writes into its journaling area.  Implementation
-of
-.IR nolog
-is a work in progress.
-.TP
-.BR notail
-By default, reiserfs stores small files and `file tails' directly into its
-tree. This confuses some utilities such as
-.BR LILO (8).
-This option is used to disable packing of files into the tree.
-.TP
-.BR replayonly
-Replay the transactions which are in the journal, but do not actually
-mount the filesystem. Mainly used by
-.IR reiserfsck .
-.TP
-.BI resize= number
-A remount option which permits online expansion of reiserfs partitions.
-Instructs reiserfs to assume that the device has
-.I number
-blocks.
-This option is designed for use with devices which are under logical
-volume management (LVM).
-There is a special
-.I resizer
-utility which can be obtained from
-.IR ftp://ftp.namesys.com/pub/reiserfsprogs .
-.TP
-.BR user_xattr
-Enable Extended User Attributes. See the
-.BR attr (5)
-manual page.
-.TP
-.BR acl
-Enable POSIX Access Control Lists. See the
-.BR acl (5)
-manual page.
-.TP
-.BR barrier=none " / "  barrier=flush "
-This enables/disables the use of write barriers in the journaling code.
-barrier=none disables it, barrier=flush enables it. Write barriers enforce
-proper on-disk ordering of journal commits, making volatile disk write caches
-safe to use, at some performance penalty. The reiserfs filesystem does not
-enable write barriers by default. Be sure to enable barriers unless your disks
-are battery-backed one way or another. Otherwise you risk filesystem
-corruption in case of power failure.
-
-.SH "Mount options for romfs"
-None.
-
-.SH "Mount options for squashfs"
-None.
-
-.SH "Mount options for smbfs"
-Just like
-.IR nfs ", the " smbfs
-implementation expects a binary argument (a
-.IR "struct smb_mount_data" )
-to the mount system call. This argument is constructed by
-.BR smbmount (8)
-and the current version of
-.B mount
-(2.12) does not know anything about smbfs.
-
-.SH "Mount options for sysv"
-None.
-
-.SH "Mount options for tmpfs"
-.TP
-.BI size= nbytes
-Override default maximum size of the filesystem.
-The size is given in bytes, and rounded up to entire pages.
-The default is half of the memory. The size parameter also accepts a suffix %
-to limit this tmpfs instance to that percentage of your physical RAM:
-the default, when neither size nor nr_blocks is specified, is size=50%
-.TP
-.B nr_blocks=
-The same as size, but in blocks of PAGE_CACHE_SIZE
-.TP
-.B nr_inodes=
-The maximum number of inodes for this instance. The default
-is half of the number of your physical RAM pages, or (on a
-machine with highmem) the number of lowmem RAM pages,
-whichever is the lower.
-.PP
-The tmpfs mount options for sizing (
-.BR size ,
-.BR nr_blocks ,
-and
-.BR nr_inodes )
-accept a suffix
-.BR k ,
-.B m
-or
-.B g
-for Ki, Mi, Gi (binary kilo, mega and giga) and can be changed on remount.
-
-.TP
-.B mode=
-Set initial permissions of the root directory.
-.TP
-.B uid=
-The user id.
-.TP
-.B gid=
-The group id.
-.TP
-.B mpol=[default|prefer:Node|bind:NodeList|interleave|interleave:NodeList]
-Set the NUMA memory allocation policy for all files in that
-instance (if the kernel CONFIG_NUMA is enabled) - which can be adjusted on the
-fly via 'mount -o remount ...'
-.RS
-.TP
-.B default
-prefers to allocate memory from the local node
-.TP
-.B prefer:Node
-prefers to allocate memory from the given Node
-.TP
-.B bind:NodeList
-allocates memory only from nodes in NodeList
-.TP
-.B interleave
-prefers to allocate from each node in turn
-.TP
-.B interleave:NodeList
-allocates from each node of NodeList in turn.
-.PP
-The NodeList format is a comma-separated list of decimal numbers and ranges, a
-range being two hyphen-separated decimal numbers, the smallest and largest node
-numbers in the range.  For example, mpol=bind:0-3,5,7,9-15
-
-Note that trying to mount a tmpfs with an mpol option will fail if the
-running kernel does not support NUMA; and will fail if its nodelist
-specifies a node which is not online.  If your system relies on that
-tmpfs being mounted, but from time to time runs a kernel built without
-NUMA capability (perhaps a safe recovery kernel), or with fewer nodes
-online, then it is advisable to omit the mpol option from automatic
-mount options.  It can be added later, when the tmpfs is already mounted
-on MountPoint, by 'mount -o remount,mpol=Policy:NodeList MountPoint'.
-
-.SH "Mount options for ubifs"
-UBIFS is a flash file system which works on top of UBI volumes. Note that
-.B
-atime
-is not supported and is always turned off.
-.TP
-The device name may be specified as
-.RS
-.B ubiX_Y
-UBI device number
-.BR X ,
-volume number
-.B Y
-.TP
-.B ubiY
-UBI device number
-.BR 0 ,
-volume number
-.B Y
-.TP
-.B ubiX:NAME
-UBI device number
-.BR X ,
-volume with name
-.B NAME
-.TP
-.B ubi:NAME
-UBI device number
-.BR 0 ,
-volume with name
-.B NAME
-.RE
-Alternative
-.B !
-separator may be used instead of
-.BR : .
-.TP
-The following mount options are available:
-.TP
-.BR bulk_read
-Enable bulk-read. VFS read-ahead is disabled because it slows down the file
-system. Bulk-Read is an internal optimization. Some flashes may read faster if
-the data are read at one go, rather than at several read requests. For
-example, OneNAND can do "read-while-load" if it reads more than one NAND page.
-.TP
-.BR no_bulk_read
-Do not bulk-read. This is the default.
-.TP
-.BR chk_data_crc
-Check data CRC-32 checksums. This is the default.
-.TP
-.BR no_chk_data_crc.
-Do not check data CRC-32 checksums. With this option, the filesystem does not
-check CRC-32 checksum for data, but it does check it for the internal indexing
-information. This option only affects reading, not writing. CRC-32 is always
-calculated when writing the data.
-.TP
-.BR compr= { none | lzo | zlib }
-Select the default compressor which is used when new files are written. It is
-still possible to read compressed files if mounted with the
-.B none
-option.
-
-.SH "Mount options for udf"
-udf is the "Universal Disk Format" filesystem defined by the Optical
-Storage Technology Association, and is often used for DVD-ROM.
-See also
-.IR iso9660 .
-.TP
-.B gid=
-Set the default group.
-.TP
-.B umask=
-Set the default umask.
-The value is given in octal.
-.TP
-.B uid=
-Set the default user.
-.TP
-.B unhide
-Show otherwise hidden files.
-.TP
-.B undelete
-Show deleted files in lists.
-.TP
-.B nostrict
-Unset strict conformance.
-.\" .TP
-.\" .B utf8
-.\" (unused).
-.TP
-.B iocharset
-Set the NLS character set.
-.TP
-.B bs=
-Set the block size. (May not work unless 2048.)
-.TP
-.B novrs
-Skip volume sequence recognition.
-.TP
-.B session=
-Set the CDROM session counting from 0. Default: last session.
-.TP
-.B anchor=
-Override standard anchor location. Default: 256.
-.TP
-.B volume=
-Override the VolumeDesc location. (unused)
-.TP
-.B partition=
-Override the PartitionDesc location. (unused)
-.TP
-.B lastblock=
-Set the last block of the filesystem.
-.TP
-.B fileset=
-Override the fileset block location. (unused)
-.TP
-.B rootdir=
-Override the root directory location. (unused)
-
-.SH "Mount options for ufs"
-.TP
-.BI ufstype= value
-UFS is a filesystem widely used in different operating systems.
-The problem are differences among implementations. Features of some
-implementations are undocumented, so its hard to recognize the
-type of ufs automatically.
-That's why the user must specify the type of ufs by mount option.
-Possible values are:
-.RS
-.TP
-.B old
-Old format of ufs, this is the default, read only.
-(Don't forget to give the \-r option.)
-.TP
-.B 44bsd
-For filesystems created by a BSD-like system (NetBSD,FreeBSD,OpenBSD).
-.TP
-.B ufs2
-Used in FreeBSD 5.x supported as read-write.
-.TP
-.B 5xbsd
-Synonym for ufs2.
-.TP
-.B sun
-For filesystems created by SunOS or Solaris on Sparc.
-.TP
-.B sunx86
-For filesystems created by Solaris on x86.
-.TP
-.B hp
-For filesystems created by HP-UX, read-only.
-.TP
-.B nextstep
-For filesystems created by NeXTStep (on NeXT station) (currently read only).
-.TP
-.B nextstep-cd
-For NextStep CDROMs (block_size == 2048), read-only.
-.TP
-.B openstep
-For filesystems created by OpenStep (currently read only).
-The same filesystem type is also used by Mac OS X.
-.RE
-
-.TP
-.BI onerror= value
-Set behaviour on error:
-.RS
-.TP
-.B panic
-If an error is encountered, cause a kernel panic.
-.TP
-.RB [ lock | umount | repair ]
-These mount options don't do anything at present;
-when an error is encountered only a console message is printed.
-.RE
-
-.SH "Mount options for umsdos"
-See mount options for msdos.
-The
-.B dotsOK
-option is explicitly killed by
-.IR umsdos .
-
-.SH "Mount options for vfat"
-First of all, the mount options for
-.I fat
-are recognized.
-The
-.B dotsOK
-option is explicitly killed by
-.IR vfat .
-Furthermore, there are
-.TP
-.B uni_xlate
-Translate unhandled Unicode characters to special escaped sequences.
-This lets you backup and restore filenames that are created with any
-Unicode characters. Without this option, a '?' is used when no
-translation is possible. The escape character is ':' because it is
-otherwise illegal on the vfat filesystem. The escape sequence
-that gets used, where u is the unicode character,
-is: ':', (u & 0x3f), ((u>>6) & 0x3f), (u>>12).
-.TP
-.B posix
-Allow two files with names that only differ in case.
-This option is obsolete.
-.TP
-.B nonumtail
-First try to make a short name without sequence number,
-before trying
-.IR name~num.ext .
-.TP
-.B utf8
-UTF8 is the filesystem safe 8-bit encoding of Unicode that is used by the
-console. It can be enabled for the filesystem with this option or disabled
-with utf8=0, utf8=no or utf8=false. If `uni_xlate' gets set, UTF8 gets
-disabled.
-.TP
-.BR shortname= { lower | win95 | winnt | mixed }
-
-Defines the behaviour for creation and display of filenames which fit into
-8.3 characters. If a long name for a file exists, it will always be
-preferred display. There are four modes:
-:
-.RS
-.TP
-.I lower
-Force the short name to lower case upon display; store a long name when
-the short name is not all upper case.
-.TP
-.I win95
-Force the short name to upper case upon display; store a long name when
-the short name is not all upper case.
-.TP
-.I winnt
-Display the shortname as is; store a long name when the short name is
-not all lower case or all upper case.
-.TP
-.I mixed
-Display the short name as is; store a long name when the short name is not
-all upper case. This mode is the default since Linux 2.6.32.
-.RE
-
-
-.SH "Mount options for usbfs"
-.TP
-\fBdevuid=\fP\fIuid\fP and \fBdevgid=\fP\fIgid\fP and \fBdevmode=\fP\fImode\fP
-Set the owner and group and mode of the device files in the usbfs filesystem
-(default: uid=gid=0, mode=0644). The mode is given in octal.
-.TP
-\fBbusuid=\fP\fIuid\fP and \fBbusgid=\fP\fIgid\fP and \fBbusmode=\fP\fImode\fP
-Set the owner and group and mode of the bus directories in the usbfs
-filesystem (default: uid=gid=0, mode=0555). The mode is given in octal.
-.TP
-\fBlistuid=\fP\fIuid\fP and \fBlistgid=\fP\fIgid\fP and \fBlistmode=\fP\fImode\fP
-Set the owner and group and mode of the file
-.I devices
-(default: uid=gid=0, mode=0444). The mode is given in octal.
-
-.SH "Mount options for xenix"
-None.
-
-.SH "Mount options for xfs"
-.TP
-.BI allocsize= size
-Sets the buffered I/O end-of-file preallocation size when
-doing delayed allocation writeout (default size is 64KiB).
-Valid values for this option are page size (typically 4KiB)
-through to 1GiB, inclusive, in power-of-2 increments.
-.TP
-.BR attr2 | noattr2
-The options enable/disable (default is enabled) an "opportunistic"
-improvement to be made in the way inline extended attributes are
-stored on-disk.
-When the new form is used for the first time (by setting or
-removing extended attributes) the on-disk superblock feature
-bit field will be updated to reflect this format being in use.
-.TP
-.B barrier
-Enables the use of block layer write barriers for writes into
-the journal and unwritten extent conversion.  This allows for
-drive level write caching to be enabled, for devices that
-support write barriers.
-.TP
-.B dmapi
-Enable the DMAPI (Data Management API) event callouts.
-Use with the
-.B mtpt
-option.
-.TP
-.BR grpid | bsdgroups " and " nogrpid | sysvgroups
-These options define what group ID a newly created file gets.
-When grpid is set, it takes the group ID of the directory in
-which it is created; otherwise (the default) it takes the fsgid
-of the current process, unless the directory has the setgid bit
-set, in which case it takes the gid from the parent directory,
-and also gets the setgid bit set if it is a directory itself.
-.TP
-.BI ihashsize= value
-Sets the number of hash buckets available for hashing the
-in-memory inodes of the specified mount point.  If a value
-of zero is used, the value selected by the default algorithm
-will be displayed in
-.IR /proc/mounts .
-.TP
-.BR ikeep | noikeep
-When inode clusters are emptied of inodes, keep them around
-on the disk (ikeep) - this is the traditional XFS behaviour
-and is still the default for now.  Using the noikeep option,
-inode clusters are returned to the free space pool.
-.TP
-.B inode64
-Indicates that XFS is allowed to create inodes at any location
-in the filesystem, including those which will result in inode
-numbers occupying more than 32 bits of significance.  This is
-provided for backwards compatibility, but causes problems for
-backup applications that cannot handle large inode numbers.
-.TP
-.BR largeio | nolargeio
-If
-.B nolargeio
-is specified, the optimal I/O reported in
-st_blksize by
-.BR stat (2)
-will be as small as possible to allow user
-applications to avoid inefficient read/modify/write I/O.
-If
-.B largeio
-is specified, a filesystem that has a
-.B swidth
-specified
-will return the
-.B swidth
-value (in bytes) in st_blksize. If the
-filesystem does not have a
-.B swidth
-specified but does specify
-an
-.B allocsize
-then
-.B allocsize
-(in bytes) will be returned
-instead.
-If neither of these two options are specified, then filesystem
-will behave as if
-.B nolargeio
-was specified.
-.TP
-.BI logbufs= value
-Set the number of in-memory log buffers.  Valid numbers range
-from 2-8 inclusive.
-The default value is 8 buffers for any recent kernel.
-.TP
-.BI logbsize= value
-Set the size of each in-memory log buffer.
-Size may be specified in bytes, or in kilobytes with a "k" suffix.
-Valid sizes for version 1 and version 2 logs are 16384 (16k) and
-32768 (32k).  Valid sizes for version 2 logs also include
-65536 (64k), 131072 (128k) and 262144 (256k).
-The default value for any recent kernel is 32768.
-.TP
-\fBlogdev=\fP\fIdevice\fP and \fBrtdev=\fP\fIdevice\fP
-Use an external log (metadata journal) and/or real-time device.
-An XFS filesystem has up to three parts: a data section, a log section,
-and a real-time section.
-The real-time section is optional, and the log section can be separate
-from the data section or contained within it.
-Refer to
-.BR xfs (5).
-.TP
-.BI  mtpt= mountpoint
-Use with the
-.B dmapi
-option. The value specified here will be
-included in the DMAPI mount event, and should be the path of
-the actual mountpoint that is used.
-.TP
-.B noalign
-Data allocations will not be aligned at stripe unit boundaries.
-.TP
-.B noatime
-Access timestamps are not updated when a file is read.
-.TP
-.B norecovery
-The filesystem will be mounted without running log recovery.
-If the filesystem was not cleanly unmounted, it is likely to
-be inconsistent when mounted in
-.B norecovery
-mode.
-Some files or directories may not be accessible because of this.
-Filesystems mounted
-.B norecovery
-must be mounted read-only or the mount will fail.
-.TP
-.B nouuid
-Don't check for double mounted filesystems using the filesystem uuid.
-This is useful to mount LVM snapshot volumes.
-.TP
-.B osyncisosync
-Make O_SYNC writes implement true O_SYNC.  WITHOUT this option,
-Linux XFS behaves as if an
-.B osyncisdsync
-option is used,
-which will make writes to files opened with the O_SYNC flag set
-behave as if the O_DSYNC flag had been used instead.
-This can result in better performance without compromising
-data safety.
-However if this option is not in effect, timestamp updates from
-O_SYNC writes can be lost if the system crashes.
-If timestamp updates are critical, use the
-.B osyncisosync
-option.
-.TP
-.BR uquota | usrquota | uqnoenforce | quota
-User disk quota accounting enabled, and limits (optionally)
-enforced.  Refer to
-.BR xfs_quota (8)
-for further details.
-.TP
-.BR gquota | grpquota | gqnoenforce
-Group disk quota accounting enabled and limits (optionally)
-enforced. Refer to
-.BR xfs_quota (8)
-for further details.
-.TP
-.BR pquota | prjquota | pqnoenforce
-Project disk quota accounting enabled and limits (optionally)
-enforced. Refer to
-.BR xfs_quota (8)
-for further details.
-.TP
-\fBsunit=\fP\fIvalue\fP and \fBswidth=\fP\fIvalue\fP
-Used to specify the stripe unit and width for a RAID device or a stripe
-volume.
-.I value
-must be specified in 512-byte block units.
-If this option is not specified and the filesystem was made on a stripe
-volume or the stripe width or unit were specified for the RAID device at
-mkfs time, then the mount system call will restore the value from the
-superblock.
-For filesystems that are made directly on RAID devices, these options can be
-used to override the information in the superblock if the underlying disk
-layout changes after the filesystem has been created.
-The
-.B swidth
-option is required if the
-.B sunit
-option has been specified,
-and must be a multiple of the
-.B sunit
-value.
-.TP
-.B swalloc
-Data allocations will be rounded up to stripe width boundaries
-when the current end of file is being extended and the file
-size is larger than the stripe width size.
-
-.SH "Mount options for xiafs"
-None. Although nothing is wrong with xiafs, it is not used much,
-and is not maintained. Probably one shouldn't use it.
-Since Linux version 2.1.21 xiafs is no longer part of the kernel source.
-
-.SH "THE LOOP DEVICE"
-One further possible type is a mount via the loop device. For example,
-the command
-.RS
-.sp
-.B "mount /tmp/disk.img /mnt -t vfat -o loop=/dev/loop"
-.sp
-.RE
-will set up the loop device
-.I /dev/loop3
-to correspond to the file
-.IR /tmp/disk.img ,
-and then mount this device on
-.IR /mnt .
-
-If no explicit loop device is mentioned
-(but just an option `\fB\-o loop\fP' is given), then
-.B mount
-will try to find some unused loop device and use that, for example
-.RS
-.sp
-.B "mount /tmp/disk.img /mnt -o loop"
-.sp
-.RE
-The mount command
-.B automatically
-creates a loop device from a regular file if a filesystem type is
-not specified or the filesystem is known for libblkid, for example:
-.RS
-.sp
-.B "mount /tmp/disk.img /mnt"
-.sp
-.B "mount -t ext3 /tmp/disk.img /mnt"
-.sp
-.RE
-This type of mount knows about three options, namely
-.BR loop ", " offset ", " sizelimit " ,
-that are really options to
-.BR \%losetup (8).
-(These options can be used in addition to those specific
-to the filesystem type.)
-
-Since Linux 2.6.25 is supported auto-destruction of loop devices and
-then any loop device allocated by
-.B mount
-will be freed by
-.B umount
-independently on
-.IR /etc/mtab .
-
-You can also free a loop device by hand, using `losetup -d' or `umount -d`.
-
-.SH RETURN CODES
-.B mount
-has the following return codes (the bits can be ORed):
-.TP
-.BR 0
-success
-.TP
-.BR 1
-incorrect invocation or permissions
-.TP
-.BR 2
-system error (out of memory, cannot fork, no more loop devices)
-.TP
-.BR 4
-internal
-.B mount
-bug
-.TP
-.BR 8
-user interrupt
-.TP
-.BR 16
-problems writing or locking /etc/mtab
-.TP
-.BR 32
-mount failure
-.TP
-.BR 64
-some mount succeeded
-
-.SH NOTES
-The syntax of external mount helpers is:
-
-.RS
-.BI /sbin/mount. <suffix>
-.I spec dir
-.RB [ \-sfnv ]
-.RB [ \-o
-.IR options ]
-.RB [ \-t
-.IR type.subtype ]
-.RE
-
-where the <type> is filesystem type and \-sfnvo options have same meaning like
-standard mount options. The \-t option is used  for filesystems with subtypes
-support (for example /sbin/mount.fuse -t fuse.sshfs).
-
-.SH FILES
-.TP 18n
-.I /etc/fstab
-filesystem table
-.TP
-.I /etc/mtab
-table of mounted filesystems
-.TP
-.I /etc/mtab~
-lock file
-.TP
-.I /etc/mtab.tmp
-temporary file
-.TP
-.I /etc/filesystems
-a list of filesystem types to try
-
-.SH "SEE ALSO"
-.BR mount (2),
-.BR umount (2),
-.BR fstab (5),
-.BR umount (8),
-.BR swapon (8),
-.BR nfs (5),
-.BR xfs (5),
-.BR e2label (8),
-.BR xfs_admin (8),
-.BR mountd (8),
-.BR nfsd (8),
-.BR mke2fs (8),
-.BR tune2fs (8),
-.BR losetup (8)
-.SH BUGS
-It is possible for a corrupted filesystem to cause a crash.
-.PP
-Some Linux filesystems don't support
-.B "\-o sync and \-o dirsync"
-(the ext2, ext3, fat and vfat filesystems
-.I do
-support synchronous updates (a la BSD) when mounted with the
-.B sync
-option).
-.PP
-The
-.B "\-o remount"
-may not be able to change mount parameters (all
-.IR ext2fs -specific
-parameters, except
-.BR  sb ,
-are changeable with a remount, for example, but you can't change
-.B gid
-or
-.B umask
-for the
-.IR fatfs ).
-.PP
-Mount by label or uuid will work only if your devices have the names listed in
-.IR /proc/partitions .
-In particular, it may well fail if the kernel was compiled with devfs
-but devfs is not mounted.
-.PP
-It is possible that files
-.IR /etc/mtab
-and
-.IR /proc/mounts
-don't match. The first file is based only on the mount command options, but the
-content of the second file also depends on the kernel and others settings (e.g.
-remote NFS server. In particular case the mount command may reports unreliable
-information about a NFS mount point and the /proc/mounts file usually contains
-more reliable information.)
-.PP
-Checking files on NFS filesystem referenced by file descriptors (i.e. the
-.BR fcntl
-and
-.BR ioctl
-families of functions) may lead to inconsistent result due to the lack of
-consistency check in kernel even if noac is used.
-.SH HISTORY
-A
-.B mount
-command existed in Version 5 AT&T UNIX.
-.SH AVAILABILITY
-The mount command is part of the util-linux package and is available from
-ftp://ftp.kernel.org/pub/linux/utils/util-linux/.
diff --git a/mount-deprecated/mount.c b/mount-deprecated/mount.c
deleted file mode 100644 (file)
index d8e1712..0000000
+++ /dev/null
@@ -1,2625 +0,0 @@
-/*
- * A mount(8) for Linux.
- *
- * Modifications by many people. Distributed under GPL.
- */
-
-#include <unistd.h>
-#include <ctype.h>
-#include <errno.h>
-#include <string.h>
-#include <getopt.h>
-#include <stdio.h>
-
-#include <pwd.h>
-#include <grp.h>
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <sys/mount.h>
-
-#include <mntent.h>
-
-#ifdef HAVE_LIBSELINUX
-#include <selinux/selinux.h>
-#include <selinux/context.h>
-#endif
-
-#include "pathnames.h"
-#include "fsprobe.h"
-#include "devname.h"
-#include "mount_constants.h"
-#include "sundries.h"
-#include "mount_mntent.h"
-#include "fstab.h"
-#include "loopdev.h"
-#include "linux_version.h"
-#include "getusername.h"
-#include "env.h"
-#include "nls.h"
-#include "blkdev.h"
-#include "strutils.h"
-#include "closestream.h"
-#include "xgetpass.h"
-
-#define DO_PS_FIDDLING
-
-#ifdef DO_PS_FIDDLING
-#include "setproctitle.h"
-#endif
-
-/* True for fake mount (-f).  */
-static int fake = 0;
-
-/* True if we are allowed to call /sbin/mount.${FSTYPE} */
-static int external_allowed = 1;
-
-/* Don't write an entry in /etc/mtab (-n).  */
-static int nomtab = 0;
-
-/* True for explicit readonly (-r).  */
-static int readonly = 0;
-
-/* Nonzero for sloppy (-s).  */
-static int sloppy = 0;
-
-/* True for explicit read/write (-w).  */
-static int readwrite = 0;
-
-/* True for all mount (-a).  */
-static int mount_all = 0;
-
-/* True for fork() during all mount (-F).  */
-static int optfork = 0;
-
-/* Add volumelabel in a listing of mounted devices (-l). */
-static int list_with_volumelabel = 0;
-
-/* Nonzero for mount {bind|move|make-shared|make-private|
- *                             make-unbindable|make-slave}
- */
-static int mounttype = 0;
-
-/* True if (ruid != euid) or (0 != ruid), i.e. only "user" mounts permitted.  */
-static int restricted = 1;
-
-/* mount(2) options */
-struct mountargs {
-       const char *spec;
-       const char *node;
-       const char *type;
-       int flags;
-       void *data;
-};
-
-/* Map from -o and fstab option strings to the flag argument to mount(2).  */
-struct opt_map {
-  const char *opt;             /* option name */
-  int  skip;                   /* skip in mtab option string */
-  int  inv;                    /* true if flag value should be inverted */
-  int  mask;                   /* flag mask value */
-  int  cmask;                  /* comments mask */
-};
-
-/* Custom mount options for our own purposes.  */
-/* Maybe these should now be freed for kernel use again */
-#define MS_NOAUTO      0x80000000
-#define MS_USERS       0x40000000
-#define MS_USER                0x20000000
-#define MS_OWNER       0x10000000
-#define MS_GROUP       0x08000000
-#define MS_COMMENT     0x02000000
-#define MS_LOOP                0x00010000
-
-#define MS_COMMENT_NOFAIL      (1 << 1)
-#define MS_COMMENT_NETDEV      (1 << 2)
-
-/* Options that we keep the mount system call from seeing.  */
-#define MS_NOSYS       (MS_NOAUTO|MS_USERS|MS_USER|MS_COMMENT|MS_LOOP)
-
-/* Options that we keep from appearing in the options field in the mtab.  */
-#define MS_NOMTAB      (MS_REMOUNT|MS_NOAUTO|MS_USERS|MS_USER)
-
-#define MS_PROPAGATION  (MS_SHARED|MS_SLAVE|MS_UNBINDABLE|MS_PRIVATE)
-
-/* Options that we make ordinary users have by default.  */
-#define MS_SECURE      (MS_NOEXEC|MS_NOSUID|MS_NODEV)
-
-/* Options that we make owner-mounted devices have by default */
-#define MS_OWNERSECURE (MS_NOSUID|MS_NODEV)
-
-static const struct opt_map opt_map[] = {
-  { "defaults",        0, 0, 0         },      /* default options */
-  { "ro",      1, 0, MS_RDONLY },      /* read-only */
-  { "rw",      1, 1, MS_RDONLY },      /* read-write */
-  { "exec",    0, 1, MS_NOEXEC },      /* permit execution of binaries */
-  { "noexec",  0, 0, MS_NOEXEC },      /* don't execute binaries */
-  { "suid",    0, 1, MS_NOSUID },      /* honor suid executables */
-  { "nosuid",  0, 0, MS_NOSUID },      /* don't honor suid executables */
-  { "dev",     0, 1, MS_NODEV  },      /* interpret device files  */
-  { "nodev",   0, 0, MS_NODEV  },      /* don't interpret devices */
-  { "sync",    0, 0, MS_SYNCHRONOUS},  /* synchronous I/O */
-  { "async",   0, 1, MS_SYNCHRONOUS},  /* asynchronous I/O */
-  { "dirsync", 0, 0, MS_DIRSYNC},      /* synchronous directory modifications */
-  { "remount",  0, 0, MS_REMOUNT},      /* Alter flags of mounted FS */
-  { "bind",    0, 0, MS_BIND   },      /* Remount part of tree elsewhere */
-  { "rbind",   0, 0, MS_BIND|MS_REC }, /* Idem, plus mounted subtrees */
-  { "auto",    0, 1, MS_NOAUTO },      /* Can be mounted using -a */
-  { "noauto",  0, 0, MS_NOAUTO },      /* Can  only be mounted explicitly */
-  { "users",   0, 0, MS_USERS  },      /* Allow ordinary user to mount */
-  { "nousers", 0, 1, MS_USERS  },      /* Forbid ordinary user to mount */
-  { "user",    0, 0, MS_USER   },      /* Allow ordinary user to mount */
-  { "nouser",  0, 1, MS_USER   },      /* Forbid ordinary user to mount */
-  { "owner",   0, 0, MS_OWNER  },      /* Let the owner of the device mount */
-  { "noowner", 0, 1, MS_OWNER  },      /* Device owner has no special privs */
-  { "group",   0, 0, MS_GROUP  },      /* Let the group of the device mount */
-  { "nogroup", 0, 1, MS_GROUP  },      /* Device group has no special privs */
-  { "_netdev", 0, 0, MS_COMMENT, MS_COMMENT_NETDEV },  /* Device requires network */
-  { "comment", 0, 0, MS_COMMENT},      /* fstab comment only (kudzu,_netdev)*/
-
-  /* add new options here */
-#ifdef MS_NOSUB
-  { "sub",     0, 1, MS_NOSUB  },      /* allow submounts */
-  { "nosub",   0, 0, MS_NOSUB  },      /* don't allow submounts */
-#endif
-#ifdef MS_SILENT
-  { "silent",  0, 0, MS_SILENT    },   /* be quiet  */
-  { "loud",    0, 1, MS_SILENT    },   /* print out messages. */
-#endif
-#ifdef MS_MANDLOCK
-  { "mand",    0, 0, MS_MANDLOCK },    /* Allow mandatory locks on this FS */
-  { "nomand",  0, 1, MS_MANDLOCK },    /* Forbid mandatory locks on this FS */
-#endif
-  { "loop",    1, 0, MS_LOOP   },      /* use a loop device */
-#ifdef MS_NOATIME
-  { "atime",   0, 1, MS_NOATIME },     /* Update access time */
-  { "noatime", 0, 0, MS_NOATIME },     /* Do not update access time */
-#endif
-#ifdef MS_I_VERSION
-  { "iversion",        0, 0, MS_I_VERSION },   /* Update inode I_version time */
-  { "noiversion", 0, 1, MS_I_VERSION },        /* Don't update inode I_version time */
-#endif
-#ifdef MS_NODIRATIME
-  { "diratime",        0, 1, MS_NODIRATIME },  /* Update dir access times */
-  { "nodiratime", 0, 0, MS_NODIRATIME },/* Do not update dir access times */
-#endif
-#ifdef MS_RELATIME
-  { "relatime",        0, 0, MS_RELATIME },   /* Update access times relative to
-                                         mtime/ctime */
-  { "norelatime", 0, 1, MS_RELATIME }, /* Update access time without regard
-                                         to mtime/ctime */
-#endif
-#ifdef MS_STRICTATIME
-  { "strictatime", 0, 0, MS_STRICTATIME }, /* Strict atime semantics */
-  { "nostrictatime", 0, 1, MS_STRICTATIME }, /* kernel default atime */
-#endif
-  { "nofail",  0, 0, MS_COMMENT, MS_COMMENT_NOFAIL },  /* Do not fail if ENOENT on dev */
-  { NULL,      0, 0, 0         }
-};
-
-static int opt_nofail;
-static int invuser_flags;
-static int comment_flags;
-
-static const char *opt_loopdev, *opt_vfstype, *opt_offset, *opt_sizelimit,
-        *opt_encryption, *opt_speed, *opt_comment, *opt_uhelper, *opt_helper;
-
-static int is_readonly(const char *node);
-static int mounted (const char *spec0, const char *node0, struct mntentchn *fstab_mc);
-static int check_special_mountprog(const char *spec, const char *node,
-               const char *type, int flags, char *extra_opts, int *status);
-
-static struct string_opt_map {
-  char *tag;
-  int skip;
-  const char **valptr;
-} string_opt_map[] = {
-  { "loop=",   0, &opt_loopdev },
-  { "vfs=",    1, &opt_vfstype },
-  { "offset=", 0, &opt_offset },
-  { "sizelimit=",  0, &opt_sizelimit },
-  { "encryption=", 0, &opt_encryption },
-  { "speed=", 0, &opt_speed },
-  { "comment=", 1, &opt_comment },
-  { "uhelper=", 0, &opt_uhelper },
-  { "helper=", 0, &opt_helper },
-  { NULL, 0, NULL }
-};
-
-static void
-clear_string_opts(void) {
-       struct string_opt_map *m;
-
-       for (m = &string_opt_map[0]; m->tag; m++)
-               *(m->valptr) = NULL;
-}
-
-static void
-clear_flags_opts(void) {
-       invuser_flags = 0;
-       comment_flags = 0;
-       opt_nofail = 0;
-}
-
-static int
-parse_string_opt(char *s) {
-       struct string_opt_map *m;
-       int lth;
-
-       for (m = &string_opt_map[0]; m->tag; m++) {
-               lth = strlen(m->tag);
-               if (!strncmp(s, m->tag, lth)) {
-                       *(m->valptr) = xstrdup(s + lth);
-                       return 1;
-               }
-       }
-       return 0;
-}
-
-/* Report on a single mount.  */
-static void
-print_one (const struct my_mntent *me) {
-
-       char *fsname = NULL;
-
-       if (mount_quiet)
-               return;
-
-       /* users assume backing file name rather than /dev/loopN in
-        * mount(8) output if the device has been initialized by mount(8).
-        */
-       if (strncmp(me->mnt_fsname, "/dev/loop", 9) == 0 &&
-           loopdev_is_autoclear(me->mnt_fsname))
-               fsname = loopdev_get_backing_file(me->mnt_fsname);
-
-       if (!fsname)
-               fsname = (char *) me->mnt_fsname;
-
-       printf ("%s on %s", fsname, me->mnt_dir);
-       if (me->mnt_type != NULL && *(me->mnt_type) != '\0')
-               printf (" type %s", me->mnt_type);
-       if (me->mnt_opts != NULL)
-               printf (" (%s)", me->mnt_opts);
-       if (list_with_volumelabel && is_pseudo_fs(me->mnt_type) == 0) {
-               const char *devname = spec_to_devname(me->mnt_fsname);
-
-               if (devname) {
-                       const char *label;
-
-                       label = fsprobe_get_label_by_devname(devname);
-                       my_free(devname);
-
-                       if (label) {
-                               printf (" [%s]", label);
-                               my_free(label);
-                       }
-               }
-       }
-       printf ("\n");
-}
-
-/* Report on everything in mtab (of the specified types if any).  */
-static int
-print_all (char *types) {
-     struct mntentchn *mc, *mc0;
-
-     mc0 = mtab_head();
-     for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) {
-         if (matching_type (mc->m.mnt_type, types))
-              print_one (&(mc->m));
-     }
-
-     if (!mtab_does_not_exist() && !mtab_is_a_symlink() && is_readonly(_PATH_MOUNTED))
-          printf(_("\n"
-       "mount: warning: /etc/mtab is not writable (e.g. read-only filesystem).\n"
-       "       It's possible that information reported by mount(8) is not\n"
-       "       up to date. For actual information about system mount points\n"
-       "       check the /proc/mounts file.\n\n"));
-
-     exit (0);
-}
-
-/* reallocates its first arg */
-static char *
-append_opt(char *s, const char *opt, const char *val)
-{
-       if (!opt)
-               return s;
-       if (!s) {
-               if (!val)
-                      return xstrdup(opt);             /* opt */
-
-               return xstrconcat3(NULL, opt, val);     /* opt=val */
-       }
-       if (!val)
-               return xstrconcat3(s, ",", opt);        /* s,opt */
-
-       return xstrconcat4(s, ",", opt, val);           /* s,opt=val */
-}
-
-static char *
-append_numopt(char *s, const char *opt, unsigned int num)
-{
-       char buf[32];
-
-       snprintf(buf, sizeof(buf), "%u", num);
-       return append_opt(s, opt, buf);
-}
-
-#ifdef HAVE_LIBSELINUX
-/* strip quotes from a "string"
- * Warning: This function modify the "str" argument.
- */
-static char *
-strip_quotes(char *str)
-{
-       char *end = NULL;
-
-       if (*str != '"')
-               return str;
-
-       end = strrchr(str, '"');
-       if (end == NULL || end == str)
-               die (EX_USAGE, _("mount: improperly quoted option string '%s'"), str);
-
-       *end = '\0';
-       return str+1;
-}
-
-/* translates SELinux context from human to raw format and
- * appends it to the mount extra options.
- *
- * returns -1 on error and 0 on success
- */
-static int
-append_context(const char *optname, char *optdata, char **extra_opts)
-{
-       security_context_t raw = NULL;
-       char *data = NULL;
-
-       if (is_selinux_enabled() != 1)
-               /* ignore the option if we running without selinux */
-               return 0;
-
-       if (optdata==NULL || *optdata=='\0' || optname==NULL)
-               return -1;
-
-       /* TODO: use strip_quotes() for all mount options? */
-       data = *optdata =='"' ? strip_quotes(optdata) : optdata;
-
-       if (selinux_trans_to_raw_context(
-                       (security_context_t) data, &raw) == -1 ||
-                       raw == NULL)
-               return -1;
-
-       if (verbose)
-               printf(_("mount: translated %s '%s' to '%s'\n"),
-                               optname, data, (char *) raw);
-
-       *extra_opts = append_opt(*extra_opts, optname, NULL);
-       *extra_opts = xstrconcat4(*extra_opts, "\"", (char *) raw, "\"");
-
-       freecon(raw);
-       return 0;
-}
-
-/* returns newly allocated string without *context= options */
-static char *remove_context_options(char *opts)
-{
-       char *begin = NULL, *end = NULL, *p;
-       int open_quote = 0, changed = 0;
-
-       if (!opts)
-               return NULL;
-
-       opts = xstrdup(opts);
-
-       for (p = opts; p && *p; p++) {
-               if (!begin)
-                       begin = p;              /* begin of the option item */
-               if (*p == '"')
-                       open_quote ^= 1;        /* reverse the status */
-               if (open_quote)
-                       continue;               /* still in quoted block */
-               if (*p == ',')
-                       end = p;                /* terminate the option item */
-               else if (*(p + 1) == '\0')
-                       end = p + 1;            /* end of optstr */
-               if (!begin || !end)
-                       continue;
-
-               if (strncmp(begin, "context=", 8) == 0 ||
-                   strncmp(begin, "fscontext=", 10) == 0 ||
-                   strncmp(begin, "defcontext=", 11) == 0 ||
-                   strncmp(begin, "rootcontext=", 12) == 0 ||
-                   strncmp(begin, "seclabel", 8) == 0) {
-                       size_t sz;
-
-                       if ((begin == opts || *(begin - 1) == ',') && *end == ',')
-                               end++;
-                       sz = strlen(end);
-
-                       memmove(begin, end, sz + 1);
-                       if (!*begin && *(begin - 1) == ',')
-                               *(begin - 1) = '\0';
-
-                       p = begin;
-                       changed = 1;
-               }
-               begin = end = NULL;
-       }
-
-       if (changed && verbose)
-               printf (_("mount: SELinux *context= options are ignore on remount.\n"));
-
-       return opts;
-}
-
-static int has_context_option(char *opts)
-{
-       if (get_option("context=", opts, NULL) ||
-           get_option("fscontext=", opts, NULL) ||
-           get_option("defcontext=", opts, NULL) ||
-           get_option("rootcontext=", opts, NULL))
-               return 1;
-
-       return 0;
-}
-
-#endif
-
-/*
- * Look for OPT in opt_map table and return mask value.
- * If OPT isn't found, tack it onto extra_opts (which is non-NULL).
- * For the options uid= and gid= replace user or group name by its value.
- */
-static inline void
-parse_opt(char *opt, int *mask, int *inv_user, char **extra_opts) {
-       const struct opt_map *om;
-
-       for (om = opt_map; om->opt != NULL; om++)
-               if (streq (opt, om->opt)) {
-                       if (om->inv)
-                               *mask &= ~om->mask;
-                       else
-                               *mask |= om->mask;
-                       if (om->inv && ((*mask & MS_USER) || (*mask & MS_USERS))
-                           && (om->mask & MS_SECURE))
-                               *inv_user |= om->mask;
-                       if ((om->mask == MS_USER || om->mask == MS_USERS)
-                           && !om->inv)
-                               *mask |= MS_SECURE;
-                       if ((om->mask == MS_OWNER || om->mask == MS_GROUP)
-                           && !om->inv)
-                               *mask |= MS_OWNERSECURE;
-#ifdef MS_SILENT
-                       if (om->mask == MS_SILENT && om->inv)  {
-                               mount_quiet = 1;
-                               verbose = 0;
-                       }
-#endif
-                       if (om->mask == MS_COMMENT) {
-                               comment_flags |= om->cmask;
-                               if (om->cmask == MS_COMMENT_NOFAIL)
-                                       opt_nofail = 1;
-                       }
-                       return;
-               }
-
-       /* convert nonnumeric ids to numeric */
-       if (!strncmp(opt, "uid=", 4) && !isdigit(opt[4])) {
-               struct passwd *pw = getpwnam(opt+4);
-
-               if (pw) {
-                       *extra_opts = append_numopt(*extra_opts,
-                                               "uid=", pw->pw_uid);
-                       return;
-               }
-       }
-       if (!strncmp(opt, "gid=", 4) && !isdigit(opt[4])) {
-               struct group *gr = getgrnam(opt+4);
-
-               if (gr) {
-                       *extra_opts = append_numopt(*extra_opts,
-                                               "gid=", gr->gr_gid);
-                       return;
-               }
-       }
-
-#ifdef HAVE_LIBSELINUX
-       if (strncmp(opt, "context=", 8) == 0 && *(opt+8)) {
-               if (append_context("context=", opt+8, extra_opts) == 0)
-                       return;
-       }
-       if (strncmp(opt, "fscontext=", 10) == 0 && *(opt+10)) {
-               if (append_context("fscontext=", opt+10, extra_opts) == 0)
-                       return;
-       }
-       if (strncmp(opt, "defcontext=", 11) == 0 && *(opt+11)) {
-               if (append_context("defcontext=", opt+11, extra_opts) == 0)
-                       return;
-       }
-       if (strncmp(opt, "rootcontext=", 12) == 0 && *(opt+12)) {
-               if (append_context("rootcontext=", opt+12, extra_opts) == 0)
-                       return;
-       }
-#endif
-       *extra_opts = append_opt(*extra_opts, opt, NULL);
-}
-
-
-/* Take -o options list and compute 4th and 5th args to mount(2).  flags
-   gets the standard options (indicated by bits) and extra_opts all the rest */
-static void
-parse_opts (const char *options, int *flags, char **extra_opts) {
-       *flags = 0;
-       *extra_opts = NULL;
-
-       clear_string_opts();
-       clear_flags_opts();
-
-       if (options != NULL) {
-               char *opts = xstrdup(options);
-               int open_quote = 0;
-               char *opt, *p;
-
-               for (p=opts, opt=NULL; p && *p; p++) {
-                       if (!opt)
-                               opt = p;                /* begin of the option item */
-                       if (*p == '"')
-                               open_quote ^= 1;        /* reverse the status */
-                       if (open_quote)
-                               continue;               /* still in quoted block */
-                       if (*p == ',')
-                               *p = '\0';              /* terminate the option item */
-                       /* end of option item or last item */
-                       if (*p == '\0' || *(p+1) == '\0') {
-                               if (!parse_string_opt(opt))
-                                       parse_opt(opt, flags, &invuser_flags, extra_opts);
-                               opt = NULL;
-                       }
-               }
-               free(opts);
-       }
-
-       if (readonly)
-               *flags |= MS_RDONLY;
-       if (readwrite)
-               *flags &= ~MS_RDONLY;
-
-       *flags |= mounttype;
-
-       /* The propagation flags should not be used together with any
-        * other flags (except MS_REC and MS_SILENT) */
-       if (*flags & MS_PROPAGATION)
-               *flags &= (MS_PROPAGATION | MS_REC | MS_SILENT);
-}
-
-/* Try to build a canonical options string.  */
-static char *
-fix_opts_string (int flags, const char *extra_opts,
-                const char *user, int inv_user)
-{
-       const struct opt_map *om;
-       const struct string_opt_map *m;
-       char *new_opts;
-
-       new_opts = append_opt(NULL, (flags & MS_RDONLY) ? "ro" : "rw", NULL);
-       for (om = opt_map; om->opt != NULL; om++) {
-               if (om->skip)
-                       continue;
-               if (om->inv || !om->mask || (flags & om->mask) != om->mask)
-                       continue;
-               if (om->mask == MS_COMMENT && !(comment_flags & om->cmask))
-                       continue;
-               new_opts = append_opt(new_opts, om->opt, NULL);
-               flags &= ~om->mask;
-       }
-       for (m = &string_opt_map[0]; m->tag; m++) {
-               if (!m->skip && *(m->valptr))
-                       new_opts = append_opt(new_opts, m->tag, *(m->valptr));
-       }
-       if (extra_opts && *extra_opts)
-               new_opts = append_opt(new_opts, extra_opts, NULL);
-
-       if (user)
-               new_opts = append_opt(new_opts, "user=", user);
-
-       if (inv_user) {
-               for (om = opt_map; om->opt != NULL; om++) {
-                       if (om->mask && om->inv
-                           && (inv_user & om->mask) == om->mask) {
-                               new_opts = append_opt(new_opts, om->opt, NULL);
-                               inv_user &= ~om->mask;
-                       }
-               }
-       }
-
-       return new_opts;
-}
-
-static int
-already (const char *spec0, const char *node0) {
-       struct mntentchn *mc;
-       int ret = 1;
-       char *spec = canonicalize_spec(spec0);
-       char *node = canonicalize(node0);
-
-       if ((mc = getmntfile(node)) != NULL)
-               error (_("mount: according to mtab, "
-                        "%s is already mounted on %s"),
-                      mc->m.mnt_fsname, node);
-       else if (spec && strcmp (spec, "none") &&
-                (mc = getmntfile(spec)) != NULL)
-               error (_("mount: according to mtab, %s is mounted on %s"),
-                      spec, mc->m.mnt_dir);
-       else
-               ret = 0;
-
-       free(spec);
-       free(node);
-
-       return ret;
-}
-
-/* Create mtab with a root entry.  */
-static void
-create_mtab (void) {
-       struct mntentchn *fstab;
-       struct my_mntent mnt;
-       int flags;
-       mntFILE *mfp;
-
-       lock_mtab();
-
-       mfp = my_setmntent (_PATH_MOUNTED, "a+");
-       if (mfp == NULL || mfp->mntent_fp == NULL) {
-               int errsv = errno;
-               die (EX_FILEIO, _("mount: can't open %s for writing: %s"),
-                    _PATH_MOUNTED, strerror (errsv));
-       }
-
-       /* Find the root entry by looking it up in fstab */
-       if ((fstab = getfs_by_dir ("/")) || (fstab = getfs_by_dir ("root"))) {
-               char *extra_opts;
-               parse_opts (fstab->m.mnt_opts, &flags, &extra_opts);
-               mnt.mnt_dir = "/";
-               mnt.mnt_fsname = spec_to_devname(fstab->m.mnt_fsname);
-               mnt.mnt_type = fstab->m.mnt_type;
-               mnt.mnt_opts = fix_opts_string (flags, extra_opts, NULL, 0);
-               mnt.mnt_freq = mnt.mnt_passno = 0;
-               free(extra_opts);
-
-               if (my_addmntent (mfp, &mnt) == 1) {
-                       int errsv = errno;
-                       die (EX_FILEIO, _("mount: error writing %s: %s"),
-                            _PATH_MOUNTED, strerror (errsv));
-               }
-       }
-       if (fchmod (fileno (mfp->mntent_fp), 0644) < 0)
-               if (errno != EROFS) {
-                       int errsv = errno;
-                       die (EX_FILEIO,
-                            _("mount: error changing mode of %s: %s"),
-                            _PATH_MOUNTED, strerror (errsv));
-               }
-       my_endmntent (mfp);
-
-       unlock_mtab();
-
-       reset_mtab_info();
-}
-
-/* count successful mount system calls */
-static int mountcount = 0;
-
-/*
- * do_mount_syscall()
- *     Mount a single file system. Keep track of successes.
- * returns: 0: OK, -1: error in errno
- */
-static int
-do_mount_syscall (struct mountargs *args) {
-       int flags = args->flags;
-
-       if ((flags & MS_MGC_MSK) == 0)
-               flags |= MS_MGC_VAL;
-
-       if (verbose > 2)
-               printf("mount: mount(2) syscall: source: \"%s\", target: \"%s\", "
-                       "filesystemtype: \"%s\", mountflags: %d, data: %s\n",
-                       args->spec, args->node, args->type, flags, (char *) args->data);
-
-       return mount (args->spec, args->node, args->type, flags, args->data);
-}
-
-/*
- * do_mount()
- *     Mount a single file system, possibly invoking an external handler to
- *      do so. Keep track of successes.
- * returns: 0: OK, -1: error in errno
- */
-static int
-do_mount (struct mountargs *args, int *special, int *status) {
-       int ret;
-       if (check_special_mountprog(args->spec, args->node, args->type,
-                                   args->flags, args->data, status)) {
-               *special = 1;
-               ret = 0;
-       } else {
-               ret = do_mount_syscall(args);
-       }
-       if (ret == 0)
-               mountcount++;
-       return ret;
-}
-
-/*
- * check_special_mountprog()
- *     If there is a special mount program for this type, exec it.
- * returns: 0: no exec was done, 1: exec was done, status has result
- */
-static int
-check_special_mountprog(const char *spec, const char *node, const char *type, int flags,
-                       char *extra_opts, int *status) {
-       char search_path[] = FS_SEARCH_PATH;
-       char *path, mountprog[150];
-       struct stat statbuf;
-       int res;
-
-       if (!external_allowed)
-               return 0;
-
-       if (type == NULL || strcmp(type, "none") == 0)
-               return 0;
-
-       path = strtok(search_path, ":");
-       while (path) {
-               int type_opt = 0;
-
-               res = snprintf(mountprog, sizeof(mountprog), "%s/mount.%s",
-                              path, type);
-               path = strtok(NULL, ":");
-               if (res < 0 || (size_t) res >= sizeof(mountprog))
-                       continue;
-
-               res = stat(mountprog, &statbuf);
-               if (res == -1 && errno == ENOENT && strchr(type, '.')) {
-                       /* If type ends with ".subtype" try without it */
-                       *strrchr(mountprog, '.') = '\0';
-                       type_opt = 1;
-                       res = stat(mountprog, &statbuf);
-               }
-               if (res)
-                       continue;
-
-               if (verbose)
-                       fflush(stdout);
-
-               switch (fork()) {
-               case 0: { /* child */
-                       char *oo, *mountargs[12];
-                       int i = 0;
-
-                       if (setgid(getgid()) < 0)
-                               die(EX_FAIL, _("mount: cannot set group id: %m"));
-
-                       if (setuid(getuid()) < 0)
-                               die(EX_FAIL, _("mount: cannot set user id: %m"));
-
-                       oo = fix_opts_string(flags, extra_opts, NULL, invuser_flags);
-                       mountargs[i++] = mountprog;                     /* 1 */
-                       mountargs[i++] = (char *) spec;                 /* 2 */
-                       mountargs[i++] = (char *) node;                 /* 3 */
-                       if (sloppy && strncmp(type, "nfs", 3) == 0)
-                               mountargs[i++] = "-s";                  /* 4 */
-                       if (fake)
-                               mountargs[i++] = "-f";                  /* 5 */
-                       if (nomtab)
-                               mountargs[i++] = "-n";                  /* 6 */
-                       if (verbose)
-                               mountargs[i++] = "-v";                  /* 7 */
-                       if (oo && *oo) {
-                               mountargs[i++] = "-o";                  /* 8 */
-                               mountargs[i++] = oo;                    /* 9 */
-                       }
-                       if (type_opt) {
-                               mountargs[i++] = "-t";                  /* 10 */
-                               mountargs[i++] = (char *) type;         /* 11 */
-                       }
-                       mountargs[i] = NULL;                            /* 12 */
-
-                       if (verbose > 2) {
-                               i = 0;
-                               while (mountargs[i]) {
-                                       printf("mount: external mount: argv[%d] = \"%s\"\n",
-                                               i, mountargs[i]);
-                                       i++;
-                               }
-                               fflush(stdout);
-                       }
-
-                       execv(mountprog, mountargs);
-                       exit(1);        /* exec failed */
-               }
-
-               default: { /* parent */
-                       int st;
-                       wait(&st);
-                       *status = (WIFEXITED(st) ? WEXITSTATUS(st) : EX_SYSERR);
-                       return 1;
-               }
-
-               case -1: { /* error */
-                       int errsv = errno;
-                       error(_("mount: cannot fork: %s"), strerror(errsv));
-               }
-               }
-       }
-
-       return 0;
-}
-
-
-/* list of already tested filesystems by procfsloop_mount() */
-static struct tried {
-       struct tried *next;
-       char *type;
-} *tried = NULL;
-
-static int
-was_tested(const char *fstype) {
-       struct tried *t;
-
-       for (t = tried; t; t = t->next) {
-               if (!strcmp(t->type, fstype))
-                       return 1;
-       }
-       return 0;
-}
-
-static void
-set_tested(const char *fstype) {
-       struct tried *t = xmalloc(sizeof(struct tried));
-
-       t->next = tried;
-       t->type = xstrdup(fstype);
-       tried = t;
-}
-
-static void
-free_tested(void) {
-       struct tried *t, *tt;
-
-       t = tried;
-       while(t) {
-               free(t->type);
-               tt = t->next;
-               free(t);
-               t = tt;
-       }
-       tried = NULL;
-}
-
-static char *
-procfsnext(FILE *procfs) {
-   char line[100];
-   char fsname[100];
-
-   while (fgets(line, sizeof(line), procfs)) {
-      if (sscanf (line, "nodev %[^#\n]\n", fsname) == 1) continue;
-      if (sscanf (line, " %[^# \n]\n", fsname) != 1) continue;
-      return xstrdup(fsname);
-   }
-   return 0;
-}
-
-/* Only use /proc/filesystems here, this is meant to test what
-   the kernel knows about, so /etc/filesystems is irrelevant.
-   Return: 1: yes, 0: no, -1: cannot open procfs */
-static int
-known_fstype_in_procfs(const char *type)
-{
-    FILE *procfs;
-    char *fsname;
-    int ret = -1;
-
-    procfs = fopen(_PATH_PROC_FILESYSTEMS, "r");
-    if (procfs) {
-       ret = 0;
-       while ((fsname = procfsnext(procfs)) != NULL)
-           if (!strcmp(fsname, type)) {
-               ret = 1;
-               break;
-           }
-       fclose(procfs);
-       procfs = NULL;
-    }
-    return ret;
-}
-
-/* Try all types in FILESYSTEMS, except those in *types,
-   in case *types starts with "no" */
-/* return: 0: OK, -1: error in errno, 1: type not found */
-/* when 0 or -1 is returned, *types contains the type used */
-/* when 1 is returned, *types is NULL */
-static int
-procfsloop_mount(int (*mount_fn)(struct mountargs *, int *, int *),
-                        struct mountargs *args,
-                        const char **types,
-                        int *special, int *status)
-{
-       char *files[2] = { _PATH_FILESYSTEMS, _PATH_PROC_FILESYSTEMS };
-       FILE *procfs;
-       char *fsname;
-       const char *notypes = NULL;
-       int no = 0;
-       int ret = 1;
-       int errsv = 0;
-       int i;
-
-       if (*types && !strncmp(*types, "no", 2)) {
-               no = 1;
-               notypes = (*types) + 2;
-       }
-       *types = NULL;
-
-       /* Use _PATH_PROC_FILESYSTEMS only when _PATH_FILESYSTEMS
-        * (/etc/filesystems) does not exist.  In some cases trying a
-        * filesystem that the kernel knows about on the wrong data will crash
-        * the kernel; in such cases _PATH_FILESYSTEMS can be used to list the
-        * filesystems that we are allowed to try, and in the order they should
-        * be tried.  End _PATH_FILESYSTEMS with a line containing a single '*'
-        * only, if _PATH_PROC_FILESYSTEMS should be tried afterwards.
-        */
-       for (i=0; i<2; i++) {
-               procfs = fopen(files[i], "r");
-               if (!procfs)
-                       continue;
-               while ((fsname = procfsnext(procfs)) != NULL) {
-                       if (!strcmp(fsname, "*")) {
-                               fclose(procfs);
-                               goto nexti;
-                       }
-                       if (was_tested (fsname))
-                               continue;
-                       if (no && matching_type(fsname, notypes))
-                               continue;
-                       set_tested (fsname);
-                       args->type = fsname;
-                       if (verbose)
-                               printf(_("Trying %s\n"), fsname);
-                       if ((*mount_fn) (args, special, status) == 0) {
-                               *types = fsname;
-                               ret = 0;
-                               break;
-                       } else if (errno != EINVAL &&
-                                  known_fstype_in_procfs(fsname) == 1) {
-                               *types = "guess";
-                               ret = -1;
-                               errsv = errno;
-                               break;
-                       }
-               }
-               free_tested();
-               fclose(procfs);
-               errno = errsv;
-               return ret;
-       nexti:;
-       }
-       return 1;
-}
-
-static const char *
-guess_fstype_by_devname(const char *devname, int *ambivalent)
-{
-   const char *type = fsprobe_get_fstype_by_devname_ambi(devname, ambivalent);
-
-   if (verbose) {
-      printf (_("mount: you didn't specify a filesystem type for %s\n"), devname);
-
-      if (!type)
-         printf (_("       I will try all types mentioned in %s or %s\n"),
-                     _PATH_FILESYSTEMS, _PATH_PROC_FILESYSTEMS);
-      else if (!strcmp(type, MNTTYPE_SWAP))
-         printf (_("       and it looks like this is swapspace\n"));
-      else
-         printf (_("       I will try type %s\n"), type);
-   }
-   return type;
-}
-
-/*
- * guess_fstype_and_mount()
- *     Mount a single file system. Guess the type when unknown.
- * returns: 0: OK, -1: error in errno, 1: other error
- *     don't exit on non-fatal errors.
- *     on return types is filled with the type used.
- */
-static int
-guess_fstype_and_mount(const char *spec, const char *node, const char **types,
-                      int flags, char *mount_opts, int *special, int *status) {
-   struct mountargs args = { spec, node, NULL, flags & ~MS_NOSYS, mount_opts };
-   int ambivalent = 0;
-
-   if (*types && strcasecmp (*types, "auto") == 0)
-      *types = NULL;
-
-   if (!*types && !(flags & MS_REMOUNT)) {
-      *types = guess_fstype_by_devname(spec, &ambivalent);
-      if (*types) {
-         if (!strcmp(*types, MNTTYPE_SWAP)) {
-             error(_("%s looks like swapspace - not mounted"), spec);
-             *types = NULL;
-             return 1;
-         } else {
-             args.type = *types;
-             return do_mount (&args, special, status);
-          }
-      } else if (ambivalent) {
-          error(_("mount: %s: more filesystems detected. This should not happen,\n"
-                 "       use -t <type> to explicitly specify the filesystem type or\n"
-                 "       use wipefs(8) to clean up the device.\n"), spec);
-         return 1;
-      }
-   }
-
-   /* Accept a comma-separated list of types, and try them one by one */
-   /* A list like "nonfs,.." indicates types not to use */
-   if (*types && strncmp(*types, "no", 2) && strchr(*types,',')) {
-      char *t = strdup(*types);
-      char *p;
-
-      while((p = strchr(t,',')) != NULL) {
-        *p = 0;
-        args.type = *types = t;
-        if (do_mount (&args, special, status) == 0)
-           return 0;
-        t = p+1;
-      }
-      /* do last type below */
-      *types = t;
-   }
-
-   if (*types || (flags & MS_REMOUNT)) {
-      args.type = *types;
-      return do_mount (&args, special, status);
-   }
-
-   return procfsloop_mount(do_mount, &args, types, special, status);
-}
-
-/*
- * restricted_check()
- *     Die if the user is not allowed to do this.
- */
-static void
-restricted_check(const char *spec, const char *node, int *flags, char **user) {
-  if (restricted) {
-      /*
-       * MS_OWNER: Allow owners to mount when fstab contains
-       * the owner option.  Note that this should never be used
-       * in a high security environment, but may be useful to give
-       * people at the console the possibility of mounting a floppy.
-       * MS_GROUP: Allow members of device group to mount. (Martin Dickopp)
-       */
-      if (*flags & (MS_OWNER | MS_GROUP)) {
-         struct stat sb;
-
-         if (!strncmp(spec, "/dev/", 5) && stat(spec, &sb) == 0) {
-
-             if (*flags & MS_OWNER) {
-                 if (getuid() == sb.st_uid)
-                     *flags |= MS_USER;
-             }
-
-             if (*flags & MS_GROUP) {
-                 if (getgid() == sb.st_gid)
-                     *flags |= MS_USER;
-                 else {
-                     int n = getgroups(0, NULL);
-
-                     if (n > 0) {
-                             gid_t *groups = xmalloc(n * sizeof(*groups));
-                             if (getgroups(n, groups) == n) {
-                                     int i;
-                                     for (i = 0; i < n; i++) {
-                                             if (groups[i] == sb.st_gid) {
-                                                     *flags |= MS_USER;
-                                                     break;
-                                             }
-                                     }
-                             }
-                             free(groups);
-                     }
-                 }
-             }
-         }
-      }
-
-      /* James Kehl <mkehl@gil.com.au> came with a similar patch:
-        allow an arbitrary user to mount when he is the owner of
-        the mount-point and has write-access to the device.
-        This is even less secure. Let me skip it for the time being;
-        there should be an explicit fstab line allowing such things. */
-
-      if (!(*flags & (MS_USER | MS_USERS))) {
-         if (already (spec, node))
-           die (EX_USAGE, _("mount failed"));
-         else
-           die (EX_USAGE, _("mount: only root can mount %s on %s"), spec, node);
-      }
-      if (*flags & MS_USER)
-         *user = getusername();
-  }
-
-  *flags &= ~(MS_OWNER | MS_GROUP);
-}
-
-/* Check, if there already exists a mounted loop device on the mountpoint node
- * with the same parameters.
- */
-static int
-is_mounted_same_loopfile(const char *node0, const char *loopfile, unsigned long long offset)
-{
-       struct mntentchn *mnt = NULL;
-       char *node;
-       int res = 0;
-
-       node = canonicalize(node0);
-
-       /* Search for mountpoint node in mtab,
-        * procceed if any of these has the loop option set or
-        * the device is a loop device
-        */
-       mnt = getmntdirbackward(node, mnt);
-       if (!mnt) {
-               free(node);
-               return 0;
-       }
-       for(; mnt && res == 0; mnt = getmntdirbackward(node, mnt)) {
-               char *p;
-
-               if (strncmp(mnt->m.mnt_fsname, "/dev/loop", 9) == 0)
-                       res = loopdev_is_used((char *) mnt->m.mnt_fsname,
-                                       loopfile, offset, LOOPDEV_FL_OFFSET);
-
-               else if (mnt->m.mnt_opts &&
-                        (p = strstr(mnt->m.mnt_opts, "loop=")))
-               {
-                       char *dev = xstrdup(p+5);
-                       if ((p = strchr(dev, ',')))
-                               *p = '\0';
-                       res =  loopdev_is_used(dev,
-                                       loopfile, offset, LOOPDEV_FL_OFFSET);
-                       free(dev);
-               }
-       }
-
-       free(node);
-       return res;
-}
-
-static int
-parse_offset(const char **opt, uintmax_t *val)
-{
-       char *tmp;
-
-       if (strtosize(*opt, val))
-               return -1;
-
-       tmp = xmalloc(32);
-       snprintf(tmp, 32, "%jd", *val);
-       my_free(*opt);
-       *opt = tmp;
-       return 0;
-}
-
-static int
-loop_check(const char **spec, const char **type, int *flags,
-          int *loop, const char **loopdev, const char **loopfile,
-          const char *node) {
-  int looptype;
-  uintmax_t offset = 0, sizelimit = 0;
-  struct loopdev_cxt lc;
-  char *pwd = NULL;
-  int ret = EX_FAIL;
-
-  /*
-   * In the case of a loop mount, either type is of the form lo@/dev/loop5
-   * or the option "-o loop=/dev/loop5" or just "-o loop" is given, or
-   * mount just has to figure things out for itself from the fact that
-   * spec is not a block device. We do not test for a block device
-   * immediately: maybe later other types of mountable objects will occur.
-   */
-
-  *loopdev = opt_loopdev;
-
-  looptype = (*type && strncmp("lo@", *type, 3) == 0);
-  if (looptype) {
-    if (*loopdev)
-      error(_("mount: loop device specified twice"));
-    *loopdev = *type + 3;
-    *type = opt_vfstype;
-  } else if (opt_vfstype) {
-    if (*type)
-      error(_("mount: type specified twice"));
-    else
-      *type = opt_vfstype;
-  }
-
-  *loop = ((*flags & MS_LOOP) || *loopdev || opt_offset || opt_sizelimit);
-  *loopfile = *spec;
-
-  /* Automatically create a loop device from a regular file if a filesystem
-   * is not specified or the filesystem is known for libblkid (these
-   * filesystems work with block devices only).
-   *
-   * Note that there is not a restriction (on kernel side) that prevents regular
-   * file as a mount(2) source argument. A filesystem that is able to mount
-   * regular files could be implemented.
-   */
-  if (!*loop && !(*flags & (MS_BIND | MS_MOVE | MS_PROPAGATION)) &&
-      (!*type || strcmp(*type, "auto") == 0 || fsprobe_known_fstype(*type))) {
-
-    struct stat st;
-    if (stat(*loopfile, &st) == 0)
-      *loop = S_ISREG(st.st_mode);
-  }
-
-  if (*loop) {
-    *flags |= MS_LOOP;
-    if (fake) {
-      if (verbose)
-       printf(_("mount: skipping the setup of a loop device\n"));
-    } else {
-      int loop_opts = 0;
-
-      /* since 2.6.37 we don't have to store backing filename to mtab
-       * because kernel provides the name in /sys
-       */
-      if (get_linux_version() >= KERNEL_VERSION(2, 6, 37) ||
-         mtab_is_writable() == 0) {
-
-       if (verbose)
-         printf(_("mount: enabling autoclear loopdev flag\n"));
-       loop_opts = LO_FLAGS_AUTOCLEAR;
-      }
-
-      if (*flags & MS_RDONLY)
-        loop_opts |= LO_FLAGS_READ_ONLY;
-
-      if (opt_offset && parse_offset(&opt_offset, &offset)) {
-        error(_("mount: invalid offset '%s' specified"), opt_offset);
-        return EX_FAIL;
-      }
-      if (opt_sizelimit && parse_offset(&opt_sizelimit, &sizelimit)) {
-        error(_("mount: invalid sizelimit '%s' specified"), opt_sizelimit);
-        return EX_FAIL;
-      }
-
-      if (is_mounted_same_loopfile(node, *loopfile, offset)) {
-        error(_("mount: according to mtab %s is already mounted on %s as loop"), *loopfile, node);
-        return EX_FAIL;
-      }
-
-      if (opt_encryption) {
-        error("mount: %s", _("encryption not supported, use cryptsetup(8) instead"));
-        return EX_FAIL;
-      }
-
-      if (loopcxt_init(&lc, 0) < 0) {
-       error(_("mount: failed to initialize loopdev context"));
-       return EX_FAIL;
-      }
-
-      if (*loopdev && **loopdev && loopcxt_set_device(&lc, *loopdev) < 0) {
-       error(_("mount: failed to use %s device"), *loopdev);
-       return EX_FAIL;
-      }
-
-      do {
-       int rc;
-
-        if ((!*loopdev || !**loopdev) && loopcxt_find_unused(&lc) == 0)
-           *loopdev = loopcxt_strdup_device(&lc);
-
-       if (!*loopdev) {
-         error(_("mount: failed to found free loop device"));
-         loopcxt_deinit(&lc);
-         goto err;     /* no more loop devices */
-       }
-       if (verbose)
-         printf(_("mount: going to use the loop device %s\n"), *loopdev);
-
-       rc = loopcxt_set_backing_file(&lc, *loopfile);
-
-       if (!rc && offset)
-         rc = loopcxt_set_offset(&lc, offset);
-       if (!rc && sizelimit)
-         rc = loopcxt_set_sizelimit(&lc, sizelimit);
-       if (!rc)
-         loopcxt_set_flags(&lc, loop_opts);
-
-       if (rc) {
-          error(_("mount: %s: failed to set loopdev attributes"), *loopdev);
-          loopcxt_deinit(&lc);
-          goto err;
-       }
-
-       /* setup the device */
-       rc = loopcxt_setup_device(&lc);
-       if (!rc)
-         break;        /* success */
-
-       if (rc != -EBUSY) {
-         error(_("mount: %s: failed setting up loop device: %m"), *loopfile);
-         if (!opt_loopdev) {
-           my_free(*loopdev);
-           *loopdev = NULL;
-         }
-         loopcxt_deinit(&lc);
-         goto err;
-       }
-
-       if (!opt_loopdev) {
-         if (verbose)
-           printf(_("mount: stolen loop=%s ...trying again\n"), *loopdev);
-           my_free(*loopdev);
-           *loopdev = NULL;
-           continue;
-       }
-       error(_("mount: stolen loop=%s"), *loopdev);
-       loopcxt_deinit(&lc);
-       goto err;
-
-      } while (!*loopdev);
-
-      if (verbose > 1)
-       printf(_("mount: setup loop device successfully\n"));
-      *spec = *loopdev;
-
-      if (loopcxt_is_readonly(&lc))
-        *flags |= MS_RDONLY;
-
-      if (loopcxt_is_autoclear(&lc))
-        /* Prevent recording loop dev in mtab for cleanup on umount */
-        *loop = 0;
-
-      /* We have to keep the device open until mount(2), otherwise it will
-       * be auto-cleared by kernel (because LO_FLAGS_AUTOCLEAR) */
-      loopcxt_set_fd(&lc, -1, 0);
-      loopcxt_deinit(&lc);
-    }
-  }
-
-  ret = 0;
-err:
-  if (pwd) {
-    char *p = pwd;
-    while (*p)
-      *p++ = '\0';
-    free(pwd);
-  }
-  return ret;
-}
-
-
-static void
-update_mtab_entry(const char *spec, const char *node, const char *type,
-                 const char *opts, int flags, int freq, int pass) {
-       struct my_mntent mnt;
-
-       mnt.mnt_fsname = is_pseudo_fs(type) ? xstrdup(spec) : canonicalize(spec);
-       mnt.mnt_dir = canonicalize (node);
-       mnt.mnt_type = type;
-       mnt.mnt_opts = opts;
-       mnt.mnt_freq = freq;
-       mnt.mnt_passno = pass;
-
-       /* We get chatty now rather than after the update to mtab since the
-          mount succeeded, even if the write to /etc/mtab should fail.  */
-       if (verbose)
-               print_one (&mnt);
-
-       if (!nomtab && mtab_does_not_exist()) {
-               if (verbose > 1)
-                       printf(_("mount: no %s found - creating it..\n"),
-                              _PATH_MOUNTED);
-               create_mtab ();
-
-       }
-
-       if (!nomtab && mtab_is_writable()) {
-               if (flags & MS_REMOUNT)
-                       update_mtab (mnt.mnt_dir, &mnt);
-               else if (flags & MS_MOVE)
-                       update_mtab(mnt.mnt_fsname, &mnt);
-               else
-                       update_mtab(NULL, &mnt);
-       }
-       my_free(mnt.mnt_fsname);
-       my_free(mnt.mnt_dir);
-}
-
-static void
-cdrom_setspeed(const char *spec) {
-#define CDROM_SELECT_SPEED      0x5322  /* Set the CD-ROM speed */
-       if (opt_speed) {
-               int cdrom;
-               int speed = atoi(opt_speed);
-
-               if ((cdrom = open(spec, O_RDONLY | O_NONBLOCK)) < 0)
-                       die(EX_FAIL,
-                           _("mount: cannot open %s for setting speed"),
-                           spec);
-               if (ioctl(cdrom, CDROM_SELECT_SPEED, speed) < 0)
-                       die(EX_FAIL, _("mount: cannot set speed: %m"));
-               close(cdrom);
-       }
-}
-
-/*
- * Check if @path is on read-only filesystem independently on file permissions.
- */
-static int
-is_readonly(const char *path)
-{
-       if (access(path, W_OK) == 0)
-               return 0;
-       if (errno == EROFS)
-               return 1;
-       if (errno != EACCES)
-               return 0;
-
-#ifdef HAVE_FUTIMENS
-       /*
-        * access(2) returns EACCES on read-only FS:
-        *
-        * - for set-uid application if one component of the path is not
-        *   accessible for the current rUID. (Note that euidaccess(2) does not
-        *   check for EROFS at all).
-        *
-        * - for read-write filesystem with read-only VFS node (aka -o remount,ro,bind)
-        */
-       {
-               struct timespec times[2];
-
-               times[0].tv_nsec = UTIME_NOW;   /* atime */
-               times[1].tv_nsec = UTIME_OMIT;  /* mtime */
-
-               if (utimensat(AT_FDCWD, path, times, 0) == -1)
-                       return errno == EROFS;
-       }
-#endif
-       return 0;
-}
-
-/*
- * try_mount_one()
- *     Try to mount one file system.
- *
- * returns: 0: OK, EX_SYSERR, EX_FAIL, return code from nfsmount,
- *      return status from wait
- */
-static int
-try_mount_one (const char *spec0, const char *node0, const char *types0,
-              const char *opts0, int freq, int pass, int ro) {
-  int res = 0, status = 0, special = 0;
-  int mnt5_res = 0;            /* only for gcc */
-  int mnt_err;
-  int flags;
-  char *extra_opts;            /* written in mtab */
-  char *mount_opts;            /* actually used on system call */
-  const char *opts, *spec, *node, *types;
-  char *user = 0;
-  int loop = 0;
-  const char *loopdev = 0, *loopfile = 0;
-  struct stat statbuf;
-
-  /* copies for freeing on exit */
-  const char *opts1, *spec1, *node1, *types1;
-
-  if (verbose > 2) {
-         printf("mount: spec:  \"%s\"\n", spec0);
-         printf("mount: node:  \"%s\"\n", node0);
-         printf("mount: types: \"%s\"\n", types0);
-         printf("mount: opts:  \"%s\"\n", opts0);
-  }
-
-  spec = spec1 = xstrdup(spec0);
-  node = node1 = xstrdup(node0);
-  types = types1 = xstrdup(types0);
-  opts = opts1 = xstrdup(opts0);
-
-  parse_opts (opts, &flags, &extra_opts);
-  mount_opts = xstrdup(extra_opts);
-
-  /* quietly succeed for fstab entries that don't get mounted automatically */
-  if (mount_all && (flags & MS_NOAUTO))
-      goto out;
-
-  restricted_check(spec, node, &flags, &user);
-
-  /* The "mount -f" checks for for existing record in /etc/mtab (with
-   * regular non-fake mount this is usually done by kernel)
-   */
-  if (!(flags & MS_REMOUNT) && fake && mounted (spec, node, NULL))
-      die(EX_USAGE, _("mount: according to mtab, "
-                      "%s is already mounted on %s\n"),
-                     spec, node);
-
-  if (opt_speed)
-      cdrom_setspeed(spec);
-
-  if (!(flags & MS_REMOUNT)) {
-      /*
-       * Don't set up a (new) loop device if we only remount - this left
-       * stale assignments of files to loop devices. Nasty when used for
-       * encryption.
-       */
-      res = loop_check(&spec, &types, &flags, &loop, &loopdev, &loopfile, node);
-      if (res)
-         goto out;
-  }
-
-  if (loop)
-      opt_loopdev = loopdev;
-
-  if (flags & (MS_BIND | MS_MOVE | MS_PROPAGATION))
-      types = "none";
-
-#ifdef HAVE_LIBSELINUX
-  if (flags & MS_REMOUNT) {
-      /*
-       * Linux kernel does not accept any selinux context option on remount
-       */
-      if (mount_opts) {
-          char *tmp = mount_opts;
-          mount_opts = remove_context_options(mount_opts);
-          my_free(tmp);
-      }
-
-  } else if (types && strcmp(types, "tmpfs") == 0 && is_selinux_enabled() > 0 &&
-          !has_context_option(mount_opts)) {
-      /*
-       * Add rootcontext= mount option for tmpfs
-       * https://bugzilla.redhat.com/show_bug.cgi?id=476964
-       */
-      security_context_t sc = NULL;
-
-      if (getfilecon(node, &sc) > 0 && strcmp("unlabeled", sc))
-             append_context("rootcontext=", (char *) sc, &mount_opts);
-      freecon(sc);
-  }
-#endif
-
-  /*
-   * Call mount.TYPE for types that require a separate mount program.
-   * For the moment these types are ncpfs and smbfs. Maybe also vxfs.
-   * All such special things must occur isolated in the types string.
-   */
-  if (check_special_mountprog(spec, node, types, flags, mount_opts, &status)) {
-      res = status;
-      goto out;
-  }
-
-  block_signals (SIG_BLOCK);
-
-  if (!fake) {
-    mnt5_res = guess_fstype_and_mount (spec, node, &types, flags & ~MS_NOSYS,
-                                      mount_opts, &special, &status);
-
-    if (special) {
-      block_signals (SIG_UNBLOCK);
-      res = status;
-      goto out;
-    }
-  }
-
-  /* Kernel allows to use MS_RDONLY for bind mounts, but the read-only request
-   * could be silently ignored. Check it to avoid 'ro' in mtab and 'rw' in
-   * /proc/mounts.
-   */
-  if (!fake && mnt5_res == 0 &&
-      (flags & MS_BIND) && (flags & MS_RDONLY) && !is_readonly(node)) {
-
-      printf(_("mount: warning: %s seems to be mounted read-write.\n"), node);
-      flags &= ~MS_RDONLY;
-  }
-
-  /* Kernel can silently add MS_RDONLY flag when mounting file system that
-   * does not have write support. Check this to avoid 'ro' in /proc/mounts
-   * and 'rw' in mtab.
-   */
-  if (!fake && mnt5_res == 0 &&
-      !(flags & (MS_RDONLY | MS_PROPAGATION | MS_MOVE)) &&
-      is_readonly(node)) {
-
-      printf(_("mount: warning: %s seems to be mounted read-only.\n"), node);
-      flags |= MS_RDONLY;
-  }
-
-  if (fake || mnt5_res == 0) {
-      char *mo = fix_opts_string (flags & ~MS_NOMTAB, extra_opts, user, 0);
-      const char *tp = types ? types : "unknown";
-
-      /* Mount succeeded, report this (if verbose) and write mtab entry.  */
-      if (!(mounttype & MS_PROPAGATION))
-             update_mtab_entry(loop ? loopfile : spec,
-                       node,
-                       tp,
-                       mo,
-                       flags,
-                       freq,
-                       pass);
-
-      block_signals (SIG_UNBLOCK);
-      free(mo);
-
-      res = 0;
-      goto out;
-  }
-
-  mnt_err = errno;
-
-  if (loop)
-       loopdev_delete(spec);
-
-  block_signals (SIG_UNBLOCK);
-
-  /* Mount failed, complain, but don't die.  */
-
-  if (types == NULL) {
-    if (restricted)
-      error (_("mount: I could not determine the filesystem type, "
-              "and none was specified"));
-    else
-      error (_("mount: you must specify the filesystem type"));
-  } else if (mnt5_res != -1) {
-      /* should not happen */
-      error (_("mount: mount failed"));
-  } else {
-   switch (mnt_err) {
-    case EPERM:
-      if (geteuid() == 0) {
-          if (stat (node, &statbuf) || !S_ISDIR(statbuf.st_mode))
-               error (_("mount: mount point %s is not a directory"), node);
-          else
-               error (_("mount: permission denied"));
-      } else
-       error (_("mount: must be superuser to use mount"));
-      break;
-    case EBUSY:
-      if (flags & MS_REMOUNT) {
-       error (_("mount: %s is busy"), node);
-      } else if (!strcmp(types, "proc") && !strcmp(node, "/proc")) {
-       /* heuristic: if /proc/version exists, then probably proc is mounted */
-       if (stat ("/proc/version", &statbuf))   /* proc mounted? */
-          error (_("mount: %s is busy"), node);   /* no */
-       else if (!mount_all || verbose)            /* yes, don't mention it */
-          error (_("mount: proc already mounted"));
-      } else {
-       error (_("mount: %s already mounted or %s busy"), spec, node);
-       already (spec, node);
-      }
-      break;
-    case ENOENT:
-      if (lstat (node, &statbuf))
-          error (_("mount: mount point %s does not exist"), node);
-      else if (stat (node, &statbuf))
-          error (_("mount: mount point %s is a symbolic link to nowhere"),
-                 node);
-      else if (stat (spec, &statbuf)) {
-          if (opt_nofail)
-               goto out;
-          error (_("mount: special device %s does not exist"), spec);
-      } else {
-          errno = mnt_err;
-          perror("mount");
-      }
-      break;
-    case ENOTDIR:
-      if (stat (node, &statbuf) || ! S_ISDIR(statbuf.st_mode))
-          error (_("mount: mount point %s is not a directory"), node);
-      else if (stat (spec, &statbuf) && errno == ENOTDIR) {
-          if (opt_nofail)
-              goto out;
-          error (_("mount: special device %s does not exist\n"
-                   "       (a path prefix is not a directory)\n"), spec);
-      } else {
-          errno = mnt_err;
-          perror("mount");
-      }
-      break;
-    case EINVAL:
-    { int fd;
-      unsigned long long size = 0;
-
-      if (flags & MS_REMOUNT) {
-       error (_("mount: %s not mounted or bad option"), node);
-      } else {
-       error (_("mount: wrong fs type, bad option, bad superblock on %s,\n"
-              "       missing codepage or helper program, or other error"),
-              spec);
-
-       if (stat(spec, &statbuf) < 0) {
-         if (errno == ENOENT)         /* network FS? */
-           error(_(
-              "       (for several filesystems (e.g. nfs, cifs) you might\n"
-              "       need a /sbin/mount.<type> helper program)"));
-
-       } else if (S_ISBLK(statbuf.st_mode)
-                        && (fd = open(spec, O_RDONLY | O_NONBLOCK)) >= 0) {
-
-         if (blkdev_get_size(fd, &size) == 0) {
-           if (size == 0 && !loop)
-             error(_(
-                "       (could this be the IDE device where you in fact use\n"
-                "       ide-scsi so that sr0 or sda or so is needed?)"));
-
-           if (size && size <= 2)
-             error(_(
-                 "       (aren't you trying to mount an extended partition,\n"
-                 "       instead of some logical partition inside?)"));
-
-           close(fd);
-         }
-       }
-       error(_(
-               "       In some cases useful info is found in syslog - try\n"
-               "       dmesg | tail  or so\n"));
-      }
-      break;
-    }
-    case EMFILE:
-      error (_("mount table full")); break;
-    case EIO:
-      error (_("mount: %s: can't read superblock"), spec); break;
-    case ENODEV:
-    {
-      int pfs = known_fstype_in_procfs(types);
-
-      if (pfs == 1 || !strcmp(types, "guess"))
-        error(_("mount: %s: unknown device"), spec);
-      else if (pfs == 0) {
-       char *lowtype, *p;
-       int u;
-
-       error (_("mount: unknown filesystem type '%s'"), types);
-
-       /* maybe this loser asked for FAT or ISO9660 or isofs */
-       lowtype = xstrdup(types);
-       u = 0;
-       for(p=lowtype; *p; p++) {
-         if(tolower(*p) != *p) {
-           *p = tolower(*p);
-           u++;
-         }
-       }
-       if (u && known_fstype_in_procfs(lowtype) == 1)
-         error (_("mount: probably you meant %s"), lowtype);
-       else if (!strncmp(lowtype, "iso", 3) &&
-                       known_fstype_in_procfs("iso9660") == 1)
-         error (_("mount: maybe you meant 'iso9660'?"));
-       else if (!strncmp(lowtype, "fat", 3) &&
-                       known_fstype_in_procfs("vfat") == 1)
-         error (_("mount: maybe you meant 'vfat'?"));
-       free(lowtype);
-      } else
-       error (_("mount: %s has wrong device number or fs type %s not supported"),
-              spec, types);
-      break;
-    }
-    case ENOTBLK:
-      if (opt_nofail)
-        goto out;
-      if (stat (spec, &statbuf)) /* strange ... */
-       error (_("mount: %s is not a block device, and stat fails?"), spec);
-      else if (S_ISBLK(statbuf.st_mode))
-        error (_("mount: the kernel does not recognize %s as a block device\n"
-              "       (maybe `modprobe driver'?)"), spec);
-      else if (S_ISREG(statbuf.st_mode))
-       error (_("mount: %s is not a block device (maybe try `-o loop'?)"),
-                spec);
-      else
-       error (_("mount: %s is not a block device"), spec);
-      break;
-    case ENXIO:
-      if (opt_nofail)
-        goto out;
-      error (_("mount: %s is not a valid block device"), spec); break;
-    case EACCES:  /* pre-linux 1.1.38, 1.1.41 and later */
-    case EROFS:   /* linux 1.1.38 and later */
-    { char *bd = (loop ? "" : _("block device "));
-      if (ro || (flags & MS_RDONLY)) {
-          error (_("mount: cannot mount %s%s read-only"),
-                bd, spec);
-          break;
-      } else if (readwrite) {
-         error (_("mount: %s%s is write-protected but explicit `-w' flag given"),
-                bd, spec);
-         break;
-      } else if (flags & MS_REMOUNT) {
-         error (_("mount: cannot remount %s%s read-write, is write-protected"),
-                bd, spec);
-         break;
-      } else {
-        opts = opts0;
-        types = types0;
-
-         if (opts) {
-            char *opts2 = append_opt(xstrdup(opts), "ro", NULL);
-            my_free(opts1);
-            opts = opts1 = opts2;
-         } else
-             opts = "ro";
-        if (types && !strcmp(types, "guess"))
-            types = 0;
-         error (_("mount: %s%s is write-protected, mounting read-only"),
-               bd, spec0);
-        res = try_mount_one (spec0, node0, types, opts, freq, pass, 1);
-        goto out;
-      }
-      break;
-    }
-    case ENOMEDIUM:
-      error(_("mount: no medium found on %s"), spec);
-      break;
-    default:
-      error ("mount: %s", strerror (mnt_err)); break;
-    }
-  }
-  res = EX_FAIL;
-
- out:
-
-#if defined(HAVE_LIBSELINUX) && defined(HAVE_SECURITY_GET_INITIAL_CONTEXT)
-  if (res != EX_FAIL && verbose && is_selinux_enabled() > 0) {
-      security_context_t raw = NULL, def = NULL;
-
-      if (getfilecon(node, &raw) > 0 &&
-                    security_get_initial_context("file", &def) == 0) {
-
-         if (!selinux_file_context_cmp(raw, def))
-             printf(_("mount: %s does not contain SELinux labels.\n"
-                   "       You just mounted an file system that supports labels which does not\n"
-                   "       contain labels, onto an SELinux box. It is likely that confined\n"
-                   "       applications will generate AVC messages and not be allowed access to\n"
-                   "       this file system.  For more details see restorecon(8) and mount(8).\n"),
-                   node);
-      }
-      freecon(raw);
-      freecon(def);
-  }
-#endif
-
-  my_free(mount_opts);
-  my_free(extra_opts);
-  my_free(spec1);
-  my_free(node1);
-  my_free(opts1);
-  my_free(types1);
-
-  return res;
-}
-
-static char *
-subst_string(const char *s, const char *sub, int sublen, const char *repl) {
-       char *n;
-
-       n = (char *) xmalloc(strlen(s)-sublen+strlen(repl)+1);
-       strncpy (n, s, sub-s);
-       strcpy (n + (sub-s), repl);
-       strcat (n, sub+sublen);
-       return n;
-}
-
-static char *
-usersubst(const char *opts) {
-       char *s, *w;
-       char id[40];
-
-       if (!opts)
-               return NULL;
-
-       s = "uid=useruid";
-       if (opts && (w = strstr(opts, s)) != NULL) {
-               sprintf(id, "uid=%u", getuid());
-               opts = subst_string(opts, w, strlen(s), id);
-       }
-       s = "gid=usergid";
-       if (opts && (w = strstr(opts, s)) != NULL) {
-               sprintf(id, "gid=%u", getgid());
-               opts = subst_string(opts, w, strlen(s), id);
-       }
-       return xstrdup(opts);
-}
-
-static int
-is_existing_file (const char *s) {
-       struct stat statbuf;
-
-       return (stat(s, &statbuf) == 0);
-}
-
-/*
- * Return 0 for success (either mounted sth or -a and NOAUTO was given)
- */
-static int
-mount_one (const char *spec, const char *node, const char *types,
-          const char *fstabopts, char *cmdlineopts, int freq, int pass) {
-       const char *nspec = NULL;
-       char *opts;
-
-       /* Substitute values in opts, if required */
-       opts = usersubst(fstabopts);
-
-       /* Merge the fstab and command line options.  */
-       opts = append_opt(opts, cmdlineopts, NULL);
-
-       if (types == NULL && !mounttype && !is_existing_file(spec)) {
-               if (strchr (spec, ':') != NULL) {
-                       types = "nfs";
-                       if (verbose)
-                               printf(_("mount: no type was given - "
-                                        "I'll assume nfs because of "
-                                        "the colon\n"));
-               } else if(!strncmp(spec, "//", 2)) {
-                       types = "cifs";
-                       if (verbose)
-                               printf(_("mount: no type was given - "
-                                        "I'll assume cifs because of "
-                                        "the // prefix\n"));
-               }
-       }
-
-       /* Handle possible LABEL= and UUID= forms of spec */
-       if (types == NULL || (strncmp(types, "9p", 2) &&
-                             strncmp(types, "nfs", 3) &&
-                             strncmp(types, "cifs", 4) &&
-                             strncmp(types, "smbfs", 5))) {
-               if (!is_pseudo_fs(types))
-                       nspec = spec_to_devname(spec);
-               if (nspec)
-                       spec = nspec;
-       }
-
-       return try_mount_one (spec, node, types, opts, freq, pass, 0);
-}
-
-static int
-mounted (const char *spec0, const char *node0,
-        struct mntentchn *fstab_mc __attribute__((__unused__))) {
-
-       struct mntentchn *mc, *mc0;
-       const char *spec, *node;
-       int ret = 0;
-
-       /* Handle possible UUID= and LABEL= in spec */
-       spec = spec_to_devname(spec0);
-       if (!spec)
-               return ret;
-
-       node = canonicalize(node0);
-
-
-       mc0 = mtab_head();
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
-               if (streq (spec, mc->m.mnt_fsname) &&
-                   streq (node, mc->m.mnt_dir)) {
-                       ret = 1;
-                       break;
-               }
-
-       my_free(spec);
-       my_free(node);
-
-       return ret;
-}
-
-/* returns 0 if not mounted, 1 if mounted and -1 in case of error */
-static int
-is_fstab_entry_mounted(struct mntentchn *mc, int verbose)
-{
-       struct stat st;
-
-       if (mounted(mc->m.mnt_fsname, mc->m.mnt_dir, mc))
-               goto yes;
-
-       /* extra care for loop devices */
-       if ((mc->m.mnt_opts && strstr(mc->m.mnt_opts, "loop=")) ||
-           (stat(mc->m.mnt_fsname, &st) == 0 && S_ISREG(st.st_mode))) {
-
-               char *p = get_option_value(mc->m.mnt_opts, "offset=");
-               uintmax_t offset = 0;
-
-               if (p && strtosize(p, &offset) != 0) {
-                       if (verbose)
-                               printf(_("mount: ignore %s "
-                                       "(unparsable offset= option)\n"),
-                                       mc->m.mnt_fsname);
-                       return -1;
-               }
-               free(p);
-               if (is_mounted_same_loopfile(mc->m.mnt_dir, mc->m.mnt_fsname, offset))
-                       goto yes;
-       }
-
-       return 0;
-yes:
-       if (verbose)
-               printf(_("mount: %s already mounted on %s\n"),
-                              mc->m.mnt_fsname, mc->m.mnt_dir);
-       return 1;
-}
-
-/* avoid using stat() on things we are not going to mount anyway.. */
-static int
-has_noauto (const char *opts) {
-       char *s;
-
-       if (!opts)
-               return 0;
-       s = strstr(opts, "noauto");
-       if (!s)
-               return 0;
-       return (s == opts || s[-1] == ',') && (s[6] == 0 || s[6] == ',');
-}
-
-/* Mount all filesystems of the specified types except swap and root.  */
-/* With the --fork option: fork and let different incarnations of
-   mount handle different filesystems.  However, try to avoid several
-   simultaneous mounts on the same physical disk, since that is very slow. */
-#define DISKMAJOR(m)   (((int) m) & ~0xf)
-
-static int
-do_mount_all (char *types, char *options, char *test_opts) {
-       struct mntentchn *mc, *mc0, *mtmp;
-       int status = 0;
-       struct stat statbuf;
-       struct child {
-               pid_t pid;
-               char *group;
-               struct mntentchn *mec;
-               struct mntentchn *meclast;
-               struct child *nxt;
-       } childhead, *childtail, *cp;
-       char major[22];
-       char *g, *colon;
-
-       /* build a chain of what we have to do, or maybe
-          several chains, one for each major or NFS host */
-       childhead.nxt = 0;
-       childtail = &childhead;
-       mc0 = fstab_head();
-       for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) {
-               if (has_noauto (mc->m.mnt_opts))
-                       continue;
-               if (matching_type (mc->m.mnt_type, types)
-                   && matching_opts (mc->m.mnt_opts, test_opts)
-                   && !streq (mc->m.mnt_dir, "/")
-                   && !streq (mc->m.mnt_dir, "root")
-                   && !is_fstab_entry_mounted(mc, verbose)) {
-
-                       mtmp = (struct mntentchn *) xmalloc(sizeof(*mtmp));
-                       *mtmp = *mc;
-                       mtmp->nxt = 0;
-                       g = NULL;
-                       if (optfork) {
-                               if (stat(mc->m.mnt_fsname, &statbuf) == 0 &&
-                                   S_ISBLK(statbuf.st_mode)) {
-                                       sprintf(major, "#%x",
-                                               DISKMAJOR(statbuf.st_rdev));
-                                       g = major;
-                               }
-                               if (strcmp(mc->m.mnt_type, "nfs") == 0) {
-                                       g = xstrdup(mc->m.mnt_fsname);
-                                       colon = strchr(g, ':');
-                                       if (colon)
-                                               *colon = '\0';
-                               }
-                       }
-                       if (g) {
-                               for (cp = childhead.nxt; cp; cp = cp->nxt)
-                                       if (cp->group &&
-                                           strcmp(cp->group, g) == 0) {
-                                               cp->meclast->nxt = mtmp;
-                                               cp->meclast = mtmp;
-                                               goto fnd;
-                                       }
-                       }
-                       cp = (struct child *) xmalloc(sizeof *cp);
-                       cp->nxt = 0;
-                       cp->mec = cp->meclast = mtmp;
-                       cp->group = xstrdup(g);
-                       cp->pid = 0;
-                       childtail->nxt = cp;
-                       childtail = cp;
-               fnd:;
-
-               }
-       }
-
-       /* now do everything */
-       for (cp = childhead.nxt; cp; cp = cp->nxt) {
-               pid_t p = -1;
-               if (optfork) {
-                       p = fork();
-                       if (p == -1) {
-                               int errsv = errno;
-                               error(_("mount: cannot fork: %s"),
-                                     strerror (errsv));
-                       }
-                       else if (p != 0)
-                               cp->pid = p;
-               }
-
-               /* if child, or not forked, do the mounting */
-               if (p == 0 || p == -1) {
-                       for (mc = cp->mec; mc; mc = mc->nxt) {
-                               status |= mount_one (mc->m.mnt_fsname,
-                                                    mc->m.mnt_dir,
-                                                    mc->m.mnt_type,
-                                                    mc->m.mnt_opts,
-                                                    options, 0, 0);
-                       }
-                       if (mountcount)
-                               status |= EX_SOMEOK;
-                       if (p == 0)
-                               exit(status);
-               }
-       }
-
-       /* wait for children, if any */
-       while ((cp = childhead.nxt) != NULL) {
-               childhead.nxt = cp->nxt;
-               if (cp->pid) {
-                       int ret;
-               keep_waiting:
-                       if(waitpid(cp->pid, &ret, 0) == -1) {
-                               if (errno == EINTR)
-                                       goto keep_waiting;
-                               perror("waitpid");
-                       } else if (WIFEXITED(ret))
-                               status |= WEXITSTATUS(ret);
-                       else
-                               status |= EX_SYSERR;
-               }
-       }
-       if (mountcount)
-               status |= EX_SOMEOK;
-       return status;
-}
-
-static struct option longopts[] = {
-       { "all", 0, 0, 'a' },
-       { "fake", 0, 0, 'f' },
-       { "fork", 0, 0, 'F' },
-       { "help", 0, 0, 'h' },
-       { "no-mtab", 0, 0, 'n' },
-       { "read-only", 0, 0, 'r' },
-       { "ro", 0, 0, 'r' },
-       { "verbose", 0, 0, 'v' },
-       { "version", 0, 0, 'V' },
-       { "read-write", 0, 0, 'w' },
-       { "rw", 0, 0, 'w' },
-       { "options", 1, 0, 'o' },
-       { "test-opts", 1, 0, 'O' },
-       { "pass-fd", 1, 0, 'p' },
-       { "types", 1, 0, 't' },
-       { "bind", 0, 0, 'B' },
-       { "move", 0, 0, 'M' },
-       { "rbind", 0, 0, 'R' },
-       { "make-shared", 0, 0, 136 },
-       { "make-slave", 0, 0, 137 },
-       { "make-private", 0, 0, 138 },
-       { "make-unbindable", 0, 0, 139 },
-       { "make-rshared", 0, 0, 140 },
-       { "make-rslave", 0, 0, 141 },
-       { "make-rprivate", 0, 0, 142 },
-       { "make-runbindable", 0, 0, 143 },
-       { "no-canonicalize", 0, 0, 144 },
-       { "internal-only", 0, 0, 'i' },
-       { NULL, 0, 0, 0 }
-};
-
-/* Keep the usage message at max 22 lines, each at most 70 chars long.
-   The user should not need a pager to read it. */
-static void
-usage (FILE *fp, int n) {
-       fprintf(fp, _(
-         "Usage: mount -V                 : print version\n"
-         "       mount -h                 : print this help\n"
-         "       mount                    : list mounted filesystems\n"
-         "       mount -l                 : idem, including volume labels\n"
-         "So far the informational part. Next the mounting.\n"
-         "The command is `mount [-t fstype] something somewhere'.\n"
-         "Details found in /etc/fstab may be omitted.\n"
-         "       mount -a [-t|-O] ...     : mount all stuff from /etc/fstab\n"
-         "       mount device             : mount device at the known place\n"
-         "       mount directory          : mount known device here\n"
-         "       mount -t type dev dir    : ordinary mount command\n"
-         "Note that one does not really mount a device, one mounts\n"
-         "a filesystem (of the given type) found on the device.\n"
-         "One can also mount an already visible directory tree elsewhere:\n"
-         "       mount --bind olddir newdir\n"
-         "or move a subtree:\n"
-         "       mount --move olddir newdir\n"
-         "One can change the type of mount containing the directory dir:\n"
-         "       mount --make-shared dir\n"
-         "       mount --make-slave dir\n"
-         "       mount --make-private dir\n"
-         "       mount --make-unbindable dir\n"
-         "One can change the type of all the mounts in a mount subtree\n"
-         "containing the directory dir:\n"
-         "       mount --make-rshared dir\n"
-         "       mount --make-rslave dir\n"
-         "       mount --make-rprivate dir\n"
-         "       mount --make-runbindable dir\n"
-         "A device can be given by name, say /dev/hda1 or /dev/cdrom,\n"
-         "or by label, using  -L label  or by uuid, using  -U uuid .\n"
-         "Other options: [-nfFrsvw] [-o options] [-p passwdfd].\n"
-         "For many more details, say  man 8 mount .\n"
-       ));
-
-       unlock_mtab();
-       exit (n);
-}
-
-/* returns mount entry from fstab */
-static struct mntentchn *
-getfs(const char *spec, const char *uuid, const char *label)
-{
-       struct mntentchn *mc = NULL;
-       const char *devname = NULL;
-
-       if (!spec && !uuid && !label)
-               return NULL;
-
-       /*
-        * A) 99% of all cases, the spec on cmdline matches
-        *    with spec in fstab
-        */
-       if (uuid)
-               mc = getfs_by_uuid(uuid);
-       else if (label)
-               mc = getfs_by_label(label);
-       else {
-               mc = getfs_by_dir(spec);
-
-               if (!mc)
-                       mc = getfs_by_spec(spec);
-       }
-       if (mc)
-               return mc;
-
-       /*
-        * B) UUID or LABEL on cmdline, but devname in fstab
-        */
-       if (uuid)
-               devname = fsprobe_get_devname_by_uuid(uuid);
-       else if (label)
-               devname = fsprobe_get_devname_by_label(label);
-       else
-               devname = spec_to_devname(spec);
-
-       if (devname)
-               mc = getfs_by_devname(devname);
-
-       /*
-        * C) mixed
-        */
-       if (!mc && devname) {
-               const char *id = NULL;
-
-               if (!label && (!spec || strncmp(spec, "LABEL=", 6))) {
-                       id = fsprobe_get_label_by_devname(devname);
-                       if (id)
-                               mc = getfs_by_label(id);
-               }
-               if (!mc && !uuid && (!spec || strncmp(spec, "UUID=", 5))) {
-                       id = fsprobe_get_uuid_by_devname(devname);
-                       if (id)
-                               mc = getfs_by_uuid(id);
-               }
-               my_free(id);
-
-               if (mc) {
-                       /* use real device name to avoid repetitional
-                        * conversion from LABEL/UUID to devname
-                        */
-                       my_free(mc->m.mnt_fsname);
-                       mc->m.mnt_fsname = xstrdup(devname);
-               }
-       }
-
-       /*
-        * D) remount -- try /etc/mtab
-        *    Earlier mtab was tried first, but this would sometimes try the
-        *    wrong mount in case mtab had the root device entry wrong.  Try
-        *    the last occurrence first, since that is the visible mount.
-        */
-       if (!mc && (devname || spec))
-               mc = getmntfilebackward (devname ? devname : spec, NULL);
-
-       my_free(devname);
-       return mc;
-}
-
-
-static void
-print_version(int rc) {
-       printf( "mount from %s (with "
-#ifdef HAVE_LIBBLKID
-               "libblkid"
-#else
-               "libvolume_id"
-#endif
-#ifdef HAVE_LIBSELINUX
-               " and selinux"
-#endif
-               " support)\n", PACKAGE_STRING);
-       exit(rc);
-}
-
-int
-main(int argc, char *argv[]) {
-       int c, result = 0, specseen;
-       char *options = NULL, *test_opts = NULL, *node;
-       const char *spec = NULL;
-       char *label = NULL;
-       char *uuid = NULL;
-       char *types = NULL;
-       char *p;
-       struct mntentchn *mc;
-       int fd;
-
-       sanitize_env();
-       setlocale(LC_ALL, "");
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
-       atexit(close_stdout);
-
-       progname = argv[0];
-       if ((p = strrchr(progname, '/')) != NULL)
-               progname = p+1;
-
-       umask(022);
-
-       /* People report that a mount called from init without console
-          writes error messages to /etc/mtab
-          Let us try to avoid getting fd's 0,1,2 */
-       while((fd = open("/dev/null", O_RDWR)) == 0 || fd == 1 || fd == 2) ;
-       if (fd > 2)
-               close(fd);
-
-       fsprobe_init();
-
-#ifdef DO_PS_FIDDLING
-       initproctitle(argc, argv);
-#endif
-
-       while ((c = getopt_long (argc, argv, "aBfFhilL:Mno:O:p:rRsU:vVwt:",
-                                longopts, NULL)) != -1) {
-               switch (c) {
-               case 'a':              /* mount everything in fstab */
-                       ++mount_all;
-                       break;
-               case 'B': /* bind */
-                       mounttype = MS_BIND;
-                       break;
-               case 'f':              /* fake: don't actually call mount(2) */
-                       ++fake;
-                       break;
-               case 'F':
-                       ++optfork;
-                       break;
-               case 'h':               /* help */
-                       usage (stdout, 0);
-                       break;
-               case 'i':
-                       external_allowed = 0;
-                       break;
-               case 'l':
-                       list_with_volumelabel = 1;
-                       break;
-               case 'L':
-                       label = optarg;
-                       break;
-               case 'M': /* move */
-                       mounttype = MS_MOVE;
-                       break;
-               case 'n':               /* do not write /etc/mtab */
-                       ++nomtab;
-                       break;
-               case 'o':               /* specify mount options */
-                       options = append_opt(options, optarg, NULL);
-                       break;
-               case 'O':               /* with -t: mount only if (not) opt */
-                       test_opts = append_opt(test_opts, optarg, NULL);
-                       break;
-               case 'p':               /* fd on which to read passwd */
-                        error("mount: %s", _("--pass-fd is no longer supported"));
-                       break;
-               case 'r':               /* mount readonly */
-                       readonly = 1;
-                       readwrite = 0;
-                       break;
-               case 'R': /* rbind */
-                       mounttype = (MS_BIND | MS_REC);
-                       break;
-               case 's':               /* allow sloppy mount options */
-                       sloppy = 1;
-                       break;
-               case 't':               /* specify file system types */
-                       types = optarg;
-                       break;
-               case 'U':
-                       uuid = optarg;
-                       break;
-               case 'v':               /* be chatty - more so if repeated */
-                       ++verbose;
-                       break;
-               case 'V':               /* version */
-                       print_version(EXIT_SUCCESS);
-                       break;
-               case 'w':               /* mount read/write */
-                       readwrite = 1;
-                       readonly = 0;
-                       break;
-               case 0:
-                       break;
-
-               case 136:
-                       mounttype = MS_SHARED;
-                       break;
-
-               case 137:
-                       mounttype = MS_SLAVE;
-                       break;
-
-               case 138:
-                       mounttype = MS_PRIVATE;
-                       break;
-
-               case 139:
-                       mounttype = MS_UNBINDABLE;
-                       break;
-
-               case 140:
-                       mounttype = (MS_SHARED | MS_REC);
-                       break;
-
-               case 141:
-                       mounttype = (MS_SLAVE | MS_REC);
-                       break;
-
-               case 142:
-                       mounttype = (MS_PRIVATE | MS_REC);
-                       break;
-
-               case 143:
-                       mounttype = (MS_UNBINDABLE | MS_REC);
-                       break;
-               case 144:
-                       nocanonicalize = 1;
-                       break;
-               case '?':
-               default:
-                       usage (stderr, EX_USAGE);
-               }
-       }
-
-       if (verbose > 2) {
-               printf("mount: fstab path: \"%s\"\n", _PATH_MNTTAB);
-               printf("mount: mtab path:  \"%s\"\n", _PATH_MOUNTED);
-               printf("mount: lock path:  \"%s\"\n", _PATH_MOUNTED_LOCK);
-               printf("mount: temp path:  \"%s\"\n", _PATH_MOUNTED_TMP);
-               printf("mount: UID:        %u\n", getuid());
-               printf("mount: eUID:       %u\n", geteuid());
-       }
-
-       argc -= optind;
-       argv += optind;
-
-       specseen = (uuid || label) ? 1 : 0;     /* yes, .. i know */
-
-       if (argc+specseen == 0 && !mount_all) {
-               if (options || mounttype)
-                       usage (stderr, EX_USAGE);
-               return print_all (types);
-       }
-
-       {
-               const uid_t ruid = getuid();
-               const uid_t euid = geteuid();
-
-               /* if we're really root and aren't running setuid */
-               if (((uid_t)0 == ruid) && (ruid == euid)) {
-                       restricted = 0;
-               }
-
-               if (restricted &&
-                   (types || options || readwrite || nomtab || mount_all ||
-                    nocanonicalize || fake || mounttype ||
-                    (argc + specseen) != 1)) {
-
-                       if (ruid == 0 && euid != 0)
-                               /* user is root, but setuid to non-root */
-                               die (EX_USAGE, _("mount: only root can do that "
-                                       "(effective UID is %u)"), euid);
-
-                       die (EX_USAGE, _("mount: only root can do that"));
-               }
-       }
-
-       atexit(unlock_mtab);
-
-       switch (argc+specseen) {
-       case 0:
-               /* mount -a */
-               result = do_mount_all (types, options, test_opts);
-               if (result == 0 && verbose && !fake)
-                       error(_("nothing was mounted"));
-               break;
-
-       case 1:
-               /* mount [-nfrvw] [-o options] special | node
-                * mount -L label  (or -U uuid)
-                * (/etc/fstab is necessary)
-                */
-               if (types != NULL)
-                       usage (stderr, EX_USAGE);
-
-               if (uuid || label)
-                       mc = getfs(NULL, uuid, label);
-               else
-                       mc = getfs(*argv, NULL, NULL);
-
-               if (!mc) {
-                       if (uuid || label)
-                               die (EX_USAGE, _("mount: no such partition found"));
-
-                       die (EX_USAGE,
-                            _("mount: can't find %s in %s or %s"),
-                            *argv, _PATH_MNTTAB, _PATH_MOUNTED);
-               }
-
-               result = mount_one (xstrdup (mc->m.mnt_fsname),
-                                   xstrdup (mc->m.mnt_dir),
-                                   xstrdup (mc->m.mnt_type),
-                                   mc->m.mnt_opts, options, 0, 0);
-               break;
-
-       case 2:
-               /* mount special node  (/etc/fstab is not necessary) */
-               if (specseen) {
-                       /* mount -L label node   (or -U uuid) */
-                       spec = uuid ?   fsprobe_get_devname_by_uuid(uuid) :
-                                       fsprobe_get_devname_by_label(label);
-                       node = argv[0];
-               } else {
-                       /* mount special node */
-                       spec = argv[0];
-                       node = argv[1];
-               }
-               if (!spec)
-                       die (EX_USAGE, _("mount: no such partition found"));
-
-               result = mount_one (spec, node, types, NULL, options, 0, 0);
-               break;
-
-       default:
-               usage (stderr, EX_USAGE);
-       }
-
-       if (result == EX_SOMEOK)
-               result = 0;
-
-       fsprobe_exit();
-
-       exit (result);
-}
diff --git a/mount-deprecated/mount_constants.h b/mount-deprecated/mount_constants.h
deleted file mode 100644 (file)
index ce51887..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef MS_RDONLY
-#define MS_RDONLY       1      /* Mount read-only */
-#endif
-#ifndef MS_NOSUID
-#define MS_NOSUID       2      /* Ignore suid and sgid bits */
-#endif
-#ifndef MS_NODEV
-#define MS_NODEV        4      /* Disallow access to device special files */
-#endif
-#ifndef MS_NOEXEC
-#define MS_NOEXEC       8      /* Disallow program execution */
-#endif
-#ifndef MS_SYNCHRONOUS
-#define MS_SYNCHRONOUS 16      /* Writes are synced at once */
-#endif
-#ifndef MS_REMOUNT
-#define MS_REMOUNT     32      /* Alter flags of a mounted FS */
-#endif
-#ifndef MS_MANDLOCK
-#define MS_MANDLOCK    64      /* Allow mandatory locks on an FS */
-#endif
-#ifndef MS_DIRSYNC
-#define MS_DIRSYNC     128     /* Directory modifications are synchronous */
-#endif
-#ifndef MS_NOATIME
-#define MS_NOATIME     0x400   /* 1024: Do not update access times. */
-#endif
-#ifndef MS_NODIRATIME
-#define MS_NODIRATIME   0x800  /* 2048: Don't update directory access times */
-#endif
-#ifndef MS_BIND
-#define        MS_BIND         0x1000  /* 4096: Mount existing tree also elsewhere */
-#endif
-#ifndef MS_MOVE
-#define MS_MOVE                0x2000  /* 8192: Atomically move tree */
-#endif
-#ifndef MS_REC
-#define MS_REC         0x4000  /* 16384: Recursive loopback */
-#endif
-#ifndef MS_SILENT
-#define MS_SILENT      0x8000  /* 32768 (was MS_VERBOSE) */
-#endif
-#ifndef MS_RELATIME
-#define MS_RELATIME    0x200000 /* 200000: Update access times relative
-                                  to mtime/ctime */
-#endif
-#ifndef MS_UNBINDABLE
-#define MS_UNBINDABLE  (1<<17) /* 131072 unbindable*/
-#endif
-#ifndef MS_PRIVATE
-#define MS_PRIVATE     (1<<18) /* 262144 Private*/
-#endif
-#ifndef MS_SLAVE
-#define MS_SLAVE       (1<<19) /* 524288 Slave*/
-#endif
-#ifndef MS_SHARED
-#define MS_SHARED      (1<<20) /* 1048576 Shared*/
-#endif
-#ifndef MS_I_VERSION
-#define MS_I_VERSION   (1<<23) /* update inode I_version field */
-#endif
-#ifndef MS_STRICTATIME
-#define MS_STRICTATIME (1<<24) /* strict atime semantics */
-#endif
-/*
- * Magic mount flag number. Had to be or-ed to the flag values.
- */
-#ifndef MS_MGC_VAL
-#define MS_MGC_VAL 0xC0ED0000  /* magic flag number to indicate "new" flags */
-#endif
-#ifndef MS_MGC_MSK
-#define MS_MGC_MSK 0xffff0000  /* magic flag number mask */
-#endif
diff --git a/mount-deprecated/mount_mntent.c b/mount-deprecated/mount_mntent.c
deleted file mode 100644 (file)
index b5bdd90..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/* Private version of the libc *mntent() routines. */
-/* Note slightly different prototypes. */
-
-/* 1999-02-22 Arkadiusz Miƛkiewicz <misiek@pld.ORG.PL>
- * - added Native Language Support
- */
-
-#include <stdio.h>
-#include <string.h>            /* for index */
-#include <ctype.h>             /* for isdigit */
-#include <sys/stat.h>          /* for umask */
-
-#include "mount_mntent.h"
-#include "sundries.h"          /* for xmalloc */
-#include "nls.h"
-#include "mangle.h"
-#include "closestream.h"
-
-static int
-is_space_or_tab (char c) {
-       return (c == ' ' || c == '\t');
-}
-
-static char *
-skip_spaces(char *s) {
-       while (is_space_or_tab(*s))
-               s++;
-       return s;
-}
-
-/*
- * fstat'ing the file and allocating a buffer holding all of it
- * may be a bad idea: if the file is /proc/mounts, the stat
- * returns 0.
- * (On the other hand, mangling and unmangling is meaningless
- *  for /proc/mounts.)
- */
-
-mntFILE *
-my_setmntent (const char *file, char *mode) {
-       mntFILE *mfp = xmalloc(sizeof(*mfp));
-       mode_t old_umask = umask(077);
-
-       mfp->mntent_fp = fopen(file, mode);
-       umask(old_umask);
-       mfp->mntent_file = xstrdup(file);
-       mfp->mntent_errs = (mfp->mntent_fp == NULL);
-       mfp->mntent_softerrs = 0;
-       mfp->mntent_lineno = 0;
-       return mfp;
-}
-
-void
-my_endmntent(mntFILE * mfp) {
-       if (mfp) {
-               if (mfp->mntent_fp)
-                       if (close_stream(mfp->mntent_fp))
-                               fprintf(stderr, _("write error"));
-               free(mfp->mntent_file);
-               free(mfp);
-       }
-}
-
-int
-my_addmntent (mntFILE *mfp, struct my_mntent *mnt) {
-       char *m1, *m2, *m3, *m4;
-       int res;
-
-       if (fseek (mfp->mntent_fp, 0, SEEK_END))
-               return 1;                       /* failure */
-
-       m1 = mangle(mnt->mnt_fsname);
-       m2 = mangle(mnt->mnt_dir);
-       m3 = mangle(mnt->mnt_type);
-       m4 = mnt->mnt_opts ? mangle(mnt->mnt_opts) : "rw";
-
-       res = fprintf (mfp->mntent_fp, "%s %s %s %s %d %d\n",
-                      m1, m2, m3, m4, mnt->mnt_freq, mnt->mnt_passno);
-
-       free(m1);
-       free(m2);
-       free(m3);
-       if (mnt->mnt_opts)
-               free(m4);
-       return (res < 0) ? 1 : 0;
-}
-
-/* Read the next entry from the file fp. Stop reading at an incorrect entry. */
-struct my_mntent *
-my_getmntent (mntFILE *mfp) {
-       static char buf[4096];
-       static struct my_mntent me;
-       char *s;
-
- again:
-       if (mfp->mntent_errs || mfp->mntent_softerrs >= ERR_MAX)
-               return NULL;
-
-       /* read the next non-blank non-comment line */
-       do {
-               if (fgets (buf, sizeof(buf), mfp->mntent_fp) == NULL)
-                       return NULL;
-
-               mfp->mntent_lineno++;
-               s = strchr (buf, '\n');
-               if (s == NULL) {
-                       /* Missing final newline?  Otherwise extremely */
-                       /* long line - assume file was corrupted */
-                       if (feof(mfp->mntent_fp)) {
-                               fprintf(stderr, _("[mntent]: warning: no final "
-                                       "newline at the end of %s\n"),
-                                       mfp->mntent_file);
-                               s = strchr (buf, 0);
-                       } else {
-                               mfp->mntent_errs = 1;
-                               goto err;
-                       }
-               }
-               *s = 0;
-               if (--s >= buf && *s == '\r')
-                       *s = 0;
-               s = skip_spaces(buf);
-       } while (*s == '\0' || *s == '#');
-
-       me.mnt_fsname = unmangle(s, &s);
-       s = skip_spaces(s);
-       me.mnt_dir = unmangle(s, &s);
-       s = skip_spaces(s);
-       me.mnt_type = unmangle(s, &s);
-       s = skip_spaces(s);
-       me.mnt_opts = unmangle(s, &s);
-       s = skip_spaces(s);
-
-       if (!me.mnt_fsname || !me.mnt_dir || !me.mnt_type)
-               goto err;
-
-       if (isdigit(*s)) {
-               me.mnt_freq = atoi(s);
-               while(isdigit(*s)) s++;
-       } else
-               me.mnt_freq = 0;
-       if(*s && !is_space_or_tab(*s))
-               goto err;
-
-       s = skip_spaces(s);
-       if(isdigit(*s)) {
-               me.mnt_passno = atoi(s);
-               while(isdigit(*s)) s++;
-       } else
-               me.mnt_passno = 0;
-       if(*s && !is_space_or_tab(*s))
-               goto err;
-
-       /* allow more stuff, e.g. comments, on this line */
-
-       return &me;
-
- err:
-       mfp->mntent_softerrs++;
-       fprintf(stderr, _("[mntent]: line %d in %s is bad%s\n"),
-               mfp->mntent_lineno, mfp->mntent_file,
-               (mfp->mntent_errs || mfp->mntent_softerrs >= ERR_MAX) ?
-               _("; rest of file ignored") : "");
-       goto again;
-}
diff --git a/mount-deprecated/mount_mntent.h b/mount-deprecated/mount_mntent.h
deleted file mode 100644 (file)
index 3b74215..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef MOUNT_MNTENT_H
-#define MOUNT_MNTENT_H
-
-struct my_mntent {
-       const char *mnt_fsname;
-       const char *mnt_dir;
-       const char *mnt_type;
-       const char *mnt_opts;
-       int mnt_freq;
-       int mnt_passno;
-};
-
-#define ERR_MAX 5
-
-typedef struct mntFILEstruct {
-       FILE *mntent_fp;
-       char *mntent_file;
-       int mntent_lineno;
-       int mntent_errs;
-       int mntent_softerrs;
-} mntFILE;
-
-mntFILE *my_setmntent (const char *file, char *mode);
-void my_endmntent (mntFILE *mfp);
-int my_addmntent (mntFILE *mfp, struct my_mntent *mnt);
-struct my_mntent *my_getmntent (mntFILE *mfp);
-
-#endif /* MOUNT_MNTENT_H */
diff --git a/mount-deprecated/sundries.c b/mount-deprecated/sundries.c
deleted file mode 100644 (file)
index 3710439..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Support functions.  Exported functions are prototyped in sundries.h.
- *
- * added fcntl locking by Kjetil T. (kjetilho@math.uio.no) - aeb, 950927
- *
- * 1999-02-22 Arkadiusz Miƛkiewicz <misiek@pld.ORG.PL>
- * - added Native Language Support
- *
- */
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <mntent.h>            /* for MNTTYPE_SWAP */
-
-#include "canonicalize.h"
-
-#include "sundries.h"
-#include "nls.h"
-
-int mount_quiet;
-int verbose;
-int nocanonicalize;
-char *progname;
-
-/* reallocates its first arg - typical use: s = xstrconcat3(s,t,u); */
-char *
-xstrconcat3 (char *s, const char *t, const char *u) {
-     size_t len = 0;
-
-     len = (s ? strlen(s) : 0) + (t ? strlen(t) : 0) + (u ? strlen(u) : 0);
-
-     if (!len)
-            return NULL;
-     if (!s) {
-            s = xmalloc(len + 1);
-            *s = '\0';
-     }
-     else
-            s = xrealloc(s, len + 1);
-     if (t)
-            strcat(s, t);
-     if (u)
-            strcat(s, u);
-     return s;
-}
-
-/* frees its first arg - typical use: s = xstrconcat4(s,t,u,v); */
-char *
-xstrconcat4 (char *s, const char *t, const char *u, const char *v) {
-     size_t len = 0;
-
-     len = (s ? strlen(s) : 0) + (t ? strlen(t) : 0) +
-               (u ? strlen(u) : 0) + (v ? strlen(v) : 0);
-
-     if (!len)
-            return NULL;
-     if (!s) {
-            s = xmalloc(len + 1);
-            *s = '\0';
-     }
-     else
-            s = xrealloc(s, len + 1);
-     if (t)
-            strcat(s, t);
-     if (u)
-            strcat(s, u);
-     if (v)
-            strcat(s, v);
-     return s;
-
-
-}
-
-/* Call this with SIG_BLOCK to block and SIG_UNBLOCK to unblock.  */
-void
-block_signals (int how) {
-     sigset_t sigs;
-
-     sigfillset (&sigs);
-     sigdelset(&sigs, SIGTRAP);
-     sigdelset(&sigs, SIGSEGV);
-     sigprocmask (how, &sigs, (sigset_t *) 0);
-}
-
-
-/* Non-fatal error.  Print message and return.  */
-/* (print the message in a single printf, in an attempt
-    to avoid mixing output of several threads) */
-void
-error (const char *fmt, ...) {
-     va_list args;
-
-     if (mount_quiet)
-         return;
-     va_start (args, fmt);
-     vfprintf (stderr, fmt, args);
-     va_end (args);
-     fputc('\n', stderr);
-}
-
-/* Fatal error.  Print message and exit.  */
-void __attribute__ ((noreturn)) die(int err, const char *fmt, ...)
-{
-       va_list args;
-
-       va_start(args, fmt);
-       vfprintf(stderr, fmt, args);
-       fprintf(stderr, "\n");
-       va_end(args);
-
-       exit(err);
-}
-
-/* True if fstypes match.  Null *TYPES means match anything,
-   except that swap types always return false. */
-/* Accept nonfs,proc,devpts and nonfs,noproc,nodevpts
-   with the same meaning. */
-int
-matching_type (const char *type, const char *types) {
-     int no;                   /* negated types list */
-     int len;
-     const char *p;
-
-     if (streq (type, MNTTYPE_SWAP))
-         return 0;
-     if (types == NULL)
-         return 1;
-
-     no = 0;
-     if (!strncmp(types, "no", 2)) {
-         no = 1;
-         types += 2;
-     }
-
-     /* Does type occur in types, separated by commas? */
-     len = strlen(type);
-     p = types;
-     while(1) {
-            if (!strncmp(p, "no", 2) && !strncmp(p+2, type, len) &&
-                (p[len+2] == 0 || p[len+2] == ','))
-                    return 0;
-            if (strncmp(p, type, len) == 0 &&
-                (p[len] == 0 || p[len] == ','))
-                    return !no;
-            p = strchr(p,',');
-            if (!p)
-                    break;
-            p++;
-     }
-     return no;
-}
-
-/* Returns 1 if needle found or noneedle not found in haystack
- * Otherwise returns 0
- */
-static int
-check_option(const char *haystack, const char *needle) {
-     const char *p, *r;
-     int len, needle_len, this_len;
-     int no;
-
-     no = 0;
-     if (!strncmp(needle, "no", 2)) {
-         no = 1;
-         needle += 2;
-     }
-     needle_len = strlen(needle);
-     len = strlen(haystack);
-
-     for (p = haystack; p < haystack+len; p++) {
-         r = strchr(p, ',');
-         if (r) {
-              this_len = r-p;
-         } else {
-              this_len = strlen(p);
-         }
-         if (this_len != needle_len) {
-              p += this_len;
-              continue;
-         }
-         if (strncmp(p, needle, this_len) == 0)
-              return !no; /* foo or nofoo was found */
-         p += this_len;
-     }
-
-     return no;  /* foo or nofoo was not found */
-}
-
-
-/* Returns 1 if each of the test_opts options agrees with the entire
- * list of options.
- * Returns 0 if any noopt is found in test_opts and opt is found in options.
- * Returns 0 if any opt is found in test_opts but is not found in options.
- * Unlike fs type matching, nonetdev,user and nonetdev,nouser have
- * DIFFERENT meanings; each option is matched explicitly as specified.
- */
-int
-matching_opts (const char *options, const char *test_opts) {
-     const char *p, *r;
-     char *q;
-     int len, this_len;
-
-     if (test_opts == NULL)
-         return 1;
-     if (options == NULL)
-         options = "";
-
-     len = strlen(test_opts);
-     q = alloca(len+1);
-     if (q == NULL)
-          die (EX_SYSERR, _("not enough memory"));
-
-     for (p = test_opts; p < test_opts+len; p++) {
-         r = strchr(p, ',');
-         if (r) {
-              this_len = r-p;
-         } else {
-              this_len = strlen(p);
-         }
-         if (!this_len) continue; /* if two ',' appear in a row */
-         strncpy(q, p, this_len);
-         q[this_len] = '\0';
-         if (!check_option(options, q))
-              return 0; /* any match failure means failure */
-         p += this_len;
-     }
-
-     /* no match failures in list means success */
-     return 1;
-}
-
-int
-is_pseudo_fs(const char *type)
-{
-       if (type == NULL || *type == '/')
-               return 0;
-       if (streq(type, "none") ||
-           streq(type, "proc") ||
-           streq(type, "tmpfs") ||
-           streq(type, "sysfs") ||
-           streq(type, "usbfs") ||
-           streq(type, "cgroup") ||
-           streq(type, "cpuset") ||
-           streq(type, "rpc_pipefs") ||
-           streq(type, "devpts") ||
-           streq(type, "securityfs") ||
-           streq(type, "debugfs"))
-               return 1;
-       return 0;
-}
-
-/* Make a canonical pathname from PATH.  Returns a freshly malloced string.
-   It is up the *caller* to ensure that the PATH is sensible.  i.e.
-   canonicalize ("/dev/fd0/.") returns "/dev/fd0" even though ``/dev/fd0/.''
-   is not a legal pathname for ``/dev/fd0''.  Anything we cannot parse
-   we return unmodified.   */
-char *
-canonicalize_spec (const char *path)
-{
-       char *res;
-
-       if (!path)
-               return NULL;
-       if (nocanonicalize || is_pseudo_fs(path))
-               return xstrdup(path);
-
-       res = canonicalize_path(path);
-       if (!res)
-               die(EX_SYSERR, _("not enough memory"));
-       return res;
-}
-
-char *canonicalize (const char *path)
-{
-       char *res;
-
-       if (!path)
-               return NULL;
-       else if (nocanonicalize)
-               return xstrdup(path);
-
-       res = canonicalize_path(path);
-       if (!res)
-               die(EX_SYSERR, _("not enough memory"));
-       return res;
-}
diff --git a/mount-deprecated/sundries.h b/mount-deprecated/sundries.h
deleted file mode 100644 (file)
index 428d4a2..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * sundries.h
- * Support function prototypes.  Functions are in sundries.c.
- */
-#ifndef SUNDRIES_H
-#define SUNDRIES_H
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#define XALLOC_EXIT_CODE 2 /* same as EX_SYSERR, for backwards compatibility */
-#include "xalloc.h"
-
-/* global mount, umount, and losetup variables */
-extern int mount_quiet;
-extern int verbose;
-extern int nocanonicalize;
-extern char *progname;
-
-#define streq(s, t)    (strcmp ((s), (t)) == 0)
-#define my_free(_p)  free((void *) _p)
-
-void block_signals (int how);
-
-void error (const char *fmt, ...)
-       __attribute__ ((__format__ (__printf__, 1, 2)));
-void die(int err, const char *fmt, ...)
-       __attribute__ ((__format__ (__printf__, 2, 3)));
-
-int matching_type (const char *type, const char *types);
-int matching_opts (const char *options, const char *test_opts);
-char *xstrconcat3 (char *, const char *, const char *);
-char *xstrconcat4 (char *, const char *, const char *, const char *);
-
-int is_pseudo_fs(const char *type);
-
-char *canonicalize (const char *path);
-char *canonicalize_spec (const char *path);
-
-/* exit status - bits below are ORed */
-#define EX_USAGE       1       /* incorrect invocation or permission */
-#define EX_SYSERR      2       /* out of memory, cannot fork, ... */
-#define EX_SOFTWARE    4       /* internal mount bug or wrong version */
-#define EX_USER                8       /* user interrupt */
-#define EX_FILEIO      16      /* problems writing, locking, ... mtab/fstab */
-#define EX_FAIL               32       /* mount failure */
-#define EX_SOMEOK      64      /* some mount succeeded */
-
-#endif /* SUNDRIES_H */
diff --git a/mount-deprecated/umount.8 b/mount-deprecated/umount.8
deleted file mode 100644 (file)
index 4cbddc5..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-.\" Copyright (c) 1996 Andries Brouwer
-.\" This page is somewhat derived from a page that was
-.\" (c) 1980, 1989, 1991 The Regents of the University of California
-.\" and had been heavily modified by Rik Faith and myself.
-.\"
-.\" This is free documentation; you can redistribute it and/or
-.\" modify it under the terms of the GNU General Public License as
-.\" published by the Free Software Foundation; either version 2 of
-.\" the License, or (at your option) any later version.
-.\"
-.\" The GNU General Public License's references to "object code"
-.\" and "executables" are to be interpreted as the output of any
-.\" document formatting or typesetting system, including
-.\" intermediate and printed output.
-.\"
-.\" This manual is distributed in the hope that it will be useful,
-.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\" GNU General Public License for more details.
-.\"
-.\" You should have received a copy of the GNU General Public License along
-.\" with this program; if not, write to the Free Software Foundation, Inc.,
-.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-.\"
-.TH UMOUNT 8 "March 2010" "util-linux" "System Administration"
-.SH NAME
-umount \- unmount file systems
-.SH SYNOPSIS
-.B umount
-.RB [ \-hV ]
-.LP
-.B umount \-a
-.RB [ \-dflnrv ]
-.RB [ \-t
-.IR vfstype ]
-.RB [ \-O
-.IR options ]
-.br
-.B umount
-.RB [ \-dflnrv ]
-.RI { dir | device }...
-.SH DESCRIPTION
-The
-.B umount
-command detaches the file system(s) mentioned from the file hierarchy.
-A file system is specified by giving the directory where it
-has been mounted. Giving the special device on which the file system lives
-may also work, but is obsolete, mainly because it will fail
-in case this device was mounted on more than one directory.
-
-Note that a file system cannot be unmounted when it is `busy' -
-for example, when there are open files on it, or when some process
-has its working directory there, or when a swap file on it is in use.
-The offending process could even be
-.B umount
-itself - it opens libc, and libc in its turn may open for example
-locale files.
-A lazy unmount avoids this problem.
-
-Options for the
-.B umount
-command:
-.TP
-.B \-V
-Print version and exit.
-.TP
-.B \-h
-Print help message and exit.
-.TP
-.B \-v
-Verbose mode.
-.TP
-.B \-n
-Unmount without writing in
-.IR /etc/mtab .
-.TP
-.B \-r
-In case unmounting fails, try to remount read-only.
-.TP
-.B \-d
-In case the unmounted device was a loop device, also
-free this loop device.
-.TP
-.B \-i
-Don't call the /sbin/umount.<filesystem> helper even if it exists. By default /sbin/umount.<filesystem> helper is called if one exists.
-.TP
-.B \-a
-All of the file systems described in
-.I /etc/mtab
-are unmounted. (With
-.B umount
-version 2.7 and later: the
-.I proc
-filesystem is not unmounted.)
-.TP
-.BI \-t " vfstype"
-Indicate that the actions should only be taken on file systems of the
-specified type.  More than one type may be specified in a comma separated
-list.  The list of file system types can be prefixed with
-.B no
-to specify the file system types on which no action should be taken.
-.TP
-.BI \-O " options"
-Indicate that the actions should only be taken on file systems with
-the specified options in
-.IR /etc/fstab .
-More than one option type may be specified in a comma separated
-list.  Each option can be prefixed with
-.B no
-to specify options for which no action should be taken.
-.TP
-.B \-f
-Force unmount (in case of an unreachable NFS system).
-(Requires kernel 2.1.116 or later.)
-.TP
-.B \-l
-Lazy unmount. Detach the filesystem from the filesystem hierarchy now,
-and cleanup all references to the filesystem as soon as it is not busy
-anymore.
-(Requires kernel 2.4.11 or later.)
-.IP "\fB\-\-no\-canonicalize\fP"
-Don't canonicalize paths. For more details about this option see the
-.BR mount (8)
-man page.
-.IP "\fB\-\-fake\fP"
-Causes everything to be done except for the actual system call; this
-``fakes'' unmounting the filesystem.  It can  be used to remove
-entries from
-.I /etc/mtab
-that were unmounted earlier with the -n option.
-
-.SH "THE LOOP DEVICE"
-The
-.B umount
-command will free the loop device (if any) associated
-with the mount, in case it finds the option `loop=...' in
-.IR /etc/mtab ,
-or when the \-d option was given.
-Any pending loop devices can be freed using `losetup -d', see
-.BR losetup (8).
-
-.SH NOTES
-The syntax of external umount helpers is:
-
-.br
-.BI /sbin/umount. <suffix>
-.RI { dir | device }
-.RB [ \-nlfvr ]
-.RB [ \-t
-.IR type.subtype ]
-.br
-
-where the <suffix> is filesystem type or a value from "uhelper=" or "helper="
-mtab option.  The \-t option is used  for filesystems with subtypes support
-(for example /sbin/mount.fuse -t fuse.sshfs).
-
-The uhelper= (unprivileged umount helper) is possible to use when non-root user
-wants to umount a mountpoint which is not defined in the /etc/fstab file (e.g
-devices mounted by udisk).
-
-The helper= mount option redirects all umount requests to the
-/sbin/umount.<helper> independently on UID.
-
-.SH FILES
-.I /etc/mtab
-table of mounted file systems
-
-.SH "SEE ALSO"
-.BR umount (2),
-.BR mount (8),
-.BR losetup (8).
-
-.SH HISTORY
-A
-.B umount
-command appeared in Version 6 AT&T UNIX.
-.SH AVAILABILITY
-The umount command is part of the util-linux package and is available from
-ftp://ftp.kernel.org/pub/linux/utils/util-linux/.
diff --git a/mount-deprecated/umount.c b/mount-deprecated/umount.c
deleted file mode 100644 (file)
index 97a7681..0000000
+++ /dev/null
@@ -1,867 +0,0 @@
-/*
- * umount(8) for Linux 0.99 - jrs, 1993
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <sys/mount.h>
-
-#include "mount_constants.h"
-#include "sundries.h"
-#include "getusername.h"
-#include "pathnames.h"
-#include "loopdev.h"
-#include "fstab.h"
-#include "env.h"
-#include "nls.h"
-#include "strutils.h"
-#include "closestream.h"
-
-#if defined(MNT_FORCE)
-/* Interesting ... it seems libc knows about MNT_FORCE and presumably
-   about umount2 as well -- need not do anything */
-#else /* MNT_FORCE */
-
-/* Does the present kernel source know about umount2? */
-#include <linux/unistd.h>
-#ifdef __NR_umount2
-
-static int umount2(const char *path, int flags);
-
-_syscall2(int, umount2, const char *, path, int, flags);
-
-#else /* __NR_umount2 */
-
-static int
-umount2(const char *path, int flags) {
-       fprintf(stderr, _("umount: compiled without support for -f\n"));
-       errno = ENOSYS;
-       return -1;
-}
-#endif /* __NR_umount2 */
-
-#ifndef MNT_FORCE
-# define MNT_FORCE        0x00000001   /* Attempt to forcibily umount */
-#endif
-
-#endif /* MNT_FORCE */
-
-#ifndef MNT_DETACH
-# define MNT_DETACH       0x00000002   /* Just detach from the tree */
-#endif
-
-#ifndef UMOUNT_NOFOLLOW
-# define UMOUNT_NOFOLLOW  0x00000008   /* Don't follow symlink on umount */
-#endif
-
-#ifndef UMOUNT_UNUSED
-# define UMOUNT_UNUSED    0x80000000   /* Flag guaranteed to be unused */
-#endif
-
-
-/* True if we are allowed to call /sbin/umount.${FSTYPE} */
-int external_allowed = 1;
-
-/* Nonzero for force umount (-f).  There is kernel support since 2.1.116.  */
-int force = 0;
-
-/* Nonzero for lazy umount (-l).  There is kernel support since 2.4.11.  */
-int lazy = 0;
-
-/* When umount fails, attempt a read-only remount (-r). */
-int remount = 0;
-
-/* Don't write a entry in /etc/mtab (-n).  */
-int nomtab = 0;
-
-/* Call losetup -d for each unmounted loop device. */
-int delloop = 0;
-
-/* True if (ruid != euid) or (0 != ruid), i.e. only "user" umounts permitted. */
-int restricted = 1;
-
-/* Last error message */
-int complained_err = 0;
-char *complained_dev = NULL;
-
-/* True for fake umount (--fake).  */
-static int fake = 0;
-
-/*
- * check_special_umountprog()
- *     If there is a special umount program for this type, exec it.
- * returns: 0: no exec was done, 1: exec was done, status has result
- */
-static int
-check_special_umountprog(const char *node,
-                        const char *type, int *status) {
-       char search_path[] = FS_SEARCH_PATH;
-       char *path, umountprog[150];
-       struct stat statbuf;
-       int res;
-
-       if (!external_allowed)
-               return 0;
-
-       if (type == NULL || strcmp(type, "none") == 0)
-               return 0;
-
-       path = strtok(search_path, ":");
-       while (path) {
-               int type_opt = 0;
-
-               res = snprintf(umountprog, sizeof(umountprog), "%s/umount.%s",
-                              path, type);
-               path = strtok(NULL, ":");
-               if (res < 0 || (size_t) res >= sizeof(umountprog))
-                       continue;
-
-               res = stat(umountprog, &statbuf);
-               if (res == -1 && errno == ENOENT && strchr(type, '.')) {
-                       /* If type ends with ".subtype" try without it */
-                       *strrchr(umountprog, '.') = '\0';
-                       type_opt = 1;
-                       res = stat(umountprog, &statbuf);
-               }
-               if (res == 0) {
-                       res = fork();
-                       if (res == 0) {
-                               char *umountargs[10];
-                               int i = 0;
-
-                               if(setgid(getgid()) < 0)
-                                       die(EX_FAIL, _("umount: cannot set group id: %m"));
-
-                               if(setuid(getuid()) < 0)
-                                       die(EX_FAIL, _("umount: cannot set user id: %m"));
-
-                               umountargs[i++] = umountprog;
-                               umountargs[i++] = xstrdup(node);
-                               if (nomtab)
-                                       umountargs[i++] = "-n";
-                               if (lazy)
-                                       umountargs[i++] = "-l";
-                               if (force)
-                                       umountargs[i++] = "-f";
-                               if (verbose)
-                                       umountargs[i++] = "-v";
-                               if (remount)
-                                       umountargs[i++] = "-r";
-                               if (type_opt) {
-                                       umountargs[i++] = "-t";
-                                       umountargs[i++] = (char *) type;
-                               }
-                               umountargs[i] = NULL;
-                               execv(umountprog, umountargs);
-                               exit(1);        /* exec failed */
-                       } else if (res != -1) {
-                               int st;
-                               wait(&st);
-                               *status = (WIFEXITED(st) ? WEXITSTATUS(st)
-                                          : EX_SYSERR);
-                               return 1;
-                       } else {
-                               int errsv = errno;
-                               error(_("umount: cannot fork: %s"),
-                                     strerror(errsv));
-                       }
-               }
-       }
-       return 0;
-}
-
-/* complain about a failed umount */
-static void complain(int err, const char *dev) {
-
-  if (complained_err == err && complained_dev && dev &&
-                 strcmp(dev, complained_dev) == 0)
-    return;
-
-  complained_err = err;
-  free(complained_dev);
-  complained_dev = xstrdup(dev);
-
-  switch (err) {
-    case ENXIO:
-      error (_("umount: %s: invalid block device"), dev); break;
-    case EINVAL:
-      error (_("umount: %s: not mounted"), dev); break;
-    case EIO:
-      error (_("umount: %s: can't write superblock"), dev); break;
-    case EBUSY:
-     /* Let us hope fstab has a line "proc /proc ..."
-       and not "none /proc ..."*/
-      error (_("umount: %s: device is busy.\n"
-              "        (In some cases useful info about processes that use\n"
-              "         the device is found by lsof(8) or fuser(1))"), dev);
-      break;
-    case ENOENT:
-      error (_("umount: %s: not found"), dev); break;
-    case EPERM:
-      error (_("umount: %s: must be superuser to umount"), dev); break;
-    case EACCES:
-      error (_("umount: %s: block devices not permitted on fs"), dev); break;
-    default:
-      error (_("umount: %s: %s"), dev, strerror (err)); break;
-  }
-}
-
-/* Check whether the kernel supports UMOUNT_NOFOLLOW flag */
-static int umount_nofollow_support(void)
-{
-       int res = umount2("", UMOUNT_UNUSED);
-       if (res != -1 || errno != EINVAL)
-               return 0;
-
-       res = umount2("", UMOUNT_NOFOLLOW);
-       if (res != -1 || errno != ENOENT)
-               return 0;
-
-       return 1;
-}
-
-static const char *chdir_to_parent(const char *node, char **resbuf)
-{
-       char *tmp, *res;
-       const char *parent;
-       char buf[65536];
-
-       *resbuf = xstrdup(node);
-
-       tmp = strrchr(*resbuf, '/');
-       if (!tmp)
-               die (2, _("umount: internal error: invalid abs path: %s"), node);
-
-       if (tmp != *resbuf) {
-               *tmp = '\0';
-               res = tmp + 1;
-               parent = *resbuf;
-       } else if (tmp[1] != '\0') {
-               res = tmp + 1;
-               parent = "/";
-       } else {
-               res = ".";
-               parent = "/";
-       }
-
-       if (chdir(parent) == -1)
-               die (2, _("umount: failed to chdir to %s: %m"), parent);
-
-       if (!getcwd(buf, sizeof(buf)))
-               die (2, _("umount: failed to obtain current directory: %m"));
-
-       if (strcmp(buf, parent) != 0)
-               die (2, _("umount: mountpoint moved (%s -> %s)"), parent, buf);
-
-       if (verbose)
-               printf(_("current directory moved to %s\n"), res);
-
-       return res;
-}
-
-/* Umount a single device.  Return a status code, so don't exit
-   on a non-fatal error.  We lock/unlock around each umount.  */
-static int
-umount_one (const char *spec, const char *node, const char *type,
-           struct mntentchn *mc) {
-       int umnt_err = 0;
-       int isroot;
-       int res = 0;
-       int status;
-       int extra_flags = 0;
-       const char *loopdev, *target = node;
-       char *targetbuf = NULL;
-
-       /* Special case for root.  As of 0.99pl10 we can (almost) unmount root;
-          the kernel will remount it readonly so that we can carry on running
-          afterwards.  The readonly remount is illegal if any files are opened
-          for writing at the time, so we can't update mtab for an unmount of
-          root.  As it is only really a remount, this doesn't matter too
-          much.  [sct May 29, 1993] */
-       isroot = (streq (node, "/") || streq (node, "root")
-                 || streq (node, "rootfs"));
-       if (isroot)
-               nomtab++;
-
-       /*
-        * Call umount.TYPE for types that require a separate umount program.
-        * All such special things must occur isolated in the types string.
-        */
-       if (check_special_umountprog(node, type, &status))
-               return status;
-
-       block_signals(SIG_BLOCK);
-
-       /* Skip the actual umounting for --fake */
-       if (fake)
-               goto writemtab;
-
-       if (restricted) {
-               if (umount_nofollow_support())
-                       extra_flags |= UMOUNT_NOFOLLOW;
-
-               /* call umount(2) with relative path to avoid races */
-               target = chdir_to_parent(node, &targetbuf);
-       }
-
-       if (lazy) {
-               res = umount2 (target, MNT_DETACH | extra_flags);
-               if (res < 0)
-                       umnt_err = errno;
-               goto writemtab;
-       }
-
-       if (force) {            /* only supported for NFS */
-               res = umount2 (target, MNT_FORCE | extra_flags);
-               if (res == -1) {
-                       int errsv = errno;
-                       perror("umount2");
-                       errno = errsv;
-                       if (errno == ENOSYS) {
-                               if (verbose)
-                                       printf(_("no umount2, trying umount...\n"));
-                               res = umount (target);
-                       }
-               }
-       } else if (extra_flags)
-               res = umount2 (target, extra_flags);
-       else
-               res = umount (target);
-
-       free(targetbuf);
-
-       if (res < 0)
-               umnt_err = errno;
-
-       if (res < 0 && remount && umnt_err == EBUSY) {
-               /* Umount failed - let us try a remount */
-               res = mount(spec, node, NULL,
-                           MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL);
-               if (res == 0) {
-                       fprintf(stderr,
-                               _("umount: %s busy - remounted read-only\n"),
-                               spec);
-                       if (mc && !nomtab) {
-                               /* update mtab if the entry is there */
-                               struct my_mntent remnt;
-                               remnt.mnt_fsname = mc->m.mnt_fsname;
-                               remnt.mnt_dir = mc->m.mnt_dir;
-                               remnt.mnt_type = mc->m.mnt_type;
-                               remnt.mnt_opts = "ro";
-                               remnt.mnt_freq = 0;
-                               remnt.mnt_passno = 0;
-                               update_mtab(node, &remnt);
-                       }
-                       block_signals(SIG_UNBLOCK);
-                       return 0;
-               } else if (errno != EBUSY) {    /* hmm ... */
-                       perror("remount");
-                       fprintf(stderr,
-                               _("umount: could not remount %s read-only\n"),
-                               spec);
-               }
-       }
-
-       loopdev = 0;
-       if (res >= 0) {
-               /* Umount succeeded */
-               if (verbose)
-                       printf (_("%s has been unmounted\n"), spec);
-
-               /* Free any loop devices that we allocated ourselves */
-               if (mc) {
-                       char *optl;
-
-                       /* old style mtab line? */
-                       if (streq(mc->m.mnt_type, "loop")) {
-                               loopdev = spec;
-                               goto gotloop;
-                       }
-
-                       /* new style mtab line? */
-                       optl = mc->m.mnt_opts ? xstrdup(mc->m.mnt_opts) : "";
-                       for (optl = strtok (optl, ","); optl;
-                            optl = strtok (NULL, ",")) {
-                               if (!strncmp(optl, "loop=", 5)) {
-                                       loopdev = optl+5;
-                                       goto gotloop;
-                               }
-                       }
-               } else {
-                       /*
-                        * If option "-o loop=spec" occurs in mtab,
-                        * note the mount point, and delete mtab line.
-                        */
-                       if ((mc = getmntoptfile (spec)) != NULL)
-                               node = mc->m.mnt_dir;
-               }
-
-               /* Also free loop devices when -d flag is given */
-               if (delloop)
-                       loopdev = spec;
-       }
- gotloop:
-       if (loopdev) {
-               struct loopdev_cxt lc;
-
-               loopcxt_init(&lc, 0);
-               loopcxt_set_device(&lc, loopdev);
-
-               if (loopcxt_get_backing_file(&lc)
-                   && loopcxt_is_autoclear(&lc) == 0)
-                       loopcxt_delete_device(&lc);
-               loopcxt_deinit(&lc);
-       }
-
- writemtab:
-       if (!nomtab &&
-           (umnt_err == 0 || umnt_err == EINVAL || umnt_err == ENOENT)) {
-
-               update_mtab (node, NULL);
-       }
-
-       block_signals(SIG_UNBLOCK);
-
-       if (res >= 0)
-               return 0;
-       if (umnt_err)
-               complain(umnt_err, node);
-       return 1;
-}
-
-/*
- * umount_one_bw: unmount FILE that has last occurrence MC0
- *
- * Why this loop?
- * 1. People who boot a system with a bad fstab root entry
- *    will get an incorrect "/dev/foo on /" in mtab.
- *    If later /dev/foo is actually mounted elsewhere,
- *    it will occur twice in mtab.
- * 2. With overmounting one can get the situation that
- *    the same filename is used as mount point twice.
- * In both cases, it is best to try the last occurrence first.
- */
-static int
-umount_one_bw (const char *file, struct mntentchn *mc0) {
-       struct mntentchn *mc;
-       int res = 1;
-
-       mc = mc0;
-       while (res && mc) {
-               res = umount_one(mc->m.mnt_fsname, mc->m.mnt_dir,
-                                mc->m.mnt_type, mc);
-               mc = getmntdirbackward(file, mc);
-       }
-       mc = mc0;
-       while (res && mc) {
-               res = umount_one(mc->m.mnt_fsname, mc->m.mnt_dir,
-                                mc->m.mnt_type, mc);
-               mc = getmntdevbackward(file, mc);
-       }
-       return res;
-}
-
-/* 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);
-         }
-     }
-
-     return errors;
-}
-
-static struct option longopts[] =
-{
-  { "all", 0, 0, 'a' },
-  { "force", 0, 0, 'f' },
-  { "help", 0, 0, 'h' },
-  { "no-mtab", 0, 0, 'n' },
-  { "test-opts", 1, 0, 'O' },
-  { "verbose", 0, 0, 'v' },
-  { "version", 0, 0, 'V' },
-  { "read-only", 0, 0, 'r' },
-  { "types", 1, 0, 't' },
-
-  { "no-canonicalize", 0, 0, 144 },
-  { "fake", 0, 0, 145 },
-  { NULL, 0, 0, 0 }
-};
-
-static void
-usage (FILE *fp, int n)
-{
-  fprintf (fp, _("Usage: umount -h | -V\n"
-              "       umount -a [-d] [-f] [-r] [-n] [-v] [-t vfstypes] [-O opts]\n"
-              "       umount [-d] [-f] [-r] [-n] [-v] special | node...\n"));
-  exit (n);
-}
-
-/*
- * Look for an option in a comma-separated list
- */
-static int
-contains(const char *list, const char *s) {
-       int n = strlen(s);
-
-       while (list && *list) {
-               if (strncmp(list, s, n) == 0 &&
-                   (list[n] == 0 || list[n] == ','))
-                       return 1;
-               while (*list && *list++ != ',') ;
-       }
-       return 0;
-}
-
-/* check if @mc contains a loop device which is associated
- * with the @file in fs
- */
-static int
-is_valid_loop(struct mntentchn *mc, struct mntentchn *fs)
-{
-       uintmax_t offset = 0;
-       char *p;
-
-       /* check if it begins with /dev/loop */
-       if (strncmp(mc->m.mnt_fsname, _PATH_DEV_LOOP,
-                               sizeof(_PATH_DEV_LOOP) - 1))
-               return 0;
-
-       /* check for loop option in fstab */
-       if (!contains(fs->m.mnt_opts, "loop"))
-               return 0;
-
-       /* check for offset option in fstab */
-       p = get_option_value(fs->m.mnt_opts, "offset=");
-       if (p && strtosize(p, &offset)) {
-               if (verbose > 1)
-                       printf(_("failed to parse 'offset=%s' options\n"), p);
-               return 0;
-       }
-
-       /* check association */
-       if (loopdev_is_used((char *) mc->m.mnt_fsname, fs->m.mnt_fsname,
-                               offset, LOOPDEV_FL_OFFSET) == 1) {
-               if (verbose > 1)
-                       printf(_("device %s is associated with %s\n"),
-                              mc->m.mnt_fsname, fs->m.mnt_fsname);
-               return 1;
-       }
-
-       if (verbose > 1)
-               printf(_("device %s is not associated with %s\n"),
-                      mc->m.mnt_fsname, fs->m.mnt_fsname);
-       return 0;
-}
-
-/*
- * umount helper call based on {u,p}helper= mount option
- */
-static int check_helper_umountprog(const char *node,
-                                  const char *opts, const char *name,
-                                  int *status)
-{
-       char *helper;
-
-       if (!external_allowed || !opts)
-               return 0;
-
-       helper = get_option_value(opts, name);
-       if (helper)
-               return check_special_umountprog(node, helper, status);
-
-       return 0;
-}
-
-static int
-umount_file (char *arg) {
-       struct mntentchn *mc, *fs;
-       const char *file, *options;
-       int fstab_has_user, fstab_has_users, fstab_has_owner, fstab_has_group;
-       int ok, status = 0;
-       struct stat statbuf;
-       char *loopdev = NULL;
-
-       if (!*arg) {            /* "" would be expanded to `pwd` */
-               die(2, _("Cannot unmount \"\"\n"));
-               return 0;
-       }
-
-       file = canonicalize(arg); /* mtab paths are canonicalized */
-
-try_loopdev:
-       if (verbose > 1)
-               printf(_("Trying to unmount %s\n"), file);
-
-       mc = getmntdirbackward(file, NULL);
-       if (!mc) {
-               mc = getmntdevbackward(file, NULL);
-               if (mc) {
-                       struct mntentchn *mc1;
-                       char *cn;
-
-                       mc1 = getmntdirbackward(mc->m.mnt_dir, NULL);
-                       if (!mc1)
-                               /* 'mc1' must exist, though not necessarily
-                                   equals to `mc'. Otherwise we go mad. */
-                               die(EX_SOFTWARE,
-                                   _("umount: confused when analyzing mtab"));
-
-                       cn = canonicalize(mc1->m.mnt_fsname);
-                       if (cn && strcmp(file, cn)) {
-                               /* Something was stacked over `file' on the
-                                  same mount point. */
-                               die(EX_FAIL, _("umount: cannot unmount %s -- %s is "
-                                   "mounted over it on the same point"),
-                                   file, mc1->m.mnt_fsname);
-                       }
-                       free(cn);
-               }
-       }
-       if (!mc && verbose)
-               printf(_("Could not find %s in mtab\n"), file);
-
-       /* not found in mtab - check if it is associated with some loop device
-        * (only if it is a regular file)
-        */
-       if (!mc && !loopdev && !stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
-               int count = loopdev_count_by_backing_file(file, &loopdev);
-
-               if (count == 1) {
-                       if (verbose)
-                               printf(_("%s is associated with %s\n"),
-                                      arg, loopdev);
-                       file = loopdev;
-                       goto try_loopdev;
-
-               } else if (count > 1)
-                       fprintf(stderr, _("umount: warning: %s is associated "
-                               "with more than one loop device\n"), arg);
-       }
-
-       if (mc) {
-               /*
-                * helper - umount helper (e.g. pam_mount)
-                */
-                if (check_helper_umountprog(arg, mc->m.mnt_opts,
-                                           "helper=", &status))
-                       return status;
-       }
-
-       if (restricted) {
-               char *mtab_user = NULL;
-
-               if (!mc)
-                       die(2,
-                           _("umount: %s is not mounted (according to mtab)"),
-                           file);
-               /*
-                * uhelper - unprivileged umount helper (e.g. HAL/udisks mounts)
-                */
-               if (check_helper_umountprog(arg, mc->m.mnt_opts,
-                                           "uhelper=", &status))
-                       return status;
-
-               /* The 2.4 kernel will generally refuse to mount the same
-                  filesystem on the same mount point, but will accept NFS.
-                  So, unmounting must be possible. */
-               if (!is_mounted_once(file) && strcmp(mc->m.mnt_type,"nfs"))
-                       die(2,
-                           _("umount: it seems %s is mounted multiple times"),
-                           file);
-
-               /* If fstab contains the two lines
-                  /dev/sda1 /mnt/zip auto user,noauto  0 0
-                  /dev/sda4 /mnt/zip auto user,noauto  0 0
-                  then "mount /dev/sda4" followed by "umount /mnt/zip"
-                  used to fail. So, we must not look for file, but for
-                  the pair (dev,file) in fstab. */
-               fs = getfs_by_devdir(mc->m.mnt_fsname, mc->m.mnt_dir);
-               if (!fs) {
-                       fs = getfs_by_dir(file);
-                       if (!fs && !getfs_by_spec(file))
-                               die (2,
-                                    _("umount: %s is not in the fstab "
-                                      "(and you are not root)"),
-                                    file);
-
-                       /* spec could be a file which is loop mounted */
-                       if (!fs || !is_valid_loop(mc, fs))
-                               die (2, _("umount: %s mount disagrees with "
-                                         "the fstab"), file);
-               }
-
-               /*
-                * User mounting and unmounting is allowed only
-                * if fstab contains one of the options `user',
-                * `users' or `owner' or `group'.
-                *
-                * The option `users' allows arbitrary users to mount
-                * and unmount - this may be a security risk.
-                *
-                * The options `user', `owner' and `group' only allow
-                * unmounting by the user that mounted (visible in mtab).
-                */
-
-               options = fs->m.mnt_opts;
-               if (!options)
-                       options = "";
-               fstab_has_user = contains(options, "user");
-               fstab_has_users = contains(options, "users");
-               fstab_has_owner = contains(options, "owner");
-               fstab_has_group = contains(options, "group");
-               ok = 0;
-
-               if (fstab_has_users)
-                       ok = 1;
-
-               if (!ok && (fstab_has_user || fstab_has_owner ||
-                           fstab_has_group)) {
-                       char *user = getusername();
-
-                       options = mc->m.mnt_opts;
-                       if (!options)
-                               options = "";
-                       mtab_user = get_option_value(options, "user=");
-
-                       if (user && mtab_user && streq (user, mtab_user))
-                               ok = 1;
-               }
-               if (!ok)
-                       die (2, _("umount: only %s can unmount %s from %s"),
-                            mtab_user ? mtab_user : "root",
-                            fs->m.mnt_fsname, fs->m.mnt_dir);
-
-       }
-
-       if (mc)
-               return umount_one_bw (file, mc);
-       else
-               return umount_one (arg, arg, arg, NULL);
-}
-
-int
-main (int argc, char *argv[]) {
-       int c;
-       int all = 0;
-       char *types = NULL, *test_opts = NULL, *p;
-       int result = 0;
-
-       sanitize_env();
-       setlocale(LC_ALL, "");
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
-       atexit(close_stdout);
-
-       progname = argv[0];
-       if ((p = strrchr(progname, '/')) != NULL)
-               progname = p+1;
-
-       umask(022);
-
-       while ((c = getopt_long (argc, argv, "adfhlnrit:O:vV",
-                                longopts, NULL)) != -1)
-               switch (c) {
-               case 'a':               /* umount everything */
-                       ++all;
-                       break;
-                       /* fall through? */
-               case 'd':               /* do losetup -d for unmounted loop devices */
-                       ++delloop;
-                       break;
-               case 'f':               /* force umount */
-                       ++force;
-                       break;
-               case 'h':               /* help */
-                       usage (stdout, 0);
-                       break;
-               case 'l':               /* lazy umount */
-                       ++lazy;
-                       break;
-               case 'n':               /* do not write in /etc/mtab */
-                       ++nomtab;
-                       break;
-               case 'O':               /* specify file system options */
-                       test_opts = optarg;
-                       break;
-               case 'r':               /* remount read-only if umount fails */
-                       ++remount;
-                       break;
-               case 'v':               /* make noise */
-                       ++verbose;
-                       break;
-               case 'V':               /* version */
-                       printf(UTIL_LINUX_VERSION);
-                       exit (0);
-               case 't':               /* specify file system type */
-                       types = optarg;
-                       break;
-               case 'i':
-                       external_allowed = 0;
-                       break;
-               case 144:
-                       nocanonicalize = 1;
-                       break;
-               case 145:
-                       fake = 1;
-                       break;
-               case 0:
-                       break;
-               case '?':
-               default:
-                       usage (stderr, 1);
-               }
-
-       {
-               const uid_t ruid = getuid();
-               const uid_t euid = geteuid();
-
-               /* if we're really root and aren't running setuid */
-               if (((uid_t)0 == ruid) && (ruid == euid)) {
-                       restricted = 0;
-               }
-       }
-
-       if (restricted &&
-           (all || types || nomtab || force || remount || nocanonicalize ||
-            fake)) {
-               die (2, _("umount: only root can do that"));
-       }
-
-       argc -= optind;
-       argv += optind;
-
-       atexit(unlock_mtab);
-
-       if (all) {
-               /* nodev stuff: sysfs, usbfs, oprofilefs, ... */
-               if (types == NULL)
-                       types = "noproc,nodevfs,nodevpts,nosysfs,norpc_pipefs,nonfsd";
-               result = umount_all (types, test_opts);
-       } else if (argc < 1) {
-               usage (stderr, 2);
-       } else while (argc--) {
-               result += umount_file(*argv++);
-       }
-       exit (result);          /* nonzero on at least one failure */
-}
diff --git a/tests/expected/build-sys/config-old-mount b/tests/expected/build-sys/config-old-mount
deleted file mode 100644 (file)
index a9f2d60..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-blkid:  libblkid libuuid 
-cfdisk:  libblkid libncursesw libtinfo libuuid 
-eject:  libblkid libmount libuuid 
-fdisk:  libblkid libuuid 
-findfs:  libblkid libuuid 
-findmnt:  libblkid libmount libudev libuuid 
-fsck:  libblkid libmount libuuid 
-fstrim:  libblkid libmount libuuid 
-libblkid.so.1.1.0:  libuuid 
-libmount.so.1.1.0:  libblkid libuuid 
-libuuid.so.1.3.0:  
-lsblk:  libblkid libmount libudev libuuid 
-lslocks:  libblkid libmount libuuid 
-mkswap:  libblkid libuuid 
-mount:  libblkid libuuid 
-mountpoint:  libblkid libmount libuuid 
-partx:  libblkid libuuid 
-swaplabel:  libblkid libuuid 
-swapoff:  libblkid libmount libuuid 
-swapon:  libblkid libmount libuuid 
-umount:  libblkid libuuid 
-uuidd:  libuuid 
-uuidgen:  libuuid 
-wipefs:  libblkid libuuid 
-addpart:  
-agetty:  
-blkdiscard:  
-blockdev:  
-cal:  libncursesw libtinfo 
-chcpu:  
-chrt:  
-col:  
-colcrt:  
-colrm:  
-column:  
-ctrlaltdel:  
-cytune:  
-delpart:  
-dmesg:  librt 
-fallocate:  
-fdformat:  
-flock:  
-fsck.cramfs:  libz 
-fsck.minix:  
-fsfreeze:  
-getopt:  
-hexdump:  
-hwclock:  
-ionice:  
-ipcmk:  
-ipcrm:  
-ipcs:  
-isosize:  
-kill:  
-last:  
-ldattach:  
-logger:  
-login:  libpam libpam_misc 
-look:  
-losetup:  
-lscpu:  
-mcookie:  
-mesg:  
-mkfs:  
-mkfs.bfs:  
-mkfs.cramfs:  libz 
-mkfs.minix:  
-more:  libtinfo 
-namei:  
-nologin:  
-nsenter:  
-pg:  libncursesw libtinfo 
-pivot_root:  
-prlimit:  
-raw:  
-readprofile:  
-rename:  
-renice:  
-resizepart:  
-rev:  
-rtcwake:  
-runuser:  libpam libpam_misc 
-script:  libutil 
-scriptreplay:  
-setarch:  
-setpriv:  ap-ng 
-setsid:  
-setterm:  libtinfo 
-sfdisk:  
-su:  libpam libpam_misc 
-sulogin:  rypt 
-switch_root:  
-tailf:  
-taskset:  
-ul:  libtinfo 
-unshare:  
-utmpdump:  
-wall:  
-wdctl:  
-whereis:  
index c0716de2bd2f5cfbb38153363607bd69e85a3e09..f234a289ee0e89c1d6955ce52b6cd0593d464dfc 100755 (executable)
@@ -58,25 +58,19 @@ mkfs.ext3 $DEVICE &> /dev/null || ts_die "Cannot make ext3 on $DEVICE" $DEVICE
 ts_device_has "TYPE" "ext3" $DEVICE || ts_die "Cannot find ext3 on $DEVICE" $DEVICE
 
 
-# multiple propagation flags for one mount(8) call is unsupported
-# by old mount-deprecated/mount
-$TS_CMD_MOUNT -V | grep -q libmount
-if [ $? -eq 0 ]; then
-
-       ts_init_subtest "mount-private"
-       $TS_CMD_MOUNT --make-private --make-unbindable \
-                     $DEVICE $MOUNTPOINT >> $TS_OUTPUT 2>&1
-       $TS_CMD_FINDMNT -nr --target $MOUNTPOINT -o PROPAGATION >> $TS_OUTPUT
-       $TS_CMD_UMOUNT $MOUNTPOINT
-       ts_finalize_subtest
-
-       ts_init_subtest "mount-private-ro"
-       $TS_CMD_MOUNT $DEVICE $MOUNTPOINT -o ro,private >> $TS_OUTPUT 2>&1
-       $TS_CMD_FINDMNT -nr --target $MOUNTPOINT -o PROPAGATION >> $TS_OUTPUT
-       $TS_CMD_FINDMNT -nr --target $MOUNTPOINT -o VFS-OPTIONS >> $TS_OUTPUT
-       $TS_CMD_UMOUNT $MOUNTPOINT
-       ts_finalize_subtest
-fi
+ts_init_subtest "mount-private"
+$TS_CMD_MOUNT --make-private --make-unbindable \
+             $DEVICE $MOUNTPOINT >> $TS_OUTPUT 2>&1
+$TS_CMD_FINDMNT -nr --target $MOUNTPOINT -o PROPAGATION >> $TS_OUTPUT
+$TS_CMD_UMOUNT $MOUNTPOINT
+ts_finalize_subtest
+
+ts_init_subtest "mount-private-ro"
+$TS_CMD_MOUNT $DEVICE $MOUNTPOINT -o ro,private >> $TS_OUTPUT 2>&1
+$TS_CMD_FINDMNT -nr --target $MOUNTPOINT -o PROPAGATION >> $TS_OUTPUT
+$TS_CMD_FINDMNT -nr --target $MOUNTPOINT -o VFS-OPTIONS >> $TS_OUTPUT
+$TS_CMD_UMOUNT $MOUNTPOINT
+ts_finalize_subtest
 
 ts_device_deinit $DEVICE
 rmdir $MOUNTPOINT
diff --git a/tools/config-gen.d/old-mount.conf b/tools/config-gen.d/old-mount.conf
deleted file mode 100644 (file)
index 756c9b8..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-include:core.conf
-
---enable-deprecated-mount