Removed older regexp function for new POSIX regex handling due to
[unix-history] / lib / libc / gen / fstab.c
CommitLineData
15637ed4
RG
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)
35static 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
45static FILE *_fs_fp;
46static struct fstab _fs_fstab;
47static error();
48
49static
50fstabscan()
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
131bad: /* no way to distinguish between EOF and syntax error */
132 error(EFTYPE);
133 }
134 /* NOTREACHED */
135}
136
137struct fstab *
138getfsent()
139{
140 if (!_fs_fp && !setfsent() || !fstabscan())
141 return((struct fstab *)NULL);
142 return(&_fs_fstab);
143}
144
145struct fstab *
146getfsspec(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
156struct fstab *
157getfsfile(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
167setfsent()
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
179void
180endfsent()
181{
182 if (_fs_fp) {
183 (void)fclose(_fs_fp);
184 _fs_fp = NULL;
185 }
186}
187
188static
189error(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}