1c5c4113dSnw /*
2c5c4113dSnw  * CDDL HEADER START
3c5c4113dSnw  *
4c5c4113dSnw  * The contents of this file are subject to the terms of the
5c5c4113dSnw  * Common Development and Distribution License (the "License").
6c5c4113dSnw  * You may not use this file except in compliance with the License.
7c5c4113dSnw  *
8c5c4113dSnw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9c5c4113dSnw  * or http://www.opensolaris.org/os/licensing.
10c5c4113dSnw  * See the License for the specific language governing permissions
11c5c4113dSnw  * and limitations under the License.
12c5c4113dSnw  *
13c5c4113dSnw  * When distributing Covered Code, include this CDDL HEADER in each
14c5c4113dSnw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15c5c4113dSnw  * If applicable, add the following below this CDDL HEADER, with the
16c5c4113dSnw  * fields enclosed by brackets "[]" replaced with your own identifying
17c5c4113dSnw  * information: Portions Copyright [yyyy] [name of copyright owner]
18c5c4113dSnw  *
19c5c4113dSnw  * CDDL HEADER END
20c5c4113dSnw  */
21c5c4113dSnw /*
22*148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23c5c4113dSnw  */
24c5c4113dSnw 
25*148c5f43SAlan Wright %#if	defined(_KERNEL)
26*148c5f43SAlan Wright %#include <sys/nvpair.h>
27*148c5f43SAlan Wright %#else
28*148c5f43SAlan Wright %#include <libnvpair.h>
29*148c5f43SAlan Wright %#endif
30*148c5f43SAlan Wright 
31*148c5f43SAlan Wright /*
32*148c5f43SAlan Wright  * XDR support for nvlist_t.  libnvpair includes support for serializing
33*148c5f43SAlan Wright  * an nvlist, but does not include any direct XDR plug-in support.  Support
34*148c5f43SAlan Wright  * is made trickier by the fact that on read xdr_pointer() wants to allocate
35*148c5f43SAlan Wright  * structures on its own, even when there's a custom xdr_*() function for
36*148c5f43SAlan Wright  * the structure.  nvlist_unpack *also* wants to allocate the nvlist_t,
37*148c5f43SAlan Wright  * and it seems wrong to burn sizeof(nvlist_t) into the program binary.
38*148c5f43SAlan Wright  *
39*148c5f43SAlan Wright  * Another possibility is to use opaque<> in this declaration, but that
40*148c5f43SAlan Wright  * requires moving part of the encoding (the interaction with nvlist_pack
41*148c5f43SAlan Wright  * and nvlist_unpack) out into the application, instead of keeping it
42*148c5f43SAlan Wright  * all encapsulated in this layer.
43*148c5f43SAlan Wright  *
44*148c5f43SAlan Wright  * The resolution here is to put an nvlist_t * into a new typedef, and have
45*148c5f43SAlan Wright  * *that* typedef have a custom xdr_*() function.  xdr allocates space for
46*148c5f43SAlan Wright  * the pointer, but leaves all initialization of it nvlist_t *) to the
47*148c5f43SAlan Wright  * custom function.
48*148c5f43SAlan Wright  */
49*148c5f43SAlan Wright #if	defined(RPC_HDR)
50*148c5f43SAlan Wright %typedef nvlist_t *nvlist_t_ptr;
51*148c5f43SAlan Wright #endif
52*148c5f43SAlan Wright 
53*148c5f43SAlan Wright #if	defined(RPC_XDR)
54*148c5f43SAlan Wright %#if	!defined(_KERNEL)
55*148c5f43SAlan Wright %#include <string.h>
56*148c5f43SAlan Wright %#include <stdio.h>
57*148c5f43SAlan Wright %#endif
58*148c5f43SAlan Wright %
59*148c5f43SAlan Wright %bool_t
60*148c5f43SAlan Wright %xdr_nvlist_t_ptr(XDR *xdrs, nvlist_t_ptr *n)
61*148c5f43SAlan Wright %{
62*148c5f43SAlan Wright %	char *buf;
63*148c5f43SAlan Wright %	u_int len;
64*148c5f43SAlan Wright %	bool_t ret;
65*148c5f43SAlan Wright %	int err;
66*148c5f43SAlan Wright %	size_t	sz;
67*148c5f43SAlan Wright %	bool_t	present;
68*148c5f43SAlan Wright %
69*148c5f43SAlan Wright %	switch (xdrs->x_op) {
70*148c5f43SAlan Wright %	case XDR_DECODE:
71*148c5f43SAlan Wright %		if (!xdr_bool(xdrs, &present))
72*148c5f43SAlan Wright %			return (FALSE);
73*148c5f43SAlan Wright %		if (!present) {
74*148c5f43SAlan Wright %			*n = NULL;
75*148c5f43SAlan Wright %			return (TRUE);
76*148c5f43SAlan Wright %		}
77*148c5f43SAlan Wright %		buf = NULL;
78*148c5f43SAlan Wright %		if (!xdr_bytes(xdrs, &buf, &len, ~0))
79*148c5f43SAlan Wright %			return (FALSE);
80*148c5f43SAlan Wright %
81*148c5f43SAlan Wright %		err = nvlist_unpack(buf, (size_t)len, n, 0);
82*148c5f43SAlan Wright %#if	defined(_KERNEL)
83*148c5f43SAlan Wright %		kmem_free(buf, len);
84*148c5f43SAlan Wright %#else
85*148c5f43SAlan Wright %		free(buf);
86*148c5f43SAlan Wright %#endif
87*148c5f43SAlan Wright %
88*148c5f43SAlan Wright %		if (err != 0) {
89*148c5f43SAlan Wright %#if	!defined(_KERNEL)
90*148c5f43SAlan Wright %			fprintf(stderr, "xdr_nvlist_t unpack:  %s\n",
91*148c5f43SAlan Wright %			    strerror(err));
92*148c5f43SAlan Wright %#endif
93*148c5f43SAlan Wright %			return (FALSE);
94*148c5f43SAlan Wright %		}
95*148c5f43SAlan Wright %		return (TRUE);
96*148c5f43SAlan Wright %
97*148c5f43SAlan Wright %	case XDR_ENCODE:
98*148c5f43SAlan Wright %		present = (*n != NULL);
99*148c5f43SAlan Wright %		if (!xdr_bool(xdrs, &present))
100*148c5f43SAlan Wright %			return (FALSE);
101*148c5f43SAlan Wright %		if (!present)
102*148c5f43SAlan Wright %			return (TRUE);
103*148c5f43SAlan Wright %		buf = NULL;
104*148c5f43SAlan Wright %		err = nvlist_pack(*n, &buf, &sz, NV_ENCODE_XDR, 0);
105*148c5f43SAlan Wright %		if (err != 0) {
106*148c5f43SAlan Wright %#if	!defined(_KERNEL)
107*148c5f43SAlan Wright %			fprintf(stderr, "xdr_nvlist_t pack:  %s\n",
108*148c5f43SAlan Wright %			    strerror(err));
109*148c5f43SAlan Wright %#endif
110*148c5f43SAlan Wright %			return (FALSE);
111*148c5f43SAlan Wright %		}
112*148c5f43SAlan Wright %
113*148c5f43SAlan Wright %		/* nvlist_pack() and xdr_bytes() want different types */
114*148c5f43SAlan Wright %		len = (u_int) sz;
115*148c5f43SAlan Wright %
116*148c5f43SAlan Wright %		ret = xdr_bytes(xdrs, &buf, &len, ~0);
117*148c5f43SAlan Wright %#if	defined(_KERNEL)
118*148c5f43SAlan Wright %		kmem_free(buf, len);
119*148c5f43SAlan Wright %#else
120*148c5f43SAlan Wright %		free(buf);
121*148c5f43SAlan Wright %#endif
122*148c5f43SAlan Wright %
123*148c5f43SAlan Wright %		return (ret);
124*148c5f43SAlan Wright %
125*148c5f43SAlan Wright %	case XDR_FREE:
126*148c5f43SAlan Wright %		if (*n != NULL) {
127*148c5f43SAlan Wright %			nvlist_free(*n);
128*148c5f43SAlan Wright %			*n = NULL;
129*148c5f43SAlan Wright %		}
130*148c5f43SAlan Wright %		return (TRUE);
131*148c5f43SAlan Wright %
132*148c5f43SAlan Wright %	default:
133*148c5f43SAlan Wright %		return (FALSE);
134*148c5f43SAlan Wright %	}
135*148c5f43SAlan Wright %}
136*148c5f43SAlan Wright #endif
137*148c5f43SAlan Wright 
138c5c4113dSnw /* opaque type to support non-ASCII strings */
1398e228215Sdm typedef	string	idmap_utf8str<>;
1401fcced4cSJordan Brown typedef	idmap_utf8str	idmap_utf8str_list<>;
141c5c4113dSnw 
142c5c4113dSnw /* Return status */
143c5c4113dSnw typedef int idmap_retcode;
144c5c4113dSnw 
145c5c4113dSnw /* Identity types */
146c5c4113dSnw enum idmap_id_type {
147c5c4113dSnw 	IDMAP_NONE = 0,
148c5c4113dSnw 	IDMAP_UID = 1,
149c5c4113dSnw 	IDMAP_GID,
150c5c4113dSnw 	IDMAP_SID,
151cd37da74Snw 	IDMAP_USID,
152cd37da74Snw 	IDMAP_GSID,
153c5c4113dSnw 	IDMAP_POSIXID
154c5c4113dSnw };
155c5c4113dSnw 
15648258c6bSjp /* The type of ID mapping */
15748258c6bSjp enum idmap_map_type {
158479ac375Sdm 	IDMAP_MAP_TYPE_UNKNOWN = 0,
15948258c6bSjp 	IDMAP_MAP_TYPE_DS_AD,
16048258c6bSjp 	IDMAP_MAP_TYPE_DS_NLDAP,
16148258c6bSjp 	IDMAP_MAP_TYPE_RULE_BASED,
16248258c6bSjp 	IDMAP_MAP_TYPE_EPHEMERAL,
16348258c6bSjp 	IDMAP_MAP_TYPE_LOCAL_SID,
164e3f2c991SKeyur Desai 	IDMAP_MAP_TYPE_KNOWN_SID,
165e3f2c991SKeyur Desai 	IDMAP_MAP_TYPE_IDMU
16648258c6bSjp };
16748258c6bSjp 
16848258c6bSjp 
16948258c6bSjp /* Source of ID mapping */
17048258c6bSjp enum idmap_map_src {
17148258c6bSjp 	IDMAP_MAP_SRC_UNKNOWN = 0,
17248258c6bSjp 	IDMAP_MAP_SRC_NEW,
17348258c6bSjp 	IDMAP_MAP_SRC_CACHE,
17448258c6bSjp 	IDMAP_MAP_SRC_HARD_CODED,
17548258c6bSjp 	IDMAP_MAP_SRC_ALGORITHMIC
17648258c6bSjp };
17748258c6bSjp 
17848258c6bSjp 
179c5c4113dSnw /* SID */
180c5c4113dSnw struct idmap_sid {
181c5c4113dSnw 	string		prefix<>;
182c5c4113dSnw 	uint32_t	rid;
183c5c4113dSnw };
184c5c4113dSnw 
185c5c4113dSnw /* Identity (sid-posix) */
186c5c4113dSnw union idmap_id switch(idmap_id_type idtype) {
187c5c4113dSnw 	case IDMAP_UID: uint32_t uid;
188c5c4113dSnw 	case IDMAP_GID: uint32_t gid;
189c5c4113dSnw 	case IDMAP_SID: idmap_sid sid;
190cd37da74Snw 	case IDMAP_USID: idmap_sid usid;
191cd37da74Snw 	case IDMAP_GSID: idmap_sid gsid;
192c5c4113dSnw 	case IDMAP_NONE: void;
193c5c4113dSnw 	case IDMAP_POSIXID: void;
194c5c4113dSnw };
19548258c6bSjp 
19648258c6bSjp 
19748258c6bSjp /* Name-based mapping rules */
19848258c6bSjp struct idmap_namerule {
19948258c6bSjp 	bool		is_user;
20048258c6bSjp 	bool		is_wuser;
20148258c6bSjp 	int		direction;
20248258c6bSjp 	idmap_utf8str	windomain;
20348258c6bSjp 	idmap_utf8str	winname;
20448258c6bSjp 	idmap_utf8str	unixname;
20548258c6bSjp 	bool		is_nt4;
20648258c6bSjp };
20748258c6bSjp struct idmap_namerules_res {
20848258c6bSjp 	idmap_retcode	retcode;
20948258c6bSjp 	uint64_t	lastrowid;
21048258c6bSjp 	idmap_namerule	rules<>;
21148258c6bSjp };
21248258c6bSjp 
21348258c6bSjp /* How ID is mapped */
21448258c6bSjp struct idmap_how_ds_based {
21548258c6bSjp 	idmap_utf8str	dn;
21648258c6bSjp 	idmap_utf8str	attr;
21748258c6bSjp 	idmap_utf8str	value;
21848258c6bSjp };
219e3f2c991SKeyur Desai 
22048258c6bSjp union idmap_how switch(idmap_map_type map_type) {
22148258c6bSjp 	case IDMAP_MAP_TYPE_UNKNOWN: void;
22248258c6bSjp 	case IDMAP_MAP_TYPE_DS_AD: idmap_how_ds_based ad;
22348258c6bSjp 	case IDMAP_MAP_TYPE_DS_NLDAP: idmap_how_ds_based nldap;
22448258c6bSjp 	case IDMAP_MAP_TYPE_RULE_BASED: idmap_namerule rule;
22548258c6bSjp 	case IDMAP_MAP_TYPE_EPHEMERAL: void;
22648258c6bSjp 	case IDMAP_MAP_TYPE_LOCAL_SID: void;
227479ac375Sdm 	case IDMAP_MAP_TYPE_KNOWN_SID: void;
228e3f2c991SKeyur Desai 	case IDMAP_MAP_TYPE_IDMU: idmap_how_ds_based idmu;
22948258c6bSjp };
23048258c6bSjp 
23148258c6bSjp struct idmap_info {
23248258c6bSjp 	idmap_map_src	src;
23348258c6bSjp 	idmap_how	how;
234*148c5f43SAlan Wright 	nvlist_t_ptr	trace;
23548258c6bSjp };
23648258c6bSjp 
23748258c6bSjp 
23848258c6bSjp /* Id result */
239c5c4113dSnw struct idmap_id_res {
240c5c4113dSnw 	idmap_retcode	retcode;
241c5c4113dSnw 	idmap_id	id;
242c5c4113dSnw 	int		direction;
24348258c6bSjp 	idmap_info	info;
244c5c4113dSnw };
245c5c4113dSnw struct idmap_ids_res {
246c5c4113dSnw 	idmap_retcode	retcode;
247c5c4113dSnw 	idmap_id_res	ids<>;
248c5c4113dSnw };
249c5c4113dSnw 
250c5c4113dSnw 
251c5c4113dSnw /*
252c5c4113dSnw  * Flag supported by mapping requests
253c5c4113dSnw  */
2543ee87bcaSJulian Pullen 
255c5c4113dSnw /* Don't allocate a new value for the mapping */
256c5c4113dSnw const IDMAP_REQ_FLG_NO_NEW_ID_ALLOC	= 0x00000001;
2573ee87bcaSJulian Pullen 
258c5c4113dSnw /* Validate the given identity before mapping */
259c5c4113dSnw const IDMAP_REQ_FLG_VALIDATE		= 0x00000002;
2603ee87bcaSJulian Pullen 
261c5c4113dSnw /* Avoid name service lookups to prevent looping */
262c5c4113dSnw const IDMAP_REQ_FLG_NO_NAMESERVICE	= 0x00000004;
2633ee87bcaSJulian Pullen 
26448258c6bSjp /* Request how a mapping was formed */
26548258c6bSjp const IDMAP_REQ_FLG_MAPPING_INFO	= 0x00000008;
2662b4a7802SBaban Kenkre 
2673ee87bcaSJulian Pullen /*
2683ee87bcaSJulian Pullen  * This libidmap only flag is defined in idmap.h
2693ee87bcaSJulian Pullen  * It enables use of the libidmap cache
2703ee87bcaSJulian Pullen  * const IDMAP_REQ_FLG_USE_CACHE	= 0x00000010;
2713ee87bcaSJulian Pullen  */
272c5c4113dSnw 
2732b4a7802SBaban Kenkre /* Request mapping for well-known or local SIDs only */
2742b4a7802SBaban Kenkre const IDMAP_REQ_FLG_WK_OR_LOCAL_SIDS_ONLY	= 0x00000020;
2752b4a7802SBaban Kenkre 
276*148c5f43SAlan Wright /* Request trace of mapping process */
277*148c5f43SAlan Wright const IDMAP_REQ_FLG_TRACE	= 0x00000040;
278*148c5f43SAlan Wright 
279d15447b6Sjp 
280d15447b6Sjp /*
281d15447b6Sjp  * Mapping direction definitions
282d15447b6Sjp  */
283d15447b6Sjp const IDMAP_DIRECTION_UNDEF =	-1;	/* not defined */
284d15447b6Sjp const IDMAP_DIRECTION_BI =	0;	/* bi-directional */
285d15447b6Sjp const IDMAP_DIRECTION_W2U =	1;	/* windows to unix only */
286d15447b6Sjp const IDMAP_DIRECTION_U2W =	2;	/* unix to windows only */
287d15447b6Sjp 
288d15447b6Sjp 
289c5c4113dSnw /* Identity mappings (sid-posix) */
290c5c4113dSnw struct idmap_mapping {
291c5c4113dSnw 	int32_t		flag;
292c5c4113dSnw 	int		direction;
293c5c4113dSnw 	idmap_id	id1;
294c5c4113dSnw 	idmap_utf8str	id1domain;
295c5c4113dSnw 	idmap_utf8str	id1name;
296c5c4113dSnw 	idmap_id	id2;
297c5c4113dSnw 	idmap_utf8str	id2domain;
298c5c4113dSnw 	idmap_utf8str	id2name;
29948258c6bSjp 	idmap_info	info;
300c5c4113dSnw };
30148258c6bSjp 
30248258c6bSjp typedef idmap_mapping	idmap_mapping_batch<>;
30348258c6bSjp 
304*148c5f43SAlan Wright #ifndef IDMAP_XDR_MAPPING_ONLY
305c5c4113dSnw struct idmap_mappings_res {
306c5c4113dSnw 	idmap_retcode		retcode;
307c5c4113dSnw 	uint64_t		lastrowid;
308c5c4113dSnw 	idmap_mapping		mappings<>;
309c5c4113dSnw };
310c5c4113dSnw 
311c5c4113dSnw 
31248258c6bSjp /* Update result */
3138e228215Sdm struct idmap_update_res {
3148e228215Sdm 	idmap_retcode	retcode;
3158e228215Sdm 	int64_t	error_index;
3168e228215Sdm 	idmap_namerule	error_rule;
3178e228215Sdm 	idmap_namerule	conflict_rule;
3188e228215Sdm };
3198e228215Sdm 
320c5c4113dSnw /* Update requests */
321c5c4113dSnw enum idmap_opnum {
322c5c4113dSnw 	OP_NONE = 0,
323c5c4113dSnw 	OP_ADD_NAMERULE = 1,
324c5c4113dSnw 	OP_RM_NAMERULE = 2,
325c5c4113dSnw 	OP_FLUSH_NAMERULES = 3
326c5c4113dSnw };
327c5c4113dSnw union idmap_update_op switch(idmap_opnum opnum) {
328c5c4113dSnw 	case OP_ADD_NAMERULE:
329c5c4113dSnw 	case OP_RM_NAMERULE:
330c5c4113dSnw 		idmap_namerule rule;
331c5c4113dSnw 	default:
332c5c4113dSnw 		void;
333c5c4113dSnw };
334c5c4113dSnw typedef idmap_update_op idmap_update_batch<>;
335c5c4113dSnw 
336479ac375Sdm const AD_DISC_MAXHOSTNAME = 256;
337479ac375Sdm 
338479ac375Sdm struct idmap_ad_disc_ds_t {
339479ac375Sdm 	int	port;
340479ac375Sdm 	int	priority;
341479ac375Sdm 	int	weight;
342479ac375Sdm 	char	host[AD_DISC_MAXHOSTNAME];
343479ac375Sdm };
344479ac375Sdm 
345479ac375Sdm 
346479ac375Sdm /* get-prop, set-prop */
347479ac375Sdm enum idmap_prop_type {
348479ac375Sdm 	PROP_UNKNOWN = 0,
349479ac375Sdm 	PROP_LIST_SIZE_LIMIT = 1,
350479ac375Sdm 	PROP_DEFAULT_DOMAIN = 2,	/* default domain name */
351479ac375Sdm 	PROP_DOMAIN_NAME = 3,		/* AD domain name */
352479ac375Sdm 	PROP_MACHINE_SID = 4,		/* machine sid */
353479ac375Sdm 	PROP_DOMAIN_CONTROLLER = 5,	/* domain controller hosts */
354479ac375Sdm 	PROP_FOREST_NAME = 6,		/* forest name */
355479ac375Sdm 	PROP_SITE_NAME = 7,		/* site name */
356479ac375Sdm 	PROP_GLOBAL_CATALOG = 8,	/* global catalog hosts */
357479ac375Sdm 	PROP_AD_UNIXUSER_ATTR = 9,
358479ac375Sdm 	PROP_AD_UNIXGROUP_ATTR = 10,
359479ac375Sdm 	PROP_NLDAP_WINNAME_ATTR = 11,
360e3f2c991SKeyur Desai 	PROP_DIRECTORY_BASED_MAPPING = 12
361479ac375Sdm };
362479ac375Sdm 
363479ac375Sdm union idmap_prop_val switch(idmap_prop_type prop) {
364479ac375Sdm 	case PROP_LIST_SIZE_LIMIT:
365479ac375Sdm 		uint64_t intval;
366479ac375Sdm 	case PROP_DEFAULT_DOMAIN:
367479ac375Sdm 	case PROP_DOMAIN_NAME:
368479ac375Sdm 	case PROP_MACHINE_SID:
369479ac375Sdm 	case PROP_FOREST_NAME:
370479ac375Sdm 	case PROP_SITE_NAME:
371479ac375Sdm 	case PROP_AD_UNIXUSER_ATTR:
372479ac375Sdm 	case PROP_AD_UNIXGROUP_ATTR:
373479ac375Sdm 	case PROP_NLDAP_WINNAME_ATTR:
374e3f2c991SKeyur Desai 	case PROP_DIRECTORY_BASED_MAPPING:
375479ac375Sdm 		idmap_utf8str utf8val;
376479ac375Sdm 	case PROP_DOMAIN_CONTROLLER:
377479ac375Sdm 	case PROP_GLOBAL_CATALOG:
378479ac375Sdm 		idmap_ad_disc_ds_t dsval;
379479ac375Sdm 	default:
380479ac375Sdm 		void;
381479ac375Sdm };
382479ac375Sdm 
383479ac375Sdm struct idmap_prop_res {
384479ac375Sdm 	idmap_retcode	retcode;
385479ac375Sdm 	idmap_prop_val	value;
386479ac375Sdm 	bool		auto_discovered;
387479ac375Sdm };
388c5c4113dSnw 
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States enum idmap_flush_op {
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	IDMAP_FLUSH_EXPIRE = 0,
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	IDMAP_FLUSH_DELETE = 1
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3941fcced4cSJordan Brown /*
3951fcced4cSJordan Brown  * Represents an error from the directory lookup service.
3961fcced4cSJordan Brown  *
3971fcced4cSJordan Brown  * code is an ASCII string that is a key for the error.  It is not
3981fcced4cSJordan Brown  * localized.
3991fcced4cSJordan Brown  *
4001fcced4cSJordan Brown  * fmt is a format string with %n markers for where to include
4011fcced4cSJordan Brown  * params[n-1].  It should be, but NEEDSWORK is not localized to
4021fcced4cSJordan Brown  * the caller's locale.
4031fcced4cSJordan Brown  *
4041fcced4cSJordan Brown  * params is a list of parameters for the error - e.g. the name that
4051fcced4cSJordan Brown  * encountered a failure, the server that reported the failure, et cetera.
4061fcced4cSJordan Brown  * The values are to be used both as marked in fmt and for machine
4071fcced4cSJordan Brown  * interpretation of the error.
4081fcced4cSJordan Brown  */
4091fcced4cSJordan Brown struct directory_error_rpc {
4101fcced4cSJordan Brown 	idmap_utf8str	code;
4111fcced4cSJordan Brown 	idmap_utf8str	fmt;
4121fcced4cSJordan Brown 	idmap_utf8str	params<>;
4131fcced4cSJordan Brown };
4141fcced4cSJordan Brown 
4151fcced4cSJordan Brown /*
4161fcced4cSJordan Brown  * One value of a multivalued attribute.
4171fcced4cSJordan Brown  */
4181fcced4cSJordan Brown typedef opaque			directory_value_rpc<>;
4191fcced4cSJordan Brown 
4201fcced4cSJordan Brown /*
4211fcced4cSJordan Brown  * The value of an attribute, if found.  Note that this is a list
4221fcced4cSJordan Brown  * of directory_value_rpc objects, to support multivalued attributes.
4231fcced4cSJordan Brown  */
4241fcced4cSJordan Brown union directory_values_rpc switch (bool found) {
4251fcced4cSJordan Brown 	case TRUE:
4261fcced4cSJordan Brown 		directory_value_rpc values<>;
4271fcced4cSJordan Brown 	case FALSE:
4281fcced4cSJordan Brown 		void;
4291fcced4cSJordan Brown };
4301fcced4cSJordan Brown 
4311fcced4cSJordan Brown /*
4321fcced4cSJordan Brown  * The status of the lookup for any particular identifier.
4331fcced4cSJordan Brown  */
4341fcced4cSJordan Brown enum directory_lookup_status_rpc {
4351fcced4cSJordan Brown 	DIRECTORY_NOT_FOUND = 0,
4361fcced4cSJordan Brown 	DIRECTORY_FOUND = 1,
4371fcced4cSJordan Brown 	DIRECTORY_ERROR = 2
4381fcced4cSJordan Brown };
4391fcced4cSJordan Brown 
4401fcced4cSJordan Brown /*
4411fcced4cSJordan Brown  * This is the data returned for a particular identifier, either a
4421fcced4cSJordan Brown  * list of attribute values or an error.
4431fcced4cSJordan Brown  */
4441fcced4cSJordan Brown union directory_entry_rpc switch (directory_lookup_status_rpc status) {
4451fcced4cSJordan Brown 	case DIRECTORY_NOT_FOUND:
4461fcced4cSJordan Brown 		void;
4471fcced4cSJordan Brown 	case DIRECTORY_FOUND:
4481fcced4cSJordan Brown 		directory_values_rpc attrs<>;
4491fcced4cSJordan Brown 	case DIRECTORY_ERROR:
4501fcced4cSJordan Brown 		directory_error_rpc err;
4511fcced4cSJordan Brown };
4521fcced4cSJordan Brown 
4531fcced4cSJordan Brown /*
4541fcced4cSJordan Brown  * This is the result from a request, either a list of the entries for
4551fcced4cSJordan Brown  * the identifiers specified, or an error.
4561fcced4cSJordan Brown  */
4571fcced4cSJordan Brown union directory_results_rpc switch (bool failed) {
4581fcced4cSJordan Brown 	case TRUE:
4591fcced4cSJordan Brown 		directory_error_rpc	err;
4601fcced4cSJordan Brown 	case FALSE:
4611fcced4cSJordan Brown 		directory_entry_rpc	entries<>;
4621fcced4cSJordan Brown };
463*148c5f43SAlan Wright #endif	/* IDMAP_XDR_MAPPING_ONLY */
4641fcced4cSJordan Brown 
465c5c4113dSnw program IDMAP_PROG {
466c5c4113dSnw 	version IDMAP_V1 {
467*148c5f43SAlan Wright #ifndef	IDMAP_XDR_MAPPING_ONLY
468c5c4113dSnw 		void
469c5c4113dSnw 		IDMAP_NULL(void) = 0;
470*148c5f43SAlan Wright #endif	/* IDMAP_XDR_MAPPING_ONLY */
471c5c4113dSnw 
472c5c4113dSnw 		/* Batch of requests to get mapped identities */
473c5c4113dSnw 		idmap_ids_res
474c5c4113dSnw 		IDMAP_GET_MAPPED_IDS(idmap_mapping_batch batch) = 1;
475c5c4113dSnw 
476*148c5f43SAlan Wright #ifndef	IDMAP_XDR_MAPPING_ONLY
477c5c4113dSnw 		/* List all identity mappings */
478c5c4113dSnw 		idmap_mappings_res
479cd37da74Snw 		IDMAP_LIST_MAPPINGS(int64_t lastrowid,
48048258c6bSjp 			uint64_t limit, int32_t flag) = 2;
481c5c4113dSnw 
482c5c4113dSnw 		/* List all name-based mapping rules */
483c5c4113dSnw 		idmap_namerules_res
484c5c4113dSnw 		IDMAP_LIST_NAMERULES(idmap_namerule rule,
485c5c4113dSnw 			uint64_t lastrowid, uint64_t limit) = 3;
486c5c4113dSnw 
487c5c4113dSnw 		/* Batch of update requests */
4888e228215Sdm 		idmap_update_res
489c5c4113dSnw 		IDMAP_UPDATE(idmap_update_batch batch) = 4;
490c5c4113dSnw 
491c5c4113dSnw 		/* Get mapped identity by name */
492c5c4113dSnw 		idmap_mappings_res
493c5c4113dSnw 		IDMAP_GET_MAPPED_ID_BY_NAME(idmap_mapping request) = 5;
494c5c4113dSnw 
495479ac375Sdm 		/* Get configuration property */
496479ac375Sdm 		idmap_prop_res
497479ac375Sdm 		IDMAP_GET_PROP(idmap_prop_type) = 6;
498*148c5f43SAlan Wright 
4991fcced4cSJordan Brown 		/*
5001fcced4cSJordan Brown 		 * Retrieve directory information about a list of users
5011fcced4cSJordan Brown 		 * or groups by name or SID.
5021fcced4cSJordan Brown 		 *
5031fcced4cSJordan Brown 		 * ids is a list of user names, group names, or SIDs.
5041fcced4cSJordan Brown 		 *
5051fcced4cSJordan Brown 		 * types is a list of types of the ids in the id list.
5061fcced4cSJordan Brown 		 * If the type list is shorter than the id list, the last
5071fcced4cSJordan Brown 		 * type listed applies to all of the ids from that point.
5081fcced4cSJordan Brown 		 * The defined types are:
5091fcced4cSJordan Brown 		 *     'n' - name (could be user or group)
5101fcced4cSJordan Brown 		 *     'u' - user
5111fcced4cSJordan Brown 		 *     'g' - group
5121fcced4cSJordan Brown 		 *     's' - SID
5131fcced4cSJordan Brown 		 *
5141fcced4cSJordan Brown 		 * attrs is a list of attribute names to retrieve.
5151fcced4cSJordan Brown 		 */
5161fcced4cSJordan Brown 		directory_results_rpc DIRECTORY_GET_COMMON(
5171fcced4cSJordan Brown 			idmap_utf8str_list ids,
5181fcced4cSJordan Brown 			idmap_utf8str types,
5191fcced4cSJordan Brown 			idmap_utf8str_list attrs) = 7;
520479ac375Sdm 
5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idmap_retcode
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		IDMAP_FLUSH(idmap_flush_op) = 8;
523*148c5f43SAlan Wright #endif	/* IDMAP_XDR_MAPPING_ONLY */
524c5c4113dSnw 	} = 1;
525c5c4113dSnw } = 100172;
526