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