Annotation of src/lib/libc/gen/fstab.c, Revision 1.1.1.1
1.1 cgd 1: /*
2: * Copyright (c) 1980, 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: */
33:
34: #if defined(LIBC_SCCS) && !defined(lint)
35: static char sccsid[] = "@(#)fstab.c 5.15 (Berkeley) 2/23/91";
36: #endif /* LIBC_SCCS and not lint */
37:
38: #include <sys/errno.h>
39: #include <fstab.h>
40: #include <unistd.h>
41: #include <stdio.h>
42: #include <stdlib.h>
43: #include <string.h>
44:
45: static FILE *_fs_fp;
46: static struct fstab _fs_fstab;
47: static error();
48:
49: static
50: fstabscan()
51: {
52: register char *cp;
53: #define MAXLINELENGTH 1024
54: static char line[MAXLINELENGTH];
55: char subline[MAXLINELENGTH];
56: int typexx;
57:
58: for (;;) {
59: if (!(cp = fgets(line, sizeof(line), _fs_fp)))
60: return(0);
61: /* OLD_STYLE_FSTAB */
62: if (!strpbrk(cp, " \t")) {
63: _fs_fstab.fs_spec = strtok(cp, ":\n");
64: _fs_fstab.fs_file = strtok((char *)NULL, ":\n");
65: _fs_fstab.fs_type = strtok((char *)NULL, ":\n");
66: if (_fs_fstab.fs_type) {
67: if (!strcmp(_fs_fstab.fs_type, FSTAB_XX))
68: continue;
69: _fs_fstab.fs_mntops = _fs_fstab.fs_type;
70: _fs_fstab.fs_vfstype =
71: strcmp(_fs_fstab.fs_type, FSTAB_SW) ?
72: "ufs" : "swap";
73: if (cp = strtok((char *)NULL, ":\n")) {
74: _fs_fstab.fs_freq = atoi(cp);
75: if (cp = strtok((char *)NULL, ":\n")) {
76: _fs_fstab.fs_passno = atoi(cp);
77: return(1);
78: }
79: }
80: }
81: goto bad;
82: }
83: /* OLD_STYLE_FSTAB */
84: _fs_fstab.fs_spec = strtok(cp, " \t\n");
85: if (!_fs_fstab.fs_spec || *_fs_fstab.fs_spec == '#')
86: continue;
87: _fs_fstab.fs_file = strtok((char *)NULL, " \t\n");
88: _fs_fstab.fs_vfstype = strtok((char *)NULL, " \t\n");
89: _fs_fstab.fs_mntops = strtok((char *)NULL, " \t\n");
90: if (_fs_fstab.fs_mntops == NULL)
91: goto bad;
92: _fs_fstab.fs_freq = 0;
93: _fs_fstab.fs_passno = 0;
94: if ((cp = strtok((char *)NULL, " \t\n")) != NULL) {
95: _fs_fstab.fs_freq = atoi(cp);
96: if ((cp = strtok((char *)NULL, " \t\n")) != NULL)
97: _fs_fstab.fs_passno = atoi(cp);
98: }
99: strcpy(subline, _fs_fstab.fs_mntops);
100: for (typexx = 0, cp = strtok(subline, ","); cp;
101: cp = strtok((char *)NULL, ",")) {
102: if (strlen(cp) != 2)
103: continue;
104: if (!strcmp(cp, FSTAB_RW)) {
105: _fs_fstab.fs_type = FSTAB_RW;
106: break;
107: }
108: if (!strcmp(cp, FSTAB_RQ)) {
109: _fs_fstab.fs_type = FSTAB_RQ;
110: break;
111: }
112: if (!strcmp(cp, FSTAB_RO)) {
113: _fs_fstab.fs_type = FSTAB_RO;
114: break;
115: }
116: if (!strcmp(cp, FSTAB_SW)) {
117: _fs_fstab.fs_type = FSTAB_SW;
118: break;
119: }
120: if (!strcmp(cp, FSTAB_XX)) {
121: _fs_fstab.fs_type = FSTAB_XX;
122: typexx++;
123: break;
124: }
125: }
126: if (typexx)
127: continue;
128: if (cp != NULL)
129: return(1);
130:
131: bad: /* no way to distinguish between EOF and syntax error */
132: error(EFTYPE);
133: }
134: /* NOTREACHED */
135: }
136:
137: struct fstab *
138: getfsent()
139: {
140: if (!_fs_fp && !setfsent() || !fstabscan())
141: return((struct fstab *)NULL);
142: return(&_fs_fstab);
143: }
144:
145: struct fstab *
146: getfsspec(name)
147: register const char *name;
148: {
149: if (setfsent())
150: while (fstabscan())
151: if (!strcmp(_fs_fstab.fs_spec, name))
152: return(&_fs_fstab);
153: return((struct fstab *)NULL);
154: }
155:
156: struct fstab *
157: getfsfile(name)
158: register const char *name;
159: {
160: if (setfsent())
161: while (fstabscan())
162: if (!strcmp(_fs_fstab.fs_file, name))
163: return(&_fs_fstab);
164: return((struct fstab *)NULL);
165: }
166:
167: setfsent()
168: {
169: if (_fs_fp) {
170: rewind(_fs_fp);
171: return(1);
172: }
173: if (_fs_fp = fopen(_PATH_FSTAB, "r"))
174: return(1);
175: error(errno);
176: return(0);
177: }
178:
179: void
180: endfsent()
181: {
182: if (_fs_fp) {
183: (void)fclose(_fs_fp);
184: _fs_fp = NULL;
185: }
186: }
187:
188: static
189: error(err)
190: int err;
191: {
192: char *p;
193:
194: (void)write(STDERR_FILENO, "fstab: ", 7);
195: (void)write(STDERR_FILENO, _PATH_FSTAB, sizeof(_PATH_FSTAB) - 1);
196: p = strerror(err);
197: (void)write(STDERR_FILENO, p, strlen(p));
198: (void)write(STDERR_FILENO, "\n", 1);
199: }
CVSweb <webmaster@jp.NetBSD.org>