xref: /original-bsd/lib/libc/gen/fstab.c (revision 1403a0cd)
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