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