BSD 4_3_Reno release
[unix-history] / usr / src / lib / libc / gen / fstab.c
index 5a1495f..dd5ea63 100644 (file)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
  * from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * from this software without specific prior written permission.
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)fstab.c    5.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)fstab.c    5.11 (Berkeley) 6/1/90";
 #endif /* LIBC_SCCS and not lint */
 
 #include <fstab.h>
 #endif /* LIBC_SCCS and not lint */
 
 #include <fstab.h>
+#include <unistd.h>
 #include <stdio.h>
 
 #include <stdio.h>
 
-static struct fstab fs;
-static FILE *fs_file = NULL;
-static char line[BUFSIZ+1];
+static FILE *_fs_fp;
+static struct fstab _fs_fstab;
 
 static
 
 static
-fstabscan(fsp)
-       register struct fstab *fsp;
+fstabscan()
 {
        register char *cp;
 {
        register char *cp;
+#define        MAXLINELENGTH   1024
+       static char line[MAXLINELENGTH];
+       char subline[MAXLINELENGTH];
        char *fgets(), *strtok();
        char *fgets(), *strtok();
+       int typexx;
 
        for (;;) {
 
        for (;;) {
-               if (!(cp = fgets(line, sizeof(line), fs_file)))
-                       return(1);
-               fsp->fs_spec = strtok(cp, ":\n");
-               fsp->fs_file = strtok((char *)NULL, ":\n");
-               fsp->fs_type = strtok((char *)NULL, ":\n");
-               if (fsp->fs_type && strcmp(fsp->fs_type, FSTAB_XX)) {
-                       if (!(cp = strtok((char *)NULL, ":\n")))
-                               continue;
-                       fsp->fs_freq = atoi(cp);
-                       if (!(cp = strtok((char *)NULL, ":\n")))
-                               continue;
-                       fsp->fs_passno = atoi(cp);
+               if (!(cp = fgets(line, sizeof(line), _fs_fp)))
                        return(0);
                        return(0);
+               _fs_fstab.fs_spec = strtok(cp, " \t\n");
+               if (!_fs_fstab.fs_spec || *_fs_fstab.fs_spec == '#')
+                       continue;
+               _fs_fstab.fs_file = strtok((char *)NULL, " \t\n");
+               _fs_fstab.fs_vfstype = strtok((char *)NULL, " \t\n");
+               _fs_fstab.fs_mntops = strtok((char *)NULL, " \t\n");
+               if (_fs_fstab.fs_mntops == NULL)
+                       goto bad;
+               _fs_fstab.fs_freq = 0;
+               _fs_fstab.fs_passno = 0;
+               if ((cp = strtok((char *)NULL, " \t\n")) != NULL) {
+                       _fs_fstab.fs_freq = atoi(cp);
+                       if ((cp = strtok((char *)NULL, " \t\n")) != NULL)
+                               _fs_fstab.fs_passno = atoi(cp);
+               }
+               strcpy(subline, _fs_fstab.fs_mntops);
+               for (typexx = 0, cp = strtok(subline, ","); cp;
+                    cp = strtok((char *)NULL, ",")) {
+                       if (strlen(cp) != 2)
+                               continue;
+                       if (!strcmp(cp, FSTAB_RW)) {
+                               _fs_fstab.fs_type = FSTAB_RW;
+                               break;
+                       }
+                       if (!strcmp(cp, FSTAB_RQ)) {
+                               _fs_fstab.fs_type = FSTAB_RQ;
+                               break;
+                       }
+                       if (!strcmp(cp, FSTAB_RO)) {
+                               _fs_fstab.fs_type = FSTAB_RO;
+                               break;
+                       }
+                       if (!strcmp(cp, FSTAB_SW)) {
+                               _fs_fstab.fs_type = FSTAB_SW;
+                               break;
+                       }
+                       if (!strcmp(cp, FSTAB_XX)) {
+                               _fs_fstab.fs_type = FSTAB_XX;
+                               typexx++;
+                               break;
+                       }
                }
                }
+               if (typexx)
+                       continue;
+               if (cp != NULL)
+                       return(1);
+       bad:
+               /* no way to distinguish between EOF and syntax error */
+               (void)write(STDERR_FILENO, "fstab: ", 7);
+               (void)write(STDERR_FILENO, _PATH_FSTAB,
+                   sizeof(_PATH_FSTAB) - 1);
+               (void)write(STDERR_FILENO, ": syntax error.\n", 16);
        }
        /* NOTREACHED */
 }
 
        }
        /* NOTREACHED */
 }
 
-setfsent()
-{
-       if (fs_file)
-               (void)endfsent();
-       if ((fs_file = fopen(FSTAB, "r")) == NULL) {
-               fs_file = NULL;
-               return(0);
-       }
-       return(1);
-}
-
-endfsent()
-{
-       if (fs_file) {
-               (void)fclose(fs_file);
-               fs_file = NULL;
-       }
-       return(1);
-}
-
 struct fstab *
 getfsent()
 {
 struct fstab *
 getfsent()
 {
-       if (fs_file == NULL && !setfsent() || fstabscan(&fs))
+       if (!_fs_fp && !setfsent() || !fstabscan())
                return((struct fstab *)NULL);
                return((struct fstab *)NULL);
-       return(&fs);
+       return(&_fs_fstab);
 }
 
 struct fstab *
 getfsspec(name)
        register char *name;
 {
 }
 
 struct fstab *
 getfsspec(name)
        register char *name;
 {
-       register struct fstab *fsp;
-
-       if (!setfsent())                /* start from the beginning */
-               return((struct fstab *)NULL);
-       while (fsp = getfsent())
-               if (!strcmp(fsp->fs_spec, name))
-                       return(fsp);
+       if (setfsent())
+               while (fstabscan())
+                       if (!strcmp(_fs_fstab.fs_spec, name))
+                               return(&_fs_fstab);
        return((struct fstab *)NULL);
 }
 
        return((struct fstab *)NULL);
 }
 
@@ -98,12 +120,27 @@ struct fstab *
 getfsfile(name)
        register char *name;
 {
 getfsfile(name)
        register char *name;
 {
-       register struct fstab *fsp;
-
-       if (!setfsent())                /* start from the beginning */
-               return((struct fstab *)NULL);
-       while (fsp = getfsent())
-               if (!strcmp(fsp->fs_file, name))
-                       return(fsp);
+       if (setfsent())
+               while (fstabscan())
+                       if (!strcmp(_fs_fstab.fs_file, name))
+                               return(&_fs_fstab);
        return((struct fstab *)NULL);
 }
        return((struct fstab *)NULL);
 }
+
+setfsent()
+{
+       if (_fs_fp) {
+               rewind(_fs_fp);
+               return(1);
+       }
+       return((_fs_fp = fopen(_PATH_FSTAB, "r")) != NULL);
+}
+
+void
+endfsent()
+{
+       if (_fs_fp) {
+               (void)fclose(_fs_fp);
+               _fs_fp = NULL;
+       }
+}