Annotation of src/lib/libc/gen/fstab.c, Revision 1.28
1.28 ! christos 1: /* $NetBSD: fstab.c,v 1.27 2005/12/24 21:11:16 perry Exp $ */
1.6 cgd 2:
1.1 cgd 3: /*
1.6 cgd 4: * Copyright (c) 1980, 1988, 1993
5: * The Regents of the University of California. All rights reserved.
1.1 cgd 6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
1.25 agc 15: * 3. Neither the name of the University nor the names of its contributors
1.1 cgd 16: * may be used to endorse or promote products derived from this software
17: * without specific prior written permission.
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29: * SUCH DAMAGE.
30: */
31:
1.10 christos 32: #include <sys/cdefs.h>
1.1 cgd 33: #if defined(LIBC_SCCS) && !defined(lint)
1.6 cgd 34: #if 0
35: static char sccsid[] = "@(#)fstab.c 8.1 (Berkeley) 6/4/93";
36: #else
1.28 ! christos 37: __RCSID("$NetBSD: fstab.c,v 1.27 2005/12/24 21:11:16 perry Exp $");
1.6 cgd 38: #endif
1.1 cgd 39: #endif /* LIBC_SCCS and not lint */
40:
1.15 kleink 41: #include "namespace.h"
1.7 cgd 42: #include <sys/types.h>
1.20 lukem 43:
44: #include <assert.h>
1.14 mycroft 45: #include <err.h>
1.6 cgd 46: #include <errno.h>
1.1 cgd 47: #include <fstab.h>
48: #include <stdio.h>
49: #include <stdlib.h>
50: #include <string.h>
1.6 cgd 51: #include <unistd.h>
1.11 jtc 52:
53: #ifdef __weak_alias
1.22 mycroft 54: __weak_alias(endfsent,_endfsent)
55: __weak_alias(getfsent,_getfsent)
56: __weak_alias(getfsfile,_getfsfile)
57: __weak_alias(getfsspec,_getfsspec)
58: __weak_alias(setfsent,_setfsent)
1.11 jtc 59: #endif
1.1 cgd 60:
61: static FILE *_fs_fp;
1.17 christos 62: static size_t _fs_lineno = 0;
63: static const char *_fs_file = _PATH_FSTAB;
1.1 cgd 64: static struct fstab _fs_fstab;
1.6 cgd 65:
1.8 jtc 66: static int fstabscan __P((void));
1.1 cgd 67:
1.28 ! christos 68: static char *nextfld(char **, const char *);
! 69: static int fstabscan(void);
1.17 christos 70:
71:
1.28 ! christos 72: static char *
! 73: nextfld(char **str, const char *sep)
1.17 christos 74: {
75: char *ret;
1.20 lukem 76:
77: _DIAGASSERT(str != NULL);
78: _DIAGASSERT(sep != NULL);
79:
1.28 ! christos 80: while ((ret = stresep(str, sep, '\\')) != NULL && *ret == '\0')
1.17 christos 81: continue;
82: return ret;
83: }
84:
85:
1.8 jtc 86: static int
1.28 ! christos 87: fstabscan(void)
1.1 cgd 88: {
1.17 christos 89: char *cp, *lp, *sp;
1.1 cgd 90: #define MAXLINELENGTH 1024
91: static char line[MAXLINELENGTH];
92: char subline[MAXLINELENGTH];
1.10 christos 93: static const char sep[] = ":\n";
94: static const char ws[] = " \t\n";
1.26 christos 95: static const char *fstab_type[] = {
1.19 mrg 96: FSTAB_RW, FSTAB_RQ, FSTAB_RO, FSTAB_SW, FSTAB_DP, FSTAB_XX, NULL
1.17 christos 97: };
1.1 cgd 98:
1.23 lukem 99: (void)memset(&_fs_fstab, 0, sizeof(_fs_fstab));
1.1 cgd 100: for (;;) {
1.17 christos 101: if (!(lp = fgets(line, sizeof(line), _fs_fp)))
102: return 0;
103: _fs_lineno++;
1.1 cgd 104: /* OLD_STYLE_FSTAB */
1.17 christos 105: if (!strpbrk(lp, " \t")) {
106: _fs_fstab.fs_spec = nextfld(&lp, sep);
1.4 pk 107: if (!_fs_fstab.fs_spec || *_fs_fstab.fs_spec == '#')
108: continue;
1.17 christos 109: _fs_fstab.fs_file = nextfld(&lp, sep);
110: _fs_fstab.fs_type = nextfld(&lp, sep);
1.1 cgd 111: if (_fs_fstab.fs_type) {
112: if (!strcmp(_fs_fstab.fs_type, FSTAB_XX))
113: continue;
114: _fs_fstab.fs_mntops = _fs_fstab.fs_type;
115: _fs_fstab.fs_vfstype =
1.26 christos 116: __UNCONST(
1.1 cgd 117: strcmp(_fs_fstab.fs_type, FSTAB_SW) ?
1.26 christos 118: "ufs" : "swap");
1.17 christos 119: if ((cp = nextfld(&lp, sep)) != NULL) {
1.1 cgd 120: _fs_fstab.fs_freq = atoi(cp);
1.17 christos 121: if ((cp = nextfld(&lp, sep)) != NULL) {
1.1 cgd 122: _fs_fstab.fs_passno = atoi(cp);
1.17 christos 123: return 1;
1.1 cgd 124: }
125: }
126: }
127: goto bad;
128: }
129: /* OLD_STYLE_FSTAB */
1.17 christos 130: _fs_fstab.fs_spec = nextfld(&lp, ws);
1.1 cgd 131: if (!_fs_fstab.fs_spec || *_fs_fstab.fs_spec == '#')
132: continue;
1.17 christos 133: _fs_fstab.fs_file = nextfld(&lp, ws);
134: _fs_fstab.fs_vfstype = nextfld(&lp, ws);
135: _fs_fstab.fs_mntops = nextfld(&lp, ws);
1.1 cgd 136: if (_fs_fstab.fs_mntops == NULL)
137: goto bad;
138: _fs_fstab.fs_freq = 0;
139: _fs_fstab.fs_passno = 0;
1.17 christos 140: if ((cp = nextfld(&lp, ws)) != NULL) {
1.1 cgd 141: _fs_fstab.fs_freq = atoi(cp);
1.17 christos 142: if ((cp = nextfld(&lp, ws)) != NULL)
1.1 cgd 143: _fs_fstab.fs_passno = atoi(cp);
144: }
1.24 groo 145:
146: /* subline truncated iff line truncated */
147: (void)strlcpy(subline, _fs_fstab.fs_mntops, sizeof(subline));
148: sp = subline;
149:
1.17 christos 150: while ((cp = nextfld(&sp, ",")) != NULL) {
1.26 christos 151: const char **tp;
1.17 christos 152:
1.1 cgd 153: if (strlen(cp) != 2)
154: continue;
1.17 christos 155:
156: for (tp = fstab_type; *tp; tp++)
157: if (strcmp(cp, *tp) == 0) {
1.26 christos 158: _fs_fstab.fs_type = __UNCONST(*tp);
1.17 christos 159: break;
160: }
161: if (*tp)
1.1 cgd 162: break;
163: }
1.23 lukem 164: if (_fs_fstab.fs_type == NULL)
165: goto bad;
1.17 christos 166: if (strcmp(_fs_fstab.fs_type, FSTAB_XX) == 0)
1.1 cgd 167: continue;
168: if (cp != NULL)
1.17 christos 169: return 1;
1.1 cgd 170:
1.17 christos 171: bad:
1.18 thorpej 172: warnx("%s, %lu: Missing fields", _fs_file, (u_long)_fs_lineno);
1.1 cgd 173: }
174: /* NOTREACHED */
175: }
176:
177: struct fstab *
1.28 ! christos 178: getfsent(void)
1.1 cgd 179: {
1.10 christos 180: if ((!_fs_fp && !setfsent()) || !fstabscan())
1.17 christos 181: return NULL;
182: return &_fs_fstab;
1.1 cgd 183: }
184:
185: struct fstab *
1.28 ! christos 186: getfsspec(const char *name)
1.1 cgd 187: {
1.20 lukem 188:
189: _DIAGASSERT(name != NULL);
190:
1.1 cgd 191: if (setfsent())
192: while (fstabscan())
193: if (!strcmp(_fs_fstab.fs_spec, name))
1.17 christos 194: return &_fs_fstab;
195: return NULL;
1.1 cgd 196: }
197:
198: struct fstab *
1.28 ! christos 199: getfsfile(const char *name)
1.1 cgd 200: {
1.20 lukem 201:
202: _DIAGASSERT(name != NULL);
203:
1.1 cgd 204: if (setfsent())
205: while (fstabscan())
206: if (!strcmp(_fs_fstab.fs_file, name))
1.17 christos 207: return &_fs_fstab;
208: return NULL;
1.1 cgd 209: }
210:
1.8 jtc 211: int
1.28 ! christos 212: setfsent(void)
1.1 cgd 213: {
1.17 christos 214: _fs_lineno = 0;
1.1 cgd 215: if (_fs_fp) {
216: rewind(_fs_fp);
1.17 christos 217: return 1;
1.1 cgd 218: }
1.17 christos 219: if ((_fs_fp = fopen(_PATH_FSTAB, "r")) == NULL) {
220: warn("Cannot open `%s'", _PATH_FSTAB);
221: return 0;
222: }
223: return 1;
1.1 cgd 224: }
225:
226: void
1.28 ! christos 227: endfsent(void)
1.1 cgd 228: {
229: if (_fs_fp) {
230: (void)fclose(_fs_fp);
231: _fs_fp = NULL;
232: }
233: }
CVSweb <webmaster@jp.NetBSD.org>