xref: /titanic_44/usr/src/lib/libidmap/common/idmap_api.c (revision 1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9f)
1c5c4113dSnw141292 /*
2c5c4113dSnw141292  * CDDL HEADER START
3c5c4113dSnw141292  *
4c5c4113dSnw141292  * The contents of this file are subject to the terms of the
5c5c4113dSnw141292  * Common Development and Distribution License (the "License").
6c5c4113dSnw141292  * You may not use this file except in compliance with the License.
7c5c4113dSnw141292  *
8c5c4113dSnw141292  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9c5c4113dSnw141292  * or http://www.opensolaris.org/os/licensing.
10c5c4113dSnw141292  * See the License for the specific language governing permissions
11c5c4113dSnw141292  * and limitations under the License.
12c5c4113dSnw141292  *
13c5c4113dSnw141292  * When distributing Covered Code, include this CDDL HEADER in each
14c5c4113dSnw141292  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15c5c4113dSnw141292  * If applicable, add the following below this CDDL HEADER, with the
16c5c4113dSnw141292  * fields enclosed by brackets "[]" replaced with your own identifying
17c5c4113dSnw141292  * information: Portions Copyright [yyyy] [name of copyright owner]
18c5c4113dSnw141292  *
19c5c4113dSnw141292  * CDDL HEADER END
20c5c4113dSnw141292  */
21c5c4113dSnw141292 /*
22c5866007SKeyur Desai  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23ad8ef92aSMilan Jurik  * Copyright Milan Jurik 2012. All rights reserved.
248ce3a038SMarcel Telka  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
25c5c4113dSnw141292  */
26c5c4113dSnw141292 
27c5c4113dSnw141292 
28c5c4113dSnw141292 /*
29c5c4113dSnw141292  * libidmap API
30c5c4113dSnw141292  */
31c5c4113dSnw141292 
32c5c4113dSnw141292 #include <stdlib.h>
33479ac375Sdm199847 #include <sys/varargs.h>
34c5c4113dSnw141292 #include <inttypes.h>
35c5c4113dSnw141292 #include <errno.h>
36c5c4113dSnw141292 #include <strings.h>
37c5c4113dSnw141292 #include <ctype.h>
38c5c4113dSnw141292 #include <sys/param.h>
39c5c4113dSnw141292 #include <sys/types.h>
40c5c4113dSnw141292 #include <sys/stat.h>
41c5c4113dSnw141292 #include <dlfcn.h>
42c5c4113dSnw141292 #include <libintl.h>
43c5866007SKeyur Desai #include <syslog.h>
44148c5f43SAlan Wright #include <assert.h>
45c5c4113dSnw141292 #include "idmap_impl.h"
463ee87bcaSJulian Pullen #include "idmap_cache.h"
47c5c4113dSnw141292 
48c5c4113dSnw141292 static struct timeval TIMEOUT = { 25, 0 };
49c5c4113dSnw141292 
50c5c4113dSnw141292 static int idmap_stat2errno(idmap_stat);
518e228215Sdm199847 static idmap_stat	idmap_strdupnull(char **, const char *);
52c5c4113dSnw141292 
531fdeec65Sjoyce mcintosh #define	__ITER_CREATE(itera, argu, ityp)\
54c5c4113dSnw141292 	itera = calloc(1, sizeof (*itera));\
55c5c4113dSnw141292 	if (itera == NULL) {\
56c5c4113dSnw141292 		errno = ENOMEM;\
57c5c4113dSnw141292 		return (IDMAP_ERR_MEMORY);\
58c5c4113dSnw141292 	}\
59c5c4113dSnw141292 	argu = calloc(1, sizeof (*argu));\
60c5c4113dSnw141292 	if (argu == NULL) {\
61c5c4113dSnw141292 		free(itera);\
62c5c4113dSnw141292 		errno = ENOMEM;\
63c5c4113dSnw141292 		return (IDMAP_ERR_MEMORY);\
64c5c4113dSnw141292 	}\
65c5c4113dSnw141292 	itera->type = ityp;\
66c5c4113dSnw141292 	itera->retcode = IDMAP_NEXT;\
67c5c4113dSnw141292 	itera->limit = 1024;\
68c5c4113dSnw141292 	itera->arg = argu;
69c5c4113dSnw141292 
70c5c4113dSnw141292 #define	__ITER_CHECK(itera, ityp)\
71c5c4113dSnw141292 	if (itera == NULL) {\
72c5c4113dSnw141292 		errno = EINVAL;\
73c5c4113dSnw141292 		return (IDMAP_ERR_ARG);\
74c5c4113dSnw141292 	}\
75c5c4113dSnw141292 	if (itera->type != ityp) {\
76c5c4113dSnw141292 		errno = EINVAL;\
77c5c4113dSnw141292 		return (IDMAP_ERR_ARG);\
78c5c4113dSnw141292 	}
79c5c4113dSnw141292 
80c5c4113dSnw141292 /*
81c5c4113dSnw141292  * Free memory allocated by libidmap API
82c5c4113dSnw141292  *
83c5c4113dSnw141292  * Input:
84c5c4113dSnw141292  * ptr - memory to be freed
85c5c4113dSnw141292  */
86c5c4113dSnw141292 void
idmap_free(void * ptr)87cd37da74Snw141292 idmap_free(void *ptr)
88cd37da74Snw141292 {
89c5c4113dSnw141292 	free(ptr);
90c5c4113dSnw141292 }
91c5c4113dSnw141292 
92c5c4113dSnw141292 
934d61c878SJulian Pullen static idmap_stat
idmap_get_prop(idmap_prop_type pr,idmap_prop_res * res)941fdeec65Sjoyce mcintosh idmap_get_prop(idmap_prop_type pr, idmap_prop_res *res)
95479ac375Sdm199847 {
961fdeec65Sjoyce mcintosh 	idmap_stat retcode;
97479ac375Sdm199847 
98479ac375Sdm199847 	(void) memset(res, 0, sizeof (*res));
99479ac375Sdm199847 
1001fdeec65Sjoyce mcintosh 	retcode = _idmap_clnt_call(IDMAP_GET_PROP,
101479ac375Sdm199847 	    (xdrproc_t)xdr_idmap_prop_type, (caddr_t)&pr,
102479ac375Sdm199847 	    (xdrproc_t)xdr_idmap_prop_res, (caddr_t)res, TIMEOUT);
1031fdeec65Sjoyce mcintosh 	if (retcode != IDMAP_SUCCESS)
1041fdeec65Sjoyce mcintosh 		return (retcode);
105479ac375Sdm199847 
106479ac375Sdm199847 	return (res->retcode); /* This might not be IDMAP_SUCCESS! */
107479ac375Sdm199847 }
108479ac375Sdm199847 
109479ac375Sdm199847 
110479ac375Sdm199847 idmap_stat
idmap_get_prop_ds(idmap_prop_type pr,idmap_ad_disc_ds_t * dc)1111fdeec65Sjoyce mcintosh idmap_get_prop_ds(idmap_prop_type pr, idmap_ad_disc_ds_t *dc)
112479ac375Sdm199847 {
113479ac375Sdm199847 	idmap_prop_res res;
114479ac375Sdm199847 	idmap_stat rc = IDMAP_SUCCESS;
115479ac375Sdm199847 
1161fdeec65Sjoyce mcintosh 	rc = idmap_get_prop(pr, &res);
117479ac375Sdm199847 	if (rc < 0)
118479ac375Sdm199847 		return (rc);
119479ac375Sdm199847 
120479ac375Sdm199847 	dc->port = res.value.idmap_prop_val_u.dsval.port;
121479ac375Sdm199847 	(void) strlcpy(dc->host, res.value.idmap_prop_val_u.dsval.host,
122479ac375Sdm199847 	    AD_DISC_MAXHOSTNAME);
123479ac375Sdm199847 
124479ac375Sdm199847 	/* xdr doesn't guarantee 0-termination of char[]: */
125479ac375Sdm199847 	dc->host[AD_DISC_MAXHOSTNAME - 1] = '\0';
126479ac375Sdm199847 
127479ac375Sdm199847 	return (rc);
128479ac375Sdm199847 }
129479ac375Sdm199847 
130479ac375Sdm199847 
131479ac375Sdm199847 /*
132479ac375Sdm199847  * Sometimes the property is not set. In that case, str is set to NULL but
133479ac375Sdm199847  * otherwise IDMAP_SUCCESS is returned.
134479ac375Sdm199847  */
135479ac375Sdm199847 idmap_stat
idmap_get_prop_str(idmap_prop_type pr,char ** str)1361fdeec65Sjoyce mcintosh idmap_get_prop_str(idmap_prop_type pr, char **str)
137479ac375Sdm199847 {
138479ac375Sdm199847 	idmap_prop_res res;
139479ac375Sdm199847 	idmap_stat rc = IDMAP_SUCCESS;
140479ac375Sdm199847 
1411fdeec65Sjoyce mcintosh 	rc = idmap_get_prop(pr, &res);
142479ac375Sdm199847 	if (rc < 0)
143479ac375Sdm199847 		return (rc);
144479ac375Sdm199847 
145479ac375Sdm199847 	rc = idmap_strdupnull(str, res.value.idmap_prop_val_u.utf8val);
146479ac375Sdm199847 	return (rc);
147479ac375Sdm199847 }
148c5c4113dSnw141292 
149c5c4113dSnw141292 /*
150c5c4113dSnw141292  * Create/Initialize handle for updates
151c5c4113dSnw141292  *
152c5c4113dSnw141292  * Output:
153c5c4113dSnw141292  * udthandle - update handle
154c5c4113dSnw141292  */
155c5c4113dSnw141292 idmap_stat
idmap_udt_create(idmap_udt_handle_t ** udthandle)1561fdeec65Sjoyce mcintosh idmap_udt_create(idmap_udt_handle_t **udthandle)
157cd37da74Snw141292 {
158c5c4113dSnw141292 	idmap_udt_handle_t	*tmp;
159c5c4113dSnw141292 
1601fdeec65Sjoyce mcintosh 	if (udthandle == NULL) {
161c5c4113dSnw141292 		errno = EINVAL;
162c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
163c5c4113dSnw141292 	}
164c5c4113dSnw141292 	if ((tmp = calloc(1, sizeof (*tmp))) == NULL) {
165c5c4113dSnw141292 		errno = ENOMEM;
166c5c4113dSnw141292 		return (IDMAP_ERR_MEMORY);
167c5c4113dSnw141292 	}
168c5c4113dSnw141292 
169c5c4113dSnw141292 	*udthandle = tmp;
170c5c4113dSnw141292 	return (IDMAP_SUCCESS);
171c5c4113dSnw141292 }
172c5c4113dSnw141292 
173c5c4113dSnw141292 
174c5c4113dSnw141292 /*
175c5c4113dSnw141292  * All the updates specified by the update handle are committed
176c5c4113dSnw141292  * in a single transaction. i.e either all succeed or none.
177c5c4113dSnw141292  *
178c5c4113dSnw141292  * Input:
179c5c4113dSnw141292  * udthandle - update handle with the update requests
180c5c4113dSnw141292  *
181c5c4113dSnw141292  * Return value:
182c5c4113dSnw141292  * Status of the commit
183c5c4113dSnw141292  */
184c5c4113dSnw141292 idmap_stat
idmap_udt_commit(idmap_udt_handle_t * udthandle)185cd37da74Snw141292 idmap_udt_commit(idmap_udt_handle_t *udthandle)
186cd37da74Snw141292 {
1878e228215Sdm199847 	idmap_update_res	res;
1888e228215Sdm199847 	idmap_stat		retcode;
189c5c4113dSnw141292 
190c5c4113dSnw141292 	if (udthandle == NULL) {
191c5c4113dSnw141292 		errno = EINVAL;
192c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
193c5c4113dSnw141292 	}
1948e228215Sdm199847 
1958e228215Sdm199847 	(void) memset(&res, 0, sizeof (res));
1968e228215Sdm199847 
1971fdeec65Sjoyce mcintosh 	retcode = _idmap_clnt_call(IDMAP_UPDATE,
198c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_update_batch, (caddr_t)&udthandle->batch,
1998e228215Sdm199847 	    (xdrproc_t)xdr_idmap_update_res, (caddr_t)&res,
200c5c4113dSnw141292 	    TIMEOUT);
2011fdeec65Sjoyce mcintosh 	if (retcode != IDMAP_SUCCESS)
2028e228215Sdm199847 		goto out;
203651c0131Sbaban 
2048e228215Sdm199847 	retcode = udthandle->commit_stat = res.retcode;
2058e228215Sdm199847 	udthandle->error_index = res.error_index;
2068e228215Sdm199847 
2078e228215Sdm199847 	if (retcode != IDMAP_SUCCESS) {
2088e228215Sdm199847 
2098e228215Sdm199847 		if (udthandle->error_index < 0)
2108e228215Sdm199847 			goto out;
2118e228215Sdm199847 
2128e228215Sdm199847 		retcode = idmap_namerule_cpy(&udthandle->error_rule,
2138e228215Sdm199847 		    &res.error_rule);
2148e228215Sdm199847 		if (retcode != IDMAP_SUCCESS) {
2158e228215Sdm199847 			udthandle->error_index = -2;
2168e228215Sdm199847 			goto out;
2178e228215Sdm199847 		}
2188e228215Sdm199847 
2198e228215Sdm199847 		retcode = idmap_namerule_cpy(&udthandle->conflict_rule,
2208e228215Sdm199847 		    &res.conflict_rule);
2218e228215Sdm199847 		if (retcode != IDMAP_SUCCESS) {
2228e228215Sdm199847 			udthandle->error_index = -2;
2238e228215Sdm199847 			goto out;
2248e228215Sdm199847 		}
2258e228215Sdm199847 	}
2268e228215Sdm199847 
2278e228215Sdm199847 	retcode = res.retcode;
2288e228215Sdm199847 
2298e228215Sdm199847 
2308e228215Sdm199847 out:
2318e228215Sdm199847 	/* reset handle so that it can be used again */
2328e228215Sdm199847 	if (retcode == IDMAP_SUCCESS) {
2338e228215Sdm199847 		_IDMAP_RESET_UDT_HANDLE(udthandle);
2348e228215Sdm199847 	}
2358e228215Sdm199847 
2368e228215Sdm199847 	(void) xdr_free(xdr_idmap_update_res, (caddr_t)&res);
237c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
238c5c4113dSnw141292 	return (retcode);
239c5c4113dSnw141292 }
240c5c4113dSnw141292 
241c5c4113dSnw141292 
2428e228215Sdm199847 static void
idmap_namerule_parts_clear(char ** windomain,char ** winname,char ** unixname,boolean_t * is_user,boolean_t * is_wuser,boolean_t * is_nt4,int * direction)2438e228215Sdm199847 idmap_namerule_parts_clear(char **windomain, char **winname,
244cd37da74Snw141292     char **unixname, boolean_t *is_user, boolean_t *is_wuser,
245cd37da74Snw141292     boolean_t *is_nt4, int *direction)
246cd37da74Snw141292 {
2478e228215Sdm199847 	if (windomain)
2488e228215Sdm199847 		*windomain = NULL;
2498e228215Sdm199847 	if (winname)
2508e228215Sdm199847 		*winname = NULL;
2518e228215Sdm199847 	if (unixname)
2528e228215Sdm199847 		*unixname = NULL;
2538e228215Sdm199847 
2548e228215Sdm199847 	if (is_nt4)
2558e228215Sdm199847 		*is_nt4 = 0;
2568e228215Sdm199847 	if (is_user)
2578e228215Sdm199847 		*is_user = -1;
258cd37da74Snw141292 	if (is_wuser)
259cd37da74Snw141292 		*is_wuser = -1;
2608e228215Sdm199847 	if (direction)
2618e228215Sdm199847 		*direction = IDMAP_DIRECTION_UNDEF;
2628e228215Sdm199847 }
2638e228215Sdm199847 
2648e228215Sdm199847 static idmap_stat
idmap_namerule2parts(idmap_namerule * rule,char ** windomain,char ** winname,char ** unixname,boolean_t * is_user,boolean_t * is_wuser,boolean_t * is_nt4,int * direction)2658e228215Sdm199847 idmap_namerule2parts(idmap_namerule *rule,
2668e228215Sdm199847     char **windomain, char **winname,
267cd37da74Snw141292     char **unixname, boolean_t *is_user, boolean_t *is_wuser,
268cd37da74Snw141292     boolean_t *is_nt4, int *direction)
269cd37da74Snw141292 {
2708e228215Sdm199847 	idmap_stat retcode;
2718e228215Sdm199847 
2728e228215Sdm199847 	if (EMPTY_STRING(rule->winname) && EMPTY_STRING(rule->unixname))
2738e228215Sdm199847 		return (IDMAP_ERR_NORESULT);
2748e228215Sdm199847 
2758e228215Sdm199847 
2768e228215Sdm199847 	retcode = idmap_strdupnull(windomain, rule->windomain);
2778e228215Sdm199847 	if (retcode != IDMAP_SUCCESS)
2788e228215Sdm199847 		goto errout;
2798e228215Sdm199847 
2808e228215Sdm199847 	retcode = idmap_strdupnull(winname, rule->winname);
2818e228215Sdm199847 	if (retcode != IDMAP_SUCCESS)
2828e228215Sdm199847 		goto errout;
2838e228215Sdm199847 
2848e228215Sdm199847 	retcode = idmap_strdupnull(unixname, rule->unixname);
2858e228215Sdm199847 	if (retcode != IDMAP_SUCCESS)
2868e228215Sdm199847 		goto errout;
2878e228215Sdm199847 
2888e228215Sdm199847 
2898e228215Sdm199847 	if (is_user)
2908e228215Sdm199847 		*is_user = rule->is_user;
291cd37da74Snw141292 	if (is_wuser)
292cd37da74Snw141292 		*is_wuser = rule->is_wuser;
2938e228215Sdm199847 	if (is_nt4)
2948e228215Sdm199847 		*is_nt4 = rule->is_nt4;
2958e228215Sdm199847 	if (direction)
2968e228215Sdm199847 		*direction = rule->direction;
2978e228215Sdm199847 
2988e228215Sdm199847 
2998e228215Sdm199847 	return (IDMAP_SUCCESS);
3008e228215Sdm199847 
3018e228215Sdm199847 errout:
3028e228215Sdm199847 	if (windomain && *windomain)
3038e228215Sdm199847 		free(*windomain);
3048e228215Sdm199847 	if (winname && *winname)
3058e228215Sdm199847 		free(*winname);
3068e228215Sdm199847 	if (unixname && *unixname)
3078e228215Sdm199847 		free(*unixname);
3088e228215Sdm199847 
3098e228215Sdm199847 	idmap_namerule_parts_clear(windomain, winname,
310cd37da74Snw141292 	    unixname, is_user, is_wuser, is_nt4, direction);
3118e228215Sdm199847 
3128e228215Sdm199847 	return (retcode);
3138e228215Sdm199847 
3148e228215Sdm199847 }
3158e228215Sdm199847 
3168e228215Sdm199847 /*
3178e228215Sdm199847  * Retrieve the index of the failed batch element. error_index == -1
3188e228215Sdm199847  * indicates failure at the beginning, -2 at the end.
3198e228215Sdm199847  *
3208e228215Sdm199847  * If idmap_udt_commit didn't return error, the returned value is undefined.
3218e228215Sdm199847  *
3228e228215Sdm199847  * Return value:
3238e228215Sdm199847  * IDMAP_SUCCESS
3248e228215Sdm199847  */
3258e228215Sdm199847 
3268e228215Sdm199847 idmap_stat
idmap_udt_get_error_index(idmap_udt_handle_t * udthandle,int64_t * error_index)3278e228215Sdm199847 idmap_udt_get_error_index(idmap_udt_handle_t *udthandle,
328cd37da74Snw141292     int64_t *error_index)
329cd37da74Snw141292 {
3308e228215Sdm199847 	if (error_index)
3318e228215Sdm199847 		*error_index = udthandle->error_index;
3328e228215Sdm199847 
3338e228215Sdm199847 	return (IDMAP_SUCCESS);
3348e228215Sdm199847 }
3358e228215Sdm199847 
3368e228215Sdm199847 
3378e228215Sdm199847 /*
3388e228215Sdm199847  * Retrieve the rule which caused the batch to fail. If
3398e228215Sdm199847  * idmap_udt_commit didn't return error or if error_index is < 0, the
3408e228215Sdm199847  * retrieved rule is undefined.
3418e228215Sdm199847  *
3428e228215Sdm199847  * Return value:
3438e228215Sdm199847  * IDMAP_ERR_NORESULT if there is no error rule.
3448e228215Sdm199847  * IDMAP_SUCCESS if the rule was obtained OK.
3458e228215Sdm199847  * other error code (IDMAP_ERR_NOMEMORY etc)
3468e228215Sdm199847  */
3478e228215Sdm199847 
3488e228215Sdm199847 idmap_stat
idmap_udt_get_error_rule(idmap_udt_handle_t * udthandle,char ** windomain,char ** winname,char ** unixname,boolean_t * is_user,boolean_t * is_wuser,boolean_t * is_nt4,int * direction)3498e228215Sdm199847 idmap_udt_get_error_rule(idmap_udt_handle_t *udthandle,
3508e228215Sdm199847     char **windomain, char **winname,
351cd37da74Snw141292     char **unixname, boolean_t *is_user, boolean_t *is_wuser,
352cd37da74Snw141292     boolean_t *is_nt4, int *direction)
353cd37da74Snw141292 {
3548e228215Sdm199847 	idmap_namerule_parts_clear(windomain, winname,
355cd37da74Snw141292 	    unixname, is_user, is_wuser, is_nt4, direction);
3568e228215Sdm199847 
3578e228215Sdm199847 	if (udthandle->commit_stat == IDMAP_SUCCESS ||
3588e228215Sdm199847 	    udthandle->error_index < 0)
3598e228215Sdm199847 		return (IDMAP_ERR_NORESULT);
3608e228215Sdm199847 
3618e228215Sdm199847 	return (idmap_namerule2parts(
3628e228215Sdm199847 	    &udthandle->error_rule,
3638e228215Sdm199847 	    windomain,
3648e228215Sdm199847 	    winname,
3658e228215Sdm199847 	    unixname,
3668e228215Sdm199847 	    is_user,
367cd37da74Snw141292 	    is_wuser,
3688e228215Sdm199847 	    is_nt4,
3698e228215Sdm199847 	    direction));
3708e228215Sdm199847 }
3718e228215Sdm199847 
3728e228215Sdm199847 /*
3738e228215Sdm199847  * Retrieve the rule with which there was a conflict. TODO: retrieve
3748e228215Sdm199847  * the value.
3758e228215Sdm199847  *
3768e228215Sdm199847  * Return value:
3778e228215Sdm199847  * IDMAP_ERR_NORESULT if there is no error rule.
3788e228215Sdm199847  * IDMAP_SUCCESS if the rule was obtained OK.
3798e228215Sdm199847  * other error code (IDMAP_ERR_NOMEMORY etc)
3808e228215Sdm199847  */
3818e228215Sdm199847 
3828e228215Sdm199847 idmap_stat
idmap_udt_get_conflict_rule(idmap_udt_handle_t * udthandle,char ** windomain,char ** winname,char ** unixname,boolean_t * is_user,boolean_t * is_wuser,boolean_t * is_nt4,int * direction)3838e228215Sdm199847 idmap_udt_get_conflict_rule(idmap_udt_handle_t *udthandle,
3848e228215Sdm199847     char **windomain, char **winname,
385cd37da74Snw141292     char **unixname, boolean_t *is_user, boolean_t *is_wuser,
386cd37da74Snw141292     boolean_t *is_nt4, int *direction)
387cd37da74Snw141292 {
3888e228215Sdm199847 	idmap_namerule_parts_clear(windomain, winname,
389cd37da74Snw141292 	    unixname, is_user, is_wuser, is_nt4, direction);
3908e228215Sdm199847 
3918e228215Sdm199847 	if (udthandle->commit_stat != IDMAP_ERR_W2U_NAMERULE_CONFLICT &&
3928e228215Sdm199847 	    udthandle->commit_stat != IDMAP_ERR_U2W_NAMERULE_CONFLICT) {
3938e228215Sdm199847 		return (IDMAP_ERR_NORESULT);
3948e228215Sdm199847 	}
3958e228215Sdm199847 
3968e228215Sdm199847 	return (idmap_namerule2parts(
3978e228215Sdm199847 	    &udthandle->conflict_rule,
3988e228215Sdm199847 	    windomain,
3998e228215Sdm199847 	    winname,
4008e228215Sdm199847 	    unixname,
4018e228215Sdm199847 	    is_user,
402cd37da74Snw141292 	    is_wuser,
4038e228215Sdm199847 	    is_nt4,
4048e228215Sdm199847 	    direction));
4058e228215Sdm199847 }
4068e228215Sdm199847 
4078e228215Sdm199847 
408c5c4113dSnw141292 /*
409c5c4113dSnw141292  * Destroy the update handle
410c5c4113dSnw141292  */
411c5c4113dSnw141292 void
idmap_udt_destroy(idmap_udt_handle_t * udthandle)412cd37da74Snw141292 idmap_udt_destroy(idmap_udt_handle_t *udthandle)
413cd37da74Snw141292 {
414c5c4113dSnw141292 	if (udthandle == NULL)
415c5c4113dSnw141292 		return;
416c5c4113dSnw141292 	(void) xdr_free(xdr_idmap_update_batch, (caddr_t)&udthandle->batch);
4178e228215Sdm199847 	(void) xdr_free(xdr_idmap_namerule, (caddr_t)&udthandle->error_rule);
4188e228215Sdm199847 	(void) xdr_free(xdr_idmap_namerule, (caddr_t)&udthandle->conflict_rule);
419c5c4113dSnw141292 	free(udthandle);
420c5c4113dSnw141292 }
421c5c4113dSnw141292 
422c5c4113dSnw141292 
423c5c4113dSnw141292 idmap_stat
idmap_udt_add_namerule(idmap_udt_handle_t * udthandle,const char * windomain,boolean_t is_user,boolean_t is_wuser,const char * winname,const char * unixname,boolean_t is_nt4,int direction)424c5c4113dSnw141292 idmap_udt_add_namerule(idmap_udt_handle_t *udthandle, const char *windomain,
425cd37da74Snw141292     boolean_t is_user, boolean_t is_wuser, const char *winname,
426cd37da74Snw141292     const char *unixname, boolean_t is_nt4, int direction)
427cd37da74Snw141292 {
428c5c4113dSnw141292 	idmap_retcode	retcode;
429651c0131Sbaban 	idmap_namerule	*rule = NULL;
430c5c4113dSnw141292 
431651c0131Sbaban 	retcode = _udt_extend_batch(udthandle);
432c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
433c5c4113dSnw141292 		goto errout;
434c5c4113dSnw141292 
435c5c4113dSnw141292 	rule = &udthandle->batch.
436c5c4113dSnw141292 	    idmap_update_batch_val[udthandle->next].
437c5c4113dSnw141292 	    idmap_update_op_u.rule;
438c5c4113dSnw141292 	rule->is_user = is_user;
439cd37da74Snw141292 	rule->is_wuser = is_wuser;
440c5c4113dSnw141292 	rule->direction = direction;
441c5c4113dSnw141292 	rule->is_nt4 = is_nt4;
4428e228215Sdm199847 
4438e228215Sdm199847 	retcode = idmap_strdupnull(&rule->windomain, windomain);
444c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
445c5c4113dSnw141292 		goto errout;
4468e228215Sdm199847 
4478e228215Sdm199847 	retcode = idmap_strdupnull(&rule->winname, winname);
448c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
449c5c4113dSnw141292 		goto errout;
4508e228215Sdm199847 
4518e228215Sdm199847 	retcode = idmap_strdupnull(&rule->unixname, unixname);
452c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
453c5c4113dSnw141292 		goto errout;
454651c0131Sbaban 
455651c0131Sbaban 	udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
456651c0131Sbaban 	    OP_ADD_NAMERULE;
457c5c4113dSnw141292 	udthandle->next++;
458c5c4113dSnw141292 	return (IDMAP_SUCCESS);
459c5c4113dSnw141292 
460c5c4113dSnw141292 errout:
461651c0131Sbaban 	/* The batch should still be usable */
462651c0131Sbaban 	if (rule)
463651c0131Sbaban 		(void) xdr_free(xdr_idmap_namerule, (caddr_t)rule);
464c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
465c5c4113dSnw141292 	return (retcode);
466c5c4113dSnw141292 }
467c5c4113dSnw141292 
468c5c4113dSnw141292 
469c5c4113dSnw141292 /* ARGSUSED */
470c5c4113dSnw141292 idmap_stat
idmap_udt_rm_namerule(idmap_udt_handle_t * udthandle,boolean_t is_user,boolean_t is_wuser,const char * windomain,const char * winname,const char * unixname,int direction)471c5c4113dSnw141292 idmap_udt_rm_namerule(idmap_udt_handle_t *udthandle, boolean_t is_user,
472cd37da74Snw141292     boolean_t is_wuser,	const char *windomain, const char *winname,
473cd37da74Snw141292     const char *unixname, int direction)
474cd37da74Snw141292 {
475c5c4113dSnw141292 	idmap_retcode	retcode;
476651c0131Sbaban 	idmap_namerule	*rule = NULL;
477c5c4113dSnw141292 
478651c0131Sbaban 	retcode = _udt_extend_batch(udthandle);
479c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
480c5c4113dSnw141292 		goto errout;
481c5c4113dSnw141292 
482c5c4113dSnw141292 	rule = &udthandle->batch.
483c5c4113dSnw141292 	    idmap_update_batch_val[udthandle->next].
484c5c4113dSnw141292 	    idmap_update_op_u.rule;
485c5c4113dSnw141292 	rule->is_user = is_user;
486cd37da74Snw141292 	rule->is_wuser = is_wuser;
487c5c4113dSnw141292 	rule->direction = direction;
4888e228215Sdm199847 
4898e228215Sdm199847 	retcode = idmap_strdupnull(&rule->windomain, windomain);
490c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
491c5c4113dSnw141292 		goto errout;
4928e228215Sdm199847 
4938e228215Sdm199847 	retcode = idmap_strdupnull(&rule->winname, winname);
494c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
495c5c4113dSnw141292 		goto errout;
4968e228215Sdm199847 
4978e228215Sdm199847 	retcode = idmap_strdupnull(&rule->unixname, unixname);
498c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
499c5c4113dSnw141292 		goto errout;
5008e228215Sdm199847 
501651c0131Sbaban 	udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
502651c0131Sbaban 	    OP_RM_NAMERULE;
503c5c4113dSnw141292 	udthandle->next++;
504c5c4113dSnw141292 	return (IDMAP_SUCCESS);
505c5c4113dSnw141292 
506c5c4113dSnw141292 errout:
507651c0131Sbaban 	if (rule)
508651c0131Sbaban 		(void) xdr_free(xdr_idmap_namerule, (caddr_t)rule);
509c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
510c5c4113dSnw141292 	return (retcode);
511c5c4113dSnw141292 }
512c5c4113dSnw141292 
513c5c4113dSnw141292 
514c5c4113dSnw141292 /* ARGSUSED */
515c5c4113dSnw141292 idmap_stat
idmap_udt_flush_namerules(idmap_udt_handle_t * udthandle)516cd37da74Snw141292 idmap_udt_flush_namerules(idmap_udt_handle_t *udthandle)
517cd37da74Snw141292 {
518c5c4113dSnw141292 	idmap_retcode	retcode;
519c5c4113dSnw141292 
520651c0131Sbaban 	retcode = _udt_extend_batch(udthandle);
521c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
522c5c4113dSnw141292 		goto errout;
523c5c4113dSnw141292 
524651c0131Sbaban 	udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
525651c0131Sbaban 	    OP_FLUSH_NAMERULES;
526c5c4113dSnw141292 	udthandle->next++;
527c5c4113dSnw141292 	return (IDMAP_SUCCESS);
528c5c4113dSnw141292 
529c5c4113dSnw141292 errout:
530c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
531c5c4113dSnw141292 	return (retcode);
532c5c4113dSnw141292 }
533c5c4113dSnw141292 
534c5c4113dSnw141292 
535c5c4113dSnw141292 /*
536c5c4113dSnw141292  * Set the number of entries requested per batch by the iterator
537c5c4113dSnw141292  *
538c5c4113dSnw141292  * Input:
539c5c4113dSnw141292  * iter  - iterator
540c5c4113dSnw141292  * limit - number of entries requested per batch
541c5c4113dSnw141292  */
542c5c4113dSnw141292 idmap_stat
idmap_iter_set_limit(idmap_iter_t * iter,uint64_t limit)543cd37da74Snw141292 idmap_iter_set_limit(idmap_iter_t *iter, uint64_t limit)
544cd37da74Snw141292 {
545c5c4113dSnw141292 	if (iter == NULL) {
546c5c4113dSnw141292 		errno = EINVAL;
547c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
548c5c4113dSnw141292 	}
549c5c4113dSnw141292 	iter->limit = limit;
550c5c4113dSnw141292 	return (IDMAP_SUCCESS);
551c5c4113dSnw141292 }
552c5c4113dSnw141292 
553c5c4113dSnw141292 
554c5c4113dSnw141292 /*
555c5c4113dSnw141292  * Create iterator to get name-based mapping rules
556c5c4113dSnw141292  *
557c5c4113dSnw141292  * Input:
558c5c4113dSnw141292  * windomain - Windows domain
559c5c4113dSnw141292  * is_user   - user or group rules
560c5c4113dSnw141292  * winname   - Windows user or group name
561c5c4113dSnw141292  * unixname  - Unix user or group name
562c5c4113dSnw141292  *
563c5c4113dSnw141292  * Output:
564c5c4113dSnw141292  * iter - iterator
565c5c4113dSnw141292  */
566c5c4113dSnw141292 idmap_stat
idmap_iter_namerules(const char * windomain,boolean_t is_user,boolean_t is_wuser,const char * winname,const char * unixname,idmap_iter_t ** iter)5671fdeec65Sjoyce mcintosh idmap_iter_namerules(const char *windomain,
568cd37da74Snw141292 		boolean_t is_user, boolean_t is_wuser, const char *winname,
569cd37da74Snw141292 		const char *unixname, idmap_iter_t **iter)
570cd37da74Snw141292 {
571c5c4113dSnw141292 
572c5c4113dSnw141292 	idmap_iter_t			*tmpiter;
573c5c4113dSnw141292 	idmap_list_namerules_1_argument	*arg = NULL;
574c5c4113dSnw141292 	idmap_namerule			*rule;
575c5c4113dSnw141292 	idmap_retcode			retcode;
576c5c4113dSnw141292 
5771fdeec65Sjoyce mcintosh 	__ITER_CREATE(tmpiter, arg, IDMAP_LIST_NAMERULES);
578c5c4113dSnw141292 
579c5c4113dSnw141292 	rule = &arg->rule;
580c5c4113dSnw141292 	rule->is_user = is_user;
581cd37da74Snw141292 	rule->is_wuser = is_wuser;
582651c0131Sbaban 	rule->direction = IDMAP_DIRECTION_UNDEF;
5838e228215Sdm199847 
5848e228215Sdm199847 	retcode = idmap_strdupnull(&rule->windomain, windomain);
5858e228215Sdm199847 	if (retcode != IDMAP_SUCCESS)
586c5c4113dSnw141292 		goto errout;
5878e228215Sdm199847 
5888e228215Sdm199847 	retcode = idmap_strdupnull(&rule->winname, winname);
5898e228215Sdm199847 	if (retcode != IDMAP_SUCCESS)
590c5c4113dSnw141292 		goto errout;
5918e228215Sdm199847 
5928e228215Sdm199847 	retcode = idmap_strdupnull(&rule->unixname, unixname);
5938e228215Sdm199847 	if (retcode != IDMAP_SUCCESS)
594c5c4113dSnw141292 		goto errout;
595c5c4113dSnw141292 
596c5c4113dSnw141292 	*iter = tmpiter;
597c5c4113dSnw141292 	return (IDMAP_SUCCESS);
598c5c4113dSnw141292 
599c5c4113dSnw141292 errout:
600ad8ef92aSMilan Jurik 	if (arg) {
601ad8ef92aSMilan Jurik 		xdr_free(xdr_idmap_list_namerules_1_argument, (char *)arg);
602ad8ef92aSMilan Jurik 		free(arg);
603ad8ef92aSMilan Jurik 	}
604ad8ef92aSMilan Jurik 	if (tmpiter)
605ad8ef92aSMilan Jurik 		free(tmpiter);
606ad8ef92aSMilan Jurik 
607ad8ef92aSMilan Jurik 	return (retcode);
608c5c4113dSnw141292 }
609c5c4113dSnw141292 
610c5c4113dSnw141292 
611c5c4113dSnw141292 /*
612c5c4113dSnw141292  * Iterate through the name-based mapping rules
613c5c4113dSnw141292  *
614c5c4113dSnw141292  * Input:
615c5c4113dSnw141292  * iter - iterator
616c5c4113dSnw141292  *
617c5c4113dSnw141292  * Output:
618c5c4113dSnw141292  * windomain - Windows domain
619c5c4113dSnw141292  * winname   - Windows user or group name
620c5c4113dSnw141292  * unixname  - Unix user or group name
621c5c4113dSnw141292  * is_nt4    - NT4 or AD
622c5c4113dSnw141292  * direction - bi(0), win2unix(1), unix2win(2)
623c5c4113dSnw141292  *
624c5c4113dSnw141292  * Return value:
625c5c4113dSnw141292  * 0   - done
626c5c4113dSnw141292  * 1   - more results available
627c5c4113dSnw141292  * < 0 - error
628c5c4113dSnw141292  */
629c5c4113dSnw141292 idmap_stat
idmap_iter_next_namerule(idmap_iter_t * iter,char ** windomain,char ** winname,char ** unixname,boolean_t * is_user,boolean_t * is_wuser,boolean_t * is_nt4,int * direction)630c5c4113dSnw141292 idmap_iter_next_namerule(idmap_iter_t *iter, char **windomain,
631cd37da74Snw141292     char **winname, char **unixname,  boolean_t *is_user,
632cd37da74Snw141292     boolean_t *is_wuser, boolean_t *is_nt4, int *direction)
633cd37da74Snw141292 {
634c5c4113dSnw141292 	idmap_namerules_res		*namerules;
635c5c4113dSnw141292 	idmap_list_namerules_1_argument	*arg;
636c5c4113dSnw141292 	idmap_retcode			retcode;
637c5c4113dSnw141292 
638cd37da74Snw141292 	idmap_namerule_parts_clear(windomain, winname,
639cd37da74Snw141292 	    unixname, is_user, is_wuser, is_nt4, direction);
640cd37da74Snw141292 
641c5c4113dSnw141292 
642c5c4113dSnw141292 	__ITER_CHECK(iter, IDMAP_LIST_NAMERULES);
643c5c4113dSnw141292 
644c5c4113dSnw141292 	namerules = (idmap_namerules_res *)iter->retlist;
645c5c4113dSnw141292 	if (iter->retcode == IDMAP_NEXT && (namerules == NULL ||
646c5c4113dSnw141292 	    iter->next >= namerules->rules.rules_len)) {
647c5c4113dSnw141292 
648c5c4113dSnw141292 		if ((arg = iter->arg) == NULL) {
649c5c4113dSnw141292 			errno = EINVAL;
650c5c4113dSnw141292 			return (IDMAP_ERR_ARG);
651c5c4113dSnw141292 		}
652c5c4113dSnw141292 		arg->limit = iter->limit;
653c5c4113dSnw141292 
654c5c4113dSnw141292 		retcode = _iter_get_next_list(IDMAP_LIST_NAMERULES,
655c5c4113dSnw141292 		    iter, arg,
656c5c4113dSnw141292 		    (uchar_t **)&namerules, sizeof (*namerules),
657c5c4113dSnw141292 		    (xdrproc_t)xdr_idmap_list_namerules_1_argument,
658c5c4113dSnw141292 		    (xdrproc_t)xdr_idmap_namerules_res);
659c5c4113dSnw141292 		if (retcode != IDMAP_SUCCESS)
660c5c4113dSnw141292 			return (retcode);
661c5c4113dSnw141292 
662c5c4113dSnw141292 		if (IDMAP_ERROR(namerules->retcode)) {
663c5c4113dSnw141292 			retcode  = namerules->retcode;
664c5c4113dSnw141292 			xdr_free(xdr_idmap_namerules_res, (caddr_t)namerules);
665c5c4113dSnw141292 			free(namerules);
666c5c4113dSnw141292 			iter->retlist = NULL;
667c5c4113dSnw141292 			return (retcode);
668c5c4113dSnw141292 		}
669c5c4113dSnw141292 		iter->retcode = namerules->retcode;
670c5c4113dSnw141292 		arg->lastrowid = namerules->lastrowid;
671c5c4113dSnw141292 	}
672c5c4113dSnw141292 
673c5c4113dSnw141292 	if (namerules == NULL || namerules->rules.rules_len == 0)
674c5c4113dSnw141292 		return (IDMAP_SUCCESS);
675c5c4113dSnw141292 
676c5c4113dSnw141292 	if (iter->next >= namerules->rules.rules_len) {
677c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
678c5c4113dSnw141292 	}
679c5c4113dSnw141292 
6808e228215Sdm199847 	retcode = idmap_strdupnull(windomain,
6818e228215Sdm199847 	    namerules->rules.rules_val[iter->next].windomain);
682c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
683c5c4113dSnw141292 		goto errout;
6848e228215Sdm199847 
6858e228215Sdm199847 	retcode = idmap_strdupnull(winname,
6868e228215Sdm199847 	    namerules->rules.rules_val[iter->next].winname);
687c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
688c5c4113dSnw141292 		goto errout;
6898e228215Sdm199847 
6908e228215Sdm199847 	retcode = idmap_strdupnull(unixname,
6918e228215Sdm199847 	    namerules->rules.rules_val[iter->next].unixname);
692c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
693c5c4113dSnw141292 		goto errout;
6948e228215Sdm199847 
695c5c4113dSnw141292 	if (is_nt4)
696c5c4113dSnw141292 		*is_nt4 = namerules->rules.rules_val[iter->next].is_nt4;
697cd37da74Snw141292 	if (is_user)
698cd37da74Snw141292 		*is_user = namerules->rules.rules_val[iter->next].is_user;
699cd37da74Snw141292 	if (is_wuser)
700cd37da74Snw141292 		*is_wuser = namerules->rules.rules_val[iter->next].is_wuser;
701c5c4113dSnw141292 	if (direction)
702c5c4113dSnw141292 		*direction = namerules->rules.rules_val[iter->next].direction;
703c5c4113dSnw141292 	iter->next++;
704c5c4113dSnw141292 
705c5c4113dSnw141292 	if (iter->next == namerules->rules.rules_len)
706c5c4113dSnw141292 		return (iter->retcode);
707c5c4113dSnw141292 	else
708c5c4113dSnw141292 		return (IDMAP_NEXT);
709c5c4113dSnw141292 
710c5c4113dSnw141292 errout:
711c5c4113dSnw141292 	if (windomain && *windomain)
712c5c4113dSnw141292 		free(*windomain);
713c5c4113dSnw141292 	if (winname && *winname)
714c5c4113dSnw141292 		free(*winname);
715c5c4113dSnw141292 	if (unixname && *unixname)
716c5c4113dSnw141292 		free(*unixname);
717c5c4113dSnw141292 	return (retcode);
718c5c4113dSnw141292 }
719c5c4113dSnw141292 
720c5c4113dSnw141292 
721c5c4113dSnw141292 /*
722c5c4113dSnw141292  * Create iterator to get SID to UID/GID mappings
723c5c4113dSnw141292  *
724c5c4113dSnw141292  * Output:
725c5c4113dSnw141292  * iter - iterator
726c5c4113dSnw141292  */
727c5c4113dSnw141292 idmap_stat
idmap_iter_mappings(idmap_iter_t ** iter,int flag)7281fdeec65Sjoyce mcintosh idmap_iter_mappings(idmap_iter_t **iter, int flag)
729cd37da74Snw141292 {
730c5c4113dSnw141292 	idmap_iter_t			*tmpiter;
731c5c4113dSnw141292 	idmap_list_mappings_1_argument	*arg = NULL;
732c5c4113dSnw141292 
7331fdeec65Sjoyce mcintosh 	__ITER_CREATE(tmpiter, arg, IDMAP_LIST_MAPPINGS);
734c5c4113dSnw141292 
73548258c6bSjp151216 	arg->flag = flag;
736c5c4113dSnw141292 	*iter = tmpiter;
737c5c4113dSnw141292 	return (IDMAP_SUCCESS);
738c5c4113dSnw141292 }
739c5c4113dSnw141292 
740c5c4113dSnw141292 
741c5c4113dSnw141292 /*
742c5c4113dSnw141292  * Iterate through the SID to UID/GID mappings
743c5c4113dSnw141292  *
744c5c4113dSnw141292  * Input:
745c5c4113dSnw141292  * iter - iterator
746c5c4113dSnw141292  *
747c5c4113dSnw141292  * Output:
748c5c4113dSnw141292  * sid - SID in canonical form
749c5c4113dSnw141292  * pid - UID or GID
750c5c4113dSnw141292  *
751c5c4113dSnw141292  * Return value:
752c5c4113dSnw141292  * 0   - done
753c5c4113dSnw141292  * 1   - more results available
754c5c4113dSnw141292  * < 0 - error
755c5c4113dSnw141292  */
756c5c4113dSnw141292 idmap_stat
idmap_iter_next_mapping(idmap_iter_t * iter,char ** sidprefix,idmap_rid_t * rid,uid_t * pid,char ** winname,char ** windomain,char ** unixname,boolean_t * is_user,boolean_t * is_wuser,int * direction,idmap_info * info)757c5c4113dSnw141292 idmap_iter_next_mapping(idmap_iter_t *iter, char **sidprefix,
758c5c4113dSnw141292     idmap_rid_t *rid, uid_t *pid, char **winname,
759cd37da74Snw141292     char **windomain, char **unixname, boolean_t *is_user,
76048258c6bSjp151216     boolean_t *is_wuser, int *direction, idmap_info *info)
761cd37da74Snw141292 {
762c5c4113dSnw141292 	idmap_mappings_res		*mappings;
763c5c4113dSnw141292 	idmap_list_mappings_1_argument	*arg;
764c5c4113dSnw141292 	idmap_retcode			retcode;
765c5c4113dSnw141292 	char				*str;
766c5c4113dSnw141292 
767c5c4113dSnw141292 	if (sidprefix)
768c5c4113dSnw141292 		*sidprefix = NULL;
769c5c4113dSnw141292 	if (rid)
770c5c4113dSnw141292 		*rid = UINT32_MAX;
771c5c4113dSnw141292 	if (winname)
772c5c4113dSnw141292 		*winname = NULL;
773c5c4113dSnw141292 	if (windomain)
774c5c4113dSnw141292 		*windomain = NULL;
775c5c4113dSnw141292 	if (unixname)
776c5c4113dSnw141292 		*unixname = NULL;
777c5c4113dSnw141292 	if (pid)
778c5c4113dSnw141292 		*pid = UINT32_MAX;
779cd37da74Snw141292 	if (is_user)
780cd37da74Snw141292 		*is_user = -1;
781cd37da74Snw141292 	if (is_wuser)
782cd37da74Snw141292 		*is_wuser = -1;
783c5c4113dSnw141292 	if (direction)
784651c0131Sbaban 		*direction = IDMAP_DIRECTION_UNDEF;
785c5c4113dSnw141292 
786c5c4113dSnw141292 	__ITER_CHECK(iter, IDMAP_LIST_MAPPINGS);
787c5c4113dSnw141292 
788c5c4113dSnw141292 	mappings = (idmap_mappings_res *)iter->retlist;
789c5c4113dSnw141292 	if (iter->retcode == IDMAP_NEXT && (mappings == NULL ||
790c5c4113dSnw141292 	    iter->next >= mappings->mappings.mappings_len)) {
791c5c4113dSnw141292 
792c5c4113dSnw141292 		if ((arg = iter->arg) == NULL) {
793c5c4113dSnw141292 			errno = EINVAL;
794c5c4113dSnw141292 			return (IDMAP_ERR_ARG);
795c5c4113dSnw141292 		}
796c5c4113dSnw141292 		arg->limit = iter->limit;
797c5c4113dSnw141292 
798c5c4113dSnw141292 		retcode = _iter_get_next_list(IDMAP_LIST_MAPPINGS,
799c5c4113dSnw141292 		    iter, arg,
800c5c4113dSnw141292 		    (uchar_t **)&mappings, sizeof (*mappings),
801c5c4113dSnw141292 		    (xdrproc_t)xdr_idmap_list_mappings_1_argument,
802c5c4113dSnw141292 		    (xdrproc_t)xdr_idmap_mappings_res);
803c5c4113dSnw141292 		if (retcode != IDMAP_SUCCESS)
804c5c4113dSnw141292 			return (retcode);
805c5c4113dSnw141292 
806c5c4113dSnw141292 		if (IDMAP_ERROR(mappings->retcode)) {
807c5c4113dSnw141292 			retcode  = mappings->retcode;
808c5c4113dSnw141292 			xdr_free(xdr_idmap_mappings_res, (caddr_t)mappings);
809c5c4113dSnw141292 			free(mappings);
810c5c4113dSnw141292 			iter->retlist = NULL;
811c5c4113dSnw141292 			return (retcode);
812c5c4113dSnw141292 		}
813c5c4113dSnw141292 		iter->retcode = mappings->retcode;
814c5c4113dSnw141292 		arg->lastrowid = mappings->lastrowid;
815c5c4113dSnw141292 	}
816c5c4113dSnw141292 
817c5c4113dSnw141292 	if (mappings == NULL || mappings->mappings.mappings_len == 0)
818c5c4113dSnw141292 		return (IDMAP_SUCCESS);
819c5c4113dSnw141292 
820c5c4113dSnw141292 	if (iter->next >= mappings->mappings.mappings_len) {
821c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
822c5c4113dSnw141292 	}
823c5c4113dSnw141292 
824c5c4113dSnw141292 	if (sidprefix) {
825c5c4113dSnw141292 		str = mappings->mappings.mappings_val[iter->next].id1.
826c5c4113dSnw141292 		    idmap_id_u.sid.prefix;
8278edda628Sbaban 		if (str && *str != '\0') {
828c5c4113dSnw141292 			*sidprefix = strdup(str);
829c5c4113dSnw141292 			if (*sidprefix == NULL) {
830c5c4113dSnw141292 				retcode = IDMAP_ERR_MEMORY;
831c5c4113dSnw141292 				goto errout;
832c5c4113dSnw141292 			}
833c5c4113dSnw141292 		}
8349581d9f4Sbaban 	}
835c5c4113dSnw141292 	if (rid)
836c5c4113dSnw141292 		*rid = mappings->mappings.mappings_val[iter->next].id1.
837c5c4113dSnw141292 		    idmap_id_u.sid.rid;
8388e228215Sdm199847 
8398e228215Sdm199847 	retcode = idmap_strdupnull(windomain,
8408e228215Sdm199847 	    mappings->mappings.mappings_val[iter->next].id1domain);
841c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
842c5c4113dSnw141292 		goto errout;
8438e228215Sdm199847 
8448e228215Sdm199847 	retcode = idmap_strdupnull(winname,
8458e228215Sdm199847 	    mappings->mappings.mappings_val[iter->next].id1name);
846c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
847c5c4113dSnw141292 		goto errout;
8488e228215Sdm199847 
8498e228215Sdm199847 	retcode = idmap_strdupnull(unixname,
8508e228215Sdm199847 	    mappings->mappings.mappings_val[iter->next].id2name);
851c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
852c5c4113dSnw141292 		goto errout;
8538e228215Sdm199847 
8548e228215Sdm199847 
855c5c4113dSnw141292 	if (pid)
856c5c4113dSnw141292 		*pid = mappings->mappings.mappings_val[iter->next].id2.
857c5c4113dSnw141292 		    idmap_id_u.uid;
858c5c4113dSnw141292 	if (direction)
859c5c4113dSnw141292 		*direction = mappings->mappings.mappings_val[iter->next].
860c5c4113dSnw141292 		    direction;
861cd37da74Snw141292 	if (is_user)
862cd37da74Snw141292 		*is_user = (mappings->mappings.mappings_val[iter->next].id2
863cd37da74Snw141292 		    .idtype == IDMAP_UID)?1:0;
864cd37da74Snw141292 	if (is_wuser)
865cd37da74Snw141292 		*is_wuser = (mappings->mappings.mappings_val[iter->next].id1
866cd37da74Snw141292 		    .idtype == IDMAP_USID)?1:0;
867cd37da74Snw141292 
86848258c6bSjp151216 	if (info) {
869148c5f43SAlan Wright 		idmap_info_mov(info,
87048258c6bSjp151216 		    &mappings->mappings.mappings_val[iter->next].info);
87148258c6bSjp151216 	}
872c5c4113dSnw141292 	iter->next++;
873c5c4113dSnw141292 
874c5c4113dSnw141292 	if (iter->next == mappings->mappings.mappings_len)
875c5c4113dSnw141292 		return (iter->retcode);
876c5c4113dSnw141292 	else
877c5c4113dSnw141292 		return (IDMAP_NEXT);
878c5c4113dSnw141292 
879c5c4113dSnw141292 errout:
880c5c4113dSnw141292 	if (sidprefix && *sidprefix)
881c5c4113dSnw141292 		free(*sidprefix);
882c5c4113dSnw141292 	if (winname && *winname)
883c5c4113dSnw141292 		free(*winname);
884c5c4113dSnw141292 	if (windomain && *windomain)
885c5c4113dSnw141292 		free(*windomain);
886c5c4113dSnw141292 	if (unixname && *unixname)
887c5c4113dSnw141292 		free(*unixname);
888c5c4113dSnw141292 	return (retcode);
889c5c4113dSnw141292 }
890c5c4113dSnw141292 
891c5c4113dSnw141292 
892c5c4113dSnw141292 /*
893c5c4113dSnw141292  * Destroy the iterator
894c5c4113dSnw141292  */
895c5c4113dSnw141292 void
idmap_iter_destroy(idmap_iter_t * iter)896cd37da74Snw141292 idmap_iter_destroy(idmap_iter_t *iter)
897cd37da74Snw141292 {
898c5c4113dSnw141292 	xdrproc_t _xdr_argument, _xdr_result;
899c5c4113dSnw141292 
900c5c4113dSnw141292 	if (iter == NULL)
901c5c4113dSnw141292 		return;
902c5c4113dSnw141292 
903c5c4113dSnw141292 	switch (iter->type) {
904c5c4113dSnw141292 	case IDMAP_LIST_NAMERULES:
905c5c4113dSnw141292 		_xdr_argument = (xdrproc_t)xdr_idmap_list_namerules_1_argument;
906c5c4113dSnw141292 		_xdr_result = (xdrproc_t)xdr_idmap_namerules_res;
907c5c4113dSnw141292 		break;
908c5c4113dSnw141292 	case IDMAP_LIST_MAPPINGS:
909c5c4113dSnw141292 		_xdr_argument = (xdrproc_t)xdr_idmap_list_mappings_1_argument;
910c5c4113dSnw141292 		_xdr_result = (xdrproc_t)xdr_idmap_mappings_res;
911c5c4113dSnw141292 		break;
912c5c4113dSnw141292 	default:
913c5c4113dSnw141292 		free(iter);
914c5c4113dSnw141292 		return;
915c5c4113dSnw141292 	};
916c5c4113dSnw141292 
917c5c4113dSnw141292 	if (iter->arg) {
918c5c4113dSnw141292 		xdr_free(_xdr_argument, (caddr_t)iter->arg);
919c5c4113dSnw141292 		free(iter->arg);
920c5c4113dSnw141292 	}
921c5c4113dSnw141292 	if (iter->retlist) {
922c5c4113dSnw141292 		xdr_free(_xdr_result, (caddr_t)iter->retlist);
923c5c4113dSnw141292 		free(iter->retlist);
924c5c4113dSnw141292 	}
925c5c4113dSnw141292 	free(iter);
926c5c4113dSnw141292 }
927c5c4113dSnw141292 
928c5c4113dSnw141292 
929c5c4113dSnw141292 /*
930c5c4113dSnw141292  * Create handle to get SID to UID/GID mapping entries
931c5c4113dSnw141292  *
932c5c4113dSnw141292  * Input:
933c5c4113dSnw141292  * gh - "get mapping" handle
934c5c4113dSnw141292  */
935c5c4113dSnw141292 idmap_stat
idmap_get_create(idmap_get_handle_t ** gh)9361fdeec65Sjoyce mcintosh idmap_get_create(idmap_get_handle_t **gh)
937cd37da74Snw141292 {
938c5c4113dSnw141292 	idmap_get_handle_t	*tmp;
939c5c4113dSnw141292 
940c5c4113dSnw141292 	/* allocate the handle */
941c5c4113dSnw141292 	if ((tmp = calloc(1, sizeof (*tmp))) == NULL) {
942c5c4113dSnw141292 		errno = ENOMEM;
943c5c4113dSnw141292 		return (IDMAP_ERR_MEMORY);
944c5c4113dSnw141292 	}
945c5c4113dSnw141292 
946c5c4113dSnw141292 	*gh = tmp;
947c5c4113dSnw141292 	return (IDMAP_SUCCESS);
948c5c4113dSnw141292 }
949c5c4113dSnw141292 
950c5c4113dSnw141292 
951c5c4113dSnw141292 /*
952c5c4113dSnw141292  * Given SID, get UID
953c5c4113dSnw141292  *
954c5c4113dSnw141292  * Input:
955c5c4113dSnw141292  * sidprefix  - SID prefix
956c5c4113dSnw141292  * rid        - RID
957c5c4113dSnw141292  * flag       - flag
958c5c4113dSnw141292  *
959c5c4113dSnw141292  * Output:
960c5c4113dSnw141292  * stat - status of the get request
961c5c4113dSnw141292  * uid  - POSIX UID if stat = 0
962c5c4113dSnw141292  *
963c5c4113dSnw141292  * Note: The output parameters will be set by idmap_get_mappings()
964c5c4113dSnw141292  */
965c5c4113dSnw141292 idmap_stat
idmap_get_uidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,uid_t * uid,idmap_stat * stat)966c5c4113dSnw141292 idmap_get_uidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
967cd37da74Snw141292 		int flag, uid_t *uid, idmap_stat *stat)
968cd37da74Snw141292 {
96948258c6bSjp151216 	return (idmap_getext_uidbysid(gh, sidprefix, rid, flag, uid,
97048258c6bSjp151216 	    NULL, stat));
97148258c6bSjp151216 }
972c5c4113dSnw141292 
97348258c6bSjp151216 /*
97448258c6bSjp151216  * Given SID, get UID
97548258c6bSjp151216  *
97648258c6bSjp151216  * Input:
97748258c6bSjp151216  * sidprefix  - SID prefix
97848258c6bSjp151216  * rid        - RID
97948258c6bSjp151216  * flag       - flag
98048258c6bSjp151216  *
98148258c6bSjp151216  * Output:
98248258c6bSjp151216  * stat - status of the get request
98348258c6bSjp151216  * uid  - POSIX UID if stat = 0
98448258c6bSjp151216  * how  - mapping type if stat = 0
98548258c6bSjp151216  *
98648258c6bSjp151216  * Note: The output parameters will be set by idmap_get_mappings()
98748258c6bSjp151216  */
98848258c6bSjp151216 
98948258c6bSjp151216 idmap_stat
idmap_getext_uidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,uid_t * uid,idmap_info * info,idmap_stat * stat)99048258c6bSjp151216 idmap_getext_uidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
99148258c6bSjp151216 		int flag, uid_t *uid, idmap_info *info, idmap_stat *stat)
99248258c6bSjp151216 {
993c5c4113dSnw141292 	idmap_retcode	retcode;
994651c0131Sbaban 	idmap_mapping	*mapping = NULL;
995c5c4113dSnw141292 
996c5c4113dSnw141292 	/* sanity checks */
997c5c4113dSnw141292 	if (gh == NULL)
998c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
999c5c4113dSnw141292 	if (uid == NULL || sidprefix == NULL)
1000c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1001c5c4113dSnw141292 
10023ee87bcaSJulian Pullen 	if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
10033ee87bcaSJulian Pullen 	    !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
10043ee87bcaSJulian Pullen 		retcode = idmap_cache_lookup_uidbysid(sidprefix, rid, uid);
10053ee87bcaSJulian Pullen 		if (retcode  == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
10063ee87bcaSJulian Pullen 			*stat = retcode;
10073ee87bcaSJulian Pullen 			return (retcode);
10083ee87bcaSJulian Pullen 		}
10093ee87bcaSJulian Pullen 	}
10103ee87bcaSJulian Pullen 
1011c5c4113dSnw141292 	/* Extend the request array and the return list */
1012c5c4113dSnw141292 	if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
1013c5c4113dSnw141292 		goto errout;
1014c5c4113dSnw141292 
1015c5c4113dSnw141292 	/* Setup the request */
1016c5c4113dSnw141292 	mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
1017c5c4113dSnw141292 	mapping->flag = flag;
1018c5c4113dSnw141292 	mapping->id1.idtype = IDMAP_SID;
1019c5c4113dSnw141292 	mapping->id1.idmap_id_u.sid.rid = rid;
1020c5c4113dSnw141292 	if ((mapping->id1.idmap_id_u.sid.prefix = strdup(sidprefix)) == NULL) {
1021c5c4113dSnw141292 		retcode = IDMAP_ERR_MEMORY;
1022c5c4113dSnw141292 		goto errout;
1023c5c4113dSnw141292 	}
1024c5c4113dSnw141292 	mapping->id2.idtype = IDMAP_UID;
1025c5c4113dSnw141292 
1026c5c4113dSnw141292 	/* Setup pointers for the result */
1027c5c4113dSnw141292 	gh->retlist[gh->next].idtype = IDMAP_UID;
1028c5c4113dSnw141292 	gh->retlist[gh->next].uid = uid;
1029c5c4113dSnw141292 	gh->retlist[gh->next].stat = stat;
103048258c6bSjp151216 	gh->retlist[gh->next].info = info;
10313ee87bcaSJulian Pullen 	gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
1032c5c4113dSnw141292 
1033c5c4113dSnw141292 	gh->next++;
1034c5c4113dSnw141292 	return (IDMAP_SUCCESS);
1035c5c4113dSnw141292 
1036c5c4113dSnw141292 errout:
1037651c0131Sbaban 	/* Batch created so far should still be usable */
1038651c0131Sbaban 	if (mapping)
1039651c0131Sbaban 		(void) memset(mapping, 0, sizeof (*mapping));
1040c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
1041c5c4113dSnw141292 	return (retcode);
1042c5c4113dSnw141292 }
1043c5c4113dSnw141292 
1044c5c4113dSnw141292 
1045c5c4113dSnw141292 /*
1046c5c4113dSnw141292  * Given SID, get GID
1047c5c4113dSnw141292  *
1048c5c4113dSnw141292  * Input:
1049c5c4113dSnw141292  * sidprefix  - SID prefix
1050c5c4113dSnw141292  * rid        - rid
1051c5c4113dSnw141292  * flag       - flag
1052c5c4113dSnw141292  *
1053c5c4113dSnw141292  * Output:
1054c5c4113dSnw141292  * stat - status of the get request
1055c5c4113dSnw141292  * gid  - POSIX GID if stat = 0
1056c5c4113dSnw141292  *
1057c5c4113dSnw141292  * Note: The output parameters will be set by idmap_get_mappings()
1058c5c4113dSnw141292  */
1059c5c4113dSnw141292 idmap_stat
idmap_get_gidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,gid_t * gid,idmap_stat * stat)1060c5c4113dSnw141292 idmap_get_gidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
1061cd37da74Snw141292 		int flag, gid_t *gid, idmap_stat *stat)
1062cd37da74Snw141292 {
106348258c6bSjp151216 	return (idmap_getext_gidbysid(gh, sidprefix, rid, flag, gid,
106448258c6bSjp151216 	    NULL, stat));
106548258c6bSjp151216 }
106648258c6bSjp151216 
106748258c6bSjp151216 
106848258c6bSjp151216 /*
106948258c6bSjp151216  * Given SID, get GID
107048258c6bSjp151216  *
107148258c6bSjp151216  * Input:
107248258c6bSjp151216  * sidprefix  - SID prefix
107348258c6bSjp151216  * rid        - rid
107448258c6bSjp151216  * flag       - flag
107548258c6bSjp151216  *
107648258c6bSjp151216  * Output:
107748258c6bSjp151216  * stat - status of the get request
107848258c6bSjp151216  * gid  - POSIX GID if stat = 0
107948258c6bSjp151216  * how  - mapping type if stat = 0
108048258c6bSjp151216  *
108148258c6bSjp151216  * Note: The output parameters will be set by idmap_get_mappings()
108248258c6bSjp151216  */
108348258c6bSjp151216 idmap_stat
idmap_getext_gidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,gid_t * gid,idmap_info * info,idmap_stat * stat)108448258c6bSjp151216 idmap_getext_gidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
108548258c6bSjp151216 		int flag, gid_t *gid, idmap_info *info, idmap_stat *stat)
108648258c6bSjp151216 {
1087c5c4113dSnw141292 
1088c5c4113dSnw141292 	idmap_retcode	retcode;
1089651c0131Sbaban 	idmap_mapping	*mapping = NULL;
1090c5c4113dSnw141292 
1091c5c4113dSnw141292 	/* sanity checks */
1092c5c4113dSnw141292 	if (gh == NULL)
1093c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1094c5c4113dSnw141292 	if (gid == NULL || sidprefix == NULL)
1095c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1096c5c4113dSnw141292 
10973ee87bcaSJulian Pullen 	if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
10983ee87bcaSJulian Pullen 	    !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
10993ee87bcaSJulian Pullen 		retcode = idmap_cache_lookup_gidbysid(sidprefix, rid, gid);
11003ee87bcaSJulian Pullen 		if (retcode == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
11013ee87bcaSJulian Pullen 			*stat = retcode;
11023ee87bcaSJulian Pullen 			return (retcode);
11033ee87bcaSJulian Pullen 		}
11043ee87bcaSJulian Pullen 	}
11053ee87bcaSJulian Pullen 
1106c5c4113dSnw141292 	/* Extend the request array and the return list */
1107c5c4113dSnw141292 	if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
1108c5c4113dSnw141292 		goto errout;
1109c5c4113dSnw141292 
1110c5c4113dSnw141292 	/* Setup the request */
1111c5c4113dSnw141292 	mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
1112c5c4113dSnw141292 	mapping->flag = flag;
1113c5c4113dSnw141292 	mapping->id1.idtype = IDMAP_SID;
1114c5c4113dSnw141292 	mapping->id1.idmap_id_u.sid.rid = rid;
1115c5c4113dSnw141292 	if ((mapping->id1.idmap_id_u.sid.prefix = strdup(sidprefix)) == NULL) {
1116c5c4113dSnw141292 		retcode = IDMAP_ERR_MEMORY;
1117c5c4113dSnw141292 		goto errout;
1118c5c4113dSnw141292 	}
1119c5c4113dSnw141292 	mapping->id2.idtype = IDMAP_GID;
1120c5c4113dSnw141292 
1121c5c4113dSnw141292 	/* Setup pointers for the result */
1122c5c4113dSnw141292 	gh->retlist[gh->next].idtype = IDMAP_GID;
1123c5c4113dSnw141292 	gh->retlist[gh->next].gid = gid;
1124c5c4113dSnw141292 	gh->retlist[gh->next].stat = stat;
112548258c6bSjp151216 	gh->retlist[gh->next].info = info;
11263ee87bcaSJulian Pullen 	gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
1127c5c4113dSnw141292 
1128c5c4113dSnw141292 	gh->next++;
1129c5c4113dSnw141292 	return (IDMAP_SUCCESS);
1130c5c4113dSnw141292 
1131c5c4113dSnw141292 errout:
1132651c0131Sbaban 	if (mapping)
1133651c0131Sbaban 		(void) memset(mapping, 0, sizeof (*mapping));
1134c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
1135c5c4113dSnw141292 	return (retcode);
1136c5c4113dSnw141292 }
1137c5c4113dSnw141292 
1138c5c4113dSnw141292 
113948258c6bSjp151216 
1140c5c4113dSnw141292 /*
1141c5c4113dSnw141292  * Given SID, get POSIX ID i.e. UID/GID
1142c5c4113dSnw141292  *
1143c5c4113dSnw141292  * Input:
1144c5c4113dSnw141292  * sidprefix  - SID prefix
1145c5c4113dSnw141292  * rid        - rid
1146c5c4113dSnw141292  * flag       - flag
1147c5c4113dSnw141292  *
1148c5c4113dSnw141292  * Output:
1149c5c4113dSnw141292  * stat    - status of the get request
1150c5c4113dSnw141292  * is_user - user or group
1151c5c4113dSnw141292  * pid     - POSIX UID if stat = 0 and is_user = 1
1152c5c4113dSnw141292  *           POSIX GID if stat = 0 and is_user = 0
1153c5c4113dSnw141292  *
1154c5c4113dSnw141292  * Note: The output parameters will be set by idmap_get_mappings()
1155c5c4113dSnw141292  */
1156c5c4113dSnw141292 idmap_stat
idmap_get_pidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,uid_t * pid,int * is_user,idmap_stat * stat)1157c5c4113dSnw141292 idmap_get_pidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
1158cd37da74Snw141292 		int flag, uid_t *pid, int *is_user, idmap_stat *stat)
1159cd37da74Snw141292 {
116048258c6bSjp151216 	return (idmap_getext_pidbysid(gh, sidprefix, rid, flag, pid, is_user,
116148258c6bSjp151216 	    NULL, stat));
116248258c6bSjp151216 }
116348258c6bSjp151216 
116448258c6bSjp151216 
116548258c6bSjp151216 
116648258c6bSjp151216 /*
116748258c6bSjp151216  * Given SID, get POSIX ID i.e. UID/GID
116848258c6bSjp151216  *
116948258c6bSjp151216  * Input:
117048258c6bSjp151216  * sidprefix  - SID prefix
117148258c6bSjp151216  * rid        - rid
117248258c6bSjp151216  * flag       - flag
117348258c6bSjp151216  *
117448258c6bSjp151216  * Output:
117548258c6bSjp151216  * stat    - status of the get request
117648258c6bSjp151216  * is_user - user or group
117748258c6bSjp151216  * pid     - POSIX UID if stat = 0 and is_user = 1
117848258c6bSjp151216  *           POSIX GID if stat = 0 and is_user = 0
117948258c6bSjp151216  * how     - mapping type if stat = 0
118048258c6bSjp151216  *
118148258c6bSjp151216  * Note: The output parameters will be set by idmap_get_mappings()
118248258c6bSjp151216  */
118348258c6bSjp151216 idmap_stat
idmap_getext_pidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,uid_t * pid,int * is_user,idmap_info * info,idmap_stat * stat)118448258c6bSjp151216 idmap_getext_pidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
118548258c6bSjp151216 	int flag, uid_t *pid, int *is_user, idmap_info *info, idmap_stat *stat)
118648258c6bSjp151216 {
1187c5c4113dSnw141292 	idmap_retcode	retcode;
1188651c0131Sbaban 	idmap_mapping	*mapping = NULL;
1189c5c4113dSnw141292 
1190c5c4113dSnw141292 	/* sanity checks */
1191c5c4113dSnw141292 	if (gh == NULL)
1192c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1193c5c4113dSnw141292 	if (pid == NULL || sidprefix == NULL || is_user == NULL)
1194c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1195c5c4113dSnw141292 
11963ee87bcaSJulian Pullen 	if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
11973ee87bcaSJulian Pullen 	    !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
11983ee87bcaSJulian Pullen 		retcode = idmap_cache_lookup_pidbysid(sidprefix, rid, pid,
11993ee87bcaSJulian Pullen 		    is_user);
12003ee87bcaSJulian Pullen 		if (retcode  == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
12013ee87bcaSJulian Pullen 			*stat = retcode;
12023ee87bcaSJulian Pullen 			return (retcode);
12033ee87bcaSJulian Pullen 		}
12043ee87bcaSJulian Pullen 	}
12053ee87bcaSJulian Pullen 
1206c5c4113dSnw141292 	/* Extend the request array and the return list */
1207c5c4113dSnw141292 	if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
1208c5c4113dSnw141292 		goto errout;
1209c5c4113dSnw141292 
1210c5c4113dSnw141292 	/* Setup the request */
1211c5c4113dSnw141292 	mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
1212c5c4113dSnw141292 	mapping->flag = flag;
1213c5c4113dSnw141292 	mapping->id1.idtype = IDMAP_SID;
1214c5c4113dSnw141292 	mapping->id1.idmap_id_u.sid.rid = rid;
1215c5c4113dSnw141292 	if ((mapping->id1.idmap_id_u.sid.prefix = strdup(sidprefix)) == NULL) {
1216c5c4113dSnw141292 		retcode = IDMAP_ERR_MEMORY;
1217c5c4113dSnw141292 		goto errout;
1218c5c4113dSnw141292 	}
1219c5c4113dSnw141292 	mapping->id2.idtype = IDMAP_POSIXID;
1220c5c4113dSnw141292 
1221c5c4113dSnw141292 	/* Setup pointers for the result */
1222c5c4113dSnw141292 	gh->retlist[gh->next].idtype = IDMAP_POSIXID;
1223c5c4113dSnw141292 	gh->retlist[gh->next].uid = pid;
1224c5c4113dSnw141292 	gh->retlist[gh->next].gid = pid;
1225c5c4113dSnw141292 	gh->retlist[gh->next].is_user = is_user;
1226c5c4113dSnw141292 	gh->retlist[gh->next].stat = stat;
122748258c6bSjp151216 	gh->retlist[gh->next].info = info;
12283ee87bcaSJulian Pullen 	gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
1229c5c4113dSnw141292 
1230c5c4113dSnw141292 	gh->next++;
1231c5c4113dSnw141292 	return (IDMAP_SUCCESS);
1232c5c4113dSnw141292 
1233c5c4113dSnw141292 errout:
1234651c0131Sbaban 	if (mapping)
1235651c0131Sbaban 		(void) memset(mapping, 0, sizeof (*mapping));
1236c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
1237c5c4113dSnw141292 	return (retcode);
1238c5c4113dSnw141292 }
1239c5c4113dSnw141292 
1240c5c4113dSnw141292 
1241c5c4113dSnw141292 /*
1242c5c4113dSnw141292  * Given UID, get SID
1243c5c4113dSnw141292  *
1244c5c4113dSnw141292  * Input:
1245c5c4113dSnw141292  * uid  - POSIX UID
1246c5c4113dSnw141292  * flag - flag
1247c5c4113dSnw141292  *
1248c5c4113dSnw141292  * Output:
1249c5c4113dSnw141292  * stat - status of the get request
1250c5c4113dSnw141292  * sid  - SID prefix (if stat == 0)
1251c5c4113dSnw141292  * rid  - rid
1252c5c4113dSnw141292  *
1253c5c4113dSnw141292  * Note: The output parameters will be set by idmap_get_mappings()
1254c5c4113dSnw141292  */
1255c5c4113dSnw141292 idmap_stat
idmap_get_sidbyuid(idmap_get_handle_t * gh,uid_t uid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_stat * stat)1256c5c4113dSnw141292 idmap_get_sidbyuid(idmap_get_handle_t *gh, uid_t uid, int flag,
1257cd37da74Snw141292 		char **sidprefix, idmap_rid_t *rid, idmap_stat *stat)
1258cd37da74Snw141292 {
125948258c6bSjp151216 	return (idmap_getext_sidbyuid(gh, uid, flag, sidprefix, rid,
126048258c6bSjp151216 	    NULL, stat));
126148258c6bSjp151216 }
126248258c6bSjp151216 
126348258c6bSjp151216 
126448258c6bSjp151216 /*
126548258c6bSjp151216  * Given UID, get SID
126648258c6bSjp151216  *
126748258c6bSjp151216  * Input:
126848258c6bSjp151216  * uid  - POSIX UID
126948258c6bSjp151216  * flag - flag
127048258c6bSjp151216  *
127148258c6bSjp151216  * Output:
127248258c6bSjp151216  * stat - status of the get request
127348258c6bSjp151216  * sid  - SID prefix (if stat == 0)
127448258c6bSjp151216  * rid  - rid
127548258c6bSjp151216  * how  - mapping type if stat = 0
127648258c6bSjp151216  *
127748258c6bSjp151216  * Note: The output parameters will be set by idmap_get_mappings()
127848258c6bSjp151216  */
127948258c6bSjp151216 idmap_stat
idmap_getext_sidbyuid(idmap_get_handle_t * gh,uid_t uid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_info * info,idmap_stat * stat)128048258c6bSjp151216 idmap_getext_sidbyuid(idmap_get_handle_t *gh, uid_t uid, int flag,
128148258c6bSjp151216 	char **sidprefix, idmap_rid_t *rid, idmap_info *info, idmap_stat *stat)
128248258c6bSjp151216 {
1283c5c4113dSnw141292 
1284c5c4113dSnw141292 	idmap_retcode	retcode;
1285651c0131Sbaban 	idmap_mapping	*mapping = NULL;
1286c5c4113dSnw141292 
1287c5c4113dSnw141292 	/* sanity checks */
1288c5c4113dSnw141292 	if (gh == NULL)
1289c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1290c5c4113dSnw141292 	if (sidprefix == NULL)
1291c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1292c5c4113dSnw141292 
12933ee87bcaSJulian Pullen 	if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
12943ee87bcaSJulian Pullen 	    !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
12953ee87bcaSJulian Pullen 		retcode = idmap_cache_lookup_sidbyuid(sidprefix, rid, uid);
12963ee87bcaSJulian Pullen 		if (retcode  == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
12973ee87bcaSJulian Pullen 			*stat = retcode;
12983ee87bcaSJulian Pullen 			return (retcode);
12993ee87bcaSJulian Pullen 		}
13003ee87bcaSJulian Pullen 	}
13013ee87bcaSJulian Pullen 
1302c5c4113dSnw141292 	/* Extend the request array and the return list */
1303c5c4113dSnw141292 	if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
1304c5c4113dSnw141292 		goto errout;
1305c5c4113dSnw141292 
1306c5c4113dSnw141292 	/* Setup the request */
1307c5c4113dSnw141292 	mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
1308c5c4113dSnw141292 	mapping->flag = flag;
1309c5c4113dSnw141292 	mapping->id1.idtype = IDMAP_UID;
1310c5c4113dSnw141292 	mapping->id1.idmap_id_u.uid = uid;
1311c5c4113dSnw141292 	mapping->id2.idtype = IDMAP_SID;
1312c5c4113dSnw141292 
1313c5c4113dSnw141292 	/* Setup pointers for the result */
1314c5c4113dSnw141292 	gh->retlist[gh->next].idtype = IDMAP_SID;
1315c5c4113dSnw141292 	gh->retlist[gh->next].sidprefix = sidprefix;
1316c5c4113dSnw141292 	gh->retlist[gh->next].rid = rid;
1317c5c4113dSnw141292 	gh->retlist[gh->next].stat = stat;
131848258c6bSjp151216 	gh->retlist[gh->next].info = info;
13193ee87bcaSJulian Pullen 	gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
1320c5c4113dSnw141292 
1321c5c4113dSnw141292 	gh->next++;
1322c5c4113dSnw141292 	return (IDMAP_SUCCESS);
1323c5c4113dSnw141292 
1324c5c4113dSnw141292 errout:
1325651c0131Sbaban 	if (mapping)
1326651c0131Sbaban 		(void) memset(mapping, 0, sizeof (*mapping));
1327c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
1328c5c4113dSnw141292 	return (retcode);
1329c5c4113dSnw141292 }
1330c5c4113dSnw141292 
1331c5c4113dSnw141292 
1332c5c4113dSnw141292 /*
1333c5c4113dSnw141292  * Given GID, get SID
1334c5c4113dSnw141292  *
1335c5c4113dSnw141292  * Input:
1336c5c4113dSnw141292  * gid  - POSIX GID
1337c5c4113dSnw141292  * flag - flag
1338c5c4113dSnw141292  *
1339c5c4113dSnw141292  * Output:
1340c5c4113dSnw141292  * stat       - status of the get request
1341c5c4113dSnw141292  * sidprefix  - SID prefix (if stat == 0)
1342c5c4113dSnw141292  * rid        - rid
1343c5c4113dSnw141292  *
1344c5c4113dSnw141292  * Note: The output parameters will be set by idmap_get_mappings()
1345c5c4113dSnw141292  */
1346c5c4113dSnw141292 idmap_stat
idmap_get_sidbygid(idmap_get_handle_t * gh,gid_t gid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_stat * stat)1347c5c4113dSnw141292 idmap_get_sidbygid(idmap_get_handle_t *gh, gid_t gid, int flag,
1348cd37da74Snw141292 		char **sidprefix, idmap_rid_t *rid, idmap_stat *stat)
1349cd37da74Snw141292 {
135048258c6bSjp151216 	return (idmap_getext_sidbygid(gh, gid, flag, sidprefix, rid,
135148258c6bSjp151216 	    NULL, stat));
135248258c6bSjp151216 }
135348258c6bSjp151216 
135448258c6bSjp151216 
135548258c6bSjp151216 /*
135648258c6bSjp151216  * Given GID, get SID
135748258c6bSjp151216  *
135848258c6bSjp151216  * Input:
135948258c6bSjp151216  * gid  - POSIX GID
136048258c6bSjp151216  * flag - flag
136148258c6bSjp151216  *
136248258c6bSjp151216  * Output:
136348258c6bSjp151216  * stat       - status of the get request
136448258c6bSjp151216  * sidprefix  - SID prefix (if stat == 0)
136548258c6bSjp151216  * rid        - rid
136648258c6bSjp151216  * how        - mapping type if stat = 0
136748258c6bSjp151216  *
136848258c6bSjp151216  * Note: The output parameters will be set by idmap_get_mappings()
136948258c6bSjp151216  */
137048258c6bSjp151216 idmap_stat
idmap_getext_sidbygid(idmap_get_handle_t * gh,gid_t gid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_info * info,idmap_stat * stat)137148258c6bSjp151216 idmap_getext_sidbygid(idmap_get_handle_t *gh, gid_t gid, int flag,
137248258c6bSjp151216 	char **sidprefix, idmap_rid_t *rid, idmap_info *info, idmap_stat *stat)
137348258c6bSjp151216 {
1374c5c4113dSnw141292 
1375c5c4113dSnw141292 	idmap_retcode	retcode;
1376651c0131Sbaban 	idmap_mapping	*mapping = NULL;
1377c5c4113dSnw141292 
1378c5c4113dSnw141292 	/* sanity checks */
1379c5c4113dSnw141292 	if (gh == NULL)
1380c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1381c5c4113dSnw141292 	if (sidprefix == NULL)
1382c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1383c5c4113dSnw141292 
13843ee87bcaSJulian Pullen 	if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
13853ee87bcaSJulian Pullen 	    !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
13863ee87bcaSJulian Pullen 		retcode = idmap_cache_lookup_sidbygid(sidprefix, rid, gid);
13873ee87bcaSJulian Pullen 		if (retcode  == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
13883ee87bcaSJulian Pullen 			*stat = retcode;
13893ee87bcaSJulian Pullen 			return (retcode);
13903ee87bcaSJulian Pullen 		}
13913ee87bcaSJulian Pullen 	}
13923ee87bcaSJulian Pullen 
1393c5c4113dSnw141292 	/* Extend the request array and the return list */
1394c5c4113dSnw141292 	if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
1395c5c4113dSnw141292 		goto errout;
1396c5c4113dSnw141292 
1397c5c4113dSnw141292 	/* Setup the request */
1398c5c4113dSnw141292 	mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
1399c5c4113dSnw141292 	mapping->flag = flag;
1400c5c4113dSnw141292 	mapping->id1.idtype = IDMAP_GID;
1401c5c4113dSnw141292 	mapping->id1.idmap_id_u.gid = gid;
1402c5c4113dSnw141292 	mapping->id2.idtype = IDMAP_SID;
1403c5c4113dSnw141292 
1404c5c4113dSnw141292 	/* Setup pointers for the result */
1405c5c4113dSnw141292 	gh->retlist[gh->next].idtype = IDMAP_SID;
1406c5c4113dSnw141292 	gh->retlist[gh->next].sidprefix = sidprefix;
1407c5c4113dSnw141292 	gh->retlist[gh->next].rid = rid;
1408c5c4113dSnw141292 	gh->retlist[gh->next].stat = stat;
140948258c6bSjp151216 	gh->retlist[gh->next].info = info;
14103ee87bcaSJulian Pullen 	gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
1411c5c4113dSnw141292 
1412c5c4113dSnw141292 	gh->next++;
1413c5c4113dSnw141292 	return (IDMAP_SUCCESS);
1414c5c4113dSnw141292 
1415c5c4113dSnw141292 errout:
1416651c0131Sbaban 	if (mapping)
1417651c0131Sbaban 		(void) memset(mapping, 0, sizeof (*mapping));
1418c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
1419c5c4113dSnw141292 	return (retcode);
1420c5c4113dSnw141292 }
1421c5c4113dSnw141292 
1422c5c4113dSnw141292 
1423c5c4113dSnw141292 /*
1424c5c4113dSnw141292  * Process the batched "get mapping" requests. The results (i.e.
1425c5c4113dSnw141292  * status and identity) will be available in the data areas
1426c5c4113dSnw141292  * provided by individual requests.
1427c5c4113dSnw141292  */
1428c5c4113dSnw141292 idmap_stat
idmap_get_mappings(idmap_get_handle_t * gh)1429cd37da74Snw141292 idmap_get_mappings(idmap_get_handle_t *gh)
1430cd37da74Snw141292 {
1431c5c4113dSnw141292 	idmap_retcode	retcode;
1432c5c4113dSnw141292 	idmap_ids_res	res;
14333ee87bcaSJulian Pullen 	idmap_id	*res_id;
1434c5c4113dSnw141292 	int		i;
14353ee87bcaSJulian Pullen 	idmap_id	*req_id;
14363ee87bcaSJulian Pullen 	int		direction;
1437c5c4113dSnw141292 
1438c5c4113dSnw141292 	if (gh == NULL) {
1439c5c4113dSnw141292 		errno = EINVAL;
1440c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1441c5c4113dSnw141292 	}
1442c5c4113dSnw141292 
1443c5c4113dSnw141292 	(void) memset(&res, 0, sizeof (idmap_ids_res));
14441fdeec65Sjoyce mcintosh 	retcode = _idmap_clnt_call(IDMAP_GET_MAPPED_IDS,
1445c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_mapping_batch,
1446c5c4113dSnw141292 	    (caddr_t)&gh->batch,
1447c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_ids_res,
1448c5c4113dSnw141292 	    (caddr_t)&res,
1449c5c4113dSnw141292 	    TIMEOUT);
14501fdeec65Sjoyce mcintosh 	if (retcode != IDMAP_SUCCESS) {
1451c5c4113dSnw141292 		goto out;
1452c5c4113dSnw141292 	}
1453c5c4113dSnw141292 	if (res.retcode != IDMAP_SUCCESS) {
1454c5c4113dSnw141292 		retcode = res.retcode;
1455c5c4113dSnw141292 		goto out;
1456c5c4113dSnw141292 	}
1457c5c4113dSnw141292 	for (i = 0; i < gh->next; i++) {
1458c5c4113dSnw141292 		if (i >= res.ids.ids_len) {
1459c5c4113dSnw141292 			*gh->retlist[i].stat = IDMAP_ERR_NORESULT;
1460c5c4113dSnw141292 			continue;
1461c5c4113dSnw141292 		}
1462c5c4113dSnw141292 		*gh->retlist[i].stat = res.ids.ids_val[i].retcode;
14633ee87bcaSJulian Pullen 		res_id = &res.ids.ids_val[i].id;
14643ee87bcaSJulian Pullen 		direction = res.ids.ids_val[i].direction;
14653ee87bcaSJulian Pullen 		req_id = &gh->batch.idmap_mapping_batch_val[i].id1;
14663ee87bcaSJulian Pullen 		switch (res_id->idtype) {
1467c5c4113dSnw141292 		case IDMAP_UID:
1468c5c4113dSnw141292 			if (gh->retlist[i].uid)
14693ee87bcaSJulian Pullen 				*gh->retlist[i].uid = res_id->idmap_id_u.uid;
1470c5c4113dSnw141292 			if (gh->retlist[i].is_user)
1471c5c4113dSnw141292 				*gh->retlist[i].is_user = 1;
14723ee87bcaSJulian Pullen 
14733ee87bcaSJulian Pullen 			if (res.ids.ids_val[i].retcode == IDMAP_SUCCESS &&
14743ee87bcaSJulian Pullen 			    gh->retlist[i].cache_res) {
14753ee87bcaSJulian Pullen 				if (gh->retlist[i].is_user != NULL)
14763ee87bcaSJulian Pullen 					idmap_cache_add_sid2pid(
14773ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.prefix,
14783ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.rid,
14793ee87bcaSJulian Pullen 					    res_id->idmap_id_u.uid, 1,
14803ee87bcaSJulian Pullen 					    direction);
14813ee87bcaSJulian Pullen 				else
14823ee87bcaSJulian Pullen 					idmap_cache_add_sid2uid(
14833ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.prefix,
14843ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.rid,
14853ee87bcaSJulian Pullen 					    res_id->idmap_id_u.uid,
14863ee87bcaSJulian Pullen 					    direction);
14873ee87bcaSJulian Pullen 			}
1488c5c4113dSnw141292 			break;
14893ee87bcaSJulian Pullen 
1490c5c4113dSnw141292 		case IDMAP_GID:
1491c5c4113dSnw141292 			if (gh->retlist[i].gid)
14923ee87bcaSJulian Pullen 				*gh->retlist[i].gid = res_id->idmap_id_u.gid;
1493c5c4113dSnw141292 			if (gh->retlist[i].is_user)
1494c5c4113dSnw141292 				*gh->retlist[i].is_user = 0;
14953ee87bcaSJulian Pullen 
14963ee87bcaSJulian Pullen 			if (res.ids.ids_val[i].retcode == IDMAP_SUCCESS &&
14973ee87bcaSJulian Pullen 			    gh->retlist[i].cache_res) {
14983ee87bcaSJulian Pullen 				if (gh->retlist[i].is_user != NULL)
14993ee87bcaSJulian Pullen 					idmap_cache_add_sid2pid(
15003ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.prefix,
15013ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.rid,
15023ee87bcaSJulian Pullen 					    res_id->idmap_id_u.gid, 0,
15033ee87bcaSJulian Pullen 					    direction);
15043ee87bcaSJulian Pullen 				else
15053ee87bcaSJulian Pullen 					idmap_cache_add_sid2gid(
15063ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.prefix,
15073ee87bcaSJulian Pullen 					    req_id->idmap_id_u.sid.rid,
15083ee87bcaSJulian Pullen 					    res_id->idmap_id_u.gid,
15093ee87bcaSJulian Pullen 					    direction);
15103ee87bcaSJulian Pullen 			}
1511c5c4113dSnw141292 			break;
15123ee87bcaSJulian Pullen 
151362c60062Sbaban 		case IDMAP_POSIXID:
151462c60062Sbaban 			if (gh->retlist[i].uid)
151562c60062Sbaban 				*gh->retlist[i].uid = 60001;
151662c60062Sbaban 			if (gh->retlist[i].is_user)
151762c60062Sbaban 				*gh->retlist[i].is_user = -1;
151862c60062Sbaban 			break;
15193ee87bcaSJulian Pullen 
1520c5c4113dSnw141292 		case IDMAP_SID:
1521cd37da74Snw141292 		case IDMAP_USID:
1522cd37da74Snw141292 		case IDMAP_GSID:
1523c5c4113dSnw141292 			if (gh->retlist[i].rid)
15243ee87bcaSJulian Pullen 				*gh->retlist[i].rid =
15253ee87bcaSJulian Pullen 				    res_id->idmap_id_u.sid.rid;
1526c5c4113dSnw141292 			if (gh->retlist[i].sidprefix) {
15273ee87bcaSJulian Pullen 				if (res_id->idmap_id_u.sid.prefix == NULL ||
15283ee87bcaSJulian Pullen 				    *res_id->idmap_id_u.sid.prefix == '\0') {
1529c5c4113dSnw141292 					*gh->retlist[i].sidprefix = NULL;
1530c5c4113dSnw141292 					break;
1531c5c4113dSnw141292 				}
1532c5c4113dSnw141292 				*gh->retlist[i].sidprefix =
15333ee87bcaSJulian Pullen 				    strdup(res_id->idmap_id_u.sid.prefix);
1534c5c4113dSnw141292 				if (*gh->retlist[i].sidprefix == NULL)
1535c5c4113dSnw141292 					*gh->retlist[i].stat =
1536c5c4113dSnw141292 					    IDMAP_ERR_MEMORY;
1537c5c4113dSnw141292 			}
15383ee87bcaSJulian Pullen 			if (res.ids.ids_val[i].retcode == IDMAP_SUCCESS &&
15393ee87bcaSJulian Pullen 			    gh->retlist[i].cache_res) {
15403ee87bcaSJulian Pullen 				if (req_id->idtype == IDMAP_UID)
15413ee87bcaSJulian Pullen 					idmap_cache_add_sid2uid(
15423ee87bcaSJulian Pullen 					    res_id->idmap_id_u.sid.prefix,
15433ee87bcaSJulian Pullen 					    res_id->idmap_id_u.sid.rid,
15443ee87bcaSJulian Pullen 					    req_id->idmap_id_u.uid,
15453ee87bcaSJulian Pullen 					    direction);
15463ee87bcaSJulian Pullen 				else /* req_id->idtype == IDMAP_GID */
15473ee87bcaSJulian Pullen 					idmap_cache_add_sid2gid(
15483ee87bcaSJulian Pullen 					    res_id->idmap_id_u.sid.prefix,
15493ee87bcaSJulian Pullen 					    res_id->idmap_id_u.sid.rid,
15503ee87bcaSJulian Pullen 					    req_id->idmap_id_u.gid,
15513ee87bcaSJulian Pullen 					    direction);
15523ee87bcaSJulian Pullen 			}
1553c5c4113dSnw141292 			break;
15543ee87bcaSJulian Pullen 
1555c5c4113dSnw141292 		case IDMAP_NONE:
1556c5c4113dSnw141292 			break;
15573ee87bcaSJulian Pullen 
1558c5c4113dSnw141292 		default:
1559c5c4113dSnw141292 			*gh->retlist[i].stat = IDMAP_ERR_NORESULT;
1560c5c4113dSnw141292 			break;
1561c5c4113dSnw141292 		}
1562148c5f43SAlan Wright 		if (gh->retlist[i].info != NULL) {
1563148c5f43SAlan Wright 			idmap_info_mov(gh->retlist[i].info,
156448258c6bSjp151216 			    &res.ids.ids_val[i].info);
1565c5c4113dSnw141292 		}
1566148c5f43SAlan Wright 	}
1567c5c4113dSnw141292 	retcode = IDMAP_SUCCESS;
1568c5c4113dSnw141292 
1569c5c4113dSnw141292 out:
1570651c0131Sbaban 	_IDMAP_RESET_GET_HANDLE(gh);
1571c5c4113dSnw141292 	(void) xdr_free(xdr_idmap_ids_res, (caddr_t)&res);
1572c5c4113dSnw141292 	errno = idmap_stat2errno(retcode);
1573c5c4113dSnw141292 	return (retcode);
1574c5c4113dSnw141292 }
1575c5c4113dSnw141292 
1576c5c4113dSnw141292 
1577c5c4113dSnw141292 /*
1578c5c4113dSnw141292  * Destroy the "get mapping" handle
1579c5c4113dSnw141292  */
1580c5c4113dSnw141292 void
idmap_get_destroy(idmap_get_handle_t * gh)1581cd37da74Snw141292 idmap_get_destroy(idmap_get_handle_t *gh)
1582cd37da74Snw141292 {
1583c5c4113dSnw141292 	if (gh == NULL)
1584c5c4113dSnw141292 		return;
1585c5c4113dSnw141292 	(void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
1586c5c4113dSnw141292 	if (gh->retlist)
1587c5c4113dSnw141292 		free(gh->retlist);
1588c5c4113dSnw141292 	free(gh);
1589c5c4113dSnw141292 }
1590c5c4113dSnw141292 
1591c5c4113dSnw141292 
1592c5c4113dSnw141292 /*
1593c5c4113dSnw141292  * Get windows to unix mapping
1594c5c4113dSnw141292  */
1595c5c4113dSnw141292 idmap_stat
idmap_get_w2u_mapping(const char * sidprefix,idmap_rid_t * rid,const char * winname,const char * windomain,int flag,int * is_user,int * is_wuser,uid_t * pid,char ** unixname,int * direction,idmap_info * info)15961fdeec65Sjoyce mcintosh idmap_get_w2u_mapping(
1597c5c4113dSnw141292 		const char *sidprefix, idmap_rid_t *rid,
1598c5c4113dSnw141292 		const char *winname, const char *windomain,
1599cd37da74Snw141292 		int flag, int *is_user, int *is_wuser,
160048258c6bSjp151216 		uid_t *pid, char **unixname, int *direction, idmap_info *info)
1601cd37da74Snw141292 {
1602c5c4113dSnw141292 	idmap_mapping		request, *mapping;
1603c5c4113dSnw141292 	idmap_mappings_res	result;
1604c5c4113dSnw141292 	idmap_retcode		retcode, rc;
1605c5c4113dSnw141292 
1606c5c4113dSnw141292 	(void) memset(&request, 0, sizeof (request));
1607c5c4113dSnw141292 	(void) memset(&result, 0, sizeof (result));
1608c5c4113dSnw141292 
1609c5c4113dSnw141292 	if (pid)
1610c5c4113dSnw141292 		*pid = UINT32_MAX;
1611c5c4113dSnw141292 	if (unixname)
1612c5c4113dSnw141292 		*unixname = NULL;
1613c5c4113dSnw141292 	if (direction)
1614651c0131Sbaban 		*direction = IDMAP_DIRECTION_UNDEF;
1615c5c4113dSnw141292 
1616c5c4113dSnw141292 	request.flag = flag;
1617c5c4113dSnw141292 	request.id1.idtype = IDMAP_SID;
1618c5c4113dSnw141292 	if (sidprefix && rid) {
1619c5c4113dSnw141292 		request.id1.idmap_id_u.sid.prefix = (char *)sidprefix;
1620c5c4113dSnw141292 		request.id1.idmap_id_u.sid.rid = *rid;
1621c5c4113dSnw141292 	} else if (winname) {
16228e228215Sdm199847 		retcode = idmap_strdupnull(&request.id1name, winname);
1623c5a946baSbaban 		if (retcode != IDMAP_SUCCESS)
1624c5c4113dSnw141292 			goto out;
16258e228215Sdm199847 
16268e228215Sdm199847 		retcode = idmap_strdupnull(&request.id1domain, windomain);
1627c5a946baSbaban 		if (retcode != IDMAP_SUCCESS)
16288e228215Sdm199847 			goto out;
16298e228215Sdm199847 
1630c5c4113dSnw141292 		request.id1.idmap_id_u.sid.prefix = NULL;
1631c5c4113dSnw141292 	} else {
1632c5c4113dSnw141292 		errno = EINVAL;
1633c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1634c5c4113dSnw141292 	}
1635c5c4113dSnw141292 
1636cd37da74Snw141292 	if (*is_user == 1)
1637c5c4113dSnw141292 		request.id2.idtype = IDMAP_UID;
1638c5c4113dSnw141292 	else if (*is_user == 0)
1639c5c4113dSnw141292 		request.id2.idtype = IDMAP_GID;
1640c5c4113dSnw141292 	else
1641c5c4113dSnw141292 		request.id2.idtype = IDMAP_POSIXID;
1642c5c4113dSnw141292 
1643cd37da74Snw141292 	if (*is_wuser == 1)
1644cd37da74Snw141292 		request.id1.idtype = IDMAP_USID;
1645cd37da74Snw141292 	else if (*is_wuser == 0)
1646cd37da74Snw141292 		request.id1.idtype = IDMAP_GSID;
1647cd37da74Snw141292 	else
1648cd37da74Snw141292 		request.id1.idtype = IDMAP_SID;
1649cd37da74Snw141292 
16501fdeec65Sjoyce mcintosh 	retcode = _idmap_clnt_call(IDMAP_GET_MAPPED_ID_BY_NAME,
1651c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_mapping, (caddr_t)&request,
1652c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_mappings_res, (caddr_t)&result,
1653c5c4113dSnw141292 	    TIMEOUT);
1654c5c4113dSnw141292 
16551fdeec65Sjoyce mcintosh 	if (retcode != IDMAP_SUCCESS)
16561fdeec65Sjoyce mcintosh 		return (retcode);
1657c5c4113dSnw141292 
1658c5c4113dSnw141292 	retcode = result.retcode;
1659c5c4113dSnw141292 
1660c5c4113dSnw141292 	if ((mapping = result.mappings.mappings_val) == NULL) {
1661c5c4113dSnw141292 		if (retcode == IDMAP_SUCCESS)
1662c5c4113dSnw141292 			retcode = IDMAP_ERR_NORESULT;
1663c5c4113dSnw141292 		goto out;
1664c5c4113dSnw141292 	}
1665c5c4113dSnw141292 
1666148c5f43SAlan Wright 	if (info != NULL)
1667148c5f43SAlan Wright 		idmap_info_mov(info, &mapping->info);
1668148c5f43SAlan Wright 
166962c60062Sbaban 	if (mapping->id2.idtype == IDMAP_UID) {
1670cd37da74Snw141292 		*is_user = 1;
167162c60062Sbaban 	} else if (mapping->id2.idtype == IDMAP_GID) {
1672cd37da74Snw141292 		*is_user = 0;
167362c60062Sbaban 	} else {
167462c60062Sbaban 		goto out;
167562c60062Sbaban 	}
1676cd37da74Snw141292 
1677cd37da74Snw141292 	if (mapping->id1.idtype == IDMAP_USID) {
1678cd37da74Snw141292 		*is_wuser = 1;
1679cd37da74Snw141292 	} else if (mapping->id1.idtype == IDMAP_GSID) {
1680cd37da74Snw141292 		*is_wuser = 0;
1681cd37da74Snw141292 	} else {
1682cd37da74Snw141292 		goto out;
1683cd37da74Snw141292 	}
1684cd37da74Snw141292 
1685c5c4113dSnw141292 	if (direction)
1686c5c4113dSnw141292 		*direction = mapping->direction;
1687c5c4113dSnw141292 	if (pid)
1688c5c4113dSnw141292 		*pid = mapping->id2.idmap_id_u.uid;
16898e228215Sdm199847 
16908e228215Sdm199847 	rc = idmap_strdupnull(unixname, mapping->id2name);
1691c5c4113dSnw141292 	if (rc != IDMAP_SUCCESS)
1692c5c4113dSnw141292 		retcode = rc;
1693c5c4113dSnw141292 
1694c5c4113dSnw141292 out:
1695f7b4b2feSjp151216 	if (request.id1name != NULL)
1696f7b4b2feSjp151216 		free(request.id1name);
1697f7b4b2feSjp151216 	if (request.id1domain != NULL)
1698f7b4b2feSjp151216 		free(request.id1domain);
1699c5c4113dSnw141292 	xdr_free(xdr_idmap_mappings_res, (caddr_t)&result);
1700c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
1701c5c4113dSnw141292 		errno = idmap_stat2errno(retcode);
1702c5c4113dSnw141292 	return (retcode);
1703c5c4113dSnw141292 }
1704c5c4113dSnw141292 
1705c5c4113dSnw141292 
1706c5c4113dSnw141292 /*
1707c5c4113dSnw141292  * Get unix to windows mapping
1708c5c4113dSnw141292  */
1709c5c4113dSnw141292 idmap_stat
idmap_get_u2w_mapping(uid_t * pid,const char * unixname,int flag,int is_user,int * is_wuser,char ** sidprefix,idmap_rid_t * rid,char ** winname,char ** windomain,int * direction,idmap_info * info)17101fdeec65Sjoyce mcintosh idmap_get_u2w_mapping(
1711c5c4113dSnw141292 		uid_t *pid, const char *unixname,
1712cd37da74Snw141292 		int flag, int is_user, int *is_wuser,
1713c5c4113dSnw141292 		char **sidprefix, idmap_rid_t *rid,
1714c5c4113dSnw141292 		char **winname, char **windomain,
171548258c6bSjp151216 		int *direction, idmap_info *info)
1716cd37da74Snw141292 {
1717c5c4113dSnw141292 	idmap_mapping		request, *mapping;
1718c5c4113dSnw141292 	idmap_mappings_res	result;
1719c5c4113dSnw141292 	idmap_retcode		retcode, rc;
1720c5c4113dSnw141292 
1721c5c4113dSnw141292 	if (sidprefix)
1722c5c4113dSnw141292 		*sidprefix = NULL;
1723c5c4113dSnw141292 	if (winname)
1724c5c4113dSnw141292 		*winname = NULL;
1725c5c4113dSnw141292 	if (windomain)
1726c5c4113dSnw141292 		*windomain = NULL;
1727c5c4113dSnw141292 	if (rid)
1728c5c4113dSnw141292 		*rid = UINT32_MAX;
1729c5c4113dSnw141292 	if (direction)
1730651c0131Sbaban 		*direction = IDMAP_DIRECTION_UNDEF;
1731c5c4113dSnw141292 
1732c5c4113dSnw141292 	(void) memset(&request, 0, sizeof (request));
1733c5c4113dSnw141292 	(void) memset(&result, 0, sizeof (result));
1734c5c4113dSnw141292 
1735c5c4113dSnw141292 	request.flag = flag;
1736c5c4113dSnw141292 	request.id1.idtype = is_user?IDMAP_UID:IDMAP_GID;
1737c5c4113dSnw141292 
1738c5c4113dSnw141292 	if (pid && *pid != UINT32_MAX) {
1739c5c4113dSnw141292 		request.id1.idmap_id_u.uid = *pid;
1740c5c4113dSnw141292 	} else if (unixname) {
17418e228215Sdm199847 		request.id1name = (char *)unixname;
1742c5c4113dSnw141292 		request.id1.idmap_id_u.uid = UINT32_MAX;
1743c5c4113dSnw141292 	} else {
1744c5c4113dSnw141292 		errno = EINVAL;
1745c5c4113dSnw141292 		return (IDMAP_ERR_ARG);
1746c5c4113dSnw141292 	}
1747c5c4113dSnw141292 
1748cd37da74Snw141292 	if (is_wuser == NULL)
1749c5c4113dSnw141292 		request.id2.idtype = IDMAP_SID;
1750cd37da74Snw141292 	else if (*is_wuser == -1)
1751cd37da74Snw141292 		request.id2.idtype = IDMAP_SID;
1752cd37da74Snw141292 	else if (*is_wuser == 0)
1753cd37da74Snw141292 		request.id2.idtype = IDMAP_GSID;
1754cd37da74Snw141292 	else if (*is_wuser == 1)
1755cd37da74Snw141292 		request.id2.idtype = IDMAP_USID;
1756c5c4113dSnw141292 
17571fdeec65Sjoyce mcintosh 	retcode = _idmap_clnt_call(IDMAP_GET_MAPPED_ID_BY_NAME,
1758c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_mapping, (caddr_t)&request,
1759c5c4113dSnw141292 	    (xdrproc_t)xdr_idmap_mappings_res, (caddr_t)&result,
1760c5c4113dSnw141292 	    TIMEOUT);
1761c5c4113dSnw141292 
17621fdeec65Sjoyce mcintosh 	if (retcode != IDMAP_SUCCESS)
17631fdeec65Sjoyce mcintosh 		return (retcode);
1764c5c4113dSnw141292 
1765c5c4113dSnw141292 	retcode = result.retcode;
1766c5c4113dSnw141292 
1767c5c4113dSnw141292 	if ((mapping = result.mappings.mappings_val) == NULL) {
1768c5c4113dSnw141292 		if (retcode == IDMAP_SUCCESS)
1769c5c4113dSnw141292 			retcode = IDMAP_ERR_NORESULT;
1770c5c4113dSnw141292 		goto out;
1771c5c4113dSnw141292 	}
1772c5c4113dSnw141292 
1773148c5f43SAlan Wright 	if (info != NULL)
1774148c5f43SAlan Wright 		idmap_info_mov(info, &mapping->info);
1775148c5f43SAlan Wright 
1776cd37da74Snw141292 	if (direction != NULL)
1777c5c4113dSnw141292 		*direction = mapping->direction;
1778cd37da74Snw141292 
177948258c6bSjp151216 	if (is_wuser != NULL) {
178048258c6bSjp151216 		if (mapping->id2.idtype == IDMAP_USID)
178148258c6bSjp151216 			*is_wuser = 1;
178248258c6bSjp151216 		else if (mapping->id2.idtype == IDMAP_GSID)
178348258c6bSjp151216 			*is_wuser = 0;
178448258c6bSjp151216 		else
178548258c6bSjp151216 			*is_wuser = -1;
178648258c6bSjp151216 	}
1787cd37da74Snw141292 
17888edda628Sbaban 	if (sidprefix && mapping->id2.idmap_id_u.sid.prefix &&
17898edda628Sbaban 	    *mapping->id2.idmap_id_u.sid.prefix != '\0') {
1790c5c4113dSnw141292 		*sidprefix = strdup(mapping->id2.idmap_id_u.sid.prefix);
1791c5c4113dSnw141292 		if (*sidprefix == NULL) {
1792c5c4113dSnw141292 			retcode = IDMAP_ERR_MEMORY;
1793c5c4113dSnw141292 			goto errout;
1794c5c4113dSnw141292 		}
1795c5c4113dSnw141292 	}
1796c5c4113dSnw141292 	if (rid)
1797c5c4113dSnw141292 		*rid = mapping->id2.idmap_id_u.sid.rid;
17988e228215Sdm199847 
17998e228215Sdm199847 	rc = idmap_strdupnull(winname, mapping->id2name);
18008e228215Sdm199847 	if (rc != IDMAP_SUCCESS)
1801c5c4113dSnw141292 		retcode = rc;
18028e228215Sdm199847 
18038e228215Sdm199847 	rc = idmap_strdupnull(windomain, mapping->id2domain);
18048e228215Sdm199847 	if (rc != IDMAP_SUCCESS)
1805c5c4113dSnw141292 		retcode = rc;
1806c5c4113dSnw141292 
1807c5c4113dSnw141292 	goto out;
1808c5c4113dSnw141292 
1809c5c4113dSnw141292 errout:
1810c5c4113dSnw141292 	if (sidprefix && *sidprefix) {
1811c5c4113dSnw141292 		free(*sidprefix);
1812c5c4113dSnw141292 		*sidprefix = NULL;
1813c5c4113dSnw141292 	}
1814c5c4113dSnw141292 	if (winname && *winname) {
1815c5c4113dSnw141292 		free(*winname);
1816c5c4113dSnw141292 		*winname = NULL;
1817c5c4113dSnw141292 	}
1818c5c4113dSnw141292 	if (windomain && *windomain) {
1819c5c4113dSnw141292 		free(*windomain);
1820c5c4113dSnw141292 		*windomain = NULL;
1821c5c4113dSnw141292 	}
1822c5c4113dSnw141292 
1823c5c4113dSnw141292 out:
1824c5c4113dSnw141292 	xdr_free(xdr_idmap_mappings_res, (caddr_t)&result);
1825c5c4113dSnw141292 	if (retcode != IDMAP_SUCCESS)
1826c5c4113dSnw141292 		errno = idmap_stat2errno(retcode);
1827c5c4113dSnw141292 	return (retcode);
1828c5c4113dSnw141292 }
1829c5c4113dSnw141292 
1830c5c4113dSnw141292 
1831c5c4113dSnw141292 
1832c5c4113dSnw141292 #define	gettext(s)	s
1833c5c4113dSnw141292 static stat_table_t stattable[] = {
1834c5c4113dSnw141292 	{IDMAP_SUCCESS, gettext("Success"), 0},
1835c5c4113dSnw141292 	{IDMAP_NEXT, gettext("More results available"), 0},
1836c5c4113dSnw141292 	{IDMAP_ERR_OTHER, gettext("Undefined error"), EINVAL},
1837c5c4113dSnw141292 	{IDMAP_ERR_INTERNAL, gettext("Internal error"), EINVAL},
1838c5c4113dSnw141292 	{IDMAP_ERR_MEMORY, gettext("Out of memory"), ENOMEM},
1839c5c4113dSnw141292 	{IDMAP_ERR_NORESULT, gettext("No results available"), EINVAL},
1840c5c4113dSnw141292 	{IDMAP_ERR_NOTUSER, gettext("Not a user"), EINVAL},
1841c5c4113dSnw141292 	{IDMAP_ERR_NOTGROUP, gettext("Not a group"), EINVAL},
1842651c0131Sbaban 	{IDMAP_ERR_NOTSUPPORTED, gettext("Operation not supported"), ENOTSUP},
1843c5c4113dSnw141292 	{IDMAP_ERR_W2U_NAMERULE,
1844c5c4113dSnw141292 		gettext("Invalid Windows to UNIX name-based rule"), EINVAL},
1845c5c4113dSnw141292 	{IDMAP_ERR_U2W_NAMERULE,
1846c5c4113dSnw141292 		gettext("Invalid UNIX to Windows name-based rule"), EINVAL},
1847c5c4113dSnw141292 	{IDMAP_ERR_CACHE, gettext("Invalid cache"), EINVAL},
1848c5c4113dSnw141292 	{IDMAP_ERR_DB, gettext("Invalid database"), EINVAL},
1849c5c4113dSnw141292 	{IDMAP_ERR_ARG, gettext("Invalid argument"), EINVAL},
1850c5c4113dSnw141292 	{IDMAP_ERR_SID, gettext("Invalid SID"), EINVAL},
1851c5c4113dSnw141292 	{IDMAP_ERR_IDTYPE, gettext("Invalid identity type"), EINVAL},
1852651c0131Sbaban 	{IDMAP_ERR_RPC_HANDLE, gettext("Bad RPC handle"), EBADF},
1853c5c4113dSnw141292 	{IDMAP_ERR_RPC, gettext("RPC error"), EINVAL},
1854c5c4113dSnw141292 	{IDMAP_ERR_CLIENT_HANDLE, gettext("Bad client handle"), EINVAL},
1855651c0131Sbaban 	{IDMAP_ERR_BUSY, gettext("Server is busy"), EBUSY},
18568edda628Sbaban 	{IDMAP_ERR_PERMISSION_DENIED, gettext("Permission denied"), EACCES},
1857c5c4113dSnw141292 	{IDMAP_ERR_NOMAPPING,
1858c5c4113dSnw141292 		gettext("Mapping not found or inhibited"), EINVAL},
1859c5c4113dSnw141292 	{IDMAP_ERR_NEW_ID_ALLOC_REQD,
1860c5c4113dSnw141292 		gettext("New mapping needs to be created"), EINVAL},
1861c5c4113dSnw141292 	{IDMAP_ERR_DOMAIN, gettext("Invalid domain"), EINVAL},
1862c5c4113dSnw141292 	{IDMAP_ERR_SECURITY, gettext("Security issue"), EINVAL},
1863c5c4113dSnw141292 	{IDMAP_ERR_NOTFOUND, gettext("Not found"), EINVAL},
1864c5c4113dSnw141292 	{IDMAP_ERR_DOMAIN_NOTFOUND, gettext("Domain not found"), EINVAL},
1865c5c4113dSnw141292 	{IDMAP_ERR_UPDATE_NOTALLOWED, gettext("Update not allowed"), EINVAL},
1866c5c4113dSnw141292 	{IDMAP_ERR_CFG, gettext("Configuration error"), EINVAL},
1867c5c4113dSnw141292 	{IDMAP_ERR_CFG_CHANGE, gettext("Invalid configuration change"), EINVAL},
1868c5c4113dSnw141292 	{IDMAP_ERR_NOTMAPPED_WELLKNOWN,
1869c5c4113dSnw141292 		gettext("No mapping for well-known SID"), EINVAL},
1870c5c4113dSnw141292 	{IDMAP_ERR_RETRIABLE_NET_ERR,
187162c60062Sbaban 		gettext("Windows lookup failed"), EINVAL},
187262c60062Sbaban 	{IDMAP_ERR_W2U_NAMERULE_CONFLICT,
187362c60062Sbaban 		gettext("Duplicate rule or conflicts with an existing "
187462c60062Sbaban 		"Windows to UNIX name-based rule"), EINVAL},
187562c60062Sbaban 	{IDMAP_ERR_U2W_NAMERULE_CONFLICT,
187662c60062Sbaban 		gettext("Duplicate rule or conflicts with an existing "
187762c60062Sbaban 		"Unix to Windows name-based rule"), EINVAL},
18780dcc7149Snw141292 	{IDMAP_ERR_BAD_UTF8,
18790dcc7149Snw141292 		gettext("Invalid or illegal UTF-8 sequence found in "
18800dcc7149Snw141292 		"a given Windows entity name or domain name"), EINVAL},
18814d61c878SJulian Pullen 	{IDMAP_ERR_NONE_GENERATED,
188248258c6bSjp151216 		gettext("Mapping not found and none created (see -c option)"),
188348258c6bSjp151216 		EINVAL},
1884479ac375Sdm199847 	{IDMAP_ERR_PROP_UNKNOWN,
1885479ac375Sdm199847 		gettext("Undefined property"),
1886479ac375Sdm199847 		EINVAL},
1887479ac375Sdm199847 	{IDMAP_ERR_NS_LDAP_CFG,
1888479ac375Sdm199847 		gettext("Native LDAP configuration error"), EINVAL},
1889479ac375Sdm199847 	{IDMAP_ERR_NS_LDAP_PARTIAL,
1890479ac375Sdm199847 		gettext("Partial result from Native LDAP"), EINVAL},
1891479ac375Sdm199847 	{IDMAP_ERR_NS_LDAP_OP_FAILED,
1892479ac375Sdm199847 		gettext("Native LDAP operation failed"), EINVAL},
1893479ac375Sdm199847 	{IDMAP_ERR_NS_LDAP_BAD_WINNAME,
1894479ac375Sdm199847 		gettext("Improper winname form found in Native LDAP"), EINVAL},
18954d61c878SJulian Pullen 	{IDMAP_ERR_NO_ACTIVEDIRECTORY,
18964d61c878SJulian Pullen 		gettext("No AD servers"),
18974d61c878SJulian Pullen 		EINVAL},
1898c5c4113dSnw141292 	{-1, NULL, 0}
1899c5c4113dSnw141292 };
1900c5c4113dSnw141292 #undef	gettext
1901c5c4113dSnw141292 
1902c5c4113dSnw141292 
1903c5c4113dSnw141292 /*
1904c5c4113dSnw141292  * Get description of status code
1905c5c4113dSnw141292  *
1906c5c4113dSnw141292  * Input:
1907c5c4113dSnw141292  * status - Status code returned by libidmap API call
1908c5c4113dSnw141292  *
1909c5c4113dSnw141292  * Return Value:
1910c5c4113dSnw141292  * human-readable localized description of idmap_stat
1911c5c4113dSnw141292  */
1912c5c4113dSnw141292 const char *
idmap_stat2string(idmap_stat status)19131fdeec65Sjoyce mcintosh idmap_stat2string(idmap_stat status)
1914cd37da74Snw141292 {
1915c5c4113dSnw141292 	int i;
1916c5c4113dSnw141292 
1917c5c4113dSnw141292 	for (i = 0; stattable[i].msg; i++) {
1918c5c4113dSnw141292 		if (stattable[i].retcode == status)
19191fcced4cSJordan Brown 			return (dgettext(TEXT_DOMAIN, stattable[i].msg));
1920c5c4113dSnw141292 	}
19211fcced4cSJordan Brown 	return (dgettext(TEXT_DOMAIN, "Unknown error"));
1922c5c4113dSnw141292 }
1923c5c4113dSnw141292 
1924c5c4113dSnw141292 
1925c5c4113dSnw141292 static int
idmap_stat2errno(idmap_stat stat)1926cd37da74Snw141292 idmap_stat2errno(idmap_stat stat)
1927cd37da74Snw141292 {
1928c5c4113dSnw141292 	int i;
1929c5c4113dSnw141292 	for (i = 0; stattable[i].msg; i++) {
1930c5c4113dSnw141292 		if (stattable[i].retcode == stat)
1931c5c4113dSnw141292 			return (stattable[i].errnum);
1932c5c4113dSnw141292 	}
1933c5c4113dSnw141292 	return (EINVAL);
1934c5c4113dSnw141292 }
1935c5c4113dSnw141292 
1936c5c4113dSnw141292 
1937c5c4113dSnw141292 /*
1938c5c4113dSnw141292  * Get status code from string
1939c5c4113dSnw141292  */
1940c5c4113dSnw141292 idmap_stat
idmap_string2stat(const char * str)1941cd37da74Snw141292 idmap_string2stat(const char *str)
1942cd37da74Snw141292 {
1943c5c4113dSnw141292 	if (str == NULL)
1944c5c4113dSnw141292 		return (IDMAP_ERR_INTERNAL);
1945c5c4113dSnw141292 
1946c5c4113dSnw141292 #define	return_cmp(a) \
1947c5c4113dSnw141292 	if (0 == strcmp(str, "IDMAP_ERR_" #a)) \
1948c5c4113dSnw141292 		return (IDMAP_ERR_ ## a);
1949c5c4113dSnw141292 
1950c5c4113dSnw141292 	return_cmp(OTHER);
1951c5c4113dSnw141292 	return_cmp(INTERNAL);
1952c5c4113dSnw141292 	return_cmp(MEMORY);
1953c5c4113dSnw141292 	return_cmp(NORESULT);
1954c5c4113dSnw141292 	return_cmp(NOTUSER);
1955c5c4113dSnw141292 	return_cmp(NOTGROUP);
1956c5c4113dSnw141292 	return_cmp(NOTSUPPORTED);
1957c5c4113dSnw141292 	return_cmp(W2U_NAMERULE);
1958c5c4113dSnw141292 	return_cmp(U2W_NAMERULE);
1959c5c4113dSnw141292 	return_cmp(CACHE);
1960c5c4113dSnw141292 	return_cmp(DB);
1961c5c4113dSnw141292 	return_cmp(ARG);
1962c5c4113dSnw141292 	return_cmp(SID);
1963c5c4113dSnw141292 	return_cmp(IDTYPE);
1964c5c4113dSnw141292 	return_cmp(RPC_HANDLE);
1965c5c4113dSnw141292 	return_cmp(RPC);
1966c5c4113dSnw141292 	return_cmp(CLIENT_HANDLE);
1967c5c4113dSnw141292 	return_cmp(BUSY);
1968c5c4113dSnw141292 	return_cmp(PERMISSION_DENIED);
1969c5c4113dSnw141292 	return_cmp(NOMAPPING);
1970c5c4113dSnw141292 	return_cmp(NEW_ID_ALLOC_REQD);
1971c5c4113dSnw141292 	return_cmp(DOMAIN);
1972c5c4113dSnw141292 	return_cmp(SECURITY);
1973c5c4113dSnw141292 	return_cmp(NOTFOUND);
1974c5c4113dSnw141292 	return_cmp(DOMAIN_NOTFOUND);
1975c5c4113dSnw141292 	return_cmp(MEMORY);
1976c5c4113dSnw141292 	return_cmp(UPDATE_NOTALLOWED);
1977c5c4113dSnw141292 	return_cmp(CFG);
1978c5c4113dSnw141292 	return_cmp(CFG_CHANGE);
1979c5c4113dSnw141292 	return_cmp(NOTMAPPED_WELLKNOWN);
1980c5c4113dSnw141292 	return_cmp(RETRIABLE_NET_ERR);
198162c60062Sbaban 	return_cmp(W2U_NAMERULE_CONFLICT);
198262c60062Sbaban 	return_cmp(U2W_NAMERULE_CONFLICT);
1983479ac375Sdm199847 	return_cmp(BAD_UTF8);
19844d61c878SJulian Pullen 	return_cmp(NONE_GENERATED);
1985479ac375Sdm199847 	return_cmp(PROP_UNKNOWN);
1986479ac375Sdm199847 	return_cmp(NS_LDAP_CFG);
1987479ac375Sdm199847 	return_cmp(NS_LDAP_PARTIAL);
1988479ac375Sdm199847 	return_cmp(NS_LDAP_OP_FAILED);
1989479ac375Sdm199847 	return_cmp(NS_LDAP_BAD_WINNAME);
19904d61c878SJulian Pullen 	return_cmp(NO_ACTIVEDIRECTORY);
1991c5c4113dSnw141292 #undef return_cmp
1992c5c4113dSnw141292 
1993c5c4113dSnw141292 	return (IDMAP_ERR_OTHER);
1994c5c4113dSnw141292 }
1995c5c4113dSnw141292 
1996c5c4113dSnw141292 
1997c5c4113dSnw141292 /*
1998c5c4113dSnw141292  * Map the given status to one that can be returned by the protocol
1999c5c4113dSnw141292  */
2000c5c4113dSnw141292 idmap_stat
idmap_stat4prot(idmap_stat status)2001cd37da74Snw141292 idmap_stat4prot(idmap_stat status)
2002cd37da74Snw141292 {
2003c5c4113dSnw141292 	switch (status) {
2004c5c4113dSnw141292 	case IDMAP_ERR_MEMORY:
2005c5c4113dSnw141292 	case IDMAP_ERR_CACHE:
2006c5c4113dSnw141292 		return (IDMAP_ERR_INTERNAL);
2007c5c4113dSnw141292 	}
2008c5c4113dSnw141292 	return (status);
2009c5c4113dSnw141292 }
2010dd5829d1Sbaban 
2011dd5829d1Sbaban 
2012dd5829d1Sbaban /*
2013c5a946baSbaban  * This is a convenience routine which duplicates a string after
2014c5a946baSbaban  * checking for NULL pointers. This function will return success if
2015c5a946baSbaban  * either the 'to' OR 'from' pointers are NULL.
20168e228215Sdm199847  */
20178e228215Sdm199847 static idmap_stat
idmap_strdupnull(char ** to,const char * from)2018cd37da74Snw141292 idmap_strdupnull(char **to, const char *from)
2019cd37da74Snw141292 {
2020c5a946baSbaban 	if (to == NULL)
2021c5a946baSbaban 		return (IDMAP_SUCCESS);
2022c5a946baSbaban 
20238e228215Sdm199847 	if (from == NULL || *from == '\0') {
20248e228215Sdm199847 		*to = NULL;
20258e228215Sdm199847 		return (IDMAP_SUCCESS);
20268e228215Sdm199847 	}
20278e228215Sdm199847 
20288e228215Sdm199847 	*to = strdup(from);
20298e228215Sdm199847 	if (*to == NULL)
20308e228215Sdm199847 		return (IDMAP_ERR_MEMORY);
20318e228215Sdm199847 	return (IDMAP_SUCCESS);
20328e228215Sdm199847 }
20338e228215Sdm199847 
203448258c6bSjp151216 
20358e228215Sdm199847 idmap_stat
idmap_namerule_cpy(idmap_namerule * to,idmap_namerule * from)2036cd37da74Snw141292 idmap_namerule_cpy(idmap_namerule *to, idmap_namerule *from)
2037cd37da74Snw141292 {
20388e228215Sdm199847 	idmap_stat retval;
20398e228215Sdm199847 
204048258c6bSjp151216 	if (to == NULL)
204148258c6bSjp151216 		return (IDMAP_SUCCESS);
204248258c6bSjp151216 
20438e228215Sdm199847 	(void) memcpy(to, from, sizeof (idmap_namerule));
204448258c6bSjp151216 	to->windomain = NULL;
204548258c6bSjp151216 	to->winname = NULL;
204648258c6bSjp151216 	to->unixname = NULL;
20478e228215Sdm199847 
20488e228215Sdm199847 	retval = idmap_strdupnull(&to->windomain, from->windomain);
20498e228215Sdm199847 	if (retval != IDMAP_SUCCESS)
20508e228215Sdm199847 		return (retval);
20518e228215Sdm199847 
20528e228215Sdm199847 	retval = idmap_strdupnull(&to->winname, from->winname);
205348258c6bSjp151216 	if (retval != IDMAP_SUCCESS) {
205448258c6bSjp151216 		free(to->windomain);
205548258c6bSjp151216 		to->windomain = NULL;
205648258c6bSjp151216 		return (retval);
205748258c6bSjp151216 	}
205848258c6bSjp151216 
205948258c6bSjp151216 	retval = idmap_strdupnull(&to->unixname, from->unixname);
206048258c6bSjp151216 	if (retval != IDMAP_SUCCESS) {
206148258c6bSjp151216 		free(to->windomain);
206248258c6bSjp151216 		to->windomain = NULL;
206348258c6bSjp151216 		free(to->winname);
206448258c6bSjp151216 		to->winname = NULL;
206548258c6bSjp151216 		return (retval);
206648258c6bSjp151216 	}
206748258c6bSjp151216 
206848258c6bSjp151216 	return (retval);
206948258c6bSjp151216 }
207048258c6bSjp151216 
207148258c6bSjp151216 
207248258c6bSjp151216 /*
2073148c5f43SAlan Wright  * Move the contents of the "info" structure from "from" to "to".
207448258c6bSjp151216  */
2075148c5f43SAlan Wright void
idmap_info_mov(idmap_info * to,idmap_info * from)207648258c6bSjp151216 idmap_info_mov(idmap_info *to, idmap_info *from)
207748258c6bSjp151216 {
207848258c6bSjp151216 	(void) memcpy(to, from, sizeof (idmap_info));
207948258c6bSjp151216 	(void) memset(from, 0, sizeof (idmap_info));
208048258c6bSjp151216 }
208148258c6bSjp151216 
208248258c6bSjp151216 
208348258c6bSjp151216 void
idmap_info_free(idmap_info * info)208448258c6bSjp151216 idmap_info_free(idmap_info *info)
208548258c6bSjp151216 {
208648258c6bSjp151216 	if (info == NULL)
208748258c6bSjp151216 		return;
208848258c6bSjp151216 
2089148c5f43SAlan Wright 	xdr_free(xdr_idmap_info, (caddr_t)info);
2090148c5f43SAlan Wright 	(void) memset(info, 0, sizeof (idmap_info));
209148258c6bSjp151216 }
2092148c5f43SAlan Wright 
2093148c5f43SAlan Wright 
2094148c5f43SAlan Wright void
idmap_how_clear(idmap_how * how)2095148c5f43SAlan Wright idmap_how_clear(idmap_how *how)
2096148c5f43SAlan Wright {
2097148c5f43SAlan Wright 	xdr_free(xdr_idmap_how, (caddr_t)how);
2098148c5f43SAlan Wright 	(void) memset(how, 0, sizeof (*how));
209948258c6bSjp151216 }
210048258c6bSjp151216 
210148258c6bSjp151216 
21028e228215Sdm199847 /*
2103dd5829d1Sbaban  * Get uid given Windows name
2104dd5829d1Sbaban  */
2105dd5829d1Sbaban idmap_stat
idmap_getuidbywinname(const char * name,const char * domain,int flag,uid_t * uid)21063ee87bcaSJulian Pullen idmap_getuidbywinname(const char *name, const char *domain, int flag,
21073ee87bcaSJulian Pullen 	uid_t *uid)
2108cd37da74Snw141292 {
2109dd5829d1Sbaban 	idmap_retcode	rc;
2110cd37da74Snw141292 	int		is_user = 1;
2111cd37da74Snw141292 	int		is_wuser = -1;
21123ee87bcaSJulian Pullen 	int 		direction;
2113dd5829d1Sbaban 
2114dd5829d1Sbaban 	if (uid == NULL)
2115dd5829d1Sbaban 		return (IDMAP_ERR_ARG);
2116dd5829d1Sbaban 
21173ee87bcaSJulian Pullen 	if (flag & IDMAP_REQ_FLG_USE_CACHE) {
21183ee87bcaSJulian Pullen 		rc = idmap_cache_lookup_uidbywinname(name, domain, uid);
21193ee87bcaSJulian Pullen 		if (rc == IDMAP_SUCCESS || rc == IDMAP_ERR_MEMORY)
21203ee87bcaSJulian Pullen 			return (rc);
21213ee87bcaSJulian Pullen 	}
2122dd5829d1Sbaban 	/* Get mapping */
21231fdeec65Sjoyce mcintosh 	rc = idmap_get_w2u_mapping(NULL, NULL, name, domain, flag,
21243ee87bcaSJulian Pullen 	    &is_user, &is_wuser, uid, NULL, &direction, NULL);
2125dd5829d1Sbaban 
21263ee87bcaSJulian Pullen 	if (rc == IDMAP_SUCCESS && (flag & IDMAP_REQ_FLG_USE_CACHE)) {
21273ee87bcaSJulian Pullen 		/* If we have not got the domain don't store UID to winname */
21283ee87bcaSJulian Pullen 		if (domain == NULL)
21293ee87bcaSJulian Pullen 			direction = IDMAP_DIRECTION_W2U;
21303ee87bcaSJulian Pullen 		idmap_cache_add_winname2uid(name, domain, *uid, direction);
21313ee87bcaSJulian Pullen 	}
21323ee87bcaSJulian Pullen 
2133dd5829d1Sbaban 	return (rc);
2134dd5829d1Sbaban }
2135dd5829d1Sbaban 
2136dd5829d1Sbaban 
2137dd5829d1Sbaban /*
2138dd5829d1Sbaban  * Get gid given Windows name
2139dd5829d1Sbaban  */
2140dd5829d1Sbaban idmap_stat
idmap_getgidbywinname(const char * name,const char * domain,int flag,gid_t * gid)21413ee87bcaSJulian Pullen idmap_getgidbywinname(const char *name, const char *domain, int flag,
21423ee87bcaSJulian Pullen 	gid_t *gid)
2143cd37da74Snw141292 {
2144dd5829d1Sbaban 	idmap_retcode	rc;
2145cd37da74Snw141292 	int		is_user = 0;
2146cd37da74Snw141292 	int		is_wuser = -1;
21473ee87bcaSJulian Pullen 	int		direction;
2148dd5829d1Sbaban 
2149dd5829d1Sbaban 	if (gid == NULL)
2150dd5829d1Sbaban 		return (IDMAP_ERR_ARG);
2151dd5829d1Sbaban 
21523ee87bcaSJulian Pullen 	if (flag & IDMAP_REQ_FLG_USE_CACHE) {
21533ee87bcaSJulian Pullen 		rc = idmap_cache_lookup_gidbywinname(name, domain, gid);
21543ee87bcaSJulian Pullen 		if (rc == IDMAP_SUCCESS || rc == IDMAP_ERR_MEMORY)
21553ee87bcaSJulian Pullen 			return (rc);
21563ee87bcaSJulian Pullen 	}
21573ee87bcaSJulian Pullen 
2158dd5829d1Sbaban 	/* Get mapping */
21591fdeec65Sjoyce mcintosh 	rc = idmap_get_w2u_mapping(NULL, NULL, name, domain, flag,
21603ee87bcaSJulian Pullen 	    &is_user, &is_wuser, gid, NULL, &direction, NULL);
2161dd5829d1Sbaban 
21623ee87bcaSJulian Pullen 	if (rc == IDMAP_SUCCESS && (flag & IDMAP_REQ_FLG_USE_CACHE)) {
21633ee87bcaSJulian Pullen 		/* If we have not got the domain don't store GID to winname */
21643ee87bcaSJulian Pullen 		if (domain == NULL)
21653ee87bcaSJulian Pullen 			direction = IDMAP_DIRECTION_W2U;
21663ee87bcaSJulian Pullen 		idmap_cache_add_winname2gid(name, domain, *gid, direction);
21673ee87bcaSJulian Pullen 	}
21683ee87bcaSJulian Pullen 
2169dd5829d1Sbaban 	return (rc);
2170dd5829d1Sbaban }
2171dd5829d1Sbaban 
2172dd5829d1Sbaban 
2173dd5829d1Sbaban /*
2174dd5829d1Sbaban  * Get winname given pid
2175dd5829d1Sbaban  */
2176*1ed6b69aSGordon Ross idmap_stat
idmap_getwinnamebypid(uid_t pid,int is_user,int flag,char ** name,char ** domain)21773ee87bcaSJulian Pullen idmap_getwinnamebypid(uid_t pid, int is_user, int flag, char **name,
21783ee87bcaSJulian Pullen 	char **domain)
2179cd37da74Snw141292 {
2180dd5829d1Sbaban 	idmap_retcode	rc;
2181dd5829d1Sbaban 	int		len;
2182dd5829d1Sbaban 	char		*winname, *windomain;
21833ee87bcaSJulian Pullen 	int		direction;
2184dd5829d1Sbaban 
2185dd5829d1Sbaban 	if (name == NULL)
2186dd5829d1Sbaban 		return (IDMAP_ERR_ARG);
2187dd5829d1Sbaban 
21883ee87bcaSJulian Pullen 	if (flag & IDMAP_REQ_FLG_USE_CACHE) {
21893ee87bcaSJulian Pullen 		if (is_user)
21903ee87bcaSJulian Pullen 			rc = idmap_cache_lookup_winnamebyuid(&winname,
21913ee87bcaSJulian Pullen 			    &windomain, pid);
21923ee87bcaSJulian Pullen 		else
21933ee87bcaSJulian Pullen 			rc = idmap_cache_lookup_winnamebygid(&winname,
21943ee87bcaSJulian Pullen 			    &windomain, pid);
21953ee87bcaSJulian Pullen 		if (rc == IDMAP_SUCCESS)
21963ee87bcaSJulian Pullen 			goto out;
21973ee87bcaSJulian Pullen 		if (rc == IDMAP_ERR_MEMORY)
21983ee87bcaSJulian Pullen 			return (rc);
21993ee87bcaSJulian Pullen 	}
22003ee87bcaSJulian Pullen 
2201dd5829d1Sbaban 	/* Get mapping */
22021fdeec65Sjoyce mcintosh 	rc = idmap_get_u2w_mapping(&pid, NULL, flag, is_user, NULL,
22033ee87bcaSJulian Pullen 	    NULL, NULL, &winname, &windomain, &direction, NULL);
2204dd5829d1Sbaban 
2205dd5829d1Sbaban 	/* Return on error */
2206dd5829d1Sbaban 	if (rc != IDMAP_SUCCESS)
2207dd5829d1Sbaban 		return (rc);
2208dd5829d1Sbaban 
2209dd5829d1Sbaban 	/*
2210dd5829d1Sbaban 	 * The given PID may have been mapped to a locally
2211dd5829d1Sbaban 	 * generated SID in which case there isn't any
2212dd5829d1Sbaban 	 * Windows name
2213dd5829d1Sbaban 	 */
22148ce3a038SMarcel Telka 	if (winname == NULL) {
2215dd5829d1Sbaban 		idmap_free(windomain);
2216dd5829d1Sbaban 		return (IDMAP_ERR_NORESULT);
2217dd5829d1Sbaban 	}
2218dd5829d1Sbaban 
22193ee87bcaSJulian Pullen 	if (flag & IDMAP_REQ_FLG_USE_CACHE) {
22203ee87bcaSJulian Pullen 		if (is_user)
22213ee87bcaSJulian Pullen 			idmap_cache_add_winname2uid(winname, windomain,
22223ee87bcaSJulian Pullen 			    pid, direction);
22233ee87bcaSJulian Pullen 		else
22243ee87bcaSJulian Pullen 			idmap_cache_add_winname2gid(winname, windomain,
22253ee87bcaSJulian Pullen 			    pid, direction);
22263ee87bcaSJulian Pullen 	}
22273ee87bcaSJulian Pullen 
22283ee87bcaSJulian Pullen out:
2229dd5829d1Sbaban 	if (domain != NULL) {
2230dd5829d1Sbaban 		*name = winname;
2231dd5829d1Sbaban 		*domain = windomain;
2232dd5829d1Sbaban 	} else {
22338ce3a038SMarcel Telka 		char *wd = windomain != NULL ? windomain : "";
22348ce3a038SMarcel Telka 		len = snprintf(NULL, 0, "%s@%s", winname, wd) + 1;
2235dd5829d1Sbaban 		if ((*name = malloc(len)) != NULL)
22368ce3a038SMarcel Telka 			(void) snprintf(*name, len, "%s@%s", winname, wd);
2237dd5829d1Sbaban 		else
2238dd5829d1Sbaban 			rc = IDMAP_ERR_MEMORY;
2239dd5829d1Sbaban 		idmap_free(winname);
2240dd5829d1Sbaban 		idmap_free(windomain);
2241dd5829d1Sbaban 	}
22423ee87bcaSJulian Pullen 
2243dd5829d1Sbaban 	return (rc);
2244dd5829d1Sbaban }
2245dd5829d1Sbaban 
2246dd5829d1Sbaban 
2247dd5829d1Sbaban /*
2248dd5829d1Sbaban  * Get winname given uid
2249dd5829d1Sbaban  */
2250dd5829d1Sbaban idmap_stat
idmap_getwinnamebyuid(uid_t uid,int flag,char ** name,char ** domain)22513ee87bcaSJulian Pullen idmap_getwinnamebyuid(uid_t uid, int flag, char **name, char **domain)
2252cd37da74Snw141292 {
22533ee87bcaSJulian Pullen 	return (idmap_getwinnamebypid(uid, 1, flag, name, domain));
2254dd5829d1Sbaban }
2255dd5829d1Sbaban 
2256dd5829d1Sbaban 
2257dd5829d1Sbaban /*
2258dd5829d1Sbaban  * Get winname given gid
2259dd5829d1Sbaban  */
2260dd5829d1Sbaban idmap_stat
idmap_getwinnamebygid(gid_t gid,int flag,char ** name,char ** domain)22613ee87bcaSJulian Pullen idmap_getwinnamebygid(gid_t gid, int flag, char **name, char **domain)
2262cd37da74Snw141292 {
22633ee87bcaSJulian Pullen 	return (idmap_getwinnamebypid(gid, 0, flag, name, domain));
2264dd5829d1Sbaban }
22659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
22669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
idmap_flush(idmap_flush_op op)22671fdeec65Sjoyce mcintosh idmap_flush(idmap_flush_op op)
22689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
22691fdeec65Sjoyce mcintosh 	idmap_retcode		rc1, rc2;
22709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
22711fdeec65Sjoyce mcintosh 	rc1 = _idmap_clnt_call(IDMAP_FLUSH,
22729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (xdrproc_t)xdr_idmap_flush_op, (caddr_t)&op,
22731fdeec65Sjoyce mcintosh 	    (xdrproc_t)xdr_idmap_retcode, (caddr_t)&rc2, TIMEOUT);
22749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
22751fdeec65Sjoyce mcintosh 	if (rc1 != IDMAP_SUCCESS)
22761fdeec65Sjoyce mcintosh 		return (rc1);
22771fdeec65Sjoyce mcintosh 	return (rc2);
22789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2279c5866007SKeyur Desai 
2280c5866007SKeyur Desai 
2281c5866007SKeyur Desai /*
2282c5866007SKeyur Desai  * syslog is the default logger.
2283c5866007SKeyur Desai  * It can be overwritten by supplying a logger
2284c5866007SKeyur Desai  * with  idmap_set_logger()
2285c5866007SKeyur Desai  */
2286c5866007SKeyur Desai idmap_logger_t logger = syslog;
2287c5866007SKeyur Desai 
2288c5866007SKeyur Desai 
2289c5866007SKeyur Desai void
idmap_set_logger(idmap_logger_t funct)2290c5866007SKeyur Desai idmap_set_logger(idmap_logger_t funct)
2291c5866007SKeyur Desai {
2292c5866007SKeyur Desai 	logger = funct;
2293c5866007SKeyur Desai }
2294148c5f43SAlan Wright 
2295148c5f43SAlan Wright /*
2296148c5f43SAlan Wright  * Helper functions that concatenate two parts of a name and then
2297148c5f43SAlan Wright  * look up a value, so that the same set of functions can be used to
2298148c5f43SAlan Wright  * process both "in" and "out" parameters.
2299148c5f43SAlan Wright  */
2300148c5f43SAlan Wright static
2301148c5f43SAlan Wright boolean_t
idmap_trace_get_str(nvlist_t * entry,char * n1,char * n2,char ** ret)2302148c5f43SAlan Wright idmap_trace_get_str(nvlist_t *entry, char *n1, char *n2, char **ret)
2303148c5f43SAlan Wright {
2304148c5f43SAlan Wright 	char name[IDMAP_TRACE_NAME_MAX+1];	/* Max used is about 11 */
2305148c5f43SAlan Wright 	int err;
2306148c5f43SAlan Wright 
2307148c5f43SAlan Wright 	(void) strlcpy(name, n1, sizeof (name));
2308148c5f43SAlan Wright 	if (n2 != NULL)
2309148c5f43SAlan Wright 		(void) strlcat(name, n2, sizeof (name));
2310148c5f43SAlan Wright 
2311148c5f43SAlan Wright 	err = nvlist_lookup_string(entry, name, ret);
2312148c5f43SAlan Wright 	return (err == 0);
2313148c5f43SAlan Wright }
2314148c5f43SAlan Wright 
2315148c5f43SAlan Wright static
2316148c5f43SAlan Wright boolean_t
idmap_trace_get_int(nvlist_t * entry,char * n1,char * n2,int64_t * ret)2317148c5f43SAlan Wright idmap_trace_get_int(nvlist_t *entry, char *n1, char *n2, int64_t *ret)
2318148c5f43SAlan Wright {
2319148c5f43SAlan Wright 	char name[IDMAP_TRACE_NAME_MAX+1];	/* Max used is about 11 */
2320148c5f43SAlan Wright 	int err;
2321148c5f43SAlan Wright 
2322148c5f43SAlan Wright 	(void) strlcpy(name, n1, sizeof (name));
2323148c5f43SAlan Wright 	if (n2 != NULL)
2324148c5f43SAlan Wright 		(void) strlcat(name, n2, sizeof (name));
2325148c5f43SAlan Wright 
2326148c5f43SAlan Wright 	err = nvlist_lookup_int64(entry, name, ret);
2327148c5f43SAlan Wright 	return (err == 0);
2328148c5f43SAlan Wright }
2329148c5f43SAlan Wright 
2330148c5f43SAlan Wright static
2331148c5f43SAlan Wright void
idmap_trace_print_id(FILE * out,nvlist_t * entry,char * fromto)2332148c5f43SAlan Wright idmap_trace_print_id(FILE *out, nvlist_t *entry, char *fromto)
2333148c5f43SAlan Wright {
2334148c5f43SAlan Wright 	char *s;
2335148c5f43SAlan Wright 	int64_t i64;
2336148c5f43SAlan Wright 
2337148c5f43SAlan Wright 	if (idmap_trace_get_int(entry, fromto, IDMAP_TRACE_TYPE, &i64)) {
2338148c5f43SAlan Wright 		switch (i64) {
2339148c5f43SAlan Wright 		case IDMAP_POSIXID:
2340148c5f43SAlan Wright 			(void) fprintf(out, "unixname ");
2341148c5f43SAlan Wright 			break;
2342148c5f43SAlan Wright 		case IDMAP_UID:
2343148c5f43SAlan Wright 			(void) fprintf(out, "unixuser ");
2344148c5f43SAlan Wright 			break;
2345148c5f43SAlan Wright 		case IDMAP_GID:
2346148c5f43SAlan Wright 			(void) fprintf(out, "unixgroup ");
2347148c5f43SAlan Wright 			break;
2348148c5f43SAlan Wright 		case IDMAP_SID:
2349148c5f43SAlan Wright 			(void) fprintf(out, "winname ");
2350148c5f43SAlan Wright 			break;
2351148c5f43SAlan Wright 		case IDMAP_USID:
2352148c5f43SAlan Wright 			(void) fprintf(out, "winuser ");
2353148c5f43SAlan Wright 			break;
2354148c5f43SAlan Wright 		case IDMAP_GSID:
2355148c5f43SAlan Wright 			(void) fprintf(out, "wingroup ");
2356148c5f43SAlan Wright 			break;
2357148c5f43SAlan Wright 		case IDMAP_NONE:
2358148c5f43SAlan Wright 			(void) fprintf(out, gettext("unknown "));
2359148c5f43SAlan Wright 			break;
2360148c5f43SAlan Wright 		default:
2361148c5f43SAlan Wright 			(void) fprintf(out, gettext("bad %d "), (int)i64);
2362148c5f43SAlan Wright 			break;
2363148c5f43SAlan Wright 		}
2364148c5f43SAlan Wright 	}
2365148c5f43SAlan Wright 
2366148c5f43SAlan Wright 	if (idmap_trace_get_str(entry, fromto, IDMAP_TRACE_NAME, &s))
2367148c5f43SAlan Wright 		(void) fprintf(out, "%s ", s);
2368148c5f43SAlan Wright 
2369148c5f43SAlan Wright 	if (idmap_trace_get_str(entry, fromto, IDMAP_TRACE_SID, &s))
2370148c5f43SAlan Wright 		(void) fprintf(out, "%s ", s);
2371148c5f43SAlan Wright 
2372148c5f43SAlan Wright 	if (idmap_trace_get_int(entry, fromto, IDMAP_TRACE_UNIXID, &i64))
2373148c5f43SAlan Wright 		(void) fprintf(out, "%u ", (uid_t)i64);
2374148c5f43SAlan Wright }
2375148c5f43SAlan Wright 
2376148c5f43SAlan Wright void
idmap_trace_print_1(FILE * out,char * prefix,nvlist_t * entry)2377148c5f43SAlan Wright idmap_trace_print_1(FILE *out, char *prefix, nvlist_t *entry)
2378148c5f43SAlan Wright {
2379148c5f43SAlan Wright 	char *s;
2380148c5f43SAlan Wright 	int64_t i64;
2381148c5f43SAlan Wright 
2382148c5f43SAlan Wright 	(void) fprintf(out, "%s", prefix);
2383148c5f43SAlan Wright 	idmap_trace_print_id(out, entry, "from");
2384148c5f43SAlan Wright 	(void) fprintf(out, "-> ");
2385148c5f43SAlan Wright 	idmap_trace_print_id(out, entry, "to");
2386148c5f43SAlan Wright 	if (idmap_trace_get_int(entry, IDMAP_TRACE_ERROR, NULL, &i64))
2387148c5f43SAlan Wright 		(void) fprintf(out, gettext("Error %d "), (int)i64);
2388148c5f43SAlan Wright 	(void) fprintf(out, "-");
2389148c5f43SAlan Wright 	if (idmap_trace_get_str(entry, IDMAP_TRACE_MESSAGE, NULL, &s))
2390148c5f43SAlan Wright 		(void) fprintf(out, " %s", s);
2391148c5f43SAlan Wright 	(void) fprintf(out, "\n");
2392148c5f43SAlan Wright }
2393148c5f43SAlan Wright 
2394148c5f43SAlan Wright void
idmap_trace_print(FILE * out,char * prefix,nvlist_t * trace)2395148c5f43SAlan Wright idmap_trace_print(FILE *out, char *prefix, nvlist_t *trace)
2396148c5f43SAlan Wright {
2397148c5f43SAlan Wright 	nvpair_t *nvp;
2398148c5f43SAlan Wright 
2399148c5f43SAlan Wright 	for (nvp = nvlist_next_nvpair(trace, NULL);
2400148c5f43SAlan Wright 	    nvp != NULL;
2401148c5f43SAlan Wright 	    nvp = nvlist_next_nvpair(trace, nvp)) {
2402148c5f43SAlan Wright 		nvlist_t *entry;
2403148c5f43SAlan Wright 		int err;
2404148c5f43SAlan Wright 
2405148c5f43SAlan Wright 		err = nvpair_value_nvlist(nvp, &entry);
2406148c5f43SAlan Wright 		assert(err == 0);
2407148c5f43SAlan Wright 
2408148c5f43SAlan Wright 		idmap_trace_print_1(out, prefix, entry);
2409148c5f43SAlan Wright 	}
2410148c5f43SAlan Wright }
2411