c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER START
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The contents of this file are subject to the terms of the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Common Development and Distribution License (the "License").
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You may not use this file except in compliance with the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * or http://www.opensolaris.org/os/licensing.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * See the License for the specific language governing permissions
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * and limitations under the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * When distributing Covered Code, include this CDDL HEADER in each
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If applicable, add the following below this CDDL HEADER, with the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * fields enclosed by brackets "[]" replaced with your own identifying
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * information: Portions Copyright [yyyy] [name of copyright owner]
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER END
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
9b214d32697277d03ed2e5d98c4a7bfef16dcf4dJordan Brown * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Use is subject to license terms.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Windows to Solaris Identity Mapping kernel API
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * This module provides an API to map Windows SIDs to
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Solaris UID and GIDs.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/types.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/ksynch.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/door.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <rpc/rpc_msg.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <rpc/xdr.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <rpc/auth.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <rpc/rpc_sztypes.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef DEBUG
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/cmn_err.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif /* DEBUG */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/proc.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/sunddi.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/param.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/atomic.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/sysmacros.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/disp.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/kidmap.h>
bda89588bd7667394a834e8a9a34612cce2ae9c3jp#include <sys/zone.h>
9b214d32697277d03ed2e5d98c4a7bfef16dcf4dJordan Brown#include <rpcsvc/idmap_prot.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include "kidmap_priv.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * Defined types
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * This structure holds pointers for the
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * batch mapping results.
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwtypedef struct idmap_get_res {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id_type idtype;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid_t *uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gid_t *gid;
0b10de9fc92843e871f48de87f623808c5913a71jp uid_t *pid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int *is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char **sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t *rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat *stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw} idmap_get_res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Batch mapping handle structure */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstruct idmap_get_handle {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp struct idmap_zone_specific *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int mapping_num;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int mapping_size;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw};
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/* Zone specific data */
bda89588bd7667394a834e8a9a34612cce2ae9c3jptypedef struct idmap_zone_specific {
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zoneid_t zone_id;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp kmutex_t zone_mutex;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_cache_t cache;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_handle_t door_handle;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp int door_valid;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen int door_retried;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp uint32_t message_id;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp} idmap_zone_specific_t;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * Module global data
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic kmutex_t idmap_zone_mutex;
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic zone_key_t idmap_zone_key;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * Local function definitions
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic int
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_rpc_call(idmap_zone_specific_t *zs, uint32_t op,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp xdrproc_t xdr_args, caddr_t args,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp xdrproc_t xdr_res, caddr_t res);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic int
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_call_door(idmap_zone_specific_t *zs, door_arg_t *arg);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic idmap_zone_specific_t *
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_get_zone_specific(zone_t *zone);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_reg_dh(zone_t *zone, door_handle_t dh)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_enter(&zs->zone_mutex);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (zs->door_valid)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_ki_rele(zs->door_handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs->door_handle = dh;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs->door_valid = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&zs->zone_mutex);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * idmap_unreg_dh
bda89588bd7667394a834e8a9a34612cce2ae9c3jp *
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * This routine is called by system call idmap_unreg().
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * idmap_unreg() calls door_ki_rele() on the supplied
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * door handle after this routine returns. We only
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * need to perform one door release on zs->door_handle
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_unreg_dh(zone_t *zone, door_handle_t dh)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
0b10de9fc92843e871f48de87f623808c5913a71jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp kidmap_cache_purge(&zs->cache);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_enter(&zs->zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (!zs->door_valid || zs->door_handle != dh) {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&zs->zone_mutex);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (EINVAL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_ki_rele(zs->door_handle);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs->door_valid = 0;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen zs->door_retried = 0;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&zs->zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp/*
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp * IMPORTANT. This function idmap_get_cache_data() is project
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp * private and is for use of the test system only and should
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp * not be used for other purposes.
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jpvoid
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jpidmap_get_cache_data(zone_t *zone, size_t *uidbysid, size_t *gidbysid,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp size_t *pidbysid, size_t *sidbyuid, size_t *sidbygid)
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp{
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp idmap_zone_specific_t *zs;
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zs = idmap_get_zone_specific(zone);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp kidmap_cache_get_data(&zs->cache, uidbysid, gidbysid,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp pidbysid, sidbyuid, sidbygid);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp}
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_call_door(idmap_zone_specific_t *zs, door_arg_t *arg)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_handle_t dh;
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_info_t di;
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp int status = 0;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen int num_retries = 5;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen int door_retried;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jpretry:
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_enter(&zs->zone_mutex);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (zs->door_valid) {
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp dh = zs->door_handle;
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_ki_hold(dh);
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen } else {
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen dh = NULL;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen door_retried = zs->door_retried;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&zs->zone_mutex);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (dh == NULL) {
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen /* The door has been retried before so dont wait */
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen if (door_retried)
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen return (-1);
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /*
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp * There is no door handle yet. Give
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen * smf a chance to restart idmapd
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp */
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen if (num_retries-- > 0) {
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp delay(hz);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp goto retry;
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp }
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: Error no registered door to call the "
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap daemon\n");
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#endif
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen mutex_enter(&zs->zone_mutex);
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen if (!zs->door_valid)
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen zs->door_retried = 1;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen mutex_exit(&zs->zone_mutex);
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp return (-1);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
323a81d93e2f58a7d62f6e523f9fddbc029d3d0bjwadams status = door_ki_upcall_limited(dh, arg, NULL, SIZE_MAX, 0);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp switch (status) {
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp case 0: /* Success */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_ki_rele(dh);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp return (0);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp case EINTR:
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* If we took an interrupt we have to bail out. */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (ttolwp(curthread) && ISSIG(curthread, JUSTLOOKING)) {
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_ki_rele(dh);
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: Interrupted\n");
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen#endif
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp return (-1);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp /*
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp * Just retry and see what happens.
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* FALLTHROUGH */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp case EAGAIN:
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* A resouce problem */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_ki_rele(dh);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* Back off before retrying */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: Door call returned error %d. Retrying\n", status);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#endif /* DEBUG */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp delay(hz);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp goto retry;
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp case EBADF:
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* Stale door handle. See if smf restarts the daemon. */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_ki_rele(dh);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_enter(&zs->zone_mutex);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (zs->door_valid && dh == zs->door_handle) {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs->door_valid = 0;
8d059b82ae23fedab9646299cec0f2242f2c38b6Julian Pullen zs->door_retried = 0;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_ki_rele(zs->door_handle);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&zs->zone_mutex);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* Back off before retrying */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: Door call returned error %d. Retrying\n", status);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#endif /* DEBUG */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp delay(hz);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp goto retry;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp default:
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp /* Unknown error */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: Door call returned error %d.\n", status);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp#endif /* DEBUG */
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp door_ki_rele(dh);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp return (-1);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic idmap_zone_specific_t *
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_get_zone_specific(zone_t *zone)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp ASSERT(zone != NULL);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = zone_getspecific(idmap_zone_key, zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (zs != NULL)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp return (zs);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_enter(&idmap_zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = zone_getspecific(idmap_zone_key, zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (zs == NULL) {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = kmem_zalloc(sizeof (idmap_zone_specific_t), KM_SLEEP);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_init(&zs->zone_mutex, NULL, MUTEX_DEFAULT, NULL);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp kidmap_cache_create(&zs->cache);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zs->zone_id = zone->zone_id;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp (void) zone_setspecific(idmap_zone_key, zone, zs);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&idmap_zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp return (zs);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&idmap_zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp return (zs);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp}
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jpstatic void
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/* ARGSUSED */
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_zone_destroy(zoneid_t zone_id, void *arg)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs = arg;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (zs != NULL) {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp kidmap_cache_delete(&zs->cache);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (zs->door_valid) {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_ki_rele(zs->door_handle);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_destroy(&zs->zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp kmem_free(zs, sizeof (idmap_zone_specific_t));
bda89588bd7667394a834e8a9a34612cce2ae9c3jp }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp}
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_start(void)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_init(&idmap_zone_mutex, NULL, MUTEX_DEFAULT, NULL);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zone_key_create(&idmap_zone_key, NULL, NULL, idmap_zone_destroy);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kidmap_sid_prefix_store_init();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_stop(void)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp return (EBUSY);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp}
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * idmap_get_door
bda89588bd7667394a834e8a9a34612cce2ae9c3jp *
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * This is called by the system call allocids() to get the door for the
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * given zone.
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
bda89588bd7667394a834e8a9a34612cce2ae9c3jpdoor_handle_t
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_get_door(zone_t *zone)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_handle_t dh = NULL;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_enter(&zs->zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (zs->door_valid) {
bda89588bd7667394a834e8a9a34612cce2ae9c3jp dh = zs->door_handle;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp door_ki_hold(dh);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
bda89588bd7667394a834e8a9a34612cce2ae9c3jp mutex_exit(&zs->zone_mutex);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp return (dh);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp/*
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * idmap_purge_cache
bda89588bd7667394a834e8a9a34612cce2ae9c3jp *
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * This is called by the system call allocids() to purge the cache for the
bda89588bd7667394a834e8a9a34612cce2ae9c3jp * given zone.
bda89588bd7667394a834e8a9a34612cce2ae9c3jp */
bda89588bd7667394a834e8a9a34612cce2ae9c3jpvoid
bda89588bd7667394a834e8a9a34612cce2ae9c3jpidmap_purge_cache(zone_t *zone)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp kidmap_cache_purge(&zs->cache);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given Domain SID and RID, get UID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * uid - POSIX UID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Success return IDMAP_SUCCESS else IDMAP error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_getuidbysid(zone_t *zone, const char *sid_prefix, uint32_t rid,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp uid_t *uid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping_batch args;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res results;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t op = IDMAP_GET_MAPPED_IDS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *new_sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat status;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sid_prefix == NULL || uid == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_uidbysid(&zs->cache, sid_prefix, rid, uid)
0b10de9fc92843e871f48de87f623808c5913a71jp == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&mapping, sizeof (idmap_mapping));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.sid.prefix = (char *)sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id2.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&results, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_len = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_val = &mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_rpc_call(zs, op, xdr_idmap_mapping_batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&args, xdr_idmap_ids_res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&results) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call succeded */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (results.retcode != IDMAP_SUCCESS) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp status = results.retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *uid = UID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp } else if (results.ids.ids_len >= 1 &&
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw results.ids.ids_val[0].id.idtype == IDMAP_UID) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = results.ids.ids_val[0].retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *uid = results.ids.ids_val[0].id.idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (status == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw new_sid_prefix = kidmap_find_sid_prefix(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw sid_prefix);
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2uid(&zs->cache,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp new_sid_prefix, rid, *uid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp results.ids.ids_val[0].direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *uid = UID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_ids_res, (char *)&results);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call failed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *uid = UID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given Domain SID and RID, get GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gid - POSIX UID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Success return IDMAP_SUCCESS else IDMAP error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_getgidbysid(zone_t *zone, const char *sid_prefix, uint32_t rid,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp gid_t *gid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping_batch args;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res results;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t op = IDMAP_GET_MAPPED_IDS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *new_sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat status;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sid_prefix == NULL || gid == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_gidbysid(&zs->cache, sid_prefix, rid, gid)
bda89588bd7667394a834e8a9a34612cce2ae9c3jp == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&mapping, sizeof (idmap_mapping));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.sid.prefix = (char *)sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id2.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&results, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_len = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_val = &mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_rpc_call(zs, op, xdr_idmap_mapping_batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&args, xdr_idmap_ids_res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&results) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call succeded */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (results.retcode != IDMAP_SUCCESS) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp status = results.retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *gid = GID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp } else if (results.ids.ids_len >= 1 &&
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw results.ids.ids_val[0].id.idtype == IDMAP_GID) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = results.ids.ids_val[0].retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gid = results.ids.ids_val[0].id.idmap_id_u.gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (status == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw new_sid_prefix = kidmap_find_sid_prefix(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw sid_prefix);
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2gid(&zs->cache,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp new_sid_prefix, rid, *gid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp results.ids.ids_val[0].direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gid = GID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_ids_res, (char *)&results);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call failed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gid = GID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given Domain SID and RID, get Posix ID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * pid - POSIX ID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_user - 1 == UID, 0 == GID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Success return IDMAP_SUCCESS else IDMAP error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_getpidbysid(zone_t *zone, const char *sid_prefix, uint32_t rid,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp uid_t *pid, int *is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping_batch args;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res results;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t op = IDMAP_GET_MAPPED_IDS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *new_sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat status;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sid_prefix == NULL || pid == NULL || is_user == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_pidbysid(&zs->cache, sid_prefix, rid, pid,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp is_user) == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&mapping, sizeof (idmap_mapping));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.sid.prefix = (char *)sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id2.idtype = IDMAP_POSIXID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&results, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_len = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_val = &mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_rpc_call(zs, op, xdr_idmap_mapping_batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&args, xdr_idmap_ids_res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&results) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call succeded */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (results.retcode != IDMAP_SUCCESS) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp status = results.retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *is_user = 1;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *pid = UID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp } else if (results.ids.ids_len >= 1 && (
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw results.ids.ids_val[0].id.idtype == IDMAP_UID ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw results.ids.ids_val[0].id.idtype == IDMAP_GID)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = results.ids.ids_val[0].retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (results.ids.ids_val[0].id.idtype == IDMAP_UID) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_user = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = results.ids.ids_val[0].id.idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_user = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = results.ids.ids_val[0].id.idmap_id_u.gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (status == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw new_sid_prefix = kidmap_find_sid_prefix(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw sid_prefix);
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2pid(&zs->cache,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw new_sid_prefix, rid, *pid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp *is_user,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp results.ids.ids_val[0].direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_user = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = UID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_ids_res, (char *)&results);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call failed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_user = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = UID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given UID, get Domain SID and RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * uid - Posix UID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Success return IDMAP_SUCCESS else IDMAP error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_getsidbyuid(zone_t *zone, uid_t uid, const char **sid_prefix,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp uint32_t *rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping_batch args;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res results;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t op = IDMAP_GET_MAPPED_IDS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat status;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw time_t entry_ttl;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id *id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sid_prefix == NULL || rid == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_sidbyuid(&zs->cache, sid_prefix, rid, uid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&mapping, sizeof (idmap_mapping));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.uid = uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&results, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_len = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_val = &mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_rpc_call(zs, op, xdr_idmap_mapping_batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&args, xdr_idmap_ids_res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&results) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call succeded */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (results.retcode != IDMAP_SUCCESS) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp status = results.retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *rid = 0;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *sid_prefix = NULL;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp } else if (results.ids.ids_len >= 1 &&
cd37da7426f0c49c14ad9a8a07638ca971477566nw (results.ids.ids_val[0].id.idtype == IDMAP_SID ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw results.ids.ids_val[0].id.idtype == IDMAP_USID ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw results.ids.ids_val[0].id.idtype == IDMAP_GSID)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = results.ids.ids_val[0].retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw id = &results.ids.ids_val[0].id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sid_prefix = kidmap_find_sid_prefix(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw id->idmap_id_u.sid.prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = id->idmap_id_u.sid.rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (status == IDMAP_SUCCESS) {
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2uid(&zs->cache,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp *sid_prefix, *rid, uid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp results.ids.ids_val[0].direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_ids_res, (char *)&results);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call failed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given GID, get Domain SID and RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gid - Posix GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID if return == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Success return IDMAP_SUCCESS else IDMAP error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_getsidbygid(zone_t *zone, gid_t gid, const char **sid_prefix,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp uint32_t *rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping_batch args;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res results;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t op = IDMAP_GET_MAPPED_IDS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat status;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id *id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sid_prefix == NULL || rid == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_sidbygid(&zs->cache, sid_prefix, rid, gid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&mapping, sizeof (idmap_mapping));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id1.idmap_id_u.uid = gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping.id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw bzero(&results, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_len = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw args.idmap_mapping_batch_val = &mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_rpc_call(zs, op, xdr_idmap_mapping_batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&args, xdr_idmap_ids_res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&results) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call succeded */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (results.retcode != IDMAP_SUCCESS) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp status = results.retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *rid = 0;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *sid_prefix = NULL;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp } else if (results.ids.ids_len >= 1 &&
cd37da7426f0c49c14ad9a8a07638ca971477566nw (results.ids.ids_val[0].id.idtype == IDMAP_SID ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw results.ids.ids_val[0].id.idtype == IDMAP_USID ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw results.ids.ids_val[0].id.idtype == IDMAP_GSID)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = results.ids.ids_val[0].retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw id = &results.ids.ids_val[0].id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sid_prefix = kidmap_find_sid_prefix(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw id->idmap_id_u.sid.prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = id->idmap_id_u.sid.rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (status == IDMAP_SUCCESS) {
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2gid(&zs->cache,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp *sid_prefix, *rid, gid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp results.ids.ids_val[0].direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_ids_res, (char *)&results);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call failed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create handle to get SID to UID/GID mapping entries
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * none
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * get_handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_handle_t *
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_get_create(zone_t *zone)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_zone_specific_t *zs;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_get_handle_t *handle;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp#define INIT_MAPPING_SIZE 32
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp zs = idmap_get_zone_specific(zone);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw handle = kmem_zalloc(sizeof (idmap_get_handle_t), KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw handle->mapping = kmem_zalloc((sizeof (idmap_mapping)) *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw INIT_MAPPING_SIZE, KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw handle->result = kmem_zalloc((sizeof (idmap_get_res)) *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw INIT_MAPPING_SIZE, KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw handle->mapping_size = INIT_MAPPING_SIZE;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp handle->zs = zs;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Internal routine to extend a "get_handle"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic void
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_get_extend(idmap_get_handle_t *get_handle)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int new_size = get_handle->mapping_size + INIT_MAPPING_SIZE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = kmem_zalloc((sizeof (idmap_mapping)) *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw new_size, KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memcpy(mapping, get_handle->mapping,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (sizeof (idmap_mapping)) * get_handle->mapping_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result = kmem_zalloc((sizeof (idmap_get_res)) *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw new_size, KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memcpy(result, get_handle->result,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (sizeof (idmap_get_res)) * get_handle->mapping_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(get_handle->mapping,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (sizeof (idmap_mapping)) * get_handle->mapping_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping = mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(get_handle->result,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (sizeof (idmap_get_res)) * get_handle->mapping_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->result = result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_size = new_size;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given Domain SID and RID, get UID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * uid - POSIX UID if stat == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * Notes:
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * The output parameters will be set by idmap_get_mappings()
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * The sid_prefix is copied.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_batch_getuidbysid(idmap_get_handle_t *get_handle, const char *sid_prefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t rid, uid_t *uid, idmap_stat *stat)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL || sid_prefix == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid == NULL || stat == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_uidbysid(&get_handle->zs->cache, sid_prefix,
0b10de9fc92843e871f48de87f623808c5913a71jp rid, uid) == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *stat = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross /* Get a copy of sid_prefix */
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross sid_prefix = kidmap_find_sid_prefix(sid_prefix);
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle->mapping_num >= get_handle->mapping_size)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kidmap_get_extend(get_handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &get_handle->mapping[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.prefix = (char *)sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result = &get_handle->result[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->uid = uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->gid = NULL;
0b10de9fc92843e871f48de87f623808c5913a71jp result->pid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->rid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->is_user = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_num++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given Domain SID and RID, get GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gid - POSIX GID if stat == IDMAP_SUCCESS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * Notes:
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * The output parameters will be set by idmap_get_mappings()
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * The sid_prefix is copied.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_batch_getgidbysid(idmap_get_handle_t *get_handle, const char *sid_prefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t rid, uid_t *gid, idmap_stat *stat)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL || sid_prefix == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gid == NULL || stat == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_gidbysid(&get_handle->zs->cache, sid_prefix,
0b10de9fc92843e871f48de87f623808c5913a71jp rid, gid) == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *stat = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross /* Get a copy of sid_prefix */
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross sid_prefix = kidmap_find_sid_prefix(sid_prefix);
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle->mapping_num >= get_handle->mapping_size)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kidmap_get_extend(get_handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &get_handle->mapping[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.prefix = (char *)sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result = &get_handle->result[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->uid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->gid = gid;
0b10de9fc92843e871f48de87f623808c5913a71jp result->pid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->rid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->is_user = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_num++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given Domain SID and RID, get Posix ID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid_prefix - Domain SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_user - user or group
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * pid - POSIX UID if stat == IDMAP_SUCCESS and is_user == 1
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * POSIX GID if stat == IDMAP_SUCCESS and is_user == 0
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * Notes:
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * The output parameters will be set by idmap_get_mappings()
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross * The sid_prefix is copied.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_batch_getpidbysid(idmap_get_handle_t *get_handle, const char *sid_prefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t rid, uid_t *pid, int *is_user, idmap_stat *stat)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL || sid_prefix == NULL || pid == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_user == NULL || stat == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_pidbysid(&get_handle->zs->cache, sid_prefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rid, pid, is_user) == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *stat = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross /* Get a copy of sid_prefix */
dea83360607af241eb793e94f19278029f3a8a97Gordon Ross sid_prefix = kidmap_find_sid_prefix(sid_prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle->mapping_num >= get_handle->mapping_size)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kidmap_get_extend(get_handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &get_handle->mapping[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.prefix = (char *)sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_POSIXID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result = &get_handle->result[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->idtype = IDMAP_POSIXID;
0b10de9fc92843e871f48de87f623808c5913a71jp result->uid = NULL;
0b10de9fc92843e871f48de87f623808c5913a71jp result->gid = NULL;
0b10de9fc92843e871f48de87f623808c5913a71jp result->pid = pid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->rid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_num++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given UID, get SID and RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * uid - POSIX UID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid - SID in canonical form (if stat == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID (if stat == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_batch_getsidbyuid(idmap_get_handle_t *get_handle, uid_t uid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char **sid_prefix, uint32_t *rid, idmap_stat *stat)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL || sid_prefix == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rid == NULL || stat == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_sidbyuid(&get_handle->zs->cache,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp sid_prefix, rid, uid) == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *stat = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle->mapping_num >= get_handle->mapping_size)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kidmap_get_extend(get_handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &get_handle->mapping[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.uid = uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result = &get_handle->result[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->uid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->gid = NULL;
0b10de9fc92843e871f48de87f623808c5913a71jp result->pid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->sid_prefix = sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->is_user = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_num++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given GID, get SID and RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gid - POSIX GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid - SID in canonical form (if stat == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID (if stat == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_batch_getsidbygid(idmap_get_handle_t *get_handle, gid_t gid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char **sid_prefix, uint32_t *rid, idmap_stat *stat)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL || sid_prefix == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rid == NULL || stat == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_cache_lookup_sidbygid(&get_handle->zs->cache,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp sid_prefix, rid, gid) == IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *stat = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle->mapping_num >= get_handle->mapping_size)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kidmap_get_extend(get_handle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &get_handle->mapping[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.gid = gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result = &get_handle->result[get_handle->mapping_num];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->uid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->gid = NULL;
0b10de9fc92843e871f48de87f623808c5913a71jp result->pid = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->sid_prefix = sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->is_user = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw result->stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_num++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Process the batched "get mapping" requests. The results (i.e.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * status and identity) will be available in the data areas
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * provided by individual requests.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If the door call fails the status IDMAP_ERR_NOMAPPING is
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * return and the UID or UID result is set to "nobody"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_get_mappings(idmap_get_handle_t *get_handle)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
9d0aba9223380be5042b63aef9767fa367b2a2ecjp idmap_mapping_batch rpc_args;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp idmap_ids_res rpc_res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uint32_t op = IDMAP_GET_MAPPED_IDS;
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp idmap_mapping *request;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_res *result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id *id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int status;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *sid_prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int is_user;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp idmap_cache_t *cache;
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp int direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle->mapping_num == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp cache = &get_handle->zs->cache;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
9d0aba9223380be5042b63aef9767fa367b2a2ecjp bzero(&rpc_res, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
9d0aba9223380be5042b63aef9767fa367b2a2ecjp rpc_args.idmap_mapping_batch_len = get_handle->mapping_num;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp rpc_args.idmap_mapping_batch_val = get_handle->mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_rpc_call(get_handle->zs, op, xdr_idmap_mapping_batch,
9d0aba9223380be5042b63aef9767fa367b2a2ecjp (caddr_t)&rpc_args, xdr_idmap_ids_res,
9d0aba9223380be5042b63aef9767fa367b2a2ecjp (caddr_t)&rpc_res) != 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Door call failed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = IDMAP_ERR_NOMAPPING;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp goto error;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
9d0aba9223380be5042b63aef9767fa367b2a2ecjp status = rpc_res.retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (status != IDMAP_SUCCESS) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp /* RPC returned idmap error code */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp xdr_free(xdr_idmap_ids_res, (char *)&rpc_res);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp goto error;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp }
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp for (i = 0; i < get_handle->mapping_num; i++) {
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request = &get_handle->mapping[i];
9d0aba9223380be5042b63aef9767fa367b2a2ecjp result = &get_handle->result[i];
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (i >= rpc_res.ids.ids_len) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->stat = IDMAP_ERR_NOMAPPING;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (result->uid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *result->uid = UID_NOBODY;
0b10de9fc92843e871f48de87f623808c5913a71jp if (result->gid)
0b10de9fc92843e871f48de87f623808c5913a71jp *result->gid = GID_NOBODY;
0b10de9fc92843e871f48de87f623808c5913a71jp if (result->pid)
0b10de9fc92843e871f48de87f623808c5913a71jp *result->pid = UID_NOBODY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (result->is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *result->is_user = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (result->sid_prefix)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *result->sid_prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (result->rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *result->rid = 0;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->stat = rpc_res.ids.ids_val[i].retcode;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp id = &rpc_res.ids.ids_val[i].id;
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction = rpc_res.ids.ids_val[i].direction;
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp switch (id->idtype) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp case IDMAP_UID:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->uid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->uid = id->idmap_id_u.uid;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->pid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->pid = id->idmap_id_u.uid;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->is_user)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->is_user = 1;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp sid_prefix = kidmap_find_sid_prefix(
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.sid.prefix);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (*result->stat == IDMAP_SUCCESS && result->uid)
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2uid(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp cache, sid_prefix,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.sid.rid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp id->idmap_id_u.uid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp else if (*result->stat == IDMAP_SUCCESS && result->pid)
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2pid(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp cache, sid_prefix,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.sid.rid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp id->idmap_id_u.uid, 1,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp break;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp case IDMAP_GID:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->gid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->gid = id->idmap_id_u.gid;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->pid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->pid = id->idmap_id_u.gid;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->is_user)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->is_user = 0;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp sid_prefix = kidmap_find_sid_prefix(
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.sid.prefix);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (*result->stat == IDMAP_SUCCESS && result->gid)
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2gid(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp cache, sid_prefix,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.sid.rid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp id->idmap_id_u.gid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp else if (*result->stat == IDMAP_SUCCESS && result->pid)
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2pid(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp cache, sid_prefix,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.sid.rid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp id->idmap_id_u.gid, 0,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp break;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp case IDMAP_SID:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp case IDMAP_USID:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp case IDMAP_GSID:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp sid_prefix = kidmap_find_sid_prefix(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp id->idmap_id_u.sid.prefix);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->sid_prefix && result->rid) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->sid_prefix = sid_prefix;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->rid = id->idmap_id_u.sid.rid;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp }
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (*result->stat == IDMAP_SUCCESS &&
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idtype == IDMAP_UID)
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2uid(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp cache, sid_prefix,
9d0aba9223380be5042b63aef9767fa367b2a2ecjp id->idmap_id_u.sid.rid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.uid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp else if (*result->stat == IDMAP_SUCCESS &&
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idtype == IDMAP_GID)
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp kidmap_cache_add_sid2gid(
9d0aba9223380be5042b63aef9767fa367b2a2ecjp cache, sid_prefix,
9d0aba9223380be5042b63aef9767fa367b2a2ecjp id->idmap_id_u.sid.rid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp request->id1.idmap_id_u.gid,
d15447b6c777a1b2223924443bf36c9c8efb2ea4jp direction);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp break;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp default:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->stat = IDMAP_ERR_NORESULT;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->uid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->uid = UID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->gid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->gid = GID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->pid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->pid = UID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->is_user)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->is_user = 1;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->sid_prefix)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->sid_prefix = NULL;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->rid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->rid = 0;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp break;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp }
9d0aba9223380be5042b63aef9767fa367b2a2ecjp }
9d0aba9223380be5042b63aef9767fa367b2a2ecjp xdr_free(xdr_idmap_ids_res, (char *)&rpc_res);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp /* Reset get_handle for new resquests */
9d0aba9223380be5042b63aef9767fa367b2a2ecjp get_handle->mapping_num = 0;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp return (status);
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjperror:
9d0aba9223380be5042b63aef9767fa367b2a2ecjp for (i = 0; i < get_handle->mapping_num; i++) {
9d0aba9223380be5042b63aef9767fa367b2a2ecjp result = &get_handle->result[i];
9d0aba9223380be5042b63aef9767fa367b2a2ecjp
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->stat = status;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->uid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->uid = UID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->gid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->gid = GID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->pid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->pid = UID_NOBODY;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->is_user)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->is_user = 1;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->sid_prefix)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->sid_prefix = NULL;
9d0aba9223380be5042b63aef9767fa367b2a2ecjp if (result->rid)
9d0aba9223380be5042b63aef9767fa367b2a2ecjp *result->rid = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Reset get_handle for new resquests */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping_num = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Destroy the "get mapping" handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwkidmap_get_destroy(idmap_get_handle_t *get_handle)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (get_handle == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(get_handle->mapping,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (sizeof (idmap_mapping)) * get_handle->mapping_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->mapping = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(get_handle->result,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (sizeof (idmap_get_res)) * get_handle->mapping_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw get_handle->result = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(get_handle, sizeof (idmap_get_handle_t));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
bda89588bd7667394a834e8a9a34612cce2ae9c3jpkidmap_rpc_call(idmap_zone_specific_t *zs, uint32_t op, xdrproc_t xdr_args,
bda89588bd7667394a834e8a9a34612cce2ae9c3jp caddr_t args, xdrproc_t xdr_res, caddr_t res)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw XDR xdr_ctx;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw struct rpc_msg reply_msg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *inbuf_ptr = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t inbuf_size = 4096;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *outbuf_ptr = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t outbuf_size = 4096;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t size;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int status = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw door_arg_t params;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int retry = 0;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp struct rpc_msg call_msg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.rbuf = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.rsize = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwretry:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw inbuf_ptr = kmem_alloc(inbuf_size, KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw outbuf_ptr = kmem_alloc(outbuf_size, KM_SLEEP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdrmem_create(&xdr_ctx, inbuf_ptr, inbuf_size, XDR_ENCODE);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
bda89588bd7667394a834e8a9a34612cce2ae9c3jp call_msg.rm_call.cb_prog = IDMAP_PROG;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp call_msg.rm_call.cb_vers = IDMAP_V1;
bda89588bd7667394a834e8a9a34612cce2ae9c3jp call_msg.rm_xid = atomic_inc_32_nv(&zs->message_id);
bda89588bd7667394a834e8a9a34612cce2ae9c3jp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (!xdr_callhdr(&xdr_ctx, &call_msg)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: xdr encoding header error");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif /* DEBUG */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto exit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (!xdr_uint32(&xdr_ctx, &op) ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Auth none */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw !xdr_opaque_auth(&xdr_ctx, &_null_auth) ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw !xdr_opaque_auth(&xdr_ctx, &_null_auth) ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* RPC args */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw !xdr_args(&xdr_ctx, args)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN, "idmap: xdr encoding error");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif /* DEBUG */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retry > 2) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto exit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retry++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (inbuf_ptr) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(inbuf_ptr, inbuf_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw inbuf_ptr = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (outbuf_ptr) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(outbuf_ptr, outbuf_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw outbuf_ptr = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((size = xdr_sizeof(xdr_args, args)) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: xdr_sizeof error");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif /* DEBUG */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto exit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw inbuf_size = size + 1024;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw outbuf_size = size + 1024;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto retry;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.data_ptr = inbuf_ptr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.data_size = XDR_GETPOS(&xdr_ctx);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.desc_ptr = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.desc_num = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.rbuf = outbuf_ptr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw params.rsize = outbuf_size;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
bda89588bd7667394a834e8a9a34612cce2ae9c3jp if (kidmap_call_door(zs, &params) != 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto exit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw reply_msg.acpted_rply.ar_verf = _null_auth;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw reply_msg.acpted_rply.ar_results.where = res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw reply_msg.acpted_rply.ar_results.proc = xdr_res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdrmem_create(&xdr_ctx, params.data_ptr, params.data_size, XDR_DECODE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (xdr_replymsg(&xdr_ctx, &reply_msg)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (reply_msg.rm_reply.rp_stat != MSG_ACCEPTED ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw reply_msg.rm_reply.rp_acpt.ar_stat != SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto exit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef DEBUG
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp zcmn_err(zs->zone_id, CE_WARN,
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp "idmap: xdr decoding reply message error");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif /* DEBUG */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw status = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwexit:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (outbuf_ptr != params.rbuf && params.rbuf != NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(params.rbuf, params.rsize);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (inbuf_ptr)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(inbuf_ptr, inbuf_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (outbuf_ptr)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw kmem_free(outbuf_ptr, outbuf_size);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}