use correct buffer size; use strtok(3), delete fsskip() and fsdigit();
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Tue, 16 Aug 1988 03:24:22 +0000 (19:24 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Tue, 16 Aug 1988 03:24:22 +0000 (19:24 -0800)
change fstabscan to skip bad lines and continue on, also ignore lines with
FSTAB_XX as the type field; delete getfstype(3); minor lint cleanups

SCCS-vsn: lib/libc/gen/fstab.c 5.4

usr/src/lib/libc/gen/fstab.c

index 82a7242..5a1495f 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
+ * Copyright (c) 1980, 1988 Regents of the University of California.
  * 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
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)fstab.c    5.3 (Berkeley) %G%";
+static char sccsid[] = "@(#)fstab.c    5.4 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 #include <fstab.h>
 #include <stdio.h>
 #endif /* LIBC_SCCS and not lint */
 
 #include <fstab.h>
 #include <stdio.h>
-#include <ctype.h>
 
 static struct fstab fs;
 
 static struct fstab fs;
+static FILE *fs_file = NULL;
 static char line[BUFSIZ+1];
 static char line[BUFSIZ+1];
-static FILE *fs_file = 0;
 
 
-static char *
-fsskip(p)
-       register char *p;
-{
-
-       while (*p && *p != ':')
-               ++p;
-       if (*p)
-               *p++ = 0;
-       return (p);
-}
-
-static char *
-fsdigit(backp, string, end)
-       int *backp;
-       char *string, end;
+static
+fstabscan(fsp)
+       register struct fstab *fsp;
 {
 {
-       register int value = 0;
        register char *cp;
        register char *cp;
-
-       for (cp = string; *cp && isdigit(*cp); cp++) {
-               value *= 10;
-               value += *cp - '0';
+       char *fgets(), *strtok();
+
+       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);
+                       return(0);
+               }
        }
        }
-       if (*cp == '\0')
-               return ((char *)0);
-       *backp = value;
-       while (*cp && *cp != end)
-               cp++;
-       if (*cp == '\0')
-               return ((char *)0);
-       return (cp+1);
+       /* NOTREACHED */
 }
 
 }
 
-static
-fstabscan(fs)
-       struct fstab *fs;
-{
-       register char *cp;
-
-       cp = fgets(line, 256, fs_file);
-       if (cp == NULL)
-               return (EOF);
-       fs->fs_spec = cp;
-       cp = fsskip(cp);
-       fs->fs_file = cp;
-       cp = fsskip(cp);
-       fs->fs_type = cp;
-       cp = fsskip(cp);
-       cp = fsdigit(&fs->fs_freq, cp, ':');
-       if (cp == 0)
-               return (3);
-       cp = fsdigit(&fs->fs_passno, cp, '\n');
-       if (cp == 0)
-               return (4);
-       return (5);
-}
-       
 setfsent()
 {
 setfsent()
 {
-
        if (fs_file)
        if (fs_file)
-               endfsent();
+               (void)endfsent();
        if ((fs_file = fopen(FSTAB, "r")) == NULL) {
        if ((fs_file = fopen(FSTAB, "r")) == NULL) {
-               fs_file = 0;
-               return (0);
+               fs_file = NULL;
+               return(0);
        }
        }
-       return (1);
+       return(1);
 }
 
 endfsent()
 {
 }
 
 endfsent()
 {
-
        if (fs_file) {
        if (fs_file) {
-               fclose(fs_file);
-               fs_file = 0;
+               (void)fclose(fs_file);
+               fs_file = NULL;
        }
        }
-       return (1);
+       return(1);
 }
 
 struct fstab *
 getfsent()
 {
 }
 
 struct fstab *
 getfsent()
 {
-       int nfields;
-
-       if ((fs_file == 0) && (setfsent() == 0))
-               return ((struct fstab *)0);
-       nfields = fstabscan(&fs);
-       if (nfields == EOF || nfields != 5)
-               return ((struct fstab *)0);
-       return (&fs);
+       if (fs_file == NULL && !setfsent() || fstabscan(&fs))
+               return((struct fstab *)NULL);
+       return(&fs);
 }
 
 struct fstab *
 getfsspec(name)
 }
 
 struct fstab *
 getfsspec(name)
-       char *name;
+       register char *name;
 {
        register struct fstab *fsp;
 
 {
        register struct fstab *fsp;
 
-       if (setfsent() == 0)    /* start from the beginning */
-               return ((struct fstab *)0);
-       while((fsp = getfsent()) != 0)
-               if (strcmp(fsp->fs_spec, name) == 0)
-                       return (fsp);
-       return ((struct fstab *)0);
+       if (!setfsent())                /* start from the beginning */
+               return((struct fstab *)NULL);
+       while (fsp = getfsent())
+               if (!strcmp(fsp->fs_spec, name))
+                       return(fsp);
+       return((struct fstab *)NULL);
 }
 
 struct fstab *
 getfsfile(name)
 }
 
 struct fstab *
 getfsfile(name)
-       char *name;
+       register char *name;
 {
        register struct fstab *fsp;
 
 {
        register struct fstab *fsp;
 
-       if (setfsent() == 0)    /* start from the beginning */
-               return ((struct fstab *)0);
-       while ((fsp = getfsent()) != 0)
-               if (strcmp(fsp->fs_file, name) == 0)
-                       return (fsp);
-       return ((struct fstab *)0);
-}
-
-struct fstab *
-getfstype(type)
-       char *type;
-{
-       register struct fstab *fs;
-
-       if (setfsent() == 0)
-               return ((struct fstab *)0);
-       while ((fs = getfsent()) != 0)
-               if (strcmp(fs->fs_type, type) == 0)
-                       return (fs);
-       return ((struct fstab *)0);
+       if (!setfsent())                /* start from the beginning */
+               return((struct fstab *)NULL);
+       while (fsp = getfsent())
+               if (!strcmp(fsp->fs_file, name))
+                       return(fsp);
+       return((struct fstab *)NULL);
 }
 }