121341Sdist /* 235370Sbostic * Copyright (c) 1980, 1988 Regents of the University of California. 335368Sbostic * All rights reserved. 435368Sbostic * 542624Sbostic * %sccs.include.redist.c% 621341Sdist */ 721341Sdist 826552Sdonn #if defined(LIBC_SCCS) && !defined(lint) 9*56410Sbostic static char sccsid[] = "@(#)fstab.c 5.16 (Berkeley) 10/04/92"; 1035368Sbostic #endif /* LIBC_SCCS and not lint */ 1112597Ssam 12*56410Sbostic #include <errno.h> 132010Swnj #include <fstab.h> 142010Swnj #include <stdio.h> 1546597Sdonn #include <stdlib.h> 1645646Sbostic #include <string.h> 17*56410Sbostic #include <unistd.h> 182010Swnj 1936214Sbostic static FILE *_fs_fp; 2036214Sbostic static struct fstab _fs_fstab; 212010Swnj 22*56410Sbostic static error __P((int)); 23*56410Sbostic static fstabscan __P((void)); 24*56410Sbostic 2535370Sbostic static 2636214Sbostic fstabscan() 272010Swnj { 2812597Ssam register char *cp; 2940563Smckusick #define MAXLINELENGTH 1024 3036214Sbostic static char line[MAXLINELENGTH]; 3138671Smckusick char subline[MAXLINELENGTH]; 3238697Smckusick int typexx; 3312597Ssam 3435370Sbostic for (;;) { 3536214Sbostic if (!(cp = fgets(line, sizeof(line), _fs_fp))) 3636214Sbostic return(0); 3745245Sbostic /* OLD_STYLE_FSTAB */ 3845245Sbostic if (!strpbrk(cp, " \t")) { 3945245Sbostic _fs_fstab.fs_spec = strtok(cp, ":\n"); 4045245Sbostic _fs_fstab.fs_file = strtok((char *)NULL, ":\n"); 4145245Sbostic _fs_fstab.fs_type = strtok((char *)NULL, ":\n"); 4245245Sbostic if (_fs_fstab.fs_type) { 4345245Sbostic if (!strcmp(_fs_fstab.fs_type, FSTAB_XX)) 4445245Sbostic continue; 4545245Sbostic _fs_fstab.fs_mntops = _fs_fstab.fs_type; 4645245Sbostic _fs_fstab.fs_vfstype = 4745245Sbostic strcmp(_fs_fstab.fs_type, FSTAB_SW) ? 4845245Sbostic "ufs" : "swap"; 4945245Sbostic if (cp = strtok((char *)NULL, ":\n")) { 5045245Sbostic _fs_fstab.fs_freq = atoi(cp); 5145245Sbostic if (cp = strtok((char *)NULL, ":\n")) { 5245245Sbostic _fs_fstab.fs_passno = atoi(cp); 5345245Sbostic return(1); 5445245Sbostic } 5545245Sbostic } 5645245Sbostic } 5745245Sbostic goto bad; 5845245Sbostic } 5945245Sbostic /* OLD_STYLE_FSTAB */ 6038671Smckusick _fs_fstab.fs_spec = strtok(cp, " \t\n"); 6141578Sbostic if (!_fs_fstab.fs_spec || *_fs_fstab.fs_spec == '#') 6241578Sbostic continue; 6338671Smckusick _fs_fstab.fs_file = strtok((char *)NULL, " \t\n"); 6438671Smckusick _fs_fstab.fs_vfstype = strtok((char *)NULL, " \t\n"); 6538671Smckusick _fs_fstab.fs_mntops = strtok((char *)NULL, " \t\n"); 6638671Smckusick if (_fs_fstab.fs_mntops == NULL) 6738671Smckusick goto bad; 6838671Smckusick _fs_fstab.fs_freq = 0; 6938671Smckusick _fs_fstab.fs_passno = 0; 7038671Smckusick if ((cp = strtok((char *)NULL, " \t\n")) != NULL) { 7138671Smckusick _fs_fstab.fs_freq = atoi(cp); 7238671Smckusick if ((cp = strtok((char *)NULL, " \t\n")) != NULL) 7338671Smckusick _fs_fstab.fs_passno = atoi(cp); 7438671Smckusick } 7538671Smckusick strcpy(subline, _fs_fstab.fs_mntops); 7638697Smckusick for (typexx = 0, cp = strtok(subline, ","); cp; 7738671Smckusick cp = strtok((char *)NULL, ",")) { 7838671Smckusick if (strlen(cp) != 2) 7935370Sbostic continue; 8038671Smckusick if (!strcmp(cp, FSTAB_RW)) { 8138671Smckusick _fs_fstab.fs_type = FSTAB_RW; 8238671Smckusick break; 8338110Sbostic } 8438671Smckusick if (!strcmp(cp, FSTAB_RQ)) { 8538671Smckusick _fs_fstab.fs_type = FSTAB_RQ; 8638671Smckusick break; 8738671Smckusick } 8838671Smckusick if (!strcmp(cp, FSTAB_RO)) { 8938671Smckusick _fs_fstab.fs_type = FSTAB_RO; 9038671Smckusick break; 9138671Smckusick } 9238671Smckusick if (!strcmp(cp, FSTAB_SW)) { 9338671Smckusick _fs_fstab.fs_type = FSTAB_SW; 9438671Smckusick break; 9538671Smckusick } 9638671Smckusick if (!strcmp(cp, FSTAB_XX)) { 9738671Smckusick _fs_fstab.fs_type = FSTAB_XX; 9838697Smckusick typexx++; 9938671Smckusick break; 10038671Smckusick } 10135370Sbostic } 10238697Smckusick if (typexx) 10338697Smckusick continue; 10438671Smckusick if (cp != NULL) 10538671Smckusick return(1); 10645245Sbostic 10745245Sbostic bad: /* no way to distinguish between EOF and syntax error */ 10846597Sdonn error(EFTYPE); 1092010Swnj } 11035370Sbostic /* NOTREACHED */ 1112010Swnj } 1122010Swnj 11312597Ssam struct fstab * 11412597Ssam getfsent() 1152010Swnj { 11636214Sbostic if (!_fs_fp && !setfsent() || !fstabscan()) 11735370Sbostic return((struct fstab *)NULL); 11836214Sbostic return(&_fs_fstab); 1192010Swnj } 12012597Ssam 12112597Ssam struct fstab * 12212597Ssam getfsspec(name) 12346597Sdonn register const char *name; 1242010Swnj { 12536214Sbostic if (setfsent()) 12636214Sbostic while (fstabscan()) 12736214Sbostic if (!strcmp(_fs_fstab.fs_spec, name)) 12836214Sbostic return(&_fs_fstab); 12935370Sbostic return((struct fstab *)NULL); 1302010Swnj } 13112597Ssam 13212597Ssam struct fstab * 13312597Ssam getfsfile(name) 13446597Sdonn register const char *name; 1352010Swnj { 13636214Sbostic if (setfsent()) 13736214Sbostic while (fstabscan()) 13836214Sbostic if (!strcmp(_fs_fstab.fs_file, name)) 13936214Sbostic return(&_fs_fstab); 14035370Sbostic return((struct fstab *)NULL); 1412010Swnj } 14236214Sbostic 14336214Sbostic setfsent() 14436214Sbostic { 14536214Sbostic if (_fs_fp) { 14636214Sbostic rewind(_fs_fp); 14736214Sbostic return(1); 14836214Sbostic } 14945646Sbostic if (_fs_fp = fopen(_PATH_FSTAB, "r")) 15045646Sbostic return(1); 15145646Sbostic error(errno); 15245646Sbostic return(0); 15336214Sbostic } 15436214Sbostic 15536214Sbostic void 15636214Sbostic endfsent() 15736214Sbostic { 15836214Sbostic if (_fs_fp) { 15936214Sbostic (void)fclose(_fs_fp); 16036214Sbostic _fs_fp = NULL; 16136214Sbostic } 16236214Sbostic } 16345646Sbostic 16445646Sbostic static 16545646Sbostic error(err) 16645646Sbostic int err; 16745646Sbostic { 16845646Sbostic char *p; 16945646Sbostic 17045646Sbostic (void)write(STDERR_FILENO, "fstab: ", 7); 17145646Sbostic (void)write(STDERR_FILENO, _PATH_FSTAB, sizeof(_PATH_FSTAB) - 1); 17245646Sbostic p = strerror(err); 17345646Sbostic (void)write(STDERR_FILENO, p, strlen(p)); 17445646Sbostic (void)write(STDERR_FILENO, "\n", 1); 17545646Sbostic } 176