]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
mount: enable fstab.d
authorMasatake YAMATO <yamato@redhat.com>
Mon, 14 Nov 2011 13:47:53 +0000 (22:47 +0900)
committerKarel Zak <kzak@redhat.com>
Tue, 22 Nov 2011 14:43:20 +0000 (15:43 +0100)
This patch makes mount command read fstab.d/*.fstab if the command
is built with --enable-libmount-mount.

[kzak@redhat.com: - add some info to fstab.5 and mount.8 man pages
                  - use error callback for tab parser]

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
mount/fstab.5
mount/fstab.c
mount/mount.8

index b0cd7635a627eaab19c2a08c87bea92064b30448..2db55030d8ad7331f04e2d101238da8db4422420 100644 (file)
 fstab \- static information about the filesystems
 .SH SYNOPSIS
 .B /etc/fstab
+.sp
+.B /etc/fstab.d
 .SH DESCRIPTION
 The file
-.B fstab
+.B /etc/fstab
 contains descriptive information about the various file systems.
 .B fstab
 is only read by programs, and not written; it is the duty of the system
@@ -65,6 +67,20 @@ sequentially iterate through
 .B fstab
 doing their thing.
 
+The directory
+.B /etc/fstab.d
+is optional and contains fstab-like files. All files without .fstab extension or with '.' prefix
+are ignored. The directory
+.B /etc/fstab.d
+is supported by
+.BR mount (8)
+and
+.BR umount (8)
+programs only if linked with libmount. The files in the directory are parsed in
+order defined by
+.BR strverscmp (3)
+function. The command \fBfindmnt --fstab\fP returns complete list of the filesystems.
+
 .B The first field
 .RI ( fs_spec ).
 .RS
@@ -244,6 +260,7 @@ or
 .SH "SEE ALSO"
 .BR mount (8),
 .BR swapon (8),
+.BR findmnt (8),
 .BR fs (5),
 .BR nfs (5),
 .BR xfs (5),
index a1bae908ea202634a0a1a6fe29a521507cce4fbb..c6aa5889060cca4576e4b1782f58dfa0112c5517 100644 (file)
@@ -150,23 +150,36 @@ read_mntentchn(mntFILE *mfp, const char *fnam, struct mntentchn *mc0) {
 }
 
 #ifdef HAVE_LIBMOUNT_MOUNT
-
-#define USE_UNSTABLE_LIBMOUNT_API
 #include <libmount.h>                  /* libmount */
 
-static void read_mounttable()
+static int parser_errcb(struct libmnt_table *tb __attribute__((__unused__)),
+                       const char *filename, int line)
 {
-       struct mntentchn *mc0 = &mounttable, *mc = mc0;
+       fprintf(stderr, _("%s: %d: parse error -- line ignored.\n"),
+               filename, line);
+
+       return 1;       /* = recoverable error
+                        * (the line is ignored, parsing continue) */
+}
+
+static void read_tab_common(struct mntentchn *mc0,
+                           int (* reader)(struct libmnt_table *tb,
+                                          const char *filename),
+                           const char *name_in_errmsg)
+{
+       struct mntentchn *mc = mc0;
        struct libmnt_table *tb = mnt_new_table();
        struct libmnt_iter *itr = mnt_new_iter(MNT_ITER_FORWARD);
        struct libmnt_fs *fs;
 
-       got_mtab = 1;
        mc->nxt = mc->prev = NULL;
 
        if (!tb || !itr)
                goto err;
-       if (mnt_table_parse_mtab(tb, NULL))
+
+       mnt_table_set_parser_errcb(tb, parser_errcb);
+
+       if (reader(tb, NULL))
                goto err;
 
        while(mnt_table_next_fs(tb, itr, &fs) == 0) {
@@ -187,12 +200,23 @@ static void read_mounttable()
        mc0->prev = mc;
        return;
 err:
-       error(_("warning: failed to read mtab"));
+       error(_("warning: failed to parse %s"), name_in_errmsg);
        mnt_free_table(tb);
        mnt_free_iter(itr);
        mc->nxt = mc->prev = NULL;
 }
 
+static void read_mounttable()
+{
+       got_mtab = 1;
+       read_tab_common(&mounttable, mnt_table_parse_mtab, "mtab");
+}
+
+static void read_fstab()
+{
+       got_fstab = 1;
+       read_tab_common(&fstab, mnt_table_parse_fstab, "fstab");
+}
 #else /* !HAVE_LIBMOUNT_MOUNT */
 
 /*
@@ -226,7 +250,6 @@ read_mounttable() {
        }
        read_mntentchn(mfp, fnam, mc);
 }
-#endif /* HAVE_LIBMOUNT_MOUNT */
 
 static void
 read_fstab() {
@@ -247,6 +270,7 @@ read_fstab() {
        }
        read_mntentchn(mfp, fnam, mc);
 }
+#endif /* !HAVE_LIBMOUNT_MOUNT */
 
 
 /* Given the name NAME, try to find it in mtab.  */
index 83a7e1821eaea7c005695e599eb393c1bd3103fc..fc352b57928d59cd13bbd60508b44d65a0319e23 100644 (file)
@@ -182,6 +182,14 @@ The file
 .BR fstab (5)),
 may contain lines describing what devices are usually
 mounted where, using which options.
+
+If the
+.B mount
+command is linked with libmount, then filesystems could be also defined in
+.I /etc/fstab.d/*.fstab
+files. See
+.BR fstab (5)
+for more details.
 .LP
 The command
 .RS
@@ -206,7 +214,7 @@ filesystems are mounted simultaneously.
 When mounting a filesystem mentioned in
 .IR fstab
 or
-.IR mtab ,
+.IR mtab,
 it suffices to give only the device, or only the mount point.
 
 
@@ -2760,6 +2768,9 @@ support (for example /sbin/mount.fuse -t fuse.sshfs).
 .I /etc/fstab
 filesystem table
 .TP
+.I /etc/fstab.d
+directory with filesystem tables
+.TP
 .I /etc/mtab
 table of mounted filesystems
 .TP
@@ -2778,6 +2789,7 @@ a list of filesystem types to try
 .BR fstab (5),
 .BR umount (8),
 .BR swapon (8),
+.BR findmnt (8),
 .BR nfs (5),
 .BR xfs (5),
 .BR e2label (8),