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