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