xref: /titanic_51/usr/src/lib/smbsrv/libsmb/common/smb_reparse.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 <errno.h>
27*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <unistd.h>
28*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <strings.h>
29*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/fs_reparse.h>
30*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/libsmb.h>
31*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
32*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <syslog.h>
33*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
34*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_reparse_init(const char *, nvlist_t **);
35*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_reparse_free(nvlist_t *);
36*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_reparse_set(const char *, nvlist_t *);
37*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
38*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
39*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Checks the status of the object specified by 'path'
40*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
41*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns 0 and fills 'stat' with the proper status on
42*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * success, otherwise returns an error code.
43*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
44*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
45*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_stat(const char *path, uint32_t *stat)
46*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
47*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	struct stat statbuf;
48*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char symbuf[MAXREPARSELEN];
49*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rptaglen;
50*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
51*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (lstat(path, &statbuf) != 0) {
52*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (errno == ENOENT) {
53*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			*stat = SMB_REPARSE_NOTFOUND;
54*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (0);
55*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
56*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (errno);
57*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
58*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
59*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((statbuf.st_mode & S_IFMT) != S_IFLNK) {
60*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*stat = SMB_REPARSE_NOTREPARSE;
61*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (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 	bzero(symbuf, MAXREPARSELEN);
65*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (readlink(path, symbuf, MAXREPARSELEN) == -1)
66*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (errno);
67*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
68*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rptaglen = strlen(FS_REPARSE_TAG_STR);
69*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (strncmp(symbuf, FS_REPARSE_TAG_STR, rptaglen) != 0)
70*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*stat = SMB_REPARSE_NOTREPARSE;
71*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else
72*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*stat = SMB_REPARSE_ISREPARSE;
73*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
74*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
75*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
76*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
77*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
78*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the reparse point specified by the path already exists
79*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * it is updated by given service type and its data. Update means
80*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * that if such service type does not already exist, it is added
81*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * otherwise it is overwritten by given data.
82*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
83*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the reparse point does not exist, one is created with given
84*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * service type and its data.
85*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
86*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
87*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_svcadd(const char *path, const char *svctype, const char *svcdata)
88*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
89*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nvlist_t *nvl;
90*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
91*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
92*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = smb_reparse_init(path, &nvl)) != 0)
93*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
94*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
95*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = reparse_add(nvl, svctype, svcdata)) != 0) {
96*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_reparse_free(nvl);
97*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
98*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
99*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
100*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = smb_reparse_set(path, nvl);
101*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_reparse_free(nvl);
102*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
103*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
104*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
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  * Removes the entry for the given service type from the
108*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * specified reparse point. If there is no service entry
109*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * left, the reparse point object will be deleted.
110*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
111*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
112*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_svcdel(const char *path, const char *svctype)
113*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
114*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nvlist_t *nvl;
115*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
116*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
117*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = smb_reparse_init(path, &nvl)) != 0)
118*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
119*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
120*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = reparse_remove(nvl, svctype)) != 0) {
121*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_reparse_free(nvl);
122*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
123*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
124*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
125*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (nvlist_next_nvpair(nvl, NULL) == NULL) {
126*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/* list is empty remove the object */
127*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = reparse_delete(path);
128*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((rc != 0) && (rc == ENOENT))
129*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = 0;
130*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
131*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = smb_reparse_set(path, nvl);
132*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
133*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
134*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_reparse_free(nvl);
135*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
136*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
137*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
138*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
139*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Obtains data of the given service type from the specified
140*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * reparse point. Function allocates the memory needed to hold
141*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the service data so the caller must free this memory by
142*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * calling free().
143*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
144*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If 'svcdata' is NULL, successful return means that the reparse
145*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * point contains a record for the given service type.
146*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
147*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
148*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_svcget(const char *path, const char *svctype, char **svcdata)
149*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
150*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nvlist_t *nvl;
151*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nvpair_t *nvp;
152*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char *stype, *sdata;
153*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
154*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
155*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = smb_reparse_init(path, &nvl)) != 0)
156*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
157*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
158*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = ENODATA;
159*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nvp = nvlist_next_nvpair(nvl, NULL);
160*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
161*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (nvp != NULL) {
162*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		stype = nvpair_name(nvp);
163*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
164*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((stype != NULL) && (strcasecmp(stype, svctype) == 0)) {
165*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if ((rc = nvpair_value_string(nvp, &sdata)) != 0)
166*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				break;
167*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
168*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (svcdata != NULL) {
169*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				if ((*svcdata = strdup(sdata)) == NULL)
170*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 					rc = ENOMEM;
171*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
172*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
173*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = 0;
174*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
175*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
176*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		nvp = nvlist_next_nvpair(nvl, nvp);
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 	smb_reparse_free(nvl);
180*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
181*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
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  * Initializes the given nvpair list.
185*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
186*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function assumes that the object specified by this path
187*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * is a reparse point, so it does not do any verification.
188*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
189*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If specified reparse point does not exist the function
190*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * returns successfully with an empty nvpair list.
191*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
192*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the object exists and readlink is successful then nvpair
193*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * list is polulated with the reparse service information, otherwise
194*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * an error code is returned.
195*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
196*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
197*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_init(const char *path, nvlist_t **nvl)
198*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
199*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char rp_data[MAXREPARSELEN];
200*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
201*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
202*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((*nvl = reparse_init()) == NULL)
203*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (ENOMEM);
204*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
205*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(rp_data, MAXREPARSELEN);
206*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = readlink(path, rp_data, MAXREPARSELEN)) == -1) {
207*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (errno == ENOENT)
208*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (0);
209*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
210*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		reparse_free(*nvl);
211*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (errno);
212*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
213*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
214*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = reparse_parse(rp_data, *nvl)) != 0) {
215*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		reparse_free(*nvl);
216*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
217*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
218*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
219*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
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 /*
223*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Frees given nvlist
224*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
225*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
226*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_free(nvlist_t *nvl)
227*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
228*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	reparse_free(nvl);
229*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
230*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
231*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
232*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Create a reparse point with given services in the passed
233*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * nvlist. If the reparse point already exists, it will be
234*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * deleted and a new one with the given data is created.
235*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
236*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
237*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_reparse_set(const char *path, nvlist_t *nvl)
238*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
239*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char *rp_data;
240*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
241*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
242*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = reparse_unparse(nvl, &rp_data)) != 0)
243*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
244*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
245*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = reparse_delete(path);
246*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc != 0) && (rc != ENOENT)) {
247*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(rp_data);
248*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (rc);
249*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
250*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
251*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = reparse_create(path, rp_data);
252*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free(rp_data);
253*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
254*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
255*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
256