1 /* $NetBSD: fstab.c,v 1.27 2005/12/24 21:11:16 perry Exp $ */
4 * Copyright (c) 1980, 1988, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
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
32 #include <sys/cdefs.h>
33 #if defined(LIBC_SCCS) && !defined(lint)
35 static char sccsid
[] = "@(#)fstab.c 8.1 (Berkeley) 6/4/93";
37 __RCSID("$NetBSD: fstab.c,v 1.27 2005/12/24 21:11:16 perry Exp $");
39 #endif /* LIBC_SCCS and not lint */
41 #include "namespace.h"
42 #include <sys/types.h>
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
)
62 static size_t _fs_lineno
= 0;
63 static const char *_fs_file
= _PATH_FSTAB
;
64 static struct fstab _fs_fstab
;
66 static int fstabscan
__P((void));
68 static char *nextfld(char **, const char *);
69 static int fstabscan(void);
73 nextfld(char **str
, const char *sep
)
77 _DIAGASSERT(str
!= NULL
);
78 _DIAGASSERT(sep
!= NULL
);
80 while ((ret
= stresep(str
, sep
, '\\')) != NULL
&& *ret
== '\0')
90 #define MAXLINELENGTH 1024
91 static char line
[MAXLINELENGTH
];
92 char subline
[MAXLINELENGTH
];
93 static const char sep
[] = ":\n";
94 static const char ws
[] = " \t\n";
95 static const char *fstab_type
[] = {
96 FSTAB_RW
, FSTAB_RQ
, FSTAB_RO
, FSTAB_SW
, FSTAB_DP
, FSTAB_XX
, NULL
99 (void)memset(&_fs_fstab
, 0, sizeof(_fs_fstab
));
101 if (!(lp
= fgets(line
, sizeof(line
), _fs_fp
)))
104 /* OLD_STYLE_FSTAB */
105 if (!strpbrk(lp
, " \t")) {
106 _fs_fstab
.fs_spec
= nextfld(&lp
, sep
);
107 if (!_fs_fstab
.fs_spec
|| *_fs_fstab
.fs_spec
== '#')
109 _fs_fstab
.fs_file
= nextfld(&lp
, sep
);
110 _fs_fstab
.fs_type
= nextfld(&lp
, sep
);
111 if (_fs_fstab
.fs_type
) {
112 if (!strcmp(_fs_fstab
.fs_type
, FSTAB_XX
))
114 _fs_fstab
.fs_mntops
= _fs_fstab
.fs_type
;
115 _fs_fstab
.fs_vfstype
=
117 strcmp(_fs_fstab
.fs_type
, FSTAB_SW
) ?
119 if ((cp
= nextfld(&lp
, sep
)) != NULL
) {
120 _fs_fstab
.fs_freq
= atoi(cp
);
121 if ((cp
= nextfld(&lp
, sep
)) != NULL
) {
122 _fs_fstab
.fs_passno
= atoi(cp
);
129 /* OLD_STYLE_FSTAB */
130 _fs_fstab
.fs_spec
= nextfld(&lp
, ws
);
131 if (!_fs_fstab
.fs_spec
|| *_fs_fstab
.fs_spec
== '#')
133 _fs_fstab
.fs_file
= nextfld(&lp
, ws
);
134 _fs_fstab
.fs_vfstype
= nextfld(&lp
, ws
);
135 _fs_fstab
.fs_mntops
= nextfld(&lp
, ws
);
136 if (_fs_fstab
.fs_mntops
== NULL
)
138 _fs_fstab
.fs_freq
= 0;
139 _fs_fstab
.fs_passno
= 0;
140 if ((cp
= nextfld(&lp
, ws
)) != NULL
) {
141 _fs_fstab
.fs_freq
= atoi(cp
);
142 if ((cp
= nextfld(&lp
, ws
)) != NULL
)
143 _fs_fstab
.fs_passno
= atoi(cp
);
146 /* subline truncated iff line truncated */
147 (void)strlcpy(subline
, _fs_fstab
.fs_mntops
, sizeof(subline
));
150 while ((cp
= nextfld(&sp
, ",")) != NULL
) {
156 for (tp
= fstab_type
; *tp
; tp
++)
157 if (strcmp(cp
, *tp
) == 0) {
158 _fs_fstab
.fs_type
= __UNCONST(*tp
);
164 if (_fs_fstab
.fs_type
== NULL
)
166 if (strcmp(_fs_fstab
.fs_type
, FSTAB_XX
) == 0)
172 warnx("%s, %lu: Missing fields", _fs_file
, (u_long
)_fs_lineno
);
180 if ((!_fs_fp
&& !setfsent()) || !fstabscan())
186 getfsspec(const char *name
)
189 _DIAGASSERT(name
!= NULL
);
193 if (!strcmp(_fs_fstab
.fs_spec
, name
))
199 getfsfile(const char *name
)
202 _DIAGASSERT(name
!= NULL
);
206 if (!strcmp(_fs_fstab
.fs_file
, name
))
219 if ((_fs_fp
= fopen(_PATH_FSTAB
, "r")) == NULL
) {
220 warn("Cannot open `%s'", _PATH_FSTAB
);
230 (void)fclose(_fs_fp
);