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
nfscmd_err(door_desc_t * dp,nfscmd_arg_t * args,int err)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 *
charmap_search(struct netbuf * nbuf,char * opts)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
nfscmd_charmap_lookup(door_desc_t * dp,nfscmd_arg_t * args)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
nfscmd_vers_1(door_desc_t * dp,nfscmd_arg_t * args,size_t size)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
nfscmd_func(void * cookie,char * dataptr,size_t arg_size,door_desc_t * dp,uint_t n_desc)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