xref: /original-bsd/lib/libc/gen/fstab.c (revision aba77441)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)fstab.c	5.1 (Berkeley) 05/30/85";
9 #endif not lint
10 
11 #include <fstab.h>
12 #include <stdio.h>
13 #include <ctype.h>
14 
15 static	struct fstab fs;
16 static	char line[BUFSIZ+1];
17 static	FILE *fs_file = 0;
18 
19 static char *
20 fsskip(p)
21 	register char *p;
22 {
23 
24 	while (*p && *p != ':')
25 		++p;
26 	if (*p)
27 		*p++ = 0;
28 	return (p);
29 }
30 
31 static char *
32 fsdigit(backp, string, end)
33 	int *backp;
34 	char *string, end;
35 {
36 	register int value = 0;
37 	register char *cp;
38 
39 	for (cp = string; *cp && isdigit(*cp); cp++) {
40 		value *= 10;
41 		value += *cp - '0';
42 	}
43 	if (*cp == '\0')
44 		return ((char *)0);
45 	*backp = value;
46 	while (*cp && *cp != end)
47 		cp++;
48 	if (*cp == '\0')
49 		return ((char *)0);
50 	return (cp+1);
51 }
52 
53 static
54 fstabscan(fs)
55 	struct fstab *fs;
56 {
57 	register char *cp;
58 
59 	cp = fgets(line, 256, fs_file);
60 	if (cp == NULL)
61 		return (EOF);
62 	fs->fs_spec = cp;
63 	cp = fsskip(cp);
64 	fs->fs_file = cp;
65 	cp = fsskip(cp);
66 	fs->fs_type = cp;
67 	cp = fsskip(cp);
68 	cp = fsdigit(&fs->fs_freq, cp, ':');
69 	if (cp == 0)
70 		return (3);
71 	cp = fsdigit(&fs->fs_passno, cp, '\n');
72 	if (cp == 0)
73 		return (4);
74 	return (5);
75 }
76 
77 setfsent()
78 {
79 
80 	if (fs_file)
81 		endfsent();
82 	if ((fs_file = fopen(FSTAB, "r")) == NULL) {
83 		fs_file = 0;
84 		return (0);
85 	}
86 	return (1);
87 }
88 
89 endfsent()
90 {
91 
92 	if (fs_file) {
93 		fclose(fs_file);
94 		fs_file = 0;
95 	}
96 	return (1);
97 }
98 
99 struct fstab *
100 getfsent()
101 {
102 	int nfields;
103 
104 	if ((fs_file == 0) && (setfsent() == 0))
105 		return ((struct fstab *)0);
106 	nfields = fstabscan(&fs);
107 	if (nfields == EOF || nfields != 5)
108 		return ((struct fstab *)0);
109 	return (&fs);
110 }
111 
112 struct fstab *
113 getfsspec(name)
114 	char *name;
115 {
116 	register struct fstab *fsp;
117 
118 	if (setfsent() == 0)	/* start from the beginning */
119 		return ((struct fstab *)0);
120 	while((fsp = getfsent()) != 0)
121 		if (strcmp(fsp->fs_spec, name) == 0)
122 			return (fsp);
123 	return ((struct fstab *)0);
124 }
125 
126 struct fstab *
127 getfsfile(name)
128 	char *name;
129 {
130 	register struct fstab *fsp;
131 
132 	if (setfsent() == 0)	/* start from the beginning */
133 		return ((struct fstab *)0);
134 	while ((fsp = getfsent()) != 0)
135 		if (strcmp(fsp->fs_file, name) == 0)
136 			return (fsp);
137 	return ((struct fstab *)0);
138 }
139 
140 struct fstab *
141 getfstype(type)
142 	char *type;
143 {
144 	register struct fstab *fs;
145 
146 	if (setfsent() == 0)
147 		return ((struct fstab *)0);
148 	while ((fs = getfsent()) != 0)
149 		if (strcmp(fs->fs_type, type) == 0)
150 			return (fs);
151 	return ((struct fstab *)0);
152 }
153