19fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 29fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * CDDL HEADER START 39fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 49fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The contents of this file are subject to the terms of the 59fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Common Development and Distribution License (the "License"). 69fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * You may not use this file except in compliance with the License. 79fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 89fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 99fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * or http://www.opensolaris.org/os/licensing. 109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * See the License for the specific language governing permissions 119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and limitations under the License. 129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * When distributing Covered Code, include this CDDL HEADER in each 149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If applicable, add the following below this CDDL HEADER, with the 169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fields enclosed by brackets "[]" replaced with your own identifying 179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information: Portions Copyright [yyyy] [name of copyright owner] 189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * CDDL HEADER END 209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 21148c5f43SAlan Wright 229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 23148c5f43SAlan Wright * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*b3700b07SGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <strings.h> 289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <errno.h> 299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <unistd.h> 309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <fcntl.h> 319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <dirent.h> 32148c5f43SAlan Wright #include <dlfcn.h> 339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <pthread.h> 349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <syslog.h> 359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/fs_reparse.h> 369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <uuid/uuid.h> 379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libsmb.h> 399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libmlsvc.h> 40148c5f43SAlan Wright #include <smbsrv/smb_dfs.h> 41148c5f43SAlan Wright #include <smbsrv/smb_share.h> 429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <dfs.h> 439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * default timeout (TTL) values (in second) for root and link 469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_ROOT_TIMEOUT 300 489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_TIMEOUT 1800 499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS link data format in reparse point 529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ver:state:prop:timeout:guid:ntarget:cmntlen:comment 549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * [[:tserver:tshare:tstate:pclass:prank]...] 559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_V1 1 579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_HDR_NFIELDS 7 /* # fields in header section */ 589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_TRGT_NFIELDS 5 /* # fields for each target */ 599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_ROOT_XATTR "SUNWdfs.rootinfo" 619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_INFO_ALL 0 639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 64148c5f43SAlan Wright static void *dfs_intr_hdl = NULL; 65148c5f43SAlan Wright 66148c5f43SAlan Wright static struct { 67148c5f43SAlan Wright int (*dfsops_remote_count)(uint32_t *); 68148c5f43SAlan Wright } dfs_intr_ops; 69148c5f43SAlan Wright 709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Namespace cache 729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Caches links' UNC and filesystem path where the key is the UNC path. 749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smb_cache_t dfs_nscache; 769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static char dfs_nbname[NETBIOS_NAME_SZ]; 779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 78cb174861Sjoyce mcintosh /* 79cb174861Sjoyce mcintosh * The name of cached namespace. This will be the only 80cb174861Sjoyce mcintosh * exported namespace until hosting multiple namespaces 81cb174861Sjoyce mcintosh * is supported 82cb174861Sjoyce mcintosh */ 83cb174861Sjoyce mcintosh static char dfs_cached_ns[MAXNAMELEN]; 84cb174861Sjoyce mcintosh static mutex_t dfs_nsmtx; 85cb174861Sjoyce mcintosh 869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Lock for accessing root information (extended attribute) 889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static rwlock_t dfs_root_rwl; 909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States extern uint32_t srvsvc_shr_setdfsroot(smb_share_t *, boolean_t); 929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Namespace functions 959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_namespace_findlink(const char *, char *, char *, size_t); 979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *dfs_namespace_cache(void *); 98cb174861Sjoyce mcintosh static boolean_t dfs_namespace_iscached(const char *); 999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Root functions 1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_root_add(const char *, dfs_info_t *); 1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_remove(const char *); 1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_encode(dfs_info_t *, char **, size_t *); 1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_decode(dfs_info_t *, char *, size_t, uint32_t); 1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_isvalidstate(uint32_t); 1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_root_xopen(const char *, int); 1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void dfs_root_xclose(int); 1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_xwrite(int, dfs_info_t *); 1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_xread(int, dfs_info_t *, uint32_t); 1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Link functions 1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_link_encode(dfs_info_t *, char *, size_t); 1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_link_decode(dfs_info_t *, char *, uint32_t); 1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_link_commit(const char *, dfs_info_t *); 1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_link_isvalidstate(uint32_t); 1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Target functions 1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void dfs_target_init(dfs_target_t *, const char *, const char *, 1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t); 1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_target_find(dfs_target_t *, uint32_t, const char *, 1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *); 1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_target_isvalidstate(uint32_t); 1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Cache functions 1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_cache_add_byunc(const char *, const char *, uint32_t); 1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void dfs_cache_populate(const char *, const char *); 1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_cache_cmp(const void *, const void *); 137cb174861Sjoyce mcintosh static void dfs_cache_flush(const char *); 138cb174861Sjoyce mcintosh static uint32_t dfs_cache_nscount(void); 1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Utility functions 1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_path_isdir(const char *); 1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_modinfo(uint32_t, dfs_info_t *, dfs_info_t *, uint32_t); 1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS module initializationr: 1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - creates the namespace cache 1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - gets system's NetBIOS name 1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_init(void) 1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_create(&dfs_nscache, 0, dfs_cache_cmp, free, bcopy, 1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (dfs_nscnode_t)); 1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 158*b3700b07SGordon Ross if (smb_getnetbiosname(dfs_nbname, sizeof (dfs_nbname)) != 0) { 159*b3700b07SGordon Ross syslog(LOG_ERR, "dfs: can't get machine name"); 1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 161*b3700b07SGordon Ross } 162148c5f43SAlan Wright 163148c5f43SAlan Wright bzero((void *)&dfs_intr_ops, sizeof (dfs_intr_ops)); 164148c5f43SAlan Wright 165148c5f43SAlan Wright if ((dfs_intr_hdl = smb_dlopen()) == NULL) 166148c5f43SAlan Wright return; 167148c5f43SAlan Wright 168148c5f43SAlan Wright if ((dfs_intr_ops.dfsops_remote_count = 169148c5f43SAlan Wright (int (*)())dlsym(dfs_intr_hdl, "smb_dfs_remote_count")) == NULL) { 170148c5f43SAlan Wright smb_dlclose(dfs_intr_hdl); 171148c5f43SAlan Wright dfs_intr_hdl = NULL; 172148c5f43SAlan Wright bzero((void *)&dfs_intr_ops, sizeof (dfs_intr_ops)); 173148c5f43SAlan Wright } 1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS module cleanup: 1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - destroys the namespace cache 1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_fini(void) 1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 184148c5f43SAlan Wright smb_dlclose(dfs_intr_hdl); 1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_destroy(&dfs_nscache); 1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * To successfully handle some of link/root requests, some 1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * file system operations need to be performed. These operations 1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * should take place on behalf of the connected user (typically 1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Administrator) and to do so we need to have an infrastructure 1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * in place so that smbd can act as a client and sends request to 1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the kernel. Right now, we lack this infrastructure, so we make 1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a compromise by temporarily enabling some privileges for smbd 1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to be able to fulfill various link/root requests. 1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_setpriv(priv_op_t op) 2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) priv_set(op, PRIV_EFFECTIVE, 2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_READ, 2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_WRITE, 2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_EXECUTE, 2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_SEARCH, NULL); 2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ======================== 2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Namespace API (public) 2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ======================== 2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Launches a thread to cache the specified namespace 2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_load(const char *name) 2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pthread_t thr; 2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pthread_attr_t tattr; 2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *rootshr; 2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((rootshr = strdup(name)) == NULL) { 2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "dfs: failed to load %s namespace (no memory)", 2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name); 2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_init(&tattr); 2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); 2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = pthread_create(&thr, &tattr, dfs_namespace_cache, rootshr); 2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_destroy(&tattr); 2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) 2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "dfs: fail to loading %s namespace (%d)", 2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name, rc); 2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Flushes the cache when a DFS root share is removed 2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void /*ARGSUSED*/ 2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_unload(const char *name) 2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 247cb174861Sjoyce mcintosh dfs_cache_flush(name); 2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the file system path for the given share if it 2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is a DFS root share. 2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If 'path' is NULL, this function only indicates whether 2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * or not the given share represents a DFS namespace 2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_path(const char *name, char *path, size_t pathsz) 2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)name, &si) != NERR_Success) 2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((si.shr_flags & SMB_SHRF_DFSROOT) == 0) 2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 267cb174861Sjoyce mcintosh if (!dfs_namespace_iscached(name)) 268cb174861Sjoyce mcintosh return (ERROR_NOT_FOUND); 269cb174861Sjoyce mcintosh 2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path != NULL) 2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(path, si.shr_path, pathsz); 2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the number of DFS root shares i.e. the number 2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * of standalone namespaces. 2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_count(void) 2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t nroot = 0; 284148c5f43SAlan Wright int rc; 285148c5f43SAlan Wright 286148c5f43SAlan Wright if (dfs_intr_ops.dfsops_remote_count != NULL && 287148c5f43SAlan Wright (rc = dfs_intr_ops.dfsops_remote_count(&nroot)) != 0) { 288148c5f43SAlan Wright /* 289148c5f43SAlan Wright * If this call fails, let's assume there's at least one root 290148c5f43SAlan Wright * namespace already configured. The interposer library cannot 291148c5f43SAlan Wright * confirm or deny the presence of a namespace, so let's take 292148c5f43SAlan Wright * the safe approach and assume one exists. 293148c5f43SAlan Wright */ 294148c5f43SAlan Wright nroot = 1; 295148c5f43SAlan Wright syslog(LOG_WARNING, "dfs: dfsops_remote_count() failed: %d, " 296148c5f43SAlan Wright "assuming one namespace exists", rc); 297148c5f43SAlan Wright } 2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 299cb174861Sjoyce mcintosh nroot += dfs_cache_nscount(); 3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (nroot); 3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Creates a DFS root with the given name and comment. 3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function does not create the root share, it 3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * should already exist. 3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_add(const char *rootshr, const char *cmnt) 3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t info; 3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t t; 3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_t uuid; 3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (*rootshr == '\\') { 3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Windows has a special case here! */ 3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_BAD_PATHNAME); 3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)rootshr, &si) != NERR_Success) 3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NERR_NetNameNotFound); 3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 327cb174861Sjoyce mcintosh (void) mutex_lock(&dfs_nsmtx); 328cb174861Sjoyce mcintosh if (smb_strcasecmp(dfs_cached_ns, rootshr, 0) == 0) { 329cb174861Sjoyce mcintosh /* This DFS root is already exported */ 330cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 334cb174861Sjoyce mcintosh if (*dfs_cached_ns != '\0') { 335cb174861Sjoyce mcintosh syslog(LOG_WARNING, "dfs: trying to add %s namespace." 336cb174861Sjoyce mcintosh " Only one standalone namespace is supported." 337cb174861Sjoyce mcintosh " A namespace is already exported for %s", 338cb174861Sjoyce mcintosh rootshr, dfs_cached_ns); 339cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 340cb174861Sjoyce mcintosh return (ERROR_NOT_SUPPORTED); 341cb174861Sjoyce mcintosh } 342cb174861Sjoyce mcintosh 3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&info, sizeof (info)); 3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (cmnt) 3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info.i_comment, cmnt, sizeof (info.i_comment)); 3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_state = DFS_VOLUME_STATE_OK | DFS_VOLUME_FLAVOR_STANDALONE; 3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_timeout = DFS_ROOT_TIMEOUT; 3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_propflags = 0; 3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_generate_random(uuid); 3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_unparse(uuid, info.i_guid); 3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(&t, dfs_nbname, rootshr, DFS_STORAGE_STATE_ONLINE); 3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_ntargets = 1; 3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_targets = &t; 3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 358cb174861Sjoyce mcintosh if ((status = dfs_root_add(si.shr_path, &info)) != ERROR_SUCCESS) { 359cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 361cb174861Sjoyce mcintosh } 3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = srvsvc_shr_setdfsroot(&si, B_TRUE); 364cb174861Sjoyce mcintosh if (status == ERROR_SUCCESS) { 3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) dfs_cache_add_byname(rootshr, NULL, DFS_OBJECT_ROOT); 366cb174861Sjoyce mcintosh (void) strlcpy(dfs_cached_ns, rootshr, sizeof (dfs_cached_ns)); 367cb174861Sjoyce mcintosh (void) smb_config_setnum(SMB_CI_DFS_STDROOT_NUM, 1); 368cb174861Sjoyce mcintosh } 369cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Removes the namespace and all the links in it. 3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_remove(const char *name) 3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_cursor_t cursor; 3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t nscnode; 3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)name, &si) != NERR_Success) 3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((si.shr_flags & SMB_SHRF_DFSROOT) == 0) 3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_root_remove(si.shr_path)) != ERROR_SUCCESS) 3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = srvsvc_shr_setdfsroot(&si, B_FALSE); 3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: failed to disable root share %s (%d)", 3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name, status); 3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 399cb174861Sjoyce mcintosh if (!dfs_namespace_iscached(name)) 400cb174861Sjoyce mcintosh return (ERROR_SUCCESS); 401cb174861Sjoyce mcintosh 4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_iterinit(&dfs_nscache, &cursor); 4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (smb_cache_iterate(&dfs_nscache, &cursor, &nscnode)) { 4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nscnode.nsc_type == DFS_OBJECT_ROOT) 4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States continue; 4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_remove(nscnode.nsc_fspath, NULL, NULL); 4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: failed to remove %s (%d)", 4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nscnode.nsc_fspath, status); 4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 413cb174861Sjoyce mcintosh dfs_cache_flush(name); 4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* TODO: remove empty dirs */ 4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 419cb174861Sjoyce mcintosh /* 420cb174861Sjoyce mcintosh * Determines the DFS namespace flavor. 421cb174861Sjoyce mcintosh */ 422cb174861Sjoyce mcintosh uint32_t 423cb174861Sjoyce mcintosh dfs_namespace_getflavor(const char *name) 424cb174861Sjoyce mcintosh { 425cb174861Sjoyce mcintosh char rootdir[DFS_PATH_MAX]; 426cb174861Sjoyce mcintosh dfs_info_t info; 427cb174861Sjoyce mcintosh 428cb174861Sjoyce mcintosh if (dfs_namespace_path(name, rootdir, DFS_PATH_MAX) != ERROR_SUCCESS) 429cb174861Sjoyce mcintosh return (0); 430cb174861Sjoyce mcintosh 431cb174861Sjoyce mcintosh /* get flavor info from state info (info level 2) */ 432cb174861Sjoyce mcintosh if (dfs_root_getinfo(rootdir, &info, 2) != ERROR_SUCCESS) 433cb174861Sjoyce mcintosh return (0); 434cb174861Sjoyce mcintosh 435cb174861Sjoyce mcintosh return (info.i_state & DFS_VOLUME_FLAVORS); 436cb174861Sjoyce mcintosh } 437cb174861Sjoyce mcintosh 4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Root API (public) 4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Retrieves the information of the root specified by its path. 4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Info level (1) only needs the UNC path which is not stored, 4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * it is constructed so the function will return without 4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * accessing the backend storage. 4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_getinfo(const char *rootdir, dfs_info_t *info, uint32_t infolvl) 4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_INTERNAL_ERROR; 4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd; 4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(info, sizeof (dfs_info_t)); 4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_type = DFS_OBJECT_ROOT; 4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (infolvl == 1) 4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_rdlock(&dfs_root_rwl); 4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((xfd = dfs_root_xopen(rootdir, O_RDONLY)) > 0) { 4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xread(xfd, info, infolvl); 4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Sets the provided information for the specified root or root target. 4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Root is specified by 'rootdir' and the target is specified by 4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (t_server, t_share) pair. Only information items needed for given 4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information level (infolvl) is valid in the passed DFS info structure 4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'info'. 4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_setinfo(const char *rootdir, dfs_info_t *info, uint32_t infolvl) 4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t curinfo; 4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd; 4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_wrlock(&dfs_root_rwl); 4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((xfd = dfs_root_xopen(rootdir, O_RDWR)) < 0) { 4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xread(xfd, &curinfo, DFS_INFO_ALL); 4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) { 4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_modinfo(DFS_OBJECT_ROOT, &curinfo, info, infolvl); 5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xwrite(xfd, &curinfo); 5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&curinfo); 5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Link API (public) 5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Gets the status of the given path as a link 5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_stat(const char *path, uint32_t *stat) 5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_reparse_stat(path, stat) != 0) 5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (*stat) { 5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_REPARSE_NOTFOUND: 5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_NOTFOUND; 5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_REPARSE_NOTREPARSE: 5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_NOTLINK; 5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_REPARSE_ISREPARSE: 5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_ISREPARSE; 5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_reparse_svcget(path, DFS_REPARSE_SVCTYPE, NULL) == 0) 5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_ISDFS; 5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_UNKNOWN; 5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Creates a new DFS link or adds a new target to an existing link 5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_add(const char *path, const char *server, const char *share, 5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *cmnt, uint32_t flags, boolean_t *newlink) 5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t info; 5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int ntargets; 5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t stat; 5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *newlink = B_FALSE; 5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_link_stat(path, &stat)) != ERROR_SUCCESS) 5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (stat) { 5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_NOTFOUND: 5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_ISREPARSE: 5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Create a new DFS link */ 5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(NULL, &info, DFS_INFO_ALL); 5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info.i_comment, (cmnt) ? cmnt : "", 5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (info.i_comment)); 5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *newlink = B_TRUE; 5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_ISDFS: 5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Add a target to an existing link */ 5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (flags & DFS_ADD_VOLUME) 5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(path, &info, DFS_INFO_ALL); 5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_NOTLINK: 5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* specified path points to a non-reparse object */ 5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* checks to see if the target already exists */ 5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ntargets = info.i_ntargets; 6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_target_find(info.i_targets, ntargets, server, share) != -1) { 6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* add the new target */ 6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t = realloc(info.i_targets, (ntargets + 1) * sizeof (dfs_target_t)); 6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (t == NULL) { 6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_targets = t; 6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(&info.i_targets[ntargets], server, share, 6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DFS_STORAGE_STATE_ONLINE); 6159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_ntargets++; 6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_commit(path, &info); 6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Removes a link or a link target from a DFS namespace. A link can be 6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * removed regardless of the number of targets associated with it. 6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'server' and 'share' parameters specify a target, so if they are NULL 6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * it means the link should be removed, otherwise the specified target 6299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is removed if found. 6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_remove(const char *path, const char *server, const char *share) 6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t info; 6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status, stat; 6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc, idx; 6379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_link_stat(path, &stat)) != ERROR_SUCCESS) 6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (stat != DFS_STAT_ISDFS) 6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (server == NULL && share == NULL) { 6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* remove the link */ 6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_reparse_svcdel(path, DFS_REPARSE_SVCTYPE) != 0) 6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* remove the specified target in the link */ 6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(path, &info, DFS_INFO_ALL); 6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* checks to see if the target exists */ 6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idx = dfs_target_find(info.i_targets, info.i_ntargets, server, share); 6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (idx != -1) { 6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bcopy(&info.i_targets[idx + 1], &info.i_targets[idx], 6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (info.i_ntargets - idx - 1) * sizeof (dfs_target_t)); 6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_ntargets--; 6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_NOT_FOUND); 6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info.i_ntargets == 0) { 6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* if last target, then remove the link */ 6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_reparse_svcdel(path, DFS_REPARSE_SVCTYPE); 6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = (rc == 0) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR; 6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_commit(path, &info); 6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Sets the provided information for the specified link or link target. 6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Link is specified by 'path' and the target is specified by 6849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (t_server, t_share) pair. Only information items needed for given 6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information level (infolvl) is valid in the passed DFS info structure 6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'info'. 6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_setinfo(const char *path, dfs_info_t *info, uint32_t infolvl) 6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t curinfo; 6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(path, &curinfo, DFS_INFO_ALL); 6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_modinfo(DFS_OBJECT_LINK, &curinfo, info, infolvl); 6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_commit(path, &curinfo); 7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&curinfo); 7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Gets the DFS link info. 7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If path is NULL, it just does some initialization. 7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Info level (1) only needs the UNC path which is not 7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * stored, it is constructed so the function will return 7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * without accessing the backend storage. 7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_getinfo(const char *path, dfs_info_t *info, uint32_t infolvl) 7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *link_data; 7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_t uuid; 7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(info, sizeof (dfs_info_t)); 7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_type = DFS_OBJECT_LINK; 7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path == NULL) { 7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = DFS_VOLUME_STATE_OK; 7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = DFS_LINK_TIMEOUT; 7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = 0; 7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_generate_random(uuid); 7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_unparse(uuid, info->i_guid); 7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (infolvl == 1) 7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_reparse_svcget(path, DFS_REPARSE_SVCTYPE, &link_data); 7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) 7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_decode(info, link_data, infolvl); 7439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(link_data); 7449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 7469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 7499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * =================== 7509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Cache API (public) 7519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * =================== 7529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 7539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 7559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Adds an entry with given DFS name (root sharename) and relative path 7569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to the share (relpath) and the specified entry type (i.e. root/link) 7579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to the namespace cache. 7589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 7599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 7609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_add_byname(const char *name, const char *relpath, uint32_t type) 7619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 7629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char uncpath[DFS_PATH_MAX]; 7639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char fspath[DFS_PATH_MAX]; 7649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 7659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)name, &si) != NERR_Success) 7679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 7689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (type == DFS_OBJECT_ROOT) { 7709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "\\\\%s\\%s", 7719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nbname, name); 7729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (dfs_cache_add_byunc(uncpath, si.shr_path, type)); 7739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* add link entry */ 7769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(fspath, DFS_PATH_MAX, "%s/%s", si.shr_path, relpath); 7779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "\\\\%s\\%s\\%s", dfs_nbname, 7789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name, relpath); 7799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* relpath may contain '/' */ 7819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strsubst(uncpath, '/', '\\'); 7829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (dfs_cache_add_byunc(uncpath, fspath, type)); 7849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 7859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 7879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Removes the namespace cache entry for the given link 7889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * in the namespace ('name') with 'relpath' 7899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 7909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 7919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_remove(const char *name, const char *relpath) 7929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 7939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t dn; 7949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(dn.nsc_uncpath, sizeof (dn.nsc_uncpath), 7969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States "\\\\%s\\%s\\%s", dfs_nbname, name, relpath); 7979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 7989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* relpath may contain '/' */ 7999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strsubst(dn.nsc_uncpath, '/', '\\'); 8009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_remove(&dfs_nscache, &dn); 8029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 8059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Get the DFS data for the specified cache entry 8069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 8079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 8089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_getinfo(dfs_nscnode_t *dn, dfs_info_t *info, uint32_t infolvl) 8099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 8109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 8119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dn->nsc_type == DFS_OBJECT_LINK) 8139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(dn->nsc_fspath, info, infolvl); 8149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 8159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_getinfo(dn->nsc_fspath, info, infolvl); 8169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_uncpath, dn->nsc_uncpath, 8189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (info->i_uncpath)); 8199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 8219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace("dfs_cache_getinfo", info); 8229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 8249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 8279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the number of cache entries i.e. the number of 8289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * root(s) and link(s) 8299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 8309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 8319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_num(void) 8329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 8339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_cache_num(&dfs_nscache)); 8349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 8379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_iterinit(smb_cache_cursor_t *cursor) 8389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 8399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_iterinit(&dfs_nscache, cursor); 8409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t 8439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_iterate(smb_cache_cursor_t *cursor, dfs_nscnode_t *dn) 8449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 8459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_cache_iterate(&dfs_nscache, cursor, dn)); 8469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 8499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 8509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Misc API (public) 8519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 8529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 8539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 8559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This is the function that is called by smbd door server to 8569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fullfil a GetReferrals request from smbsrv kernel module 8579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 8589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'reftype' specifies the requested referral type. If it is 8599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS_REFERRAL_ROOT then dfs_path should point to a namespace 8609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * root. If it is DFS_REFERRAL_LINK then dfs_path should CONTAIN 8619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a link, in which case this function will find the link and 8629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * returns its target information. 8639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 8649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 8659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_get_referrals(const char *dfs_path, dfs_reftype_t reftype, 8669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t *referrals) 8679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 8689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_t path; 8699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_t *unc; 8709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char linkpath[DFS_PATH_MAX]; 8719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 8729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_path_parse(&path, dfs_path, DFS_OBJECT_ANY); 8749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 8759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 8769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_setpriv(PRIV_ON); 8789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States referrals->i_type = path.p_type; 8809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (reftype) { 8829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_REFERRAL_ROOT: 8839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path.p_type != DFS_OBJECT_ROOT) { 8849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 8859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 8869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_getinfo((const char *)path.p_fspath, 8899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States referrals, DFS_INFO_ALL); 8909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(referrals->i_uncpath, dfs_path, DFS_PATH_MAX); 8919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 8929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_REFERRAL_LINK: 8949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path.p_type != DFS_OBJECT_LINK) { 8959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 8969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 8979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 8989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 8999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unc = &path.p_unc; 9009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!dfs_namespace_findlink(unc->unc_share, unc->unc_path, 9019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States linkpath, DFS_PATH_MAX)) { 9029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_NOT_FOUND; 9039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 9049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(linkpath, referrals, DFS_INFO_ALL); 9079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(referrals->i_uncpath, DFS_PATH_MAX, "/%s/%s/%s", 9089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unc->unc_server, unc->unc_share, unc->unc_path); 9099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 9109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 9129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 9139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 9149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_setpriv(PRIV_OFF); 9179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_free(&path); 9189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 9199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 9229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Takes a DFS path in UNC format (dfs_path) and parse it into a dfs_path_t 9239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * structure. 9249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 9259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * dfs_path_free() MUST be called to free the allocated memory in this 9269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * function. 9279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 9289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: 9299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 9309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ERROR_INVALID_PARAMETER path is not a valid UNC or not valid for the 9319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * specified object type 9329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ERROR_NOT_ENOUGH_MEMORY not enough memory to peform the parse 9339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ERROR_NOT_FOUND namespace specified does not exist 9349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 9359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 9369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_parse(dfs_path_t *path, const char *dfs_path, uint32_t path_type) 9379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 9389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char rootdir[DFS_PATH_MAX]; 9399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_t *unc; 9409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 9419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 9429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(path, sizeof (dfs_path_t)); 9449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unc = &path->p_unc; 9459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_unc_init(dfs_path, unc); 9479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (rc) { 9489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case EINVAL: 9499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_PARAMETER); 9509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case ENOMEM: 9519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 9529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 9539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 9549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_namespace_path(unc->unc_share, rootdir, DFS_PATH_MAX) 9579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States != ERROR_SUCCESS) { 9589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_free(unc); 9599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 9609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path_type == DFS_OBJECT_ANY) 9639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States path->p_type = (unc->unc_path != NULL) 9649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ? DFS_OBJECT_LINK : DFS_OBJECT_ROOT; 9659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 9669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States path->p_type = path_type; 9679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (path->p_type) { 9699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_OBJECT_LINK: 9709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((unc->unc_path == NULL) || (*unc->unc_path == '\0')) 9719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_NOT_FOUND; 9729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 9739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(path->p_fspath, sizeof (path->p_fspath), 9749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States "%s/%s", rootdir, unc->unc_path); 9759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 9769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_OBJECT_ROOT: 9789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (unc->unc_path == NULL) 9799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(path->p_fspath, rootdir, 9809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (path->p_fspath)); 9819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 9829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 9839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 9849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 9869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 9879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 9909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_free(unc); 9919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 9939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 9949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 9959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 9969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Frees the allocated memory for p_unc field of the passed path 9979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 9989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 9999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_free(dfs_path_t *path) 10009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 10019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path != NULL) 10029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_free(&path->p_unc); 10039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 10069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Free the allocated memory for targets in the given info 10079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * structure 10089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 10099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 10109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(dfs_info_t *info) 10119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 10129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info) 10139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(info->i_targets); 10149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 10179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Trace the given DFS info structure 10189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 10199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 10209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace(const char *msg, dfs_info_t *info) 10219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 10229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 10239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i; 10249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("%s", msg); 10269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info == NULL) 10279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 10289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("UNC\t%s", info->i_uncpath); 10309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("comment\t%s", info->i_comment); 10319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("GUID\t%s", info->i_guid); 10329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("state\t%X", info->i_state); 10339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("timeout\t%d", info->i_timeout); 10349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("props\t%X", info->i_propflags); 10359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("# targets\t%X", info->i_ntargets); 10369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info->i_targets == NULL) 10389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 10399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = info->i_targets; i < info->i_ntargets; i++, t++) { 10419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("[%d] \\\\%s\\%s", i, t->t_server, t->t_share); 10429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("[%d] state\t%X", i, t->t_state); 10439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("[%d] priority\t%d:%d", i, t->t_priority.p_class, 10449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_rank); 10459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 10499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Search the path specified by 'relpath' to see if it contains 10509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a DFS link starting from the last component. If a link is found 10519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the full path is returned in 'linkpath' 10529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 10539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 10549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_findlink(const char *name, char *relpath, 10559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *linkpath, size_t bufsz) 10569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 10579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char rootdir[DFS_PATH_MAX]; 10589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t stat; 10599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *p; 10609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_namespace_path(name, rootdir, DFS_PATH_MAX) != ERROR_SUCCESS) 10629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 10639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(linkpath, bufsz, "%s/%s", rootdir, relpath); 10659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (;;) { 10679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_link_stat(linkpath, &stat) != ERROR_SUCCESS) 10689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 10699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (stat == DFS_STAT_ISDFS) 10719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_TRUE); 10729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((p = strrchr(relpath, '/')) == NULL) 10749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 10759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *p = '\0'; 10769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(linkpath, bufsz, "%s/%s", rootdir, relpath); 10789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*NOTREACHED*/ 10819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 10829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 10859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Caches the specified namespace 10869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 10879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void * 10889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_cache(void *arg) 10899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 10909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *share = arg; 10919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char uncpath[DFS_PATH_MAX]; 10929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 10939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 10949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get(share, &si) != NERR_Success) { 10959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(share); 10969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL); 10979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 10989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1099cb174861Sjoyce mcintosh /* 1100cb174861Sjoyce mcintosh * This check should be removed when multiple standalone 1101cb174861Sjoyce mcintosh * namespaces are supported. 1102cb174861Sjoyce mcintosh */ 1103cb174861Sjoyce mcintosh (void) mutex_lock(&dfs_nsmtx); 1104cb174861Sjoyce mcintosh if (*dfs_cached_ns != '\0') { 1105cb174861Sjoyce mcintosh syslog(LOG_WARNING, "dfs: trying to load %s namespace." 1106cb174861Sjoyce mcintosh " Only one standalone namespace is supported." 1107cb174861Sjoyce mcintosh " A namespace is already exported for %s", 1108cb174861Sjoyce mcintosh share, dfs_cached_ns); 1109cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 1110cb174861Sjoyce mcintosh free(share); 1111cb174861Sjoyce mcintosh return (NULL); 1112cb174861Sjoyce mcintosh } 1113cb174861Sjoyce mcintosh (void) strlcpy(dfs_cached_ns, share, sizeof (dfs_cached_ns)); 1114cb174861Sjoyce mcintosh (void) smb_config_setnum(SMB_CI_DFS_STDROOT_NUM, 1); 1115cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 1116cb174861Sjoyce mcintosh 11179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "\\\\%s\\%s", dfs_nbname, share); 11189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) dfs_cache_add_byunc(uncpath, si.shr_path, DFS_OBJECT_ROOT); 11199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_populate(uncpath, si.shr_path); 11219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(share); 11239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL); 11249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1126cb174861Sjoyce mcintosh /* 1127cb174861Sjoyce mcintosh * Checks whether the given name matches the name of 1128cb174861Sjoyce mcintosh * the cached namespace. 1129cb174861Sjoyce mcintosh */ 1130cb174861Sjoyce mcintosh static boolean_t 1131cb174861Sjoyce mcintosh dfs_namespace_iscached(const char *name) 1132cb174861Sjoyce mcintosh { 1133cb174861Sjoyce mcintosh boolean_t iscached; 1134cb174861Sjoyce mcintosh 1135cb174861Sjoyce mcintosh (void) mutex_lock(&dfs_nsmtx); 1136cb174861Sjoyce mcintosh iscached = (smb_strcasecmp(name, dfs_cached_ns, 0) == 0); 1137cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 1138cb174861Sjoyce mcintosh 1139cb174861Sjoyce mcintosh return (iscached); 1140cb174861Sjoyce mcintosh } 1141cb174861Sjoyce mcintosh 11429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 11439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_add(const char *rootdir, dfs_info_t *info) 11449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 11459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_INTERNAL_ERROR; 11469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd; 11479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_wrlock(&dfs_root_rwl); 11499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((xfd = dfs_root_xopen(rootdir, O_CREAT | O_TRUNC | O_RDWR)) > 0) { 11509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xwrite(xfd, info); 11519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 11529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 11549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 11569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 11599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Deletes the specified root information 11609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 11619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 11629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_remove(const char *rootdir) 11639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 11649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int attrdirfd; 11659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int err = 0; 11669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_wrlock(&dfs_root_rwl); 11689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((attrdirfd = attropen(rootdir, ".", O_RDONLY)) > 0) { 11709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (unlinkat(attrdirfd, DFS_ROOT_XATTR, 0) == -1) { 11719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (errno != ENOENT) 11729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 11739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) close(attrdirfd); 11759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 11769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 11779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 11809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (err != 0) { 11829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "dfs: failed to remove root info %s (%d)", 11839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rootdir, err); 11849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 11859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 11889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 11899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 11909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 11919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Opens DFS root directory's extended attribute with the given mode. 11929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 11939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 11949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xopen(const char *rootdir, int oflag) 11959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 11969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int dfd; 11979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd = -1; 11989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int err = 0; 11999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dfd = open(rootdir, O_RDONLY)) > 0) { 12019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xfd = openat(dfd, DFS_ROOT_XATTR, oflag | O_XATTR, 0600); 12029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (xfd == -1) 12039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 12049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) close(dfd); 12059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 12069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 12079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 12089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (err != 0) { 12109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "dfs: failed to open root directory %s (%d)", 12119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rootdir, err); 12129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 12139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (xfd); 12159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 12169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 12189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Closes given extended attribute file descriptor 12199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 12209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 12219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(int xfd) 12229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 12239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) close(xfd); 12249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 12259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 12279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Writes the given DFS data in the DFS root directory's 12289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * extended attribute specified with xfd file descriptor. 12299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 12309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 12319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xwrite(int xfd, dfs_info_t *info) 12329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 12339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t nbytes; 12349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *buf = NULL; 12359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t buflen; 12369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 12379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_root_encode(info, &buf, &buflen)) != ERROR_SUCCESS) 12399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 12409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) lseek(xfd, 0, SEEK_SET); 12429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nbytes = write(xfd, buf, buflen); 12439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(buf); 12449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((nbytes == buflen) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR); 12469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 12479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 12499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Reads DFS root information from its directory extended attribute 12509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and parse it into given dfs_info_t structure 12519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 12529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 12539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xread(int xfd, dfs_info_t *info, uint32_t infolvl) 12549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 12559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct stat statbuf; 12569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 12579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *buf; 12589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (fstat(xfd, &statbuf) != 0) 12609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 12619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((buf = malloc(statbuf.st_size)) == NULL) 12639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 12649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (read(xfd, buf, statbuf.st_size) == statbuf.st_size) 12669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_decode(info, buf, statbuf.st_size, infolvl); 12679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 12689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INTERNAL_ERROR; 12699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(buf); 12719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 12729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 12739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 12759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Encodes (packs) DFS information in 'info' into a flat 12769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * buffer in a name-value format. This function allocates a 12779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * buffer with appropriate size to contain all the information 12789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * so the caller MUST free the allocated memory by calling free(). 12799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 12809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 12819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_encode(dfs_info_t *info, char **buf, size_t *bufsz) 12829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 12839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 12849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_t *nvl; 12859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 12869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) 12889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 12899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 12909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_add_string(nvl, "comment", info->i_comment); 12919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_string(nvl, "guid", info->i_guid); 12929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "state", info->i_state); 12939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "timeout", info->i_timeout); 12949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "propflags", info->i_propflags); 12959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t = info->i_targets; 12969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_string(nvl, "t_server", t->t_server); 12979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_string(nvl, "t_share", t->t_share); 12989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "t_state", t->t_state); 1299cb174861Sjoyce mcintosh rc |= nvlist_add_uint32(nvl, "t_priority_class", 1300cb174861Sjoyce mcintosh t->t_priority.p_class); 1301cb174861Sjoyce mcintosh rc |= nvlist_add_uint16(nvl, "t_priority_rank", 1302cb174861Sjoyce mcintosh t->t_priority.p_rank); 13039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc == 0) 13059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_pack(nvl, buf, bufsz, NV_ENCODE_NATIVE, 0); 13069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 13089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((rc == 0) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR); 13109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 13119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 13139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Decodes (unpack) provided buffer which contains a list of name-value 13149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * pairs into given dfs_info_t structure 13159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 13169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 13179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_decode(dfs_info_t *info, char *buf, size_t bufsz, uint32_t infolvl) 13189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 13199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_t *nvl; 13209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *cmnt, *guid; 13219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *t_server, *t_share; 13229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t t_state; 1323cb174861Sjoyce mcintosh uint32_t t_priority_class; 1324cb174861Sjoyce mcintosh uint16_t t_priority_rank; 1325cb174861Sjoyce mcintosh boolean_t decode_priority = B_FALSE; 13269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 13279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nvlist_unpack(buf, bufsz, &nvl, 0) != 0) 13299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 13309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_lookup_string(nvl, "comment", &cmnt); 13329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_string(nvl, "guid", &guid); 13339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "state", &info->i_state); 13349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "timeout", &info->i_timeout); 13359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "propflags", &info->i_propflags); 13369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) { 13389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 13399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 13409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 13419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, (cmnt) ? cmnt : "", 13439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (info->i_comment)); 13449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_guid, (guid) ? guid : "", sizeof (info->i_guid)); 13459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = NULL; 13479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_ntargets = 1; 13489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolvl) { 13509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_INFO_ALL: 13519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 3: 13529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 4: 1353cb174861Sjoyce mcintosh /* need target information */ 1354cb174861Sjoyce mcintosh break; 13559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 6: 13569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 9: 1357cb174861Sjoyce mcintosh /* need target and priority information */ 1358cb174861Sjoyce mcintosh decode_priority = B_TRUE; 13599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 13609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 13619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 13629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 13639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 13649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = malloc(sizeof (dfs_target_t)); 13669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info->i_targets == NULL) { 13679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 13689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 13699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 13709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 13719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_lookup_string(nvl, "t_server", &t_server); 13729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_string(nvl, "t_share", &t_share); 13739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "t_state", &t_state); 13749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) { 13759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 13769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(info->i_targets); 13779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 13789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 13799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(info->i_targets, t_server, t_share, t_state); 13809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1381cb174861Sjoyce mcintosh if (decode_priority) { 1382cb174861Sjoyce mcintosh rc = nvlist_lookup_uint32(nvl, "t_priority_class", 1383cb174861Sjoyce mcintosh &t_priority_class); 1384cb174861Sjoyce mcintosh if (rc == 0) 1385cb174861Sjoyce mcintosh rc = nvlist_lookup_uint16(nvl, "t_priority_rank", 1386cb174861Sjoyce mcintosh &t_priority_rank); 1387cb174861Sjoyce mcintosh 1388cb174861Sjoyce mcintosh if (rc != 0 && rc != ENOENT) { 1389cb174861Sjoyce mcintosh nvlist_free(nvl); 1390cb174861Sjoyce mcintosh free(info->i_targets); 1391cb174861Sjoyce mcintosh return (ERROR_INTERNAL_ERROR); 1392cb174861Sjoyce mcintosh } else if (rc == 0) { 1393cb174861Sjoyce mcintosh info->i_targets->t_priority.p_class = t_priority_class; 1394cb174861Sjoyce mcintosh info->i_targets->t_priority.p_rank = t_priority_rank; 1395cb174861Sjoyce mcintosh } 1396cb174861Sjoyce mcintosh } 1397cb174861Sjoyce mcintosh 13989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 13999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 14009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 14019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 14039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines if the passed state is valid for a DFS root 14049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 14059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This is based on test results against Win2003 and in some cases 14069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * does not match [MS-DFSNM] spec. 14079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 14089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 14099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_isvalidstate(uint32_t state) 14109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 14119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (state) { 14129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_OK: 14139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_RESYNCHRONIZE: 14149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 14159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_INCONSISTENT: 14179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_FORCE_SYNC: 14189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_PARAMETER); 14199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_OFFLINE: 14219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_ONLINE: 14229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_STANDBY: 14239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_SUPPORTED); 14249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 14259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 14269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 14279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_PARAMETER); 14299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 14309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 14329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Decodes the link info from given string buffer (buf) into 14339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * dfs_info_t structure. 14349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 14359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 14369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_decode(dfs_info_t *info, char *buf, uint32_t infolvl) 14379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 14389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *lfield[DFS_LINK_HDR_NFIELDS]; 14399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 14409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t linkver; 14419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t cmntlen; 14429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t cpylen; 14439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i, j; 14449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 14469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Header format 14479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ver:state:prop:timeout:guid:ntarget:cmntlen:comment: 14489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 14499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0; i < DFS_LINK_HDR_NFIELDS; i++) { 14509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((lfield[i] = strsep((char **)&buf, ":")) == NULL) 14519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_DATA); 14529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 14539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i = 0; 14559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States linkver = strtoul(lfield[i++], NULL, 10); 14569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (linkver != DFS_LINK_V1) 14579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_DATA); 14589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = strtoul(lfield[i++], NULL, 10); 14609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = strtoul(lfield[i++], NULL, 10); 14619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = strtoul(lfield[i++], NULL, 10); 14629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_guid, lfield[i++], sizeof (info->i_guid)); 14639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_ntargets = strtoul(lfield[i++], NULL, 10); 14649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = NULL; 14659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cpylen = cmntlen = strtoul(lfield[i++], NULL, 10); 14679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (cmntlen > sizeof (info->i_comment)) 14699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cpylen = sizeof (info->i_comment); 14709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else if (cmntlen != 0) 14719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cpylen = cmntlen + 1; 14729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, buf, cpylen); 14749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States buf += (cmntlen + 1); 14759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolvl) { 14779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_INFO_ALL: 14789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 3: 14799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 4: 14809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 6: 14819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 9: 14829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* need target information */ 14839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 14849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 14859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 14869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 14879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = calloc(info->i_ntargets, sizeof (dfs_target_t)); 14899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info->i_targets == NULL) 14909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 14919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 14929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 14939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Format for each target 14949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * server:share:state:class:rank 14959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 14969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = info->i_targets; i < info->i_ntargets; i++, t++) { 14979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (j = 0; j < DFS_LINK_TRGT_NFIELDS; j++) { 14989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((lfield[j] = strsep((char **)&buf, ":")) == NULL) { 14999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(info); 15009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_DATA); 15019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_server, lfield[0], sizeof (t->t_server)); 15059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_share, lfield[1], sizeof (t->t_share)); 15069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_state = strtoul(lfield[2], NULL, 10); 15079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_class = strtoul(lfield[3], NULL, 10); 15089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_rank = strtoul(lfield[4], NULL, 10); 15099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 15129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 15159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Encodes given link information (info) 15169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 15179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 15189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_encode(dfs_info_t *info, char *buf, size_t bufsz) 15199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 15209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char linkdata[MAXREPARSELEN]; 15219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 15229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i, sz; 15239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 15259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Header format 15269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ver:state:prop:timeout:guid:ntarget:cmntlen:comment 15279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 15289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sz = snprintf(buf, bufsz, "%u:%u:%u:%u:%s:%u:%u:%s", 15299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DFS_LINK_V1, info->i_state, info->i_propflags, info->i_timeout, 15309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_guid, info->i_ntargets, 15319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States strlen(info->i_comment), info->i_comment); 15329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sz > bufsz) { 15349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: link data is too large"); 15359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace("DFS link encode", info); 15369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 15379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 15409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Format for each target 15419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * :server:share:state:class:rank 15429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 15439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bufsz -= sz; 15449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = info->i_targets; i < info->i_ntargets; i++, t++) { 15459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (strchr(t->t_server, ':') || strchr(t->t_share, ':')) 15469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_NAME); 15479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sz = snprintf(linkdata, MAXREPARSELEN, ":%s:%s:%u:%u:%u", 15499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_server, t->t_share, t->t_state, 15509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_class, t->t_priority.p_rank); 15519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sz > bufsz) { 15529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: link data is too large"); 15539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace("DFS link encode", info); 15549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 15559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strcat(buf, linkdata); 15579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bufsz -= sz; 15589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 15619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 15649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Stores given information for the specified link 15659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 15669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 15679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_commit(const char *path, dfs_info_t *info) 15689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 15699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char linkdata[MAXREPARSELEN]; 15709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 15719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 15729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_encode(info, linkdata, MAXREPARSELEN); 15749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) { 15759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_reparse_svcadd(path, DFS_REPARSE_SVCTYPE, linkdata); 15769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) 15779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INTERNAL_ERROR; 15789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 15819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 15849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines if the passed state is valid for a link 15859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 15869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 15879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_isvalidstate(uint32_t state) 15889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 15899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (state == DFS_VOLUME_STATE_OK || 15909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state == DFS_VOLUME_STATE_OFFLINE || 15919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state == DFS_VOLUME_STATE_ONLINE); 15929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 15939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 15949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 15959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Initializes the given target structure (t) with provided information. 15969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 15979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 15989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(dfs_target_t *t, const char *srv, const char *share, 15999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t state) 16009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 16019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_server, (srv) ? srv : "", sizeof (t->t_server)); 16029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_share, (share) ? share : "", sizeof (t->t_share)); 16039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_state = state; 16049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_class = DfsSiteCostNormalPriorityClass; 16059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_rank = 0; 16069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 16099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Lookup the specified target (server, share) in the given 16109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * target list (targets). If there is a match its index is 16119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * returned, otherwise -1 will be returned. 16129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 16139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 16149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_find(dfs_target_t *targets, uint32_t ntargets, 16159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *server, const char *share) 16169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 16179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 16189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i; 16199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = targets; i < ntargets; i++, t++) { 16219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((smb_strcasecmp(t->t_server, server, 0) == 0) && 16229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (smb_strcasecmp(t->t_share, share, 0) == 0)) 16239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (i); 16249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 16279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 16309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines if the passed state is valid for a link/root target 16319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 16329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 16339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_isvalidstate(uint32_t state) 16349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 16359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (state == DFS_STORAGE_STATE_ONLINE || 16369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state == DFS_STORAGE_STATE_OFFLINE); 16379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 16409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Cache compare function, the key is UNC path 16419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 16429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 16439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_cmp(const void *p1, const void *p2) 16449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 16459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_node_t *cn1 = (smb_cache_node_t *)p1; 16469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_node_t *cn2 = (smb_cache_node_t *)p2; 16479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t *dn1 = cn1->cn_data; 16489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t *dn2 = cn2->cn_data; 16499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 16509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_strcasecmp(dn1->nsc_uncpath, dn2->nsc_uncpath, 0); 16529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc < 0) 16549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 16559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc > 0) 16579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (1); 16589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0); 16609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 16639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Adds an entry with given UNC and filesystem path and the specified 16649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * entry type (i.e. root/link) to the namespace cache. 16659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 16669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 16679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_add_byunc(const char *uncpath, const char *fspath, uint32_t type) 16689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 16699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t *dn; 16709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 16719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dn = malloc(sizeof (dfs_nscnode_t))) == NULL) 16739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 16749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(dn->nsc_uncpath, uncpath, sizeof (dn->nsc_uncpath)); 16769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(dn->nsc_fspath, fspath, sizeof (dn->nsc_fspath)); 16779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dn->nsc_type = type; 16789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_cache_add(&dfs_nscache, dn, SMB_CACHE_ADD) != 0) { 16799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(dn); 16809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INTERNAL_ERROR; 16819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 16849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 16859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 16869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 16879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * starting from DFS root directory, scans the tree for DFS links 16889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and adds them to the cache. 16899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 16909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 16919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_populate(const char *unc_prefix, const char *dir) 16929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 16939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char fspath[DFS_PATH_MAX]; 16949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char uncpath[DFS_PATH_MAX]; 16959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *fname; 16969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int nentries, i; 16979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct dirent **entry_list; 16989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t stat; 16999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nentries = scandir(dir, &entry_list, NULL, NULL); 17019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nentries == -1) 17029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 17039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0; i < nentries; i++) { 17059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fname = entry_list[i]->d_name; 17069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (strcmp(fname, ".") == 0 || 17089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States strcmp(fname, "..") == 0) { 17099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list[i]); 17109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States continue; 17119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 17129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(fspath, DFS_PATH_MAX, "%s/%s", dir, fname); 17149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "%s\\%s", unc_prefix, 17159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fname); 17169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_path_isdir(fspath)) { 17189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_populate(uncpath, fspath); 17199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else if (dfs_link_stat(fspath, &stat) == ERROR_SUCCESS) { 17209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (stat == DFS_STAT_ISDFS) 17219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) dfs_cache_add_byunc(uncpath, fspath, 17229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DFS_OBJECT_LINK); 17239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 17249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list[i]); 17269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 17279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (; i < nentries; i++) 17299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list[i]); 17309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list); 17329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 17339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1734cb174861Sjoyce mcintosh /* 1735cb174861Sjoyce mcintosh * If this namespace hasn't been cached then return 1736cb174861Sjoyce mcintosh * without flushing the cache; otherwise clear the 1737cb174861Sjoyce mcintosh * name and flush the cache. 1738cb174861Sjoyce mcintosh */ 1739cb174861Sjoyce mcintosh static void 1740cb174861Sjoyce mcintosh dfs_cache_flush(const char *name) 1741cb174861Sjoyce mcintosh { 1742cb174861Sjoyce mcintosh (void) mutex_lock(&dfs_nsmtx); 1743cb174861Sjoyce mcintosh if (smb_strcasecmp(name, dfs_cached_ns, 0) != 0) { 1744cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 1745cb174861Sjoyce mcintosh return; 1746cb174861Sjoyce mcintosh } 1747cb174861Sjoyce mcintosh *dfs_cached_ns = '\0'; 1748cb174861Sjoyce mcintosh (void) smb_config_setnum(SMB_CI_DFS_STDROOT_NUM, 0); 1749cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 1750cb174861Sjoyce mcintosh 1751cb174861Sjoyce mcintosh smb_cache_flush(&dfs_nscache); 1752cb174861Sjoyce mcintosh } 1753cb174861Sjoyce mcintosh 1754cb174861Sjoyce mcintosh /* 1755cb174861Sjoyce mcintosh * Returns the number of cached namespaces 1756cb174861Sjoyce mcintosh */ 1757cb174861Sjoyce mcintosh static uint32_t 1758cb174861Sjoyce mcintosh dfs_cache_nscount(void) 1759cb174861Sjoyce mcintosh { 1760cb174861Sjoyce mcintosh uint32_t nscount; 1761cb174861Sjoyce mcintosh 1762cb174861Sjoyce mcintosh (void) mutex_lock(&dfs_nsmtx); 1763cb174861Sjoyce mcintosh nscount = (*dfs_cached_ns == '\0') ? 0 : 1; 1764cb174861Sjoyce mcintosh (void) mutex_unlock(&dfs_nsmtx); 1765cb174861Sjoyce mcintosh 1766cb174861Sjoyce mcintosh return (nscount); 1767cb174861Sjoyce mcintosh } 1768cb174861Sjoyce mcintosh 17699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 17709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines whether the given path is a directory. 17719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 17729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 17739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_isdir(const char *path) 17749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 17759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct stat statbuf; 17769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (lstat(path, &statbuf) != 0) 17789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 17799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((statbuf.st_mode & S_IFMT) == S_IFDIR); 17819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 17829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 17839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1784cb174861Sjoyce mcintosh * Validates the given state based on the object type (root/link), info 1785cb174861Sjoyce mcintosh * level, and whether it is the object's state or its target's state 17869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 17879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1788cb174861Sjoyce mcintosh dfs_isvalidstate(uint32_t state, uint32_t type, boolean_t target, 1789cb174861Sjoyce mcintosh uint32_t infolvl) 17909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 17919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 17929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1793cb174861Sjoyce mcintosh switch (infolvl) { 1794cb174861Sjoyce mcintosh case 101: 1795cb174861Sjoyce mcintosh if (type == DFS_OBJECT_ROOT) { 1796cb174861Sjoyce mcintosh if (!target) 1797cb174861Sjoyce mcintosh return (dfs_root_isvalidstate(state)); 17989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1799cb174861Sjoyce mcintosh if (!dfs_target_isvalidstate(state)) 18009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 1801cb174861Sjoyce mcintosh else if (state == DFS_STORAGE_STATE_OFFLINE) 1802cb174861Sjoyce mcintosh status = ERROR_NOT_SUPPORTED; 18039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1804cb174861Sjoyce mcintosh if (!target) { 1805cb174861Sjoyce mcintosh if (!dfs_link_isvalidstate(state)) 1806cb174861Sjoyce mcintosh status = ERROR_INVALID_PARAMETER; 1807cb174861Sjoyce mcintosh } else { 1808cb174861Sjoyce mcintosh if (!dfs_target_isvalidstate(state)) 1809cb174861Sjoyce mcintosh status = ERROR_INVALID_PARAMETER; 1810cb174861Sjoyce mcintosh } 1811cb174861Sjoyce mcintosh } 1812cb174861Sjoyce mcintosh break; 1813cb174861Sjoyce mcintosh 1814cb174861Sjoyce mcintosh case 105: 1815cb174861Sjoyce mcintosh if (state == 0) 1816cb174861Sjoyce mcintosh return (ERROR_SUCCESS); 1817cb174861Sjoyce mcintosh 1818cb174861Sjoyce mcintosh if (type == DFS_OBJECT_ROOT) { 1819cb174861Sjoyce mcintosh switch (state) { 1820cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_OK: 1821cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_OFFLINE: 1822cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_ONLINE: 1823cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_RESYNCHRONIZE: 1824cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_STANDBY: 1825cb174861Sjoyce mcintosh status = ERROR_NOT_SUPPORTED; 1826cb174861Sjoyce mcintosh break; 1827cb174861Sjoyce mcintosh 1828cb174861Sjoyce mcintosh default: 1829cb174861Sjoyce mcintosh status = ERROR_INVALID_PARAMETER; 1830cb174861Sjoyce mcintosh } 1831cb174861Sjoyce mcintosh } else { 1832cb174861Sjoyce mcintosh switch (state) { 1833cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_OK: 1834cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_OFFLINE: 1835cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_ONLINE: 1836cb174861Sjoyce mcintosh break; 1837cb174861Sjoyce mcintosh 1838cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_RESYNCHRONIZE: 1839cb174861Sjoyce mcintosh case DFS_VOLUME_STATE_STANDBY: 1840cb174861Sjoyce mcintosh status = ERROR_NOT_SUPPORTED; 1841cb174861Sjoyce mcintosh break; 1842cb174861Sjoyce mcintosh 1843cb174861Sjoyce mcintosh default: 18449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 1845cb174861Sjoyce mcintosh } 18469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1847cb174861Sjoyce mcintosh break; 1848cb174861Sjoyce mcintosh 1849cb174861Sjoyce mcintosh default: 1850cb174861Sjoyce mcintosh status = ERROR_INVALID_LEVEL; 18519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 18529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 18539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 18549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 18559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1856cb174861Sjoyce mcintosh /* 1857cb174861Sjoyce mcintosh * Validates the given property flag mask based on the object 1858cb174861Sjoyce mcintosh * type (root/link) and namespace flavor. 1859cb174861Sjoyce mcintosh */ 1860cb174861Sjoyce mcintosh static uint32_t 1861cb174861Sjoyce mcintosh dfs_isvalidpropflagmask(uint32_t propflag_mask, uint32_t type, 1862cb174861Sjoyce mcintosh uint32_t flavor) 1863cb174861Sjoyce mcintosh { 1864cb174861Sjoyce mcintosh uint32_t flgs_not_supported; 1865cb174861Sjoyce mcintosh 1866cb174861Sjoyce mcintosh flgs_not_supported = DFS_PROPERTY_FLAG_ROOT_SCALABILITY 1867cb174861Sjoyce mcintosh | DFS_PROPERTY_FLAG_CLUSTER_ENABLED 1868cb174861Sjoyce mcintosh | DFS_PROPERTY_FLAG_ABDE; 1869cb174861Sjoyce mcintosh 1870cb174861Sjoyce mcintosh if (flavor == DFS_VOLUME_FLAVOR_STANDALONE) { 1871cb174861Sjoyce mcintosh if (type == DFS_OBJECT_LINK) 1872cb174861Sjoyce mcintosh flgs_not_supported |= DFS_PROPERTY_FLAG_SITE_COSTING; 1873cb174861Sjoyce mcintosh if (propflag_mask & flgs_not_supported) 1874cb174861Sjoyce mcintosh return (ERROR_NOT_SUPPORTED); 1875cb174861Sjoyce mcintosh } 1876cb174861Sjoyce mcintosh 1877cb174861Sjoyce mcintosh return (ERROR_SUCCESS); 1878cb174861Sjoyce mcintosh } 1879cb174861Sjoyce mcintosh 18809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 18819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Based on the specified information level (infolvl) copy parts of the 18829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information provided through newinfo into the existing information 18839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (info) for the given object. 18849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 18859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 18869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_modinfo(uint32_t type, dfs_info_t *info, dfs_info_t *newinfo, 18879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t infolvl) 18889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 18899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t target_op = B_FALSE; 18909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 18919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t state; 18929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int target_idx; 18939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 18949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (newinfo->i_targets != NULL) { 18959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States target_idx = dfs_target_find(info->i_targets, info->i_ntargets, 18969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States newinfo->i_targets->t_server, newinfo->i_targets->t_share); 18979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (target_idx == -1) 18989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_NOT_FOUND); 18999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States target_op = B_TRUE; 19009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 19019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolvl) { 19039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 100: 19049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, newinfo->i_comment, 19059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (newinfo->i_comment)); 19069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 19079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 101: 19099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state = (target_op) 19109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ? newinfo->i_targets->t_state : newinfo->i_state; 1911cb174861Sjoyce mcintosh status = dfs_isvalidstate(state, type, target_op, 101); 19129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 19139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 19149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!target_op) { 19169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 19179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * states specified by this mask should not be stored 19189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 19199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (state & DFS_VOLUME_STATES_SRV_OPS) 19209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 19219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = state; 19239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 19249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets[target_idx].t_state = state; 19259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 19269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 19279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 102: 19299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = newinfo->i_timeout; 19309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 19319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 103: 19339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = newinfo->i_propflags; 19349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 19359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 104: 19379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets[target_idx].t_priority = 19389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States newinfo->i_targets->t_priority; 19399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 19409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 105: 1942cb174861Sjoyce mcintosh status = dfs_isvalidstate(newinfo->i_state, type, B_FALSE, 105); 1943cb174861Sjoyce mcintosh if (status != ERROR_SUCCESS) 1944cb174861Sjoyce mcintosh return (status); 1945cb174861Sjoyce mcintosh 1946cb174861Sjoyce mcintosh status = dfs_isvalidpropflagmask(newinfo->i_propflag_mask, type, 1947cb174861Sjoyce mcintosh newinfo->i_flavor); 1948cb174861Sjoyce mcintosh if (status != ERROR_SUCCESS) 1949cb174861Sjoyce mcintosh return (status); 1950cb174861Sjoyce mcintosh 19519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, newinfo->i_comment, 19529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (newinfo->i_comment)); 1953cb174861Sjoyce mcintosh if (newinfo->i_state != 0) 1954cb174861Sjoyce mcintosh info->i_state = newinfo->i_state; 19559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = newinfo->i_timeout; 19569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = newinfo->i_propflags; 19579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 19589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 19609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_LEVEL; 19619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 19629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 19639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 19649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1965