tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Patch: Use fstab different to /etc/fstab in fstab.h



Hi,

in a case where it would be useful to read a fstab that is not the system's
own one (sysinst), i.e. lies not /etc/fstab, you can't do that with fstab.h.

The solution would be to have a function setfstab(const char*) do set the
fstab you want to read. The code is about 20 lines of additional code + some
documentation.
Rewriting that for a userland program would need either copying nearly the
whole fstab.c or changing the interface, which is not wanted.

Appended are patches (fstab.h.diff, fstab.c.diff, fstab.3.diff) and a test
program (fstab-test.file, fstab-test.c, Makefile). To test it locally, just
copy over fstab.c, apply the patch and change the include to a local include.
Then run make and execute fstab-test. It will show the mount point of a
directory according to your and the delivered fstab.

So far, the test was run on two systems, one 5.99.55, one 5.0.2 (thanks to
dzoe).


I fully understand objections that it's unnecessary bloat and only used in
that single case.
Then I would rather copy fstab.c and modify that code to fit my needs.


Regards, Julian

Attachment: Makefile
Description: Binary data

Index: lib/libc/gen/fstab.c
===================================================================
RCS file: /cvsroot/src/lib/libc/gen/fstab.c,v
retrieving revision 1.28
diff -u -r1.28 fstab.c
--- lib/libc/gen/fstab.c        12 Aug 2006 23:49:54 -0000      1.28
+++ lib/libc/gen/fstab.c        9 Sep 2011 10:29:24 -0000
@@ -55,6 +55,7 @@
 __weak_alias(getfsent,_getfsent)
 __weak_alias(getfsfile,_getfsfile)
 __weak_alias(getfsspec,_getfsspec)
+__weak_alias(setfstab,_setfstab)
 __weak_alias(setfsent,_setfsent)
 #endif
 
@@ -209,6 +210,21 @@
 }
 
 int
+setfstab(const char *path)
+{
+       _fs_lineno = 0;
+       if (_fs_fp) {
+               (void)fclose(_fs_fp);
+               _fs_fp = NULL;
+       }
+       if ((_fs_fp = fopen(path, "r")) == NULL) {
+               warn("Cannot open `%s'", path);
+               return 0;
+       }
+       return 1;
+}
+
+int
 setfsent(void)
 {
        _fs_lineno = 0;
Index: include/fstab.h
===================================================================
RCS file: /cvsroot/src/include/fstab.h,v
retrieving revision 1.11
diff -u -r1.11 fstab.h
--- include/fstab.h     3 Feb 2005 04:39:32 -0000       1.11
+++ include/fstab.h     9 Sep 2011 10:29:48 -0000
@@ -71,6 +71,7 @@
 struct fstab *getfsent(void);
 struct fstab *getfsspec(const char *);
 struct fstab *getfsfile(const char *);
+int setfstab(const char *);
 int setfsent(void);
 void endfsent(void);
 __END_DECLS
#include <stdio.h>
#include <stdlib.h>
#include <fstab.h>

int
main(int argc, char *argv[]) {
        struct fstab *file;

        if (argc != 2)
                errx(EXIT_FAILURE, "fstab-test <mount-path>");

        file = getfsfile(argv[1]);
        if (file)
                printf("Your fstab: %s\n", file->fs_spec);
        else
                printf("No entry found in your fstab.\n");

        setfstab("fstab-test.file");
        file = getfsfile(argv[1]);
        if (file)
                printf("This fstab: %s\n", file->fs_spec);
        else
                printf("No entry found in this fstab.\n");

        return 0;
}

Attachment: fstab-test.file
Description: Binary data

Index: ./lib/libc/gen/getfsent.3
===================================================================
RCS file: /cvsroot/src/lib/libc/gen/getfsent.3,v
retrieving revision 1.11
diff -u -r1.11 getfsent.3
--- ./lib/libc/gen/getfsent.3   22 Mar 2010 19:30:53 -0000      1.11
+++ ./lib/libc/gen/getfsent.3   5 Sep 2011 22:01:00 -0000
@@ -50,6 +50,8 @@
 .Ft struct fstab *
 .Fn getfsfile "const char *file"
 .Ft int
+.Fn setfstab "const char *path"
+.Ft int
 .Fn setfsent void
 .Ft void
 .Fn endfsent void
@@ -82,8 +84,7 @@
 The
 .Fn setfsent
 function
-opens the file (closing any previously opened file) or rewinds it
-if it is already open.
+opens the file or rewinds it if it is already open.
 .Pp
 The
 .Fn endfsent
@@ -96,7 +97,22 @@
 .Fn getfsfile
 functions
 search the entire file (opening it if necessary) for a matching special
-file name or file system file name.
+file name
+.Ar spec
+or file system file name
+.Ar file .
+.Pp
+With
+.Fn setfstab
+you can specify to read the fstab file from
+.Ar path
+instead of the generic
+.Pa /etc/fstab
+as is stored in the constant
+.Dv _PATH_FSTAB .
+You have to call
+.Fn endfsent
+to close the file and open up the right fstab again.
 .Pp
 For programs wishing to read the entire database,
 .Fn getfsent
@@ -117,8 +133,10 @@
 or error.
 The
 .Fn setfsent
-function
-returns 0 on failure, 1 on success.
+and
+.Fn setfstab
+functions
+return 0 on failure, 1 on success.
 The
 .Fn endfsent
 function
@@ -142,6 +160,10 @@
 .Fn setfsent
 functions appeared in
 .Bx 4.3 .
+The
+.Fn setfstab
+function appeared in
+.Nx 6.0 .
 .Sh BUGS
 These functions use static data storage;
 if the data is needed for future use, it should be

Attachment: signature.asc
Description: PGP signature



Home | Main Index | Thread Index | Old Index