xref: /csrg-svn/lib/libc/gen/fstab.c (revision 12699)
1 #ifndef lint
2 static char sccsid[] = "@(#)fstab.c	4.3 (Berkeley) 05/24/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 	return (1);
89 }
90 
91 struct fstab *
92 getfsent()
93 {
94 	int nfields;
95 
96 	if ((fs_file == 0) && (setfsent() == 0))
97 		return ((struct fstab *)0);
98 	nfields = fstabscan(&fs);
99 	if (nfields == EOF || nfields != 5)
100 		return ((struct fstab *)0);
101 	return (&fs);
102 }
103 
104 struct fstab *
105 getfsspec(name)
106 	char *name;
107 {
108 	register struct fstab *fsp;
109 
110 	if (setfsent() == 0)	/* start from the beginning */
111 		return ((struct fstab *)0);
112 	while((fsp = getfsent()) != 0)
113 		if (strcmp(fsp->fs_spec, name) == 0)
114 			return (fsp);
115 	return ((struct fstab *)0);
116 }
117 
118 struct fstab *
119 getfsfile(name)
120 	char *name;
121 {
122 	register struct fstab *fsp;
123 
124 	if (setfsent() == 0)	/* start from the beginning */
125 		return ((struct fstab *)0);
126 	while ((fsp = getfsent()) != 0)
127 		if (strcmp(fsp->fs_file, name) == 0)
128 			return (fsp);
129 	return ((struct fstab *)0);
130 }
131 
132 struct fstab *
133 getfstype(type)
134 	char *type;
135 {
136 	register struct fstab *fs;
137 
138 	if (setfsent() == 0)
139 		return ((struct fstab *)0);
140 	while ((fs = getfsent()) != 0)
141 		if (strcmp(fs->fs_type, type) == 0)
142 			return (fs);
143 	return ((struct fstab *)0);
144 }
145