1*2010Swnj /* @(#)fstab.c 4.1 (Berkeley) 12/21/80 */ 2*2010Swnj #include <fstab.h> 3*2010Swnj #include <stdio.h> 4*2010Swnj #include <ctype.h> 5*2010Swnj 6*2010Swnj static struct fstab fs; 7*2010Swnj static FILE *fs_file = 0; 8*2010Swnj 9*2010Swnj static char *fs_string(back, string, lg, end) 10*2010Swnj char *string, *back; 11*2010Swnj int lg; /* length of field to stuff into */ 12*2010Swnj char end; 13*2010Swnj { 14*2010Swnj register char *cp; 15*2010Swnj for (cp = string; *cp && *cp != end; cp++) 16*2010Swnj continue; 17*2010Swnj if (*cp == '\0') return(0); 18*2010Swnj *cp = '\0'; 19*2010Swnj strncpy(back, string, lg-1); 20*2010Swnj return(cp+1); 21*2010Swnj } 22*2010Swnj static char *fs_digit(backp, string, end) 23*2010Swnj int *backp; 24*2010Swnj char *string; 25*2010Swnj char end; 26*2010Swnj { 27*2010Swnj register int value = 0; 28*2010Swnj register char *cp; 29*2010Swnj for (cp = string; *cp && isdigit(*cp); cp++){ 30*2010Swnj value *= 10; 31*2010Swnj value += *cp - '0'; 32*2010Swnj } 33*2010Swnj if (*cp == '\0') return(0); 34*2010Swnj *backp = value; 35*2010Swnj while ( *cp && *cp != end) 36*2010Swnj cp++; 37*2010Swnj if (*cp == '\0') return(0); 38*2010Swnj return(cp+1); 39*2010Swnj } 40*2010Swnj 41*2010Swnj static int fstabscan(fsp) 42*2010Swnj struct fstab *fsp; 43*2010Swnj { 44*2010Swnj register char *cp; 45*2010Swnj char buf[256]; 46*2010Swnj if (fgets(buf, 256, fs_file) == NULL) 47*2010Swnj return(EOF); 48*2010Swnj cp = buf; 49*2010Swnj cp = fs_string(&fsp->fs_spec[0], cp, FSNMLG, ':'); 50*2010Swnj if (cp == 0) return(0); 51*2010Swnj cp = fs_string(&fsp->fs_file[0], cp, FSNMLG, ':'); 52*2010Swnj if (cp == 0) return(1); 53*2010Swnj cp = fs_string(&fsp->fs_type[0], cp, 3, ':'); 54*2010Swnj if (cp == 0) return(2); 55*2010Swnj cp = fs_digit(&fsp->fs_freq, cp, ':'); 56*2010Swnj if (cp == 0) return(3); 57*2010Swnj cp = fs_digit(&fsp->fs_passno, cp, '\n'); 58*2010Swnj if (cp == 0) return(4); 59*2010Swnj return(5); 60*2010Swnj } 61*2010Swnj 62*2010Swnj int setfsent() 63*2010Swnj { 64*2010Swnj if (fs_file) 65*2010Swnj endfsent(); 66*2010Swnj if ( (fs_file = fopen(FSTAB, "r")) == NULL){ 67*2010Swnj fs_file = 0; 68*2010Swnj return(0); 69*2010Swnj } 70*2010Swnj return(1); 71*2010Swnj } 72*2010Swnj 73*2010Swnj int endfsent() 74*2010Swnj { 75*2010Swnj if (fs_file){ 76*2010Swnj fclose(fs_file); 77*2010Swnj } 78*2010Swnj return(1); 79*2010Swnj } 80*2010Swnj 81*2010Swnj struct fstab *getfsent() 82*2010Swnj { 83*2010Swnj int nfields; 84*2010Swnj 85*2010Swnj if ( (fs_file == 0) && (setfsent() == 0) ) 86*2010Swnj return(0); 87*2010Swnj nfields = fstabscan(&fs); 88*2010Swnj if (nfields == EOF || nfields != FSTABNARGS) 89*2010Swnj return(0); 90*2010Swnj return(&fs); 91*2010Swnj } 92*2010Swnj struct fstab *getfsspec(name) 93*2010Swnj char *name; 94*2010Swnj { 95*2010Swnj register struct fstab *fsp; 96*2010Swnj if (setfsent() == 0) /* start from the beginning */ 97*2010Swnj return(0); 98*2010Swnj while( (fsp = getfsent()) != 0){ 99*2010Swnj if (strncmp(fsp->fs_spec, name, sizeof(fsp->fs_spec)) == 0) 100*2010Swnj return(fsp); 101*2010Swnj } 102*2010Swnj return(0); 103*2010Swnj } 104*2010Swnj struct fstab *getfsfile(name) 105*2010Swnj char *name; 106*2010Swnj { 107*2010Swnj register struct fstab *fsp; 108*2010Swnj if (setfsent() == 0) /* start from the beginning */ 109*2010Swnj return(0); 110*2010Swnj while ( (fsp = getfsent()) != 0){ 111*2010Swnj if (strncmp(fsp->fs_file, name, sizeof(fsp->fs_spec)) == 0) 112*2010Swnj return(fsp); 113*2010Swnj } 114*2010Swnj return(0); 115*2010Swnj } 116