xref: /titanic_41/usr/src/lib/libbc/libc/gen/common/mntent.c (revision 77b938d5c5dbaf1d833182acdb9de0fc1782fcba)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 1990 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <stdio.h>
30 #include <ctype.h>
31 #include <mntent.h>
32 #include <sys/file.h>
33 #include <malloc.h>
34 
35 static int	mntprtent(FILE *, struct mntent *);
36 
37 static	struct mntent *mntp;
38 
39 struct mntent *
40 _mnt(void)
41 {
42 
43 	if (mntp == 0)
44 		mntp = (struct mntent *)calloc(1, sizeof (struct mntent));
45 	return (mntp);
46 }
47 
48 static char *
49 mntstr(char **p)
50 {
51 	unsigned char *cp = (unsigned char *) *p;
52 	unsigned char *retstr;
53 
54 	while (*cp && isspace(*cp))
55 		cp++;
56 	retstr = cp;
57 	while (*cp && !isspace(*cp))
58 		cp++;
59 	if (*cp) {
60 		*cp = '\0';
61 		cp++;
62 	}
63 	*p = (char *) cp;
64 	return ((char *)retstr);
65 }
66 
67 static int
68 mntdigit(char **p)
69 {
70 	int value = 0;
71 	unsigned char *cp = (unsigned char *) *p;
72 
73 	while (*cp && isspace(*cp))
74 		cp++;
75 	for (; *cp && isdigit(*cp); cp++) {
76 		value *= 10;
77 		value += *cp - '0';
78 	}
79 	while (*cp && !isspace(*cp))
80 		cp++;
81 	if (*cp) {
82 		*cp = '\0';
83 		cp++;
84 	}
85 	*p =  (char *) cp;
86 	return (value);
87 }
88 
89 static int
90 mnttabscan(FILE *mnttabp, struct mntent *mnt)
91 {
92 	static	char *line = NULL;
93 	char *cp;
94 
95 	if (line == NULL)
96 		line = (char *)malloc(BUFSIZ+1);
97 	do {
98 		cp = fgets(line, BUFSIZ, mnttabp);
99 		if (cp == NULL) {
100 			return (EOF);
101 		}
102 	} while (*cp == '#');
103 	mnt->mnt_fsname = mntstr(&cp);
104 	if (*cp == '\0')
105 		return (1);
106 	mnt->mnt_dir = mntstr(&cp);
107 	if (*cp == '\0')
108 		return (2);
109 	mnt->mnt_type = mntstr(&cp);
110 	if (*cp == '\0')
111 		return (3);
112 	mnt->mnt_opts = mntstr(&cp);
113 	if (*cp == '\0')
114 		return (4);
115 	mnt->mnt_freq = mntdigit(&cp);
116 	if (*cp == '\0')
117 		return (5);
118 	mnt->mnt_passno = mntdigit(&cp);
119 	return (6);
120 }
121 
122 FILE *
123 setmntent(char *fname, char *flag)
124 {
125 	FILE *mnttabp;
126 
127 	if ((mnttabp = fopen(fname, flag)) == NULL) {
128 		return (NULL);
129 	}
130 	for (; *flag ; flag++) {
131 		if (*flag == 'w' || *flag == 'a' || *flag == '+') {
132 			if (flock(fileno(mnttabp), LOCK_EX) < 0) {
133 				fclose(mnttabp);
134 				return (NULL);
135 			}
136 			break;
137 		}
138 	}
139 	return (mnttabp);
140 }
141 
142 int
143 endmntent(FILE *mnttabp)
144 {
145 
146 	if (mnttabp) {
147 		fclose(mnttabp);
148 	}
149 	return (1);
150 }
151 
152 struct mntent *
153 getmntent(FILE *mnttabp)
154 {
155 	int nfields;
156 
157 	if (mnttabp == 0)
158 		return ((struct mntent *)0);
159 	if (_mnt() == 0)
160 		return ((struct mntent *)0);
161 	nfields = mnttabscan(mnttabp, mntp);
162 	if (nfields == EOF || nfields != 6)
163 		return ((struct mntent *)0);
164 	return (mntp);
165 }
166 
167 int
168 addmntent(FILE *mnttabp, struct mntent *mnt)
169 {
170 	if (fseek(mnttabp, 0L, 2) < 0)
171 		return (1);
172 	if (mnt == (struct mntent *)0)
173 		return (1);
174 	if (mnt->mnt_fsname == NULL || mnt->mnt_dir  == NULL ||
175 	    mnt->mnt_type   == NULL || mnt->mnt_opts == NULL)
176 		return (1);
177 
178 	mntprtent(mnttabp, mnt);
179 	return (0);
180 }
181 
182 static char *
183 mntopt(char **p)
184 {
185 	unsigned char *cp = (unsigned char *) *p;
186 	unsigned char *retstr;
187 
188 	while (*cp && isspace(*cp))
189 		cp++;
190 	retstr = cp;
191 	while (*cp && *cp != ',')
192 		cp++;
193 	if (*cp) {
194 		*cp = '\0';
195 		cp++;
196 	}
197 	*p =  (char *) cp;
198 	return ((char *)retstr);
199 }
200 
201 char *
202 hasmntopt(struct mntent *mnt, char *opt)
203 {
204 	char *f, *opts;
205 	static char *tmpopts;
206 
207 	if (tmpopts == 0) {
208 		tmpopts = (char *)calloc(256, sizeof (char));
209 		if (tmpopts == 0)
210 			return (0);
211 	}
212 	strcpy(tmpopts, mnt->mnt_opts);
213 	opts = tmpopts;
214 	f = mntopt(&opts);
215 	for (; *f; f = mntopt(&opts)) {
216 		if (strncmp(opt, f, strlen(opt)) == 0)
217 			return (f - tmpopts + mnt->mnt_opts);
218 	}
219 	return (NULL);
220 }
221 
222 static int
223 mntprtent(FILE *mnttabp, struct mntent *mnt)
224 {
225 	fprintf(mnttabp, "%s %s %s %s %d %d\n",
226 	    mnt->mnt_fsname,
227 	    mnt->mnt_dir,
228 	    mnt->mnt_type,
229 	    mnt->mnt_opts,
230 	    mnt->mnt_freq,
231 	    mnt->mnt_passno);
232 	return (0);
233 }
234