1 #ifndef lint 2 static char sccsid[] = "@(#)fstab.c 4.2 (Berkeley) 05/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 (0); 39 *backp = value; 40 while (*cp && *cp != end) 41 cp++; 42 if (*cp == '\0') 43 return (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 fs->fs_quotafile = cp; 63 cp = fsskip(cp); 64 cp = fsdigit(&fs->fs_freq, cp, ':'); 65 if (cp == 0) 66 return (4); 67 cp = fsdigit(&fs->fs_passno, cp, '\n'); 68 if (cp == 0) 69 return (5); 70 return (6); 71 } 72 73 setfsent() 74 { 75 76 if (fs_file) 77 endfsent(); 78 if ((fs_file = fopen(FSTAB, "r")) == NULL){ 79 fs_file = 0; 80 return (0); 81 } 82 return (1); 83 } 84 85 endfsent() 86 { 87 88 if (fs_file) 89 fclose(fs_file); 90 return (1); 91 } 92 93 struct fstab * 94 getfsent() 95 { 96 int nfields; 97 98 if ((fs_file == 0) && (setfsent() == 0)) 99 return (0); 100 nfields = fstabscan(&fs); 101 if (nfields == EOF || nfields != 6) 102 return (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 (0); 114 while((fsp = getfsent()) != 0) 115 if (strcmp(fsp->fs_spec, name) == 0) 116 return (fsp); 117 return (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 (0); 128 while ((fsp = getfsent()) != 0) 129 if (strcmp(fsp->fs_file, name) == 0) 130 return (fsp); 131 return (0); 132 } 133