xref: /csrg-svn/lib/libc/gen/fstab.c (revision 2010)
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