idmap_api.c revision 9581d9f4f3b1515f88149f920c7e786b4fb901d4
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 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Use is subject to license terms.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#pragma ident "%Z%%M% %I% %E% SMI"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * libidmap API
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdlib.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <inttypes.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <errno.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <strings.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <ctype.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/param.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/types.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <sys/stat.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <dlfcn.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <libintl.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include "idmap_impl.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic struct timeval TIMEOUT = { 25, 0 };
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int idmap_stat2errno(idmap_stat);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define __ITER_CREATE(itera, argu, handl, ityp)\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (handl == NULL) {\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera = calloc(1, sizeof (*itera));\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (itera == NULL) {\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw argu = calloc(1, sizeof (*argu));\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argu == NULL) {\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(itera);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->ih = handl;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->type = ityp;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->retcode = IDMAP_NEXT;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->limit = 1024;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->arg = argu;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define __ITER_ERR_RETURN(itera, argu, xdr_argu, iretcod)\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argu) {\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_argu, (caddr_t)argu);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(argu);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (itera)\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(itera);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (iretcod);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define __ITER_CHECK(itera, ityp)\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (itera == NULL) {\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (itera->type != ityp) {\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Free memory allocated by libidmap API
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * ptr - memory to be freed
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_free(void *ptr) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(ptr);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create and Initialize idmap client handle for rpc/doors
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * handle - idmap handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_init(idmap_handle_t **handle) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw CLIENT *clnt = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw struct idmap_handle *hptr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *handle = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw hptr = (struct idmap_handle *)calloc(1, sizeof (*hptr));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (hptr == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clnt = clnt_door_create(IDMAP_PROG, IDMAP_V1, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clnt == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(hptr);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_RPC);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw hptr->type = _IDMAP_HANDLE_RPC_DOORS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw hptr->privhandle = clnt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *handle = hptr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Finalize idmap handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * handle - idmap handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_fini(idmap_handle_t *handle) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw CLIENT *clnt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw struct idmap_handle *hptr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (handle == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw hptr = (struct idmap_handle *)handle;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (hptr->type) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case _IDMAP_HANDLE_RPC_DOORS:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clnt = (CLIENT *)hptr->privhandle;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clnt) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clnt->cl_auth)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw auth_destroy(clnt->cl_auth);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clnt_destroy(clnt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(hptr);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create/Initialize handle for updates
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * udthandle - update handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_create(idmap_handle_t *handle, idmap_udt_handle_t **udthandle) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_udt_handle_t *tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (handle == NULL || udthandle == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((tmp = calloc(1, sizeof (*tmp))) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->ih = handle;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *udthandle = tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * All the updates specified by the update handle are committed
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * in a single transaction. i.e either all succeed or none.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * udthandle - update handle with the update requests
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return value:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Status of the commit
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_commit(idmap_udt_handle_t *udthandle) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw CLIENT *clnt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw enum clnt_stat clntstat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (udthandle == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _IDMAP_GET_CLIENT_HANDLE(udthandle->ih, clnt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clntstat = clnt_call(clnt, IDMAP_UPDATE,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_update_batch, (caddr_t)&udthandle->batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_retcode, (caddr_t)&retcode,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw TIMEOUT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clntstat != RPC_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_RPC);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Destroy the update handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_destroy(idmap_udt_handle_t *udthandle) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (udthandle == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_update_batch, (caddr_t)&udthandle->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(udthandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_add_namerule(idmap_udt_handle_t *udthandle, const char *windomain,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw boolean_t is_user, const char *winname, const char *unixname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw boolean_t is_nt4, int direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_namerule *rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_utf8str *str;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = _udt_extend_batch(udthandle, OP_ADD_NAMERULE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule = &udthandle->batch.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_update_batch_val[udthandle->next].
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_update_op_u.rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->direction = direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_nt4 = is_nt4;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->windomain;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, windomain, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->winname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, winname, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->unixname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, unixname, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_update_batch, (caddr_t)&udthandle->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* ARGSUSED */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_rm_namerule(idmap_udt_handle_t *udthandle, boolean_t is_user,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *windomain, const char *winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *unixname, int direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_namerule *rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_utf8str *str;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = _udt_extend_batch(udthandle, OP_RM_NAMERULE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule = &udthandle->batch.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_update_batch_val[udthandle->next].
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_update_op_u.rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->direction = direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->windomain;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, windomain, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->winname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, winname, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->unixname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, unixname, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_update_batch, (caddr_t)&udthandle->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* ARGSUSED */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_flush_namerules(idmap_udt_handle_t *udthandle, boolean_t is_user) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = _udt_extend_batch(udthandle, OP_FLUSH_NAMERULES);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->batch.idmap_update_batch_val[udthandle->next].
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_update_op_u.is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_update_batch, (caddr_t)&udthandle->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Set the number of entries requested per batch by the iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * iter - iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * limit - number of entries requested per batch
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_iter_set_limit(idmap_iter_t *iter, uint64_t limit) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->limit = limit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create iterator to get name-based mapping rules
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * windomain - Windows domain
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_user - user or group rules
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * winname - Windows user or group name
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * unixname - Unix user or group name
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * iter - iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_iter_namerules(idmap_handle_t *handle, const char *windomain,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw boolean_t is_user, const char *winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *unixname, idmap_iter_t **iter) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_t *tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_namerules_1_argument *arg = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_namerule *rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_utf8str *str;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_CREATE(tmpiter, arg, handle, IDMAP_LIST_NAMERULES);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule = &arg->rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->direction = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->windomain;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, windomain, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->winname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, winname, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &rule->unixname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, unixname, 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *iter = tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_ERR_RETURN(tmpiter, arg,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_idmap_list_namerules_1_argument, retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Iterate through the name-based mapping rules
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * iter - iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * windomain - Windows domain
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * winname - Windows user or group name
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * unixname - Unix user or group name
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_nt4 - NT4 or AD
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * direction - bi(0), win2unix(1), unix2win(2)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return value:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * 0 - done
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * 1 - more results available
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * < 0 - error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_iter_next_namerule(idmap_iter_t *iter, char **windomain,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **winname, char **unixname, boolean_t *is_nt4,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int *direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_namerules_res *namerules;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_namerules_1_argument *arg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *winname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *unixname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_nt4)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_nt4 = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_CHECK(iter, IDMAP_LIST_NAMERULES);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw namerules = (idmap_namerules_res *)iter->retlist;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->retcode == IDMAP_NEXT && (namerules == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->next >= namerules->rules.rules_len)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((arg = iter->arg) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw arg->limit = iter->limit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = _iter_get_next_list(IDMAP_LIST_NAMERULES,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter, arg,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (uchar_t **)&namerules, sizeof (*namerules),
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_list_namerules_1_argument,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_namerules_res);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (IDMAP_ERROR(namerules->retcode)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = namerules->retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_namerules_res, (caddr_t)namerules);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(namerules);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->retcode = namerules->retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw arg->lastrowid = namerules->lastrowid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (namerules == NULL || namerules->rules.rules_len == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->next >= namerules->rules.rules_len) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_utf82str(windomain, 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &namerules->rules.rules_val[iter->next].windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_utf82str(winname, 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &namerules->rules.rules_val[iter->next].winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_utf82str(unixname, 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &namerules->rules.rules_val[iter->next].unixname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_nt4)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_nt4 = namerules->rules.rules_val[iter->next].is_nt4;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = namerules->rules.rules_val[iter->next].direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->next == namerules->rules.rules_len)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (iter->retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_NEXT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain && *windomain)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname && *winname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname && *unixname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*unixname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create iterator to get SID to UID/GID mappings
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_user - user or group
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * iter - iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_iter_mappings(idmap_handle_t *handle, boolean_t is_user,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_t **iter) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_t *tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_mappings_1_argument *arg = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_CREATE(tmpiter, arg, handle, IDMAP_LIST_MAPPINGS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw arg->is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *iter = tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Iterate through the SID to UID/GID mappings
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * iter - iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid - SID in canonical form
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * pid - UID or GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return value:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * 0 - done
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * 1 - more results available
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * < 0 - error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_iter_next_mapping(idmap_iter_t *iter, char **sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_rid_t *rid, uid_t *pid, char **winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **windomain, char **unixname, int *direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mappings_res *mappings;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_mappings_1_argument *arg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *str;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sidprefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = UINT32_MAX;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *winname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *unixname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = UINT32_MAX;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_CHECK(iter, IDMAP_LIST_MAPPINGS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mappings = (idmap_mappings_res *)iter->retlist;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->retcode == IDMAP_NEXT && (mappings == NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->next >= mappings->mappings.mappings_len)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((arg = iter->arg) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw arg->limit = iter->limit;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = _iter_get_next_list(IDMAP_LIST_MAPPINGS,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter, arg,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (uchar_t **)&mappings, sizeof (*mappings),
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_list_mappings_1_argument,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_mappings_res);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (IDMAP_ERROR(mappings->retcode)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = mappings->retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_mappings_res, (caddr_t)mappings);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(mappings);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->retcode = mappings->retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw arg->lastrowid = mappings->lastrowid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (mappings == NULL || mappings->mappings.mappings_len == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->next >= mappings->mappings.mappings_len) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = mappings->mappings.mappings_val[iter->next].id1.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id_u.sid.prefix;
9581d9f4f3b1515f88149f920c7e786b4fb901d4baban if (str) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sidprefix = strdup(str);
9581d9f4f3b1515f88149f920c7e786b4fb901d4baban if (*sidprefix == NULL) {
9581d9f4f3b1515f88149f920c7e786b4fb901d4baban retcode = IDMAP_ERR_MEMORY;
9581d9f4f3b1515f88149f920c7e786b4fb901d4baban goto errout;
9581d9f4f3b1515f88149f920c7e786b4fb901d4baban }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = mappings->mappings.mappings_val[iter->next].id1.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id_u.sid.rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_utf82str(winname, 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &mappings->mappings.mappings_val[iter->next].id1name);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_utf82str(windomain, 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &mappings->mappings.mappings_val[iter->next].id1domain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_utf82str(unixname, 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &mappings->mappings.mappings_val[iter->next].id2name);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = mappings->mappings.mappings_val[iter->next].id2.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = mappings->mappings.mappings_val[iter->next].
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw iter->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->next == mappings->mappings.mappings_len)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (iter->retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_NEXT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix && *sidprefix)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*sidprefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname && *winname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain && *windomain)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname && *unixname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*unixname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Destroy the iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_iter_destroy(idmap_iter_t *iter) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdrproc_t _xdr_argument, _xdr_result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (iter->type) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_LIST_NAMERULES:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _xdr_argument = (xdrproc_t)xdr_idmap_list_namerules_1_argument;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _xdr_result = (xdrproc_t)xdr_idmap_namerules_res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_LIST_MAPPINGS:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _xdr_argument = (xdrproc_t)xdr_idmap_list_mappings_1_argument;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _xdr_result = (xdrproc_t)xdr_idmap_mappings_res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(iter);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw };
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->arg) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(_xdr_argument, (caddr_t)iter->arg);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(iter->arg);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->retlist) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(_xdr_result, (caddr_t)iter->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(iter->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(iter);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create handle to get SID to UID/GID mapping entries
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gh - "get mapping" handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_create(idmap_handle_t *handle, idmap_get_handle_t **gh) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_handle_t *tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (handle == NULL || gh == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* allocate the handle */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((tmp = calloc(1, sizeof (*tmp))) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->ih = handle;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh = tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given SID, get UID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sidprefix - SID prefix
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - RID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * flag - flag
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * uid - POSIX UID if stat = 0
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_uidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int flag, uid_t *uid, idmap_stat *stat) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (uid == NULL || sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Extend the request array and the return list */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup the request */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((mapping->id1.idmap_id_u.sid.prefix = strdup(sidprefix)) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_MEMORY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup pointers for the result */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].uid = uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given SID, get GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sidprefix - SID prefix
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - rid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * flag - flag
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gid - POSIX GID if stat = 0
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_gidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int flag, gid_t *gid, idmap_stat *stat) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gid == NULL || sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Extend the request array and the return list */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup the request */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((mapping->id1.idmap_id_u.sid.prefix = strdup(sidprefix)) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_MEMORY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup pointers for the result */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].gid = gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given SID, get POSIX ID i.e. UID/GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sidprefix - SID prefix
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - rid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * flag - flag
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_user - user or group
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * pid - POSIX UID if stat = 0 and is_user = 1
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * POSIX GID if stat = 0 and is_user = 0
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_pidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int flag, uid_t *pid, int *is_user, idmap_stat *stat) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid == NULL || sidprefix == NULL || is_user == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Extend the request array and the return list */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup the request */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.sid.rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((mapping->id1.idmap_id_u.sid.prefix = strdup(sidprefix)) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_MEMORY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_POSIXID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup pointers for the result */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].idtype = IDMAP_POSIXID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].uid = pid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].gid = pid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].is_user = is_user;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given UID, get SID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * uid - POSIX UID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * flag - flag
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid - SID prefix (if stat == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - rid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_sidbyuid(idmap_get_handle_t *gh, uid_t uid, int flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **sidprefix, idmap_rid_t *rid, idmap_stat *stat) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Extend the request array and the return list */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup the request */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.uid = uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup pointers for the result */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].sidprefix = sidprefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Given GID, get SID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * gid - POSIX GID
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * flag - flag
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * stat - status of the get request
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sidprefix - SID prefix (if stat == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rid - rid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Note: The output parameters will be set by idmap_get_mappings()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_sidbygid(idmap_get_handle_t *gh, gid_t gid, int flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **sidprefix, idmap_rid_t *rid, idmap_stat *stat) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Extend the request array and the return list */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((retcode = _get_ids_extend_batch(gh)) != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup the request */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping = &gh->batch.idmap_mapping_batch_val[gh->next];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id1.idmap_id_u.gid = gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mapping->id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Setup pointers for the result */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].sidprefix = sidprefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].rid = rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist[gh->next].stat = stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
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 */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_mappings(idmap_get_handle_t *gh) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw CLIENT *clnt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw enum clnt_stat clntstat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res res;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_id *id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _IDMAP_GET_CLIENT_HANDLE(gh->ih, clnt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(&res, 0, sizeof (idmap_ids_res));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clntstat = clnt_call(clnt, IDMAP_GET_MAPPED_IDS,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_mapping_batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&gh->batch,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_ids_res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (caddr_t)&res,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw TIMEOUT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clntstat != RPC_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_RPC;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (res.retcode != IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = res.retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < gh->next; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (i >= res.ids.ids_len) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].stat = IDMAP_ERR_NORESULT;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].stat = res.ids.ids_val[i].retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw id = &res.ids.ids_val[i].id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (id->idtype) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_UID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].uid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].uid = id->idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].is_user = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_GID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].gid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].gid = id->idmap_id_u.gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].is_user = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_SID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].rid = id->idmap_id_u.sid.rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].sidprefix) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (id->idmap_id_u.sid.prefix == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].sidprefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].sidprefix =
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw strdup(id->idmap_id_u.sid.prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*gh->retlist[i].sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].stat =
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw IDMAP_ERR_MEMORY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_NONE:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].stat = IDMAP_ERR_NORESULT;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->retlist = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_ids_res, (caddr_t)&res);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Destroy the "get mapping" handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_destroy(idmap_get_handle_t *gh) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_mapping_batch, (caddr_t)&gh->batch);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh->retlist);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(gh);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Get windows to unix mapping
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_w2u_mapping(idmap_handle_t *handle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *sidprefix, idmap_rid_t *rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *winname, const char *windomain,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int flag, int *is_user,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid_t *pid, char **unixname, int *direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw CLIENT *clnt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw enum clnt_stat clntstat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping request, *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mappings_res result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode, rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_utf8str *str;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (handle == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _IDMAP_GET_CLIENT_HANDLE(handle, clnt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(&request, 0, sizeof (request));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(&result, 0, sizeof (result));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = UINT32_MAX;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *unixname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix && rid) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.sid.prefix = (char *)sidprefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.sid.rid = *rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &request.id1name;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, winname, 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &request.id1domain;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, windomain, 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.sid.prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_user == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id2.idtype = IDMAP_POSIXID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else if (*is_user == 1)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id2.idtype = IDMAP_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else if (*is_user == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id2.idtype = IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id2.idtype = IDMAP_POSIXID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clntstat = clnt_call(clnt, IDMAP_GET_MAPPED_ID_BY_NAME,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_mapping, (caddr_t)&request,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_mappings_res, (caddr_t)&result,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw TIMEOUT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clntstat != RPC_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_RPC);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = result.retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((mapping = result.mappings.mappings_val) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_NORESULT;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_user = (mapping->id2.idtype == IDMAP_UID)?1:0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = mapping->direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = mapping->id2.idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = idmap_utf82str(unixname, 0, &mapping->id2name);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_mappings_res, (caddr_t)&result);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Get unix to windows mapping
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_get_u2w_mapping(idmap_handle_t *handle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid_t *pid, const char *unixname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int flag, int is_user,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **sidprefix, idmap_rid_t *rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **winname, char **windomain,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int *direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw CLIENT *clnt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw enum clnt_stat clntstat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping request, *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mappings_res result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode, rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_utf8str *str;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (handle == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw _IDMAP_GET_CLIENT_HANDLE(handle, clnt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sidprefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *winname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = UINT32_MAX;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(&request, 0, sizeof (request));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(&result, 0, sizeof (result));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.flag = flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idtype = is_user?IDMAP_UID:IDMAP_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid && *pid != UINT32_MAX) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.uid = *pid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (unixname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw str = &request.id1name;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = idmap_str2utf8(&str, unixname, 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.uid = UINT32_MAX;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id2.idtype = IDMAP_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw clntstat = clnt_call(clnt, IDMAP_GET_MAPPED_ID_BY_NAME,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_mapping, (caddr_t)&request,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (xdrproc_t)xdr_idmap_mappings_res, (caddr_t)&result,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw TIMEOUT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (clntstat != RPC_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_RPC);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = result.retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((mapping = result.mappings.mappings_val) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode == IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_NORESULT;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = mapping->direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sidprefix = strdup(mapping->id2.idmap_id_u.sid.prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*sidprefix == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_ERR_MEMORY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *rid = mapping->id2.idmap_id_u.sid.rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = idmap_utf82str(winname, 0, &mapping->id2name);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc != IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = idmap_utf82str(windomain, 0, &mapping->id2domain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc != IDMAP_SUCCESS) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix && *sidprefix) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*sidprefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *sidprefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname && *winname) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *winname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (windomain && *windomain) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(*windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw xdr_free(xdr_idmap_mappings_res, (caddr_t)&result);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * utf8str to string
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_utf82str(char **out, size_t outsize, idmap_utf8str *in) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int len;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in == NULL || out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (outsize == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *out = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((len = in->idmap_utf8str_len) == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in->idmap_utf8str_val == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in->idmap_utf8str_val[len - 1] != 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw len++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *out = calloc(1, len);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(*out, 0, outsize);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((len = in->idmap_utf8str_len) == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in->idmap_utf8str_val == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in->idmap_utf8str_val[len - 1] != 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw len++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (outsize < len)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memcpy(*out, in->idmap_utf8str_val, in->idmap_utf8str_len);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * string to utf8str
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_str2utf8(idmap_utf8str **out, const char *in, int flag) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_utf8str *tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else if (*out == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp = malloc(sizeof (idmap_utf8str));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (tmp == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp = *out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->idmap_utf8str_len = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->idmap_utf8str_val = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *out = tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* include the null terminator */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->idmap_utf8str_len = strlen(in) + 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (flag == 1) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Don't malloc, simply assign */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->idmap_utf8str_val = (char *)in;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *out = tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->idmap_utf8str_val = malloc(tmp->idmap_utf8str_len);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (tmp->idmap_utf8str_val == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw tmp->idmap_utf8str_len = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(tmp);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memcpy(tmp->idmap_utf8str_val, in, tmp->idmap_utf8str_len);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*out == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *out = tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define gettext(s) s
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic stat_table_t stattable[] = {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_SUCCESS, gettext("Success"), 0},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_NEXT, gettext("More results available"), 0},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_OTHER, gettext("Undefined error"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_INTERNAL, gettext("Internal error"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_MEMORY, gettext("Out of memory"), ENOMEM},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NORESULT, gettext("No results available"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NOTUSER, gettext("Not a user"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NOTGROUP, gettext("Not a group"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NOTSUPPORTED, gettext("Operation not supported"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_W2U_NAMERULE,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Invalid Windows to UNIX name-based rule"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_U2W_NAMERULE,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Invalid UNIX to Windows name-based rule"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_CACHE, gettext("Invalid cache"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_DB, gettext("Invalid database"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_ARG, gettext("Invalid argument"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_SID, gettext("Invalid SID"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_IDTYPE, gettext("Invalid identity type"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_RPC_HANDLE, gettext("Bad RPC handle"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_RPC, gettext("RPC error"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_CLIENT_HANDLE, gettext("Bad client handle"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_BUSY, gettext("Server is busy"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_PERMISSION_DENIED, gettext("Permisssion denied"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NOMAPPING,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Mapping not found or inhibited"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NEW_ID_ALLOC_REQD,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("New mapping needs to be created"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_DOMAIN, gettext("Invalid domain"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_SECURITY, gettext("Security issue"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NOTFOUND, gettext("Not found"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_DOMAIN_NOTFOUND, gettext("Domain not found"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_UPDATE_NOTALLOWED, gettext("Update not allowed"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_CFG, gettext("Configuration error"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_CFG_CHANGE, gettext("Invalid configuration change"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_NOTMAPPED_WELLKNOWN,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("No mapping for well-known SID"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_RETRIABLE_NET_ERR,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Network error"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {-1, NULL, 0}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw};
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#undef gettext
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Get description of status code
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * status - Status code returned by libidmap API call
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return Value:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * human-readable localized description of idmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* ARGSUSED */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwconst char *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat2string(idmap_handle_t *handle, idmap_stat status) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; stattable[i].msg; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stattable[i].retcode == status)
9581d9f4f3b1515f88149f920c7e786b4fb901d4baban return (gettext(stattable[i].msg));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (gettext("Unknown error"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat2errno(idmap_stat stat) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; stattable[i].msg; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stattable[i].retcode == stat)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (stattable[i].errnum);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (EINVAL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Get status code from string
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_string2stat(const char *str) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (str == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_INTERNAL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define return_cmp(a) \
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (0 == strcmp(str, "IDMAP_ERR_" #a)) \
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ ## a);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(OTHER);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(INTERNAL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NORESULT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NOTUSER);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NOTGROUP);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NOTSUPPORTED);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(W2U_NAMERULE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(U2W_NAMERULE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(CACHE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(DB);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(SID);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(IDTYPE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(RPC_HANDLE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(RPC);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(CLIENT_HANDLE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(BUSY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(PERMISSION_DENIED);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NOMAPPING);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NEW_ID_ALLOC_REQD);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(DOMAIN);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(SECURITY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NOTFOUND);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(DOMAIN_NOTFOUND);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(UPDATE_NOTALLOWED);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(CFG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(CFG_CHANGE);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(NOTMAPPED_WELLKNOWN);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return_cmp(RETRIABLE_NET_ERR);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#undef return_cmp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_OTHER);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Map the given status to one that can be returned by the protocol
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat4prot(idmap_stat status) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (status) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_ERR_MEMORY:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_ERR_CACHE:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_INTERNAL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}