xref: /illumos-gate/usr/src/cmd/fs.d/nfs/lib/sharetab.c (revision a38ddfee9c8c6b6c5a2947ff52fd2338362a4444)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 /*
31  * Portions of this source code were derived from Berkeley 4.3 BSD
32  * under license from the Regents of the University of California.
33  */
34 
35 #pragma ident	"%Z%%M%	%I%	%E% SMI"
36 
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <unistd.h>
41 #include <sharefs/share.h>
42 #include "sharetab.h"
43 
44 /*
45  * Get an entry from the share table.
46  * There should be at least 4 fields:
47  *
48  * 	pathname  resource  fstype  options  [ description ]
49  *
50  * A fifth field (description) is optional.
51  *
52  * Returns:
53  *	> 1  valid entry
54  *	= 0  end of file
55  *	< 0  error
56  */
57 int
58 getshare(FILE *fd, share_t **shp)
59 {
60 	static char *line = NULL;
61 	static share_t *sh = NULL;
62 	char *p;
63 	char *lasts;
64 	char *w = " \t";
65 
66 	if (line == NULL) {
67 		line = (char *)malloc(MAXBUFSIZE+1);
68 		if (line == NULL)
69 			return (-1);
70 	}
71 	if (sh == NULL) {
72 		sh = (share_t *)malloc(sizeof (*sh));
73 		if (sh == NULL)
74 			return (-1);
75 	}
76 
77 	p = fgets(line, MAXBUFSIZE, fd);
78 	if (p == NULL)
79 		return (0);
80 	line[strlen(line) - 1] = '\0';
81 
82 	sh->sh_path = (char *)strtok_r(p, w, &lasts);
83 	if (sh->sh_path == NULL)
84 		return (-3);
85 	sh->sh_res = (char *)strtok_r(NULL, w, &lasts);
86 	if (sh->sh_res == NULL)
87 		return (-3);
88 	sh->sh_fstype = (char *)strtok_r(NULL, w, &lasts);
89 	if (sh->sh_fstype == NULL)
90 		return (-3);
91 	sh->sh_opts = (char *)strtok_r(NULL, w, &lasts);
92 	if (sh->sh_opts == NULL)
93 		return (-3);
94 	sh->sh_descr = (char *)strtok_r(NULL, "", &lasts);
95 	if (sh->sh_descr == NULL)
96 		sh->sh_descr = "";
97 
98 	*shp = sh;
99 	return (1);
100 }
101 
102 share_t *
103 sharedup(share_t *sh)
104 {
105 	share_t *nsh;
106 
107 	nsh = (share_t *)calloc(1, sizeof (*nsh));
108 	if (nsh == NULL)
109 		return (NULL);
110 
111 	if (sh->sh_path) {
112 		nsh->sh_path = strdup(sh->sh_path);
113 		if (nsh->sh_path == NULL)
114 			goto alloc_failed;
115 	}
116 
117 	if (sh->sh_res) {
118 		nsh->sh_res = strdup(sh->sh_res);
119 		if (nsh->sh_res == NULL)
120 			goto alloc_failed;
121 	}
122 	if (sh->sh_fstype) {
123 		nsh->sh_fstype = strdup(sh->sh_fstype);
124 		if (nsh->sh_fstype == NULL)
125 			goto alloc_failed;
126 	}
127 	if (sh->sh_opts) {
128 		nsh->sh_opts = strdup(sh->sh_opts);
129 		if (nsh->sh_opts == NULL)
130 			goto alloc_failed;
131 	}
132 	if (sh->sh_descr) {
133 		nsh->sh_descr = strdup(sh->sh_descr);
134 		if (nsh->sh_descr == NULL)
135 			goto alloc_failed;
136 	}
137 	return (nsh);
138 
139 alloc_failed:
140 	sharefree(nsh);
141 	return (NULL);
142 }
143 
144 void
145 sharefree(share_t *sh)
146 {
147 	if (sh->sh_path != NULL)
148 		free(sh->sh_path);
149 	if (sh->sh_res != NULL)
150 		free(sh->sh_res);
151 	if (sh->sh_fstype != NULL)
152 		free(sh->sh_fstype);
153 	if (sh->sh_opts != NULL)
154 		free(sh->sh_opts);
155 	if (sh->sh_descr != NULL)
156 		free(sh->sh_descr);
157 	free(sh);
158 }
159 
160 /*
161  * Return the value after "=" for option "opt"
162  * in option string "optlist". Caller must
163  * free returned value.
164  */
165 char *
166 getshareopt(char *optlist, char *opt)
167 {
168 	char *p, *pe;
169 	char *b;
170 	char *bb;
171 	char *lasts;
172 	char *val = NULL;
173 
174 	b = bb = strdup(optlist);
175 	if (b == NULL)
176 		return (NULL);
177 
178 	while (p = (char *)strtok_r(b, ",", &lasts)) {
179 		b = NULL;
180 		if (pe = strchr(p, '=')) {
181 			*pe = '\0';
182 			if (strcmp(opt, p) == 0) {
183 				val = strdup(pe + 1);
184 				goto done;
185 			}
186 		}
187 		if (strcmp(opt, p) == 0) {
188 			val = strdup("");
189 			goto done;
190 		}
191 	}
192 done:
193 	free(bb);
194 	return (val);
195 }
196