1 #ifndef lint 2 static char sccsid[] = "@(#)fstab.c 4.4 (Berkeley) 06/19/83"; 3 #endif 4 5 #include <fstab.h> 6 #include <stdio.h> 7 #include <ctype.h> 8 9 static struct fstab fs; 10 static char line[BUFSIZ+1]; 11 static FILE *fs_file = 0; 12 13 static char * 14 fsskip(p) 15 register char *p; 16 { 17 18 while (*p && *p != ':') 19 ++p; 20 if (*p) 21 *p++ = 0; 22 return (p); 23 } 24 25 static char * 26 fsdigit(backp, string, end) 27 int *backp; 28 char *string, end; 29 { 30 register int value = 0; 31 register char *cp; 32 33 for (cp = string; *cp && isdigit(*cp); cp++) { 34 value *= 10; 35 value += *cp - '0'; 36 } 37 if (*cp == '\0') 38 return ((char *)0); 39 *backp = value; 40 while (*cp && *cp != end) 41 cp++; 42 if (*cp == '\0') 43 return ((char *)0); 44 return (cp+1); 45 } 46 47 static 48 fstabscan(fs) 49 struct fstab *fs; 50 { 51 register char *cp; 52 53 cp = fgets(line, 256, fs_file); 54 if (cp == NULL) 55 return (EOF); 56 fs->fs_spec = cp; 57 cp = fsskip(cp); 58 fs->fs_file = cp; 59 cp = fsskip(cp); 60 fs->fs_type = cp; 61 cp = fsskip(cp); 62 cp = fsdigit(&fs->fs_freq, cp, ':'); 63 if (cp == 0) 64 return (3); 65 cp = fsdigit(&fs->fs_passno, cp, '\n'); 66 if (cp == 0) 67 return (4); 68 return (5); 69 } 70 71 setfsent() 72 { 73 74 if (fs_file) 75 endfsent(); 76 if ((fs_file = fopen(FSTAB, "r")) == NULL) { 77 fs_file = 0; 78 return (0); 79 } 80 return (1); 81 } 82 83 endfsent() 84 { 85 86 if (fs_file) { 87 fclose(fs_file); 88 fs_file = 0; 89 } 90 return (1); 91 } 92 93 struct fstab * 94 getfsent() 95 { 96 int nfields; 97 98 if ((fs_file == 0) && (setfsent() == 0)) 99 return ((struct fstab *)0); 100 nfields = fstabscan(&fs); 101 if (nfields == EOF || nfields != 5) 102 return ((struct fstab *)0); 103 return (&fs); 104 } 105 106 struct fstab * 107 getfsspec(name) 108 char *name; 109 { 110 register struct fstab *fsp; 111 112 if (setfsent() == 0) /* start from the beginning */ 113 return ((struct fstab *)0); 114 while((fsp = getfsent()) != 0) 115 if (strcmp(fsp->fs_spec, name) == 0) 116 return (fsp); 117 return ((struct fstab *)0); 118 } 119 120 struct fstab * 121 getfsfile(name) 122 char *name; 123 { 124 register struct fstab *fsp; 125 126 if (setfsent() == 0) /* start from the beginning */ 127 return ((struct fstab *)0); 128 while ((fsp = getfsent()) != 0) 129 if (strcmp(fsp->fs_file, name) == 0) 130 return (fsp); 131 return ((struct fstab *)0); 132 } 133 134 struct fstab * 135 getfstype(type) 136 char *type; 137 { 138 register struct fstab *fs; 139 140 if (setfsent() == 0) 141 return ((struct fstab *)0); 142 while ((fs = getfsent()) != 0) 143 if (strcmp(fs->fs_type, type) == 0) 144 return (fs); 145 return ((struct fstab *)0); 146 } 147