xref: /titanic_52/usr/src/cmd/fs.d/nfs/mountd/nfs_cmd.c (revision a9685eaab1313767d1d4dac672c3a468519aa899)
1b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
2b89a8333Snatalie li - Sun Microsystems - Irvine United States  * CDDL HEADER START
3b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
4b89a8333Snatalie li - Sun Microsystems - Irvine United States  * The contents of this file are subject to the terms of the
5b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Common Development and Distribution License (the "License").
6b89a8333Snatalie li - Sun Microsystems - Irvine United States  * You may not use this file except in compliance with the License.
7b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
8b89a8333Snatalie li - Sun Microsystems - Irvine United States  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9b89a8333Snatalie li - Sun Microsystems - Irvine United States  * or http://www.opensolaris.org/os/licensing.
10b89a8333Snatalie li - Sun Microsystems - Irvine United States  * See the License for the specific language governing permissions
11b89a8333Snatalie li - Sun Microsystems - Irvine United States  * and limitations under the License.
12b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
13b89a8333Snatalie li - Sun Microsystems - Irvine United States  * When distributing Covered Code, include this CDDL HEADER in each
14b89a8333Snatalie li - Sun Microsystems - Irvine United States  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15b89a8333Snatalie li - Sun Microsystems - Irvine United States  * If applicable, add the following below this CDDL HEADER, with the
16b89a8333Snatalie li - Sun Microsystems - Irvine United States  * fields enclosed by brackets "[]" replaced with your own identifying
17b89a8333Snatalie li - Sun Microsystems - Irvine United States  * information: Portions Copyright [yyyy] [name of copyright owner]
18b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
19b89a8333Snatalie li - Sun Microsystems - Irvine United States  * CDDL HEADER END
20b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
21b89a8333Snatalie li - Sun Microsystems - Irvine United States 
22b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
2354d34259SMarcel Telka  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
24d34083bdSJan Kryl  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
25b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
26b89a8333Snatalie li - Sun Microsystems - Irvine United States 
27b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <sys/types.h>
28b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <rpc/rpc.h>
29b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <netconfig.h>
30b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <netdir.h>
31b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <netinet/in.h>
32b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <arpa/inet.h>
33b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <netdb.h>
34b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <libtsnet.h>
35b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <nfs/nfssys.h>
36b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <nfs/export.h>
37b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <nfs/nfs_cmd.h>
38b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <door.h>
39b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <syslog.h>
40b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <locale.h>
41b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <strings.h>
42b89a8333Snatalie li - Sun Microsystems - Irvine United States #include <sharefs/share.h>
4354d34259SMarcel Telka #include <stdlib.h>
4454d34259SMarcel Telka #include "../lib/sharetab.h"
4554d34259SMarcel Telka #include "mountd.h"
46b89a8333Snatalie li - Sun Microsystems - Irvine United States 
47b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
48b89a8333Snatalie li - Sun Microsystems - Irvine United States  * The following codesets must match what is in libshare_nfs.c until we can
49b89a8333Snatalie li - Sun Microsystems - Irvine United States  * request them from the kernel.
50b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
51b89a8333Snatalie li - Sun Microsystems - Irvine United States char *charopts[] = {
52b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"euc-cn",
53b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"euc-jp",
54b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"euc-jpms",
55b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"euc-kr",
56b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"euc-tw",
57b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-1",
58b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-2",
59b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-5",
60b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-6",
61b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-7",
62b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-8",
63b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-9",
64b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-13",
65b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"iso8859-15",
66b89a8333Snatalie li - Sun Microsystems - Irvine United States 	"koi8-r",
67b89a8333Snatalie li - Sun Microsystems - Irvine United States 	NULL
68b89a8333Snatalie li - Sun Microsystems - Irvine United States };
69b89a8333Snatalie li - Sun Microsystems - Irvine United States 
70b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
71b89a8333Snatalie li - Sun Microsystems - Irvine United States  * nfscmd_err(dp, args, err)
72b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Return an error for the door call.
73b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
74b89a8333Snatalie li - Sun Microsystems - Irvine United States 
75b89a8333Snatalie li - Sun Microsystems - Irvine United States static void
76b89a8333Snatalie li - Sun Microsystems - Irvine United States nfscmd_err(door_desc_t *dp, nfscmd_arg_t *args, int err)
77b89a8333Snatalie li - Sun Microsystems - Irvine United States {
78b89a8333Snatalie li - Sun Microsystems - Irvine United States 	nfscmd_res_t res;
79b89a8333Snatalie li - Sun Microsystems - Irvine United States 
80b89a8333Snatalie li - Sun Microsystems - Irvine United States 	res.version = NFSCMD_VERS_1;
81b89a8333Snatalie li - Sun Microsystems - Irvine United States 	res.cmd = NFSCMD_ERROR;
82b89a8333Snatalie li - Sun Microsystems - Irvine United States 	res.error = err;
83b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) door_return((char *)&res, sizeof (nfscmd_res_t), NULL, 0);
84b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) door_return(NULL, 0, NULL, 0);
85b89a8333Snatalie li - Sun Microsystems - Irvine United States 	/* NOTREACHED */
86b89a8333Snatalie li - Sun Microsystems - Irvine United States 
87b89a8333Snatalie li - Sun Microsystems - Irvine United States }
88b89a8333Snatalie li - Sun Microsystems - Irvine United States 
89b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
90b89a8333Snatalie li - Sun Microsystems - Irvine United States  * charmap_search(netbuf, opts)
91b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
92b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Check to see if the address in the netbuf is found in
93b89a8333Snatalie li - Sun Microsystems - Irvine United States  * a character map spec in the opts option string. Returns the charset
94b89a8333Snatalie li - Sun Microsystems - Irvine United States  * name if found.
95b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
96b89a8333Snatalie li - Sun Microsystems - Irvine United States 
97b89a8333Snatalie li - Sun Microsystems - Irvine United States static char *
98b89a8333Snatalie li - Sun Microsystems - Irvine United States charmap_search(struct netbuf *nbuf, char *opts)
99b89a8333Snatalie li - Sun Microsystems - Irvine United States {
100b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *copts;
101b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *next;
102b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *name;
103b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *result = NULL;
104*a9685eaaSMarcel Telka 	char *netid;
105b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct sockaddr *sa;
106b89a8333Snatalie li - Sun Microsystems - Irvine United States 
107*a9685eaaSMarcel Telka 	struct cln cln;
108*a9685eaaSMarcel Telka 
109b89a8333Snatalie li - Sun Microsystems - Irvine United States 	sa = (struct sockaddr *)nbuf->buf;
110b89a8333Snatalie li - Sun Microsystems - Irvine United States 
111b89a8333Snatalie li - Sun Microsystems - Irvine United States 	switch (sa->sa_family) {
112b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case AF_INET:
113*a9685eaaSMarcel Telka 		netid = "tcp";
114b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
115b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case AF_INET6:
116*a9685eaaSMarcel Telka 		netid = "tcp6";
117b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
118b89a8333Snatalie li - Sun Microsystems - Irvine United States 	default:
119b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
120b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
121b89a8333Snatalie li - Sun Microsystems - Irvine United States 
122b89a8333Snatalie li - Sun Microsystems - Irvine United States 	copts = strdup(opts);
123*a9685eaaSMarcel Telka 	if (copts == NULL)
124b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (NULL);
125*a9685eaaSMarcel Telka 
126*a9685eaaSMarcel Telka 	cln_init_lazy(&cln, netid, nbuf);
127b89a8333Snatalie li - Sun Microsystems - Irvine United States 
128b89a8333Snatalie li - Sun Microsystems - Irvine United States 	next = copts;
129b89a8333Snatalie li - Sun Microsystems - Irvine United States 	while (*next != '\0') {
130b89a8333Snatalie li - Sun Microsystems - Irvine United States 		char *val;
131b89a8333Snatalie li - Sun Microsystems - Irvine United States 		name = next;
132b89a8333Snatalie li - Sun Microsystems - Irvine United States 		if (getsubopt(&next, charopts, &val) >= 0) {
133b89a8333Snatalie li - Sun Microsystems - Irvine United States 			char *cp;
134b89a8333Snatalie li - Sun Microsystems - Irvine United States 			/*
135b89a8333Snatalie li - Sun Microsystems - Irvine United States 			 * name will have the whole opt and val the value. Set
136b89a8333Snatalie li - Sun Microsystems - Irvine United States 			 * the '=' to '\0' and we have the charmap in name and
137b89a8333Snatalie li - Sun Microsystems - Irvine United States 			 * the access list in val.
138b89a8333Snatalie li - Sun Microsystems - Irvine United States 			 */
139b89a8333Snatalie li - Sun Microsystems - Irvine United States 			cp = strchr(name, '=');
140b89a8333Snatalie li - Sun Microsystems - Irvine United States 			if (cp != NULL)
141b89a8333Snatalie li - Sun Microsystems - Irvine United States 				*cp = '\0';
142*a9685eaaSMarcel Telka 			if (in_access_list(&cln, val) > 0) {
143b89a8333Snatalie li - Sun Microsystems - Irvine United States 				result = name;
144b89a8333Snatalie li - Sun Microsystems - Irvine United States 				break;
145b89a8333Snatalie li - Sun Microsystems - Irvine United States 			}
146b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
147b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
148b89a8333Snatalie li - Sun Microsystems - Irvine United States 
149b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (result != NULL)
150b89a8333Snatalie li - Sun Microsystems - Irvine United States 		result = strdup(result);
151b89a8333Snatalie li - Sun Microsystems - Irvine United States 
152*a9685eaaSMarcel Telka 	cln_fini(&cln);
153b89a8333Snatalie li - Sun Microsystems - Irvine United States 	free(copts);
154b89a8333Snatalie li - Sun Microsystems - Irvine United States 
155b89a8333Snatalie li - Sun Microsystems - Irvine United States 	return (result);
156b89a8333Snatalie li - Sun Microsystems - Irvine United States }
157b89a8333Snatalie li - Sun Microsystems - Irvine United States 
158b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
159b89a8333Snatalie li - Sun Microsystems - Irvine United States  * nfscmd_charmap_lookup(door, args)
160b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
161b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Check to see if there is a translation requested for the path
162b89a8333Snatalie li - Sun Microsystems - Irvine United States  * specified in the request. If there is, return the charset name.
163b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
164b89a8333Snatalie li - Sun Microsystems - Irvine United States 
165b89a8333Snatalie li - Sun Microsystems - Irvine United States static void
166b89a8333Snatalie li - Sun Microsystems - Irvine United States nfscmd_charmap_lookup(door_desc_t *dp, nfscmd_arg_t *args)
167b89a8333Snatalie li - Sun Microsystems - Irvine United States {
168b89a8333Snatalie li - Sun Microsystems - Irvine United States 	nfscmd_res_t res;
169b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct netbuf nb;
170b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct sockaddr sa;
171b89a8333Snatalie li - Sun Microsystems - Irvine United States 	struct share *sh = NULL;
172b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char *name;
173b89a8333Snatalie li - Sun Microsystems - Irvine United States 
174b89a8333Snatalie li - Sun Microsystems - Irvine United States 	memset(&res, '\0', sizeof (res));
175b89a8333Snatalie li - Sun Microsystems - Irvine United States 	res.version = NFSCMD_VERS_1;
176b89a8333Snatalie li - Sun Microsystems - Irvine United States 	res.cmd = NFSCMD_CHARMAP_LOOKUP;
177b89a8333Snatalie li - Sun Microsystems - Irvine United States 
178b89a8333Snatalie li - Sun Microsystems - Irvine United States 	sh = findentry(args->arg.charmap.path);
179b89a8333Snatalie li - Sun Microsystems - Irvine United States 
180b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (sh != NULL) {
181b89a8333Snatalie li - Sun Microsystems - Irvine United States 		nb.len = nb.maxlen = sizeof (struct sockaddr);
182b89a8333Snatalie li - Sun Microsystems - Irvine United States 		nb.buf = (char *)&sa;
183b89a8333Snatalie li - Sun Microsystems - Irvine United States 
184b89a8333Snatalie li - Sun Microsystems - Irvine United States 		sa = args->arg.charmap.addr;
185b89a8333Snatalie li - Sun Microsystems - Irvine United States 
186b89a8333Snatalie li - Sun Microsystems - Irvine United States 		name = charmap_search(&nb, sh->sh_opts);
187b89a8333Snatalie li - Sun Microsystems - Irvine United States 		if (name != NULL) {
188b89a8333Snatalie li - Sun Microsystems - Irvine United States 			strcpy(res.result.charmap.codeset, name);
189b89a8333Snatalie li - Sun Microsystems - Irvine United States 			res.result.charmap.apply = B_TRUE;
190b89a8333Snatalie li - Sun Microsystems - Irvine United States 			res.error = NFSCMD_ERR_SUCCESS;
191b89a8333Snatalie li - Sun Microsystems - Irvine United States 			free(name);
192b89a8333Snatalie li - Sun Microsystems - Irvine United States 		} else {
193b89a8333Snatalie li - Sun Microsystems - Irvine United States 			res.result.charmap.apply = B_FALSE;
194b89a8333Snatalie li - Sun Microsystems - Irvine United States 			res.error = NFSCMD_ERR_NOTFOUND;
195b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
196b89a8333Snatalie li - Sun Microsystems - Irvine United States 		sharefree(sh);
197b89a8333Snatalie li - Sun Microsystems - Irvine United States 	} else {
198b89a8333Snatalie li - Sun Microsystems - Irvine United States 		res.error = NFSCMD_ERR_NOTFOUND;
199b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
200b89a8333Snatalie li - Sun Microsystems - Irvine United States 
201b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) door_return((char *)&res, sizeof (nfscmd_res_t), NULL, 0);
202b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) door_return(NULL, 0, NULL, 0);
203b89a8333Snatalie li - Sun Microsystems - Irvine United States 	/* NOTREACHED */
204b89a8333Snatalie li - Sun Microsystems - Irvine United States }
205b89a8333Snatalie li - Sun Microsystems - Irvine United States 
206b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
207b89a8333Snatalie li - Sun Microsystems - Irvine United States  * nfscmd_ver_1(door, args, size)
208b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
209b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Version 1 of the door command processor for nfs cmds.
210b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
211b89a8333Snatalie li - Sun Microsystems - Irvine United States 
212b89a8333Snatalie li - Sun Microsystems - Irvine United States static void
213b89a8333Snatalie li - Sun Microsystems - Irvine United States nfscmd_vers_1(door_desc_t *dp, nfscmd_arg_t *args, size_t size)
214b89a8333Snatalie li - Sun Microsystems - Irvine United States {
215b89a8333Snatalie li - Sun Microsystems - Irvine United States 	switch (args->cmd) {
216b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case NFSCMD_CHARMAP_LOOKUP:
217b89a8333Snatalie li - Sun Microsystems - Irvine United States 		nfscmd_charmap_lookup(dp, args);
218b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
219b89a8333Snatalie li - Sun Microsystems - Irvine United States 	default:
220b89a8333Snatalie li - Sun Microsystems - Irvine United States 		nfscmd_err(dp, args, NFSCMD_ERR_BADCMD);
221b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
222b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
223b89a8333Snatalie li - Sun Microsystems - Irvine United States }
224b89a8333Snatalie li - Sun Microsystems - Irvine United States 
225b89a8333Snatalie li - Sun Microsystems - Irvine United States /*
226b89a8333Snatalie li - Sun Microsystems - Irvine United States  * nfscmd_func(cookie, dataptr, size, door, ndesc)
227b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
228b89a8333Snatalie li - Sun Microsystems - Irvine United States  * The function called by the door thread for processing
229b89a8333Snatalie li - Sun Microsystems - Irvine United States  * nfscmd type commands.
230b89a8333Snatalie li - Sun Microsystems - Irvine United States  */
231b89a8333Snatalie li - Sun Microsystems - Irvine United States 
232b89a8333Snatalie li - Sun Microsystems - Irvine United States void
233b89a8333Snatalie li - Sun Microsystems - Irvine United States nfscmd_func(void *cookie, char *dataptr, size_t arg_size,
234b89a8333Snatalie li - Sun Microsystems - Irvine United States 	door_desc_t *dp, uint_t n_desc)
235b89a8333Snatalie li - Sun Microsystems - Irvine United States {
236b89a8333Snatalie li - Sun Microsystems - Irvine United States 	nfscmd_arg_t	*args;
237b89a8333Snatalie li - Sun Microsystems - Irvine United States 
238b89a8333Snatalie li - Sun Microsystems - Irvine United States 	args = (nfscmd_arg_t *)dataptr;
239b89a8333Snatalie li - Sun Microsystems - Irvine United States 
240b89a8333Snatalie li - Sun Microsystems - Irvine United States 	switch (args->version) {
241b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case NFSCMD_VERS_1:
242b89a8333Snatalie li - Sun Microsystems - Irvine United States 		nfscmd_vers_1(dp, args, arg_size);
243b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
244b89a8333Snatalie li - Sun Microsystems - Irvine United States 	default:
245b89a8333Snatalie li - Sun Microsystems - Irvine United States 		syslog(LOG_ERR, gettext("Invalid nfscmd version"));
246b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
247b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
248b89a8333Snatalie li - Sun Microsystems - Irvine United States 
249b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) door_return((caddr_t)args, sizeof (nfscmd_res_t), NULL, 0);
250b89a8333Snatalie li - Sun Microsystems - Irvine United States 	(void) door_return(NULL, 0, NULL, 0);
251b89a8333Snatalie li - Sun Microsystems - Irvine United States 	/* NOTREACHED */
252b89a8333Snatalie li - Sun Microsystems - Irvine United States 
253b89a8333Snatalie li - Sun Microsystems - Irvine United States }
254