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