1*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 2*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * CDDL HEADER START 3*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 4*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The contents of this file are subject to the terms of the 5*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Common Development and Distribution License (the "License"). 6*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * You may not use this file except in compliance with the License. 7*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 8*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * or http://www.opensolaris.org/os/licensing. 10*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * See the License for the specific language governing permissions 11*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and limitations under the License. 12*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 13*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * When distributing Covered Code, include this CDDL HEADER in each 14*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If applicable, add the following below this CDDL HEADER, with the 16*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fields enclosed by brackets "[]" replaced with your own identifying 17*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information: Portions Copyright [yyyy] [name of copyright owner] 18*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 19*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * CDDL HEADER END 20*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 21*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 22*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Use is subject to license terms. 24*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 25*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 26*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <strings.h> 27*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <errno.h> 28*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <unistd.h> 29*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <fcntl.h> 30*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <dirent.h> 31*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <pthread.h> 32*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <syslog.h> 33*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/fs_reparse.h> 34*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <uuid/uuid.h> 35*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 36*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/nterror.h> 37*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_dfs.h> 38*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_share.h> 39*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libsmb.h> 40*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libmlsvc.h> 41*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <dfs.h> 42*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 43*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 44*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * default timeout (TTL) values (in second) for root and link 45*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 46*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_ROOT_TIMEOUT 300 47*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_TIMEOUT 1800 48*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 49*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 50*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS link data format in reparse point 51*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 52*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ver:state:prop:timeout:guid:ntarget:cmntlen:comment 53*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * [[:tserver:tshare:tstate:pclass:prank]...] 54*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 55*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_V1 1 56*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_HDR_NFIELDS 7 /* # fields in header section */ 57*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_LINK_TRGT_NFIELDS 5 /* # fields for each target */ 58*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 59*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_ROOT_XATTR "SUNWdfs.rootinfo" 60*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 61*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define DFS_INFO_ALL 0 62*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 63*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 64*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Namespace cache 65*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 66*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Caches links' UNC and filesystem path where the key is the UNC path. 67*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 68*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static smb_cache_t dfs_nscache; 69*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static char dfs_nbname[NETBIOS_NAME_SZ]; 70*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 71*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 72*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Lock for accessing root information (extended attribute) 73*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 74*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static rwlock_t dfs_root_rwl; 75*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 76*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States extern uint32_t srvsvc_shr_setdfsroot(smb_share_t *, boolean_t); 77*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 78*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 79*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Namespace functions 80*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 81*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_namespace_findlink(const char *, char *, char *, size_t); 82*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *dfs_namespace_cache(void *); 83*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 84*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 85*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Root functions 86*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 87*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_root_add(const char *, dfs_info_t *); 88*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_remove(const char *); 89*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_encode(dfs_info_t *, char **, size_t *); 90*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_decode(dfs_info_t *, char *, size_t, uint32_t); 91*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_isvalidstate(uint32_t); 92*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 93*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_root_xopen(const char *, int); 94*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void dfs_root_xclose(int); 95*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_xwrite(int, dfs_info_t *); 96*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_root_xread(int, dfs_info_t *, uint32_t); 97*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 98*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 99*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Link functions 100*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 101*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_link_encode(dfs_info_t *, char *, size_t); 102*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_link_decode(dfs_info_t *, char *, uint32_t); 103*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_link_commit(const char *, dfs_info_t *); 104*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_link_isvalidstate(uint32_t); 105*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 106*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 107*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Target functions 108*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 109*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void dfs_target_init(dfs_target_t *, const char *, const char *, 110*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t); 111*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_target_find(dfs_target_t *, uint32_t, const char *, 112*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *); 113*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_target_isvalidstate(uint32_t); 114*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 115*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 116*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Cache functions 117*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 118*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_cache_add_byunc(const char *, const char *, uint32_t); 119*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void dfs_cache_populate(const char *, const char *); 120*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int dfs_cache_cmp(const void *, const void *); 121*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 122*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 123*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Utility functions 124*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 125*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t dfs_path_isdir(const char *); 126*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t dfs_modinfo(uint32_t, dfs_info_t *, dfs_info_t *, uint32_t); 127*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 128*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 129*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS module initializationr: 130*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 131*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - creates the namespace cache 132*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - gets system's NetBIOS name 133*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 134*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 135*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_init(void) 136*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 137*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_domain_t di; 138*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 139*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_create(&dfs_nscache, 0, dfs_cache_cmp, free, bcopy, 140*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (dfs_nscnode_t)); 141*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 142*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_domain_lookup_type(SMB_DOMAIN_LOCAL, &di)) 143*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 144*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 145*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(dfs_nbname, di.di_nbname, NETBIOS_NAME_SZ); 146*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 147*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 148*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 149*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS module cleanup: 150*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 151*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * - destroys the namespace cache 152*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 153*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 154*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_fini(void) 155*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 156*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_destroy(&dfs_nscache); 157*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 158*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 159*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 160*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * To successfully handle some of link/root requests, some 161*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * file system operations need to be performed. These operations 162*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * should take place on behalf of the connected user (typically 163*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Administrator) and to do so we need to have an infrastructure 164*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * in place so that smbd can act as a client and sends request to 165*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the kernel. Right now, we lack this infrastructure, so we make 166*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a compromise by temporarily enabling some privileges for smbd 167*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to be able to fulfill various link/root requests. 168*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 169*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 170*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_setpriv(priv_op_t op) 171*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 172*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) priv_set(op, PRIV_EFFECTIVE, 173*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_READ, 174*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_WRITE, 175*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_EXECUTE, 176*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States PRIV_FILE_DAC_SEARCH, NULL); 177*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 178*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 179*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 180*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ======================== 181*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Namespace API (public) 182*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ======================== 183*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 184*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 185*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 186*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Launches a thread to cache the specified namespace 187*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 188*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 189*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_load(const char *name) 190*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 191*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pthread_t thr; 192*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pthread_attr_t tattr; 193*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *rootshr; 194*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 195*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 196*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((rootshr = strdup(name)) == NULL) { 197*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "dfs: failed to load %s namespace (no memory)", 198*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name); 199*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 200*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 201*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 202*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_init(&tattr); 203*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); 204*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = pthread_create(&thr, &tattr, dfs_namespace_cache, rootshr); 205*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) pthread_attr_destroy(&tattr); 206*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 207*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) 208*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "dfs: fail to loading %s namespace (%d)", 209*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name, rc); 210*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 211*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 212*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 213*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Flushes the cache when a DFS root share is removed 214*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 215*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void /*ARGSUSED*/ 216*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_unload(const char *name) 217*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 218*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_flush(&dfs_nscache); 219*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 220*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 221*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 222*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the file system path for the given share if it 223*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is a DFS root share. 224*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If 'path' is NULL, this function only indicates whether 225*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * or not the given share represents a DFS namespace 226*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 227*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 228*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_path(const char *name, char *path, size_t pathsz) 229*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 230*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 231*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 232*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)name, &si) != NERR_Success) 233*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 234*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 235*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((si.shr_flags & SMB_SHRF_DFSROOT) == 0) 236*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 237*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 238*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path != NULL) 239*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(path, si.shr_path, pathsz); 240*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 241*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 242*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 243*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 244*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 245*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the number of DFS root shares i.e. the number 246*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * of standalone namespaces. 247*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 248*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 249*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_count(void) 250*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 251*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_shriter_t shi; 252*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t *si; 253*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t nroot = 0; 254*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 255*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_shr_iterinit(&shi); 256*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while ((si = smb_shr_iterate(&shi)) != NULL) { 257*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((si->shr_flags & SMB_SHRF_DFSROOT) != 0) 258*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nroot++; 259*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 260*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 261*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (nroot); 262*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 263*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 264*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 265*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Creates a DFS root with the given name and comment. 266*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 267*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function does not create the root share, it 268*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * should already exist. 269*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 270*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 271*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_add(const char *rootshr, const char *cmnt) 272*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 273*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t info; 274*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t t; 275*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 276*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_t uuid; 277*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 278*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 279*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (*rootshr == '\\') { 280*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Windows has a special case here! */ 281*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_BAD_PATHNAME); 282*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 283*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 284*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)rootshr, &si) != NERR_Success) 285*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NERR_NetNameNotFound); 286*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 287*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (si.shr_flags & SMB_SHRF_DFSROOT) { 288*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Share is already a DFS root */ 289*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 290*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 291*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 292*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(&info, sizeof (info)); 293*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (cmnt) 294*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info.i_comment, cmnt, sizeof (info.i_comment)); 295*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_state = DFS_VOLUME_STATE_OK | DFS_VOLUME_FLAVOR_STANDALONE; 296*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_timeout = DFS_ROOT_TIMEOUT; 297*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_propflags = 0; 298*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 299*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_generate_random(uuid); 300*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_unparse(uuid, info.i_guid); 301*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 302*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(&t, dfs_nbname, rootshr, DFS_STORAGE_STATE_ONLINE); 303*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 304*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_ntargets = 1; 305*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_targets = &t; 306*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 307*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_root_add(si.shr_path, &info)) != ERROR_SUCCESS) 308*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 309*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 310*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = srvsvc_shr_setdfsroot(&si, B_TRUE); 311*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 312*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) dfs_cache_add_byname(rootshr, NULL, DFS_OBJECT_ROOT); 313*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 314*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 315*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 316*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 317*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 318*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Removes the namespace and all the links in it. 319*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 320*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 321*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_remove(const char *name) 322*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 323*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_cursor_t cursor; 324*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t nscnode; 325*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 326*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 327*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 328*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)name, &si) != NERR_Success) 329*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 330*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 331*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((si.shr_flags & SMB_SHRF_DFSROOT) == 0) 332*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 333*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 334*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_root_remove(si.shr_path)) != ERROR_SUCCESS) 335*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 336*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 337*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = srvsvc_shr_setdfsroot(&si, B_FALSE); 338*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 339*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: failed to disable root share %s (%d)", 340*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name, status); 341*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 342*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_iterinit(&dfs_nscache, &cursor); 343*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 344*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (smb_cache_iterate(&dfs_nscache, &cursor, &nscnode)) { 345*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nscnode.nsc_type == DFS_OBJECT_ROOT) 346*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States continue; 347*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_remove(nscnode.nsc_fspath, NULL, NULL); 348*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 349*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: failed to remove %s (%d)", 350*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nscnode.nsc_fspath, status); 351*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 352*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 353*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_flush(&dfs_nscache); 354*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 355*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* TODO: remove empty dirs */ 356*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 357*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 358*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 359*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 360*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 361*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Root API (public) 362*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 363*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 364*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 365*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 366*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Retrieves the information of the root specified by its path. 367*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 368*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Info level (1) only needs the UNC path which is not stored, 369*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * it is constructed so the function will return without 370*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * accessing the backend storage. 371*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 372*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 373*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_getinfo(const char *rootdir, dfs_info_t *info, uint32_t infolvl) 374*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 375*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_INTERNAL_ERROR; 376*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd; 377*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 378*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(info, sizeof (dfs_info_t)); 379*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_type = DFS_OBJECT_ROOT; 380*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 381*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (infolvl == 1) 382*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 383*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 384*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_rdlock(&dfs_root_rwl); 385*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((xfd = dfs_root_xopen(rootdir, O_RDONLY)) > 0) { 386*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xread(xfd, info, infolvl); 387*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 388*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 389*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 390*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 391*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 392*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 393*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 394*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 395*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Sets the provided information for the specified root or root target. 396*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Root is specified by 'rootdir' and the target is specified by 397*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (t_server, t_share) pair. Only information items needed for given 398*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information level (infolvl) is valid in the passed DFS info structure 399*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'info'. 400*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 401*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 402*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_setinfo(const char *rootdir, dfs_info_t *info, uint32_t infolvl) 403*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 404*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t curinfo; 405*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 406*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd; 407*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 408*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_wrlock(&dfs_root_rwl); 409*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((xfd = dfs_root_xopen(rootdir, O_RDWR)) < 0) { 410*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 411*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 412*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 413*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 414*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xread(xfd, &curinfo, DFS_INFO_ALL); 415*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) { 416*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 417*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 418*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 419*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 420*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 421*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_modinfo(DFS_OBJECT_ROOT, &curinfo, info, infolvl); 422*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 423*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xwrite(xfd, &curinfo); 424*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 425*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 426*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 427*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 428*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&curinfo); 429*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 430*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 431*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 432*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 433*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 434*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Link API (public) 435*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 436*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 437*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 438*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 439*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Gets the status of the given path as a link 440*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 441*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 442*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_stat(const char *path, uint32_t *stat) 443*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 444*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_reparse_stat(path, stat) != 0) 445*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 446*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 447*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (*stat) { 448*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_REPARSE_NOTFOUND: 449*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_NOTFOUND; 450*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 451*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_REPARSE_NOTREPARSE: 452*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_NOTLINK; 453*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 454*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case SMB_REPARSE_ISREPARSE: 455*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_ISREPARSE; 456*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_reparse_svcget(path, DFS_REPARSE_SVCTYPE, NULL) == 0) 457*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_ISDFS; 458*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 459*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 460*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *stat = DFS_STAT_UNKNOWN; 461*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 462*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 463*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 464*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 465*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 466*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 467*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 468*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Creates a new DFS link or adds a new target to an existing link 469*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 470*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 471*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_add(const char *path, const char *server, const char *share, 472*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *cmnt, uint32_t flags, boolean_t *newlink) 473*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 474*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t info; 475*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 476*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int ntargets; 477*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 478*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t stat; 479*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 480*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *newlink = B_FALSE; 481*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 482*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_link_stat(path, &stat)) != ERROR_SUCCESS) 483*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 484*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 485*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (stat) { 486*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_NOTFOUND: 487*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_ISREPARSE: 488*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Create a new DFS link */ 489*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 490*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(NULL, &info, DFS_INFO_ALL); 491*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 492*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 493*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 494*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info.i_comment, (cmnt) ? cmnt : "", 495*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (info.i_comment)); 496*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *newlink = B_TRUE; 497*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 498*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 499*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_ISDFS: 500*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Add a target to an existing link */ 501*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 502*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (flags & DFS_ADD_VOLUME) 503*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 504*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 505*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(path, &info, DFS_INFO_ALL); 506*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 507*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 508*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 509*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 510*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 511*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_STAT_NOTLINK: 512*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* specified path points to a non-reparse object */ 513*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 514*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 515*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 516*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 517*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 518*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 519*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* checks to see if the target already exists */ 520*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ntargets = info.i_ntargets; 521*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_target_find(info.i_targets, ntargets, server, share) != -1) { 522*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 523*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_EXISTS); 524*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 525*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 526*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* add the new target */ 527*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t = realloc(info.i_targets, (ntargets + 1) * sizeof (dfs_target_t)); 528*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (t == NULL) { 529*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 530*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 531*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 532*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 533*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_targets = t; 534*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(&info.i_targets[ntargets], server, share, 535*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DFS_STORAGE_STATE_ONLINE); 536*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_ntargets++; 537*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 538*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_commit(path, &info); 539*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 540*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 541*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 542*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 543*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 544*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 545*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Removes a link or a link target from a DFS namespace. A link can be 546*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * removed regardless of the number of targets associated with it. 547*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 548*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'server' and 'share' parameters specify a target, so if they are NULL 549*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * it means the link should be removed, otherwise the specified target 550*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * is removed if found. 551*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 552*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 553*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_remove(const char *path, const char *server, const char *share) 554*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 555*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t info; 556*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status, stat; 557*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc, idx; 558*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 559*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_link_stat(path, &stat)) != ERROR_SUCCESS) 560*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 561*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 562*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (stat != DFS_STAT_ISDFS) 563*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 564*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 565*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (server == NULL && share == NULL) { 566*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* remove the link */ 567*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_reparse_svcdel(path, DFS_REPARSE_SVCTYPE) != 0) 568*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 569*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 570*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 571*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 572*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 573*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* remove the specified target in the link */ 574*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 575*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(path, &info, DFS_INFO_ALL); 576*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 577*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 578*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 579*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* checks to see if the target exists */ 580*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idx = dfs_target_find(info.i_targets, info.i_ntargets, server, share); 581*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (idx != -1) { 582*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bcopy(&info.i_targets[idx + 1], &info.i_targets[idx], 583*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (info.i_ntargets - idx - 1) * sizeof (dfs_target_t)); 584*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info.i_ntargets--; 585*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 586*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 587*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_NOT_FOUND); 588*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 589*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 590*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info.i_ntargets == 0) { 591*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* if last target, then remove the link */ 592*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_reparse_svcdel(path, DFS_REPARSE_SVCTYPE); 593*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = (rc == 0) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR; 594*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 595*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_commit(path, &info); 596*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 597*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 598*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&info); 599*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 600*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 601*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 602*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 603*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Sets the provided information for the specified link or link target. 604*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Link is specified by 'path' and the target is specified by 605*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (t_server, t_share) pair. Only information items needed for given 606*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information level (infolvl) is valid in the passed DFS info structure 607*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'info'. 608*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 609*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 610*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_setinfo(const char *path, dfs_info_t *info, uint32_t infolvl) 611*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 612*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t curinfo; 613*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 614*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 615*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(path, &curinfo, DFS_INFO_ALL); 616*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 617*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 618*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 619*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_modinfo(DFS_OBJECT_LINK, &curinfo, info, infolvl); 620*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 621*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_commit(path, &curinfo); 622*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 623*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(&curinfo); 624*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 625*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 626*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 627*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 628*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Gets the DFS link info. 629*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 630*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If path is NULL, it just does some initialization. 631*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 632*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Info level (1) only needs the UNC path which is not 633*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * stored, it is constructed so the function will return 634*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * without accessing the backend storage. 635*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 636*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 637*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_getinfo(const char *path, dfs_info_t *info, uint32_t infolvl) 638*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 639*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *link_data; 640*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 641*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_t uuid; 642*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 643*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 644*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(info, sizeof (dfs_info_t)); 645*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_type = DFS_OBJECT_LINK; 646*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 647*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path == NULL) { 648*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = DFS_VOLUME_STATE_OK; 649*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = DFS_LINK_TIMEOUT; 650*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = 0; 651*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_generate_random(uuid); 652*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uuid_unparse(uuid, info->i_guid); 653*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 654*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 655*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 656*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (infolvl == 1) 657*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 658*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 659*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_reparse_svcget(path, DFS_REPARSE_SVCTYPE, &link_data); 660*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) 661*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 662*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 663*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_decode(info, link_data, infolvl); 664*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(link_data); 665*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 666*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 667*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 668*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 669*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 670*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * =================== 671*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Cache API (public) 672*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * =================== 673*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 674*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 675*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 676*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Adds an entry with given DFS name (root sharename) and relative path 677*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to the share (relpath) and the specified entry type (i.e. root/link) 678*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to the namespace cache. 679*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 680*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 681*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_add_byname(const char *name, const char *relpath, uint32_t type) 682*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 683*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char uncpath[DFS_PATH_MAX]; 684*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char fspath[DFS_PATH_MAX]; 685*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 686*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 687*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get((char *)name, &si) != NERR_Success) 688*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 689*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 690*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (type == DFS_OBJECT_ROOT) { 691*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "\\\\%s\\%s", 692*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nbname, name); 693*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (dfs_cache_add_byunc(uncpath, si.shr_path, type)); 694*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 695*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 696*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* add link entry */ 697*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(fspath, DFS_PATH_MAX, "%s/%s", si.shr_path, relpath); 698*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "\\\\%s\\%s\\%s", dfs_nbname, 699*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States name, relpath); 700*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 701*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* relpath may contain '/' */ 702*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strsubst(uncpath, '/', '\\'); 703*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 704*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (dfs_cache_add_byunc(uncpath, fspath, type)); 705*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 706*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 707*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 708*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Removes the namespace cache entry for the given link 709*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * in the namespace ('name') with 'relpath' 710*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 711*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 712*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_remove(const char *name, const char *relpath) 713*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 714*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t dn; 715*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 716*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(dn.nsc_uncpath, sizeof (dn.nsc_uncpath), 717*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States "\\\\%s\\%s\\%s", dfs_nbname, name, relpath); 718*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 719*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* relpath may contain '/' */ 720*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strsubst(dn.nsc_uncpath, '/', '\\'); 721*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 722*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_remove(&dfs_nscache, &dn); 723*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 724*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 725*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 726*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Get the DFS data for the specified cache entry 727*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 728*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 729*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_getinfo(dfs_nscnode_t *dn, dfs_info_t *info, uint32_t infolvl) 730*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 731*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 732*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 733*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dn->nsc_type == DFS_OBJECT_LINK) 734*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(dn->nsc_fspath, info, infolvl); 735*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 736*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_getinfo(dn->nsc_fspath, info, infolvl); 737*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 738*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_uncpath, dn->nsc_uncpath, 739*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (info->i_uncpath)); 740*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 741*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) 742*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace("dfs_cache_getinfo", info); 743*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 744*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 745*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 746*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 747*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 748*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the number of cache entries i.e. the number of 749*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * root(s) and link(s) 750*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 751*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 752*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_num(void) 753*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 754*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_cache_num(&dfs_nscache)); 755*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 756*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 757*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 758*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_iterinit(smb_cache_cursor_t *cursor) 759*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 760*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_iterinit(&dfs_nscache, cursor); 761*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 762*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 763*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t 764*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_iterate(smb_cache_cursor_t *cursor, dfs_nscnode_t *dn) 765*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 766*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_cache_iterate(&dfs_nscache, cursor, dn)); 767*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 768*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 769*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 770*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 771*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Misc API (public) 772*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ================== 773*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 774*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 775*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 776*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This is the function that is called by smbd door server to 777*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fullfil a GetReferrals request from smbsrv kernel module 778*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 779*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 'reftype' specifies the requested referral type. If it is 780*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * DFS_REFERRAL_ROOT then dfs_path should point to a namespace 781*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * root. If it is DFS_REFERRAL_LINK then dfs_path should CONTAIN 782*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a link, in which case this function will find the link and 783*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * returns its target information. 784*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 785*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 786*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_get_referrals(const char *dfs_path, dfs_reftype_t reftype, 787*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_t *referrals) 788*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 789*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_t path; 790*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_t *unc; 791*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char linkpath[DFS_PATH_MAX]; 792*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 793*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 794*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_path_parse(&path, dfs_path, DFS_OBJECT_ANY); 795*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 796*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 797*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 798*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_setpriv(PRIV_ON); 799*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 800*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States referrals->i_type = path.p_type; 801*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 802*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (reftype) { 803*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_REFERRAL_ROOT: 804*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path.p_type != DFS_OBJECT_ROOT) { 805*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 806*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 807*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 808*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 809*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_getinfo((const char *)path.p_fspath, 810*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States referrals, DFS_INFO_ALL); 811*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(referrals->i_uncpath, dfs_path, DFS_PATH_MAX); 812*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 813*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 814*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_REFERRAL_LINK: 815*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path.p_type != DFS_OBJECT_LINK) { 816*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 817*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 818*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 819*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 820*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unc = &path.p_unc; 821*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!dfs_namespace_findlink(unc->unc_share, unc->unc_path, 822*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States linkpath, DFS_PATH_MAX)) { 823*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_NOT_FOUND; 824*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 825*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 826*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 827*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_getinfo(linkpath, referrals, DFS_INFO_ALL); 828*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(referrals->i_uncpath, DFS_PATH_MAX, "/%s/%s/%s", 829*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unc->unc_server, unc->unc_share, unc->unc_path); 830*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 831*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 832*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 833*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 834*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 835*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 836*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 837*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_setpriv(PRIV_OFF); 838*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_free(&path); 839*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 840*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 841*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 842*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 843*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Takes a DFS path in UNC format (dfs_path) and parse it into a dfs_path_t 844*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * structure. 845*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 846*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * dfs_path_free() MUST be called to free the allocated memory in this 847*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * function. 848*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 849*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: 850*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 851*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ERROR_INVALID_PARAMETER path is not a valid UNC or not valid for the 852*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * specified object type 853*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ERROR_NOT_ENOUGH_MEMORY not enough memory to peform the parse 854*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ERROR_NOT_FOUND namespace specified does not exist 855*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 856*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t 857*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_parse(dfs_path_t *path, const char *dfs_path, uint32_t path_type) 858*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 859*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char rootdir[DFS_PATH_MAX]; 860*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_t *unc; 861*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 862*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 863*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 864*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(path, sizeof (dfs_path_t)); 865*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unc = &path->p_unc; 866*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 867*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_unc_init(dfs_path, unc); 868*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (rc) { 869*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case EINVAL: 870*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_PARAMETER); 871*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case ENOMEM: 872*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 873*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 874*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 875*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 876*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 877*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_namespace_path(unc->unc_share, rootdir, DFS_PATH_MAX) 878*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States != ERROR_SUCCESS) { 879*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_free(unc); 880*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_FOUND); 881*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 882*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 883*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path_type == DFS_OBJECT_ANY) 884*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States path->p_type = (unc->unc_path != NULL) 885*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ? DFS_OBJECT_LINK : DFS_OBJECT_ROOT; 886*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 887*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States path->p_type = path_type; 888*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 889*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (path->p_type) { 890*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_OBJECT_LINK: 891*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((unc->unc_path == NULL) || (*unc->unc_path == '\0')) 892*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_NOT_FOUND; 893*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 894*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(path->p_fspath, sizeof (path->p_fspath), 895*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States "%s/%s", rootdir, unc->unc_path); 896*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 897*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 898*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_OBJECT_ROOT: 899*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (unc->unc_path == NULL) 900*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(path->p_fspath, rootdir, 901*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (path->p_fspath)); 902*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 903*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 904*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 905*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 906*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 907*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 908*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 909*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 910*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 911*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_free(unc); 912*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 913*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 914*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 915*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 916*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 917*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Frees the allocated memory for p_unc field of the passed path 918*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 919*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 920*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_free(dfs_path_t *path) 921*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 922*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (path != NULL) 923*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_unc_free(&path->p_unc); 924*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 925*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 926*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 927*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Free the allocated memory for targets in the given info 928*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * structure 929*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 930*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 931*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(dfs_info_t *info) 932*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 933*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info) 934*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(info->i_targets); 935*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 936*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 937*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 938*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Trace the given DFS info structure 939*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 940*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void 941*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace(const char *msg, dfs_info_t *info) 942*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 943*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 944*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i; 945*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 946*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("%s", msg); 947*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info == NULL) 948*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 949*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 950*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("UNC\t%s", info->i_uncpath); 951*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("comment\t%s", info->i_comment); 952*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("GUID\t%s", info->i_guid); 953*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("state\t%X", info->i_state); 954*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("timeout\t%d", info->i_timeout); 955*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("props\t%X", info->i_propflags); 956*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("# targets\t%X", info->i_ntargets); 957*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 958*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info->i_targets == NULL) 959*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 960*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 961*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = info->i_targets; i < info->i_ntargets; i++, t++) { 962*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("[%d] \\\\%s\\%s", i, t->t_server, t->t_share); 963*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("[%d] state\t%X", i, t->t_state); 964*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_tracef("[%d] priority\t%d:%d", i, t->t_priority.p_class, 965*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_rank); 966*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 967*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 968*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 969*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 970*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Search the path specified by 'relpath' to see if it contains 971*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * a DFS link starting from the last component. If a link is found 972*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the full path is returned in 'linkpath' 973*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 974*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 975*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_findlink(const char *name, char *relpath, 976*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *linkpath, size_t bufsz) 977*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 978*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char rootdir[DFS_PATH_MAX]; 979*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t stat; 980*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *p; 981*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 982*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_namespace_path(name, rootdir, DFS_PATH_MAX) != ERROR_SUCCESS) 983*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 984*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 985*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(linkpath, bufsz, "%s/%s", rootdir, relpath); 986*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 987*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (;;) { 988*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_link_stat(linkpath, &stat) != ERROR_SUCCESS) 989*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 990*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 991*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (stat == DFS_STAT_ISDFS) 992*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_TRUE); 993*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 994*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((p = strrchr(relpath, '/')) == NULL) 995*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 996*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *p = '\0'; 997*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 998*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(linkpath, bufsz, "%s/%s", rootdir, relpath); 999*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1000*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1001*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*NOTREACHED*/ 1002*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 1003*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1004*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1005*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1006*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Caches the specified namespace 1007*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1008*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void * 1009*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_namespace_cache(void *arg) 1010*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1011*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *share = arg; 1012*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char uncpath[DFS_PATH_MAX]; 1013*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_share_t si; 1014*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1015*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_shr_get(share, &si) != NERR_Success) { 1016*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(share); 1017*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL); 1018*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1019*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1020*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "\\\\%s\\%s", dfs_nbname, share); 1021*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) dfs_cache_add_byunc(uncpath, si.shr_path, DFS_OBJECT_ROOT); 1022*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1023*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_populate(uncpath, si.shr_path); 1024*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1025*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(share); 1026*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (NULL); 1027*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1028*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1029*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 1030*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_add(const char *rootdir, dfs_info_t *info) 1031*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1032*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_INTERNAL_ERROR; 1033*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd; 1034*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1035*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_wrlock(&dfs_root_rwl); 1036*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((xfd = dfs_root_xopen(rootdir, O_CREAT | O_TRUNC | O_RDWR)) > 0) { 1037*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_xwrite(xfd, info); 1038*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(xfd); 1039*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1040*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 1041*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1042*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1043*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1044*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1045*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1046*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Deletes the specified root information 1047*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1048*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1049*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_remove(const char *rootdir) 1050*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1051*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int attrdirfd; 1052*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int err = 0; 1053*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1054*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_wrlock(&dfs_root_rwl); 1055*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1056*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((attrdirfd = attropen(rootdir, ".", O_RDONLY)) > 0) { 1057*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (unlinkat(attrdirfd, DFS_ROOT_XATTR, 0) == -1) { 1058*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (errno != ENOENT) 1059*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 1060*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1061*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) close(attrdirfd); 1062*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1063*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 1064*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1065*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1066*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) rw_unlock(&dfs_root_rwl); 1067*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1068*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (err != 0) { 1069*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "dfs: failed to remove root info %s (%d)", 1070*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rootdir, err); 1071*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1072*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1073*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1074*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1075*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1076*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1077*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1078*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Opens DFS root directory's extended attribute with the given mode. 1079*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1080*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 1081*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xopen(const char *rootdir, int oflag) 1082*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1083*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int dfd; 1084*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int xfd = -1; 1085*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int err = 0; 1086*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1087*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dfd = open(rootdir, O_RDONLY)) > 0) { 1088*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States xfd = openat(dfd, DFS_ROOT_XATTR, oflag | O_XATTR, 0600); 1089*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (xfd == -1) 1090*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 1091*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) close(dfd); 1092*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1093*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States err = errno; 1094*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1095*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1096*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (err != 0) { 1097*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_DEBUG, "dfs: failed to open root directory %s (%d)", 1098*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rootdir, err); 1099*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1100*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1101*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (xfd); 1102*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1103*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1104*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1105*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Closes given extended attribute file descriptor 1106*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1107*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 1108*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xclose(int xfd) 1109*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1110*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) close(xfd); 1111*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1112*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1113*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1114*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Writes the given DFS data in the DFS root directory's 1115*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * extended attribute specified with xfd file descriptor. 1116*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1117*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1118*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xwrite(int xfd, dfs_info_t *info) 1119*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1120*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t nbytes; 1121*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *buf = NULL; 1122*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t buflen; 1123*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 1124*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1125*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((status = dfs_root_encode(info, &buf, &buflen)) != ERROR_SUCCESS) 1126*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1127*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1128*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) lseek(xfd, 0, SEEK_SET); 1129*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nbytes = write(xfd, buf, buflen); 1130*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(buf); 1131*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1132*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((nbytes == buflen) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR); 1133*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1134*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1135*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1136*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Reads DFS root information from its directory extended attribute 1137*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and parse it into given dfs_info_t structure 1138*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1139*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1140*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_xread(int xfd, dfs_info_t *info, uint32_t infolvl) 1141*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1142*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct stat statbuf; 1143*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 1144*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *buf; 1145*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1146*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (fstat(xfd, &statbuf) != 0) 1147*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1148*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1149*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((buf = malloc(statbuf.st_size)) == NULL) 1150*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 1151*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1152*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (read(xfd, buf, statbuf.st_size) == statbuf.st_size) 1153*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_root_decode(info, buf, statbuf.st_size, infolvl); 1154*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else 1155*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INTERNAL_ERROR; 1156*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1157*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(buf); 1158*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1159*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1160*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1161*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1162*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Encodes (packs) DFS information in 'info' into a flat 1163*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * buffer in a name-value format. This function allocates a 1164*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * buffer with appropriate size to contain all the information 1165*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * so the caller MUST free the allocated memory by calling free(). 1166*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1167*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1168*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_encode(dfs_info_t *info, char **buf, size_t *bufsz) 1169*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1170*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 1171*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_t *nvl; 1172*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 1173*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1174*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) 1175*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 1176*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1177*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_add_string(nvl, "comment", info->i_comment); 1178*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_string(nvl, "guid", info->i_guid); 1179*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "state", info->i_state); 1180*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "timeout", info->i_timeout); 1181*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "propflags", info->i_propflags); 1182*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t = info->i_targets; 1183*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_string(nvl, "t_server", t->t_server); 1184*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_string(nvl, "t_share", t->t_share); 1185*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_add_uint32(nvl, "t_state", t->t_state); 1186*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1187*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc == 0) 1188*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_pack(nvl, buf, bufsz, NV_ENCODE_NATIVE, 0); 1189*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1190*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 1191*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1192*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((rc == 0) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR); 1193*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1194*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1195*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1196*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Decodes (unpack) provided buffer which contains a list of name-value 1197*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * pairs into given dfs_info_t structure 1198*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1199*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1200*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_decode(dfs_info_t *info, char *buf, size_t bufsz, uint32_t infolvl) 1201*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1202*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_t *nvl; 1203*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *cmnt, *guid; 1204*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *t_server, *t_share; 1205*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t t_state; 1206*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 1207*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1208*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nvlist_unpack(buf, bufsz, &nvl, 0) != 0) 1209*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1210*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1211*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_lookup_string(nvl, "comment", &cmnt); 1212*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_string(nvl, "guid", &guid); 1213*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "state", &info->i_state); 1214*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "timeout", &info->i_timeout); 1215*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "propflags", &info->i_propflags); 1216*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1217*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) { 1218*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 1219*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1220*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1221*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1222*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, (cmnt) ? cmnt : "", 1223*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (info->i_comment)); 1224*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_guid, (guid) ? guid : "", sizeof (info->i_guid)); 1225*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1226*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = NULL; 1227*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_ntargets = 1; 1228*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1229*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolvl) { 1230*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_INFO_ALL: 1231*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 3: 1232*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 4: 1233*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 6: 1234*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 9: 1235*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* need target information */ 1236*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1237*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 1238*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 1239*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1240*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1241*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1242*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = malloc(sizeof (dfs_target_t)); 1243*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info->i_targets == NULL) { 1244*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 1245*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 1246*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1247*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1248*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = nvlist_lookup_string(nvl, "t_server", &t_server); 1249*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_string(nvl, "t_share", &t_share); 1250*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc |= nvlist_lookup_uint32(nvl, "t_state", &t_state); 1251*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) { 1252*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 1253*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(info->i_targets); 1254*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1255*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1256*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(info->i_targets, t_server, t_share, t_state); 1257*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1258*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nvlist_free(nvl); 1259*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1260*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1261*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1262*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1263*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines if the passed state is valid for a DFS root 1264*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1265*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This is based on test results against Win2003 and in some cases 1266*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * does not match [MS-DFSNM] spec. 1267*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1268*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1269*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_root_isvalidstate(uint32_t state) 1270*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1271*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (state) { 1272*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_OK: 1273*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_RESYNCHRONIZE: 1274*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1275*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1276*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_INCONSISTENT: 1277*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_FORCE_SYNC: 1278*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_PARAMETER); 1279*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1280*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_OFFLINE: 1281*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_ONLINE: 1282*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_VOLUME_STATE_STANDBY: 1283*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_SUPPORTED); 1284*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 1285*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1286*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1287*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1288*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_PARAMETER); 1289*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1290*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1291*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1292*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Decodes the link info from given string buffer (buf) into 1293*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * dfs_info_t structure. 1294*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1295*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1296*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_decode(dfs_info_t *info, char *buf, uint32_t infolvl) 1297*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1298*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *lfield[DFS_LINK_HDR_NFIELDS]; 1299*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 1300*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t linkver; 1301*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t cmntlen; 1302*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t cpylen; 1303*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i, j; 1304*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1305*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1306*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Header format 1307*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ver:state:prop:timeout:guid:ntarget:cmntlen:comment: 1308*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1309*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0; i < DFS_LINK_HDR_NFIELDS; i++) { 1310*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((lfield[i] = strsep((char **)&buf, ":")) == NULL) 1311*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_DATA); 1312*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1313*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1314*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i = 0; 1315*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States linkver = strtoul(lfield[i++], NULL, 10); 1316*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (linkver != DFS_LINK_V1) 1317*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_DATA); 1318*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1319*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = strtoul(lfield[i++], NULL, 10); 1320*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = strtoul(lfield[i++], NULL, 10); 1321*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = strtoul(lfield[i++], NULL, 10); 1322*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_guid, lfield[i++], sizeof (info->i_guid)); 1323*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_ntargets = strtoul(lfield[i++], NULL, 10); 1324*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = NULL; 1325*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1326*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cpylen = cmntlen = strtoul(lfield[i++], NULL, 10); 1327*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1328*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (cmntlen > sizeof (info->i_comment)) 1329*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cpylen = sizeof (info->i_comment); 1330*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else if (cmntlen != 0) 1331*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cpylen = cmntlen + 1; 1332*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1333*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, buf, cpylen); 1334*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States buf += (cmntlen + 1); 1335*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1336*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolvl) { 1337*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case DFS_INFO_ALL: 1338*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 3: 1339*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 4: 1340*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 6: 1341*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 9: 1342*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* need target information */ 1343*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1344*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 1345*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1346*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1347*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1348*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets = calloc(info->i_ntargets, sizeof (dfs_target_t)); 1349*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (info->i_targets == NULL) 1350*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 1351*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1352*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1353*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Format for each target 1354*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * server:share:state:class:rank 1355*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1356*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = info->i_targets; i < info->i_ntargets; i++, t++) { 1357*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (j = 0; j < DFS_LINK_TRGT_NFIELDS; j++) { 1358*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((lfield[j] = strsep((char **)&buf, ":")) == NULL) { 1359*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_free(info); 1360*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_DATA); 1361*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1362*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1363*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1364*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_server, lfield[0], sizeof (t->t_server)); 1365*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_share, lfield[1], sizeof (t->t_share)); 1366*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_state = strtoul(lfield[2], NULL, 10); 1367*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_class = strtoul(lfield[3], NULL, 10); 1368*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_rank = strtoul(lfield[4], NULL, 10); 1369*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1370*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1371*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1372*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1373*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1374*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1375*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Encodes given link information (info) 1376*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1377*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1378*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_encode(dfs_info_t *info, char *buf, size_t bufsz) 1379*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1380*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char linkdata[MAXREPARSELEN]; 1381*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 1382*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i, sz; 1383*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1384*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1385*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Header format 1386*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ver:state:prop:timeout:guid:ntarget:cmntlen:comment 1387*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1388*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sz = snprintf(buf, bufsz, "%u:%u:%u:%u:%s:%u:%u:%s", 1389*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DFS_LINK_V1, info->i_state, info->i_propflags, info->i_timeout, 1390*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_guid, info->i_ntargets, 1391*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States strlen(info->i_comment), info->i_comment); 1392*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1393*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sz > bufsz) { 1394*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: link data is too large"); 1395*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace("DFS link encode", info); 1396*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1397*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1398*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1399*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1400*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Format for each target 1401*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * :server:share:state:class:rank 1402*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1403*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bufsz -= sz; 1404*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = info->i_targets; i < info->i_ntargets; i++, t++) { 1405*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (strchr(t->t_server, ':') || strchr(t->t_share, ':')) 1406*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INVALID_NAME); 1407*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1408*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sz = snprintf(linkdata, MAXREPARSELEN, ":%s:%s:%u:%u:%u", 1409*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_server, t->t_share, t->t_state, 1410*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_class, t->t_priority.p_rank); 1411*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sz > bufsz) { 1412*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_WARNING, "dfs: link data is too large"); 1413*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_info_trace("DFS link encode", info); 1414*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_INTERNAL_ERROR); 1415*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1416*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strcat(buf, linkdata); 1417*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bufsz -= sz; 1418*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1419*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1420*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1421*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1422*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1423*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1424*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Stores given information for the specified link 1425*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1426*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1427*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_commit(const char *path, dfs_info_t *info) 1428*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1429*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char linkdata[MAXREPARSELEN]; 1430*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status; 1431*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 1432*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1433*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_link_encode(info, linkdata, MAXREPARSELEN); 1434*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status == ERROR_SUCCESS) { 1435*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_reparse_svcadd(path, DFS_REPARSE_SVCTYPE, linkdata); 1436*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0) 1437*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INTERNAL_ERROR; 1438*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1439*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1440*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1441*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1442*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1443*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1444*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines if the passed state is valid for a link 1445*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1446*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 1447*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_link_isvalidstate(uint32_t state) 1448*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1449*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (state == DFS_VOLUME_STATE_OK || 1450*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state == DFS_VOLUME_STATE_OFFLINE || 1451*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state == DFS_VOLUME_STATE_ONLINE); 1452*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1453*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1454*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1455*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Initializes the given target structure (t) with provided information. 1456*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1457*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 1458*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_init(dfs_target_t *t, const char *srv, const char *share, 1459*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t state) 1460*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1461*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_server, (srv) ? srv : "", sizeof (t->t_server)); 1462*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(t->t_share, (share) ? share : "", sizeof (t->t_share)); 1463*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_state = state; 1464*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_class = DfsSiteCostNormalPriorityClass; 1465*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States t->t_priority.p_rank = 0; 1466*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1467*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1468*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1469*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Lookup the specified target (server, share) in the given 1470*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * target list (targets). If there is a match its index is 1471*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * returned, otherwise -1 will be returned. 1472*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1473*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 1474*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_find(dfs_target_t *targets, uint32_t ntargets, 1475*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *server, const char *share) 1476*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1477*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_t *t; 1478*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i; 1479*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1480*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0, t = targets; i < ntargets; i++, t++) { 1481*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((smb_strcasecmp(t->t_server, server, 0) == 0) && 1482*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (smb_strcasecmp(t->t_share, share, 0) == 0)) 1483*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (i); 1484*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1485*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1486*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 1487*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1488*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1489*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1490*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines if the passed state is valid for a link/root target 1491*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1492*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 1493*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_target_isvalidstate(uint32_t state) 1494*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1495*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (state == DFS_STORAGE_STATE_ONLINE || 1496*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state == DFS_STORAGE_STATE_OFFLINE); 1497*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1498*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1499*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1500*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Cache compare function, the key is UNC path 1501*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1502*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int 1503*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_cmp(const void *p1, const void *p2) 1504*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1505*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_node_t *cn1 = (smb_cache_node_t *)p1; 1506*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_cache_node_t *cn2 = (smb_cache_node_t *)p2; 1507*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t *dn1 = cn1->cn_data; 1508*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t *dn2 = cn2->cn_data; 1509*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int rc; 1510*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1511*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_strcasecmp(dn1->nsc_uncpath, dn2->nsc_uncpath, 0); 1512*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1513*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc < 0) 1514*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1); 1515*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1516*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rc > 0) 1517*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (1); 1518*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1519*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0); 1520*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1521*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1522*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1523*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Adds an entry with given UNC and filesystem path and the specified 1524*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * entry type (i.e. root/link) to the namespace cache. 1525*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1526*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1527*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_add_byunc(const char *uncpath, const char *fspath, uint32_t type) 1528*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1529*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_nscnode_t *dn; 1530*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 1531*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1532*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dn = malloc(sizeof (dfs_nscnode_t))) == NULL) 1533*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_NOT_ENOUGH_MEMORY); 1534*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1535*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(dn->nsc_uncpath, uncpath, sizeof (dn->nsc_uncpath)); 1536*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(dn->nsc_fspath, fspath, sizeof (dn->nsc_fspath)); 1537*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dn->nsc_type = type; 1538*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (smb_cache_add(&dfs_nscache, dn, SMB_CACHE_ADD) != 0) { 1539*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(dn); 1540*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INTERNAL_ERROR; 1541*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1542*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1543*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1544*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1545*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1546*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1547*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * starting from DFS root directory, scans the tree for DFS links 1548*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and adds them to the cache. 1549*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1550*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void 1551*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_populate(const char *unc_prefix, const char *dir) 1552*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1553*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char fspath[DFS_PATH_MAX]; 1554*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char uncpath[DFS_PATH_MAX]; 1555*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *fname; 1556*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int nentries, i; 1557*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct dirent **entry_list; 1558*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t stat; 1559*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1560*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nentries = scandir(dir, &entry_list, NULL, NULL); 1561*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (nentries == -1) 1562*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return; 1563*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1564*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (i = 0; i < nentries; i++) { 1565*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fname = entry_list[i]->d_name; 1566*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1567*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (strcmp(fname, ".") == 0 || 1568*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States strcmp(fname, "..") == 0) { 1569*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list[i]); 1570*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States continue; 1571*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1572*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1573*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(fspath, DFS_PATH_MAX, "%s/%s", dir, fname); 1574*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(uncpath, DFS_PATH_MAX, "%s\\%s", unc_prefix, 1575*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States fname); 1576*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1577*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (dfs_path_isdir(fspath)) { 1578*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_cache_populate(uncpath, fspath); 1579*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else if (dfs_link_stat(fspath, &stat) == ERROR_SUCCESS) { 1580*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (stat == DFS_STAT_ISDFS) 1581*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) dfs_cache_add_byunc(uncpath, fspath, 1582*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States DFS_OBJECT_LINK); 1583*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1584*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1585*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list[i]); 1586*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1587*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1588*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (; i < nentries; i++) 1589*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list[i]); 1590*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1591*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States free(entry_list); 1592*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1593*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1594*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1595*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Determines whether the given path is a directory. 1596*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1597*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t 1598*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_path_isdir(const char *path) 1599*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1600*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct stat statbuf; 1601*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1602*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (lstat(path, &statbuf) != 0) 1603*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE); 1604*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1605*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return ((statbuf.st_mode & S_IFMT) == S_IFDIR); 1606*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1607*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1608*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1609*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Validates the given state based on the object type (root/link) 1610*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and whether it is the object's state or its target's state 1611*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1612*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1613*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_isvalidstate(uint32_t state, uint32_t type, boolean_t target) 1614*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1615*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 1616*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1617*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (type == DFS_OBJECT_ROOT) { 1618*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!target) 1619*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (dfs_root_isvalidstate(state)); 1620*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1621*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!dfs_target_isvalidstate(state)) 1622*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 1623*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else if (state == DFS_STORAGE_STATE_OFFLINE) 1624*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_NOT_SUPPORTED; 1625*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1626*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!target) { 1627*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!dfs_link_isvalidstate(state)) 1628*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 1629*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1630*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!dfs_target_isvalidstate(state)) 1631*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_PARAMETER; 1632*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1633*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1634*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1635*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1636*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1637*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1638*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1639*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Based on the specified information level (infolvl) copy parts of the 1640*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * information provided through newinfo into the existing information 1641*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * (info) for the given object. 1642*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1643*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t 1644*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dfs_modinfo(uint32_t type, dfs_info_t *info, dfs_info_t *newinfo, 1645*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t infolvl) 1646*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States { 1647*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t target_op = B_FALSE; 1648*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t status = ERROR_SUCCESS; 1649*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t state; 1650*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int target_idx; 1651*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1652*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (newinfo->i_targets != NULL) { 1653*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States target_idx = dfs_target_find(info->i_targets, info->i_ntargets, 1654*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States newinfo->i_targets->t_server, newinfo->i_targets->t_share); 1655*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (target_idx == -1) 1656*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_FILE_NOT_FOUND); 1657*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States target_op = B_TRUE; 1658*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1659*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1660*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (infolvl) { 1661*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 100: 1662*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, newinfo->i_comment, 1663*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (newinfo->i_comment)); 1664*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1665*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1666*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 101: 1667*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States state = (target_op) 1668*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ? newinfo->i_targets->t_state : newinfo->i_state; 1669*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = dfs_isvalidstate(state, type, target_op); 1670*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (status != ERROR_SUCCESS) 1671*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1672*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1673*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!target_op) { 1674*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* 1675*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * states specified by this mask should not be stored 1676*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */ 1677*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (state & DFS_VOLUME_STATES_SRV_OPS) 1678*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ERROR_SUCCESS); 1679*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1680*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = state; 1681*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else { 1682*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets[target_idx].t_state = state; 1683*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1684*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1685*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1686*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 102: 1687*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = newinfo->i_timeout; 1688*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1689*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1690*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 103: 1691*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = newinfo->i_propflags; 1692*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1693*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1694*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 104: 1695*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_targets[target_idx].t_priority = 1696*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States newinfo->i_targets->t_priority; 1697*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1698*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1699*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States case 105: 1700*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(info->i_comment, newinfo->i_comment, 1701*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (newinfo->i_comment)); 1702*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_state = newinfo->i_state; 1703*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_timeout = newinfo->i_timeout; 1704*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States info->i_propflags = newinfo->i_propflags; 1705*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break; 1706*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1707*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States default: 1708*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States status = ERROR_INVALID_LEVEL; 1709*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1710*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 1711*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (status); 1712*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } 1713