idmap_api.c revision ad8ef92ae01ac09e533731f5a517162c634308b4
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/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik * Copyright Milan Jurik 2012. All rights reserved.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * libidmap API
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdlib.h>
479ac37569625bae44ffb80071d4bc865fc710eddm#include <sys/varargs.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>
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai#include <syslog.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <assert.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include "idmap_impl.h"
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen#include "idmap_cache.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic struct timeval TIMEOUT = { 25, 0 };
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int idmap_stat2errno(idmap_stat);
479ac37569625bae44ffb80071d4bc865fc710eddmstatic idmap_stat idmap_strdupnull(char **, const char *);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh#define __ITER_CREATE(itera, argu, ityp)\
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->type = ityp;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->retcode = IDMAP_NEXT;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->limit = 1024;\
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw itera->arg = argu;
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 * Free memory allocated by libidmap API
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * ptr - memory to be freed
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_free(void *ptr)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(ptr);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenstatic idmap_stat
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_get_prop(idmap_prop_type pr, idmap_prop_res *res)
479ac37569625bae44ffb80071d4bc865fc710eddm{
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat retcode;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm (void) memset(res, 0, sizeof (*res));
479ac37569625bae44ffb80071d4bc865fc710eddm
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh retcode = _idmap_clnt_call(IDMAP_GET_PROP,
479ac37569625bae44ffb80071d4bc865fc710eddm (xdrproc_t)xdr_idmap_prop_type, (caddr_t)&pr,
479ac37569625bae44ffb80071d4bc865fc710eddm (xdrproc_t)xdr_idmap_prop_res, (caddr_t)res, TIMEOUT);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (retcode != IDMAP_SUCCESS)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (retcode);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm return (res->retcode); /* This might not be IDMAP_SUCCESS! */
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
479ac37569625bae44ffb80071d4bc865fc710eddmidmap_stat
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_get_prop_ds(idmap_prop_type pr, idmap_ad_disc_ds_t *dc)
479ac37569625bae44ffb80071d4bc865fc710eddm{
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_prop_res res;
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_stat rc = IDMAP_SUCCESS;
479ac37569625bae44ffb80071d4bc865fc710eddm
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = idmap_get_prop(pr, &res);
479ac37569625bae44ffb80071d4bc865fc710eddm if (rc < 0)
479ac37569625bae44ffb80071d4bc865fc710eddm return (rc);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm dc->port = res.value.idmap_prop_val_u.dsval.port;
479ac37569625bae44ffb80071d4bc865fc710eddm (void) strlcpy(dc->host, res.value.idmap_prop_val_u.dsval.host,
479ac37569625bae44ffb80071d4bc865fc710eddm AD_DISC_MAXHOSTNAME);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm /* xdr doesn't guarantee 0-termination of char[]: */
479ac37569625bae44ffb80071d4bc865fc710eddm dc->host[AD_DISC_MAXHOSTNAME - 1] = '\0';
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm return (rc);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm/*
479ac37569625bae44ffb80071d4bc865fc710eddm * Sometimes the property is not set. In that case, str is set to NULL but
479ac37569625bae44ffb80071d4bc865fc710eddm * otherwise IDMAP_SUCCESS is returned.
479ac37569625bae44ffb80071d4bc865fc710eddm */
479ac37569625bae44ffb80071d4bc865fc710eddmidmap_stat
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_get_prop_str(idmap_prop_type pr, char **str)
479ac37569625bae44ffb80071d4bc865fc710eddm{
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_prop_res res;
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_stat rc = IDMAP_SUCCESS;
479ac37569625bae44ffb80071d4bc865fc710eddm
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = idmap_get_prop(pr, &res);
479ac37569625bae44ffb80071d4bc865fc710eddm if (rc < 0)
479ac37569625bae44ffb80071d4bc865fc710eddm return (rc);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm rc = idmap_strdupnull(str, res.value.idmap_prop_val_u.utf8val);
479ac37569625bae44ffb80071d4bc865fc710eddm return (rc);
479ac37569625bae44ffb80071d4bc865fc710eddm}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Create/Initialize handle for updates
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * udthandle - update handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_udt_create(idmap_udt_handle_t **udthandle)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_udt_handle_t *tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (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 *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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_udt_commit(idmap_udt_handle_t *udthandle)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_update_res res;
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_stat retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (udthandle == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) memset(&res, 0, sizeof (res));
8e22821528b08c6dba4e8176351560f316f6d0dedm
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh retcode = _idmap_clnt_call(IDMAP_UPDATE,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_update_batch, (caddr_t)&udthandle->batch,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_update_res, (caddr_t)&res,
cd37da7426f0c49c14ad9a8a07638ca971477566nw TIMEOUT);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = udthandle->commit_stat = res.retcode;
8e22821528b08c6dba4e8176351560f316f6d0dedm udthandle->error_index = res.error_index;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (udthandle->error_index < 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_namerule_cpy(&udthandle->error_rule,
8e22821528b08c6dba4e8176351560f316f6d0dedm &res.error_rule);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm udthandle->error_index = -2;
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_namerule_cpy(&udthandle->conflict_rule,
8e22821528b08c6dba4e8176351560f316f6d0dedm &res.conflict_rule);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm udthandle->error_index = -2;
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = res.retcode;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban /* reset handle so that it can be used again */
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode == IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm _IDMAP_RESET_UDT_HANDLE(udthandle);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) xdr_free(xdr_idmap_update_res, (caddr_t)&res);
8e22821528b08c6dba4e8176351560f316f6d0dedm errno = idmap_stat2errno(retcode);
8e22821528b08c6dba4e8176351560f316f6d0dedm return (retcode);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic void
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_namerule_parts_clear(char **windomain, char **winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **unixname, boolean_t *is_user, boolean_t *is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t *is_nt4, int *direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm if (windomain)
8e22821528b08c6dba4e8176351560f316f6d0dedm *windomain = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (winname)
8e22821528b08c6dba4e8176351560f316f6d0dedm *winname = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (unixname)
8e22821528b08c6dba4e8176351560f316f6d0dedm *unixname = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (is_nt4)
8e22821528b08c6dba4e8176351560f316f6d0dedm *is_nt4 = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (is_user)
8e22821528b08c6dba4e8176351560f316f6d0dedm *is_user = -1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_wuser)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = -1;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (direction)
8e22821528b08c6dba4e8176351560f316f6d0dedm *direction = IDMAP_DIRECTION_UNDEF;
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic idmap_stat
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_namerule2parts(idmap_namerule *rule,
8e22821528b08c6dba4e8176351560f316f6d0dedm char **windomain, char **winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **unixname, boolean_t *is_user, boolean_t *is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t *is_nt4, int *direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_stat retcode;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (EMPTY_STRING(rule->winname) && EMPTY_STRING(rule->unixname))
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_ERR_NORESULT);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(windomain, rule->windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(winname, rule->winname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(unixname, rule->unixname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (is_user)
8e22821528b08c6dba4e8176351560f316f6d0dedm *is_user = rule->is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_wuser)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = rule->is_wuser;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (is_nt4)
8e22821528b08c6dba4e8176351560f316f6d0dedm *is_nt4 = rule->is_nt4;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (direction)
8e22821528b08c6dba4e8176351560f316f6d0dedm *direction = rule->direction;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_SUCCESS);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmerrout:
8e22821528b08c6dba4e8176351560f316f6d0dedm if (windomain && *windomain)
8e22821528b08c6dba4e8176351560f316f6d0dedm free(*windomain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (winname && *winname)
8e22821528b08c6dba4e8176351560f316f6d0dedm free(*winname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (unixname && *unixname)
8e22821528b08c6dba4e8176351560f316f6d0dedm free(*unixname);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_namerule_parts_clear(windomain, winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname, is_user, is_wuser, is_nt4, direction);
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm/*
8e22821528b08c6dba4e8176351560f316f6d0dedm * Retrieve the index of the failed batch element. error_index == -1
8e22821528b08c6dba4e8176351560f316f6d0dedm * indicates failure at the beginning, -2 at the end.
8e22821528b08c6dba4e8176351560f316f6d0dedm *
8e22821528b08c6dba4e8176351560f316f6d0dedm * If idmap_udt_commit didn't return error, the returned value is undefined.
8e22821528b08c6dba4e8176351560f316f6d0dedm *
8e22821528b08c6dba4e8176351560f316f6d0dedm * Return value:
8e22821528b08c6dba4e8176351560f316f6d0dedm * IDMAP_SUCCESS
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_stat
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_udt_get_error_index(idmap_udt_handle_t *udthandle,
cd37da7426f0c49c14ad9a8a07638ca971477566nw int64_t *error_index)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm if (error_index)
8e22821528b08c6dba4e8176351560f316f6d0dedm *error_index = udthandle->error_index;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_SUCCESS);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm/*
8e22821528b08c6dba4e8176351560f316f6d0dedm * Retrieve the rule which caused the batch to fail. If
8e22821528b08c6dba4e8176351560f316f6d0dedm * idmap_udt_commit didn't return error or if error_index is < 0, the
8e22821528b08c6dba4e8176351560f316f6d0dedm * retrieved rule is undefined.
8e22821528b08c6dba4e8176351560f316f6d0dedm *
8e22821528b08c6dba4e8176351560f316f6d0dedm * Return value:
8e22821528b08c6dba4e8176351560f316f6d0dedm * IDMAP_ERR_NORESULT if there is no error rule.
8e22821528b08c6dba4e8176351560f316f6d0dedm * IDMAP_SUCCESS if the rule was obtained OK.
8e22821528b08c6dba4e8176351560f316f6d0dedm * other error code (IDMAP_ERR_NOMEMORY etc)
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_stat
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_udt_get_error_rule(idmap_udt_handle_t *udthandle,
8e22821528b08c6dba4e8176351560f316f6d0dedm char **windomain, char **winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **unixname, boolean_t *is_user, boolean_t *is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t *is_nt4, int *direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_namerule_parts_clear(windomain, winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname, is_user, is_wuser, is_nt4, direction);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (udthandle->commit_stat == IDMAP_SUCCESS ||
8e22821528b08c6dba4e8176351560f316f6d0dedm udthandle->error_index < 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_ERR_NORESULT);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm return (idmap_namerule2parts(
cd37da7426f0c49c14ad9a8a07638ca971477566nw &udthandle->error_rule,
cd37da7426f0c49c14ad9a8a07638ca971477566nw windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_user,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_nt4,
cd37da7426f0c49c14ad9a8a07638ca971477566nw direction));
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm/*
8e22821528b08c6dba4e8176351560f316f6d0dedm * Retrieve the rule with which there was a conflict. TODO: retrieve
8e22821528b08c6dba4e8176351560f316f6d0dedm * the value.
8e22821528b08c6dba4e8176351560f316f6d0dedm *
8e22821528b08c6dba4e8176351560f316f6d0dedm * Return value:
8e22821528b08c6dba4e8176351560f316f6d0dedm * IDMAP_ERR_NORESULT if there is no error rule.
8e22821528b08c6dba4e8176351560f316f6d0dedm * IDMAP_SUCCESS if the rule was obtained OK.
8e22821528b08c6dba4e8176351560f316f6d0dedm * other error code (IDMAP_ERR_NOMEMORY etc)
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_stat
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_udt_get_conflict_rule(idmap_udt_handle_t *udthandle,
8e22821528b08c6dba4e8176351560f316f6d0dedm char **windomain, char **winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **unixname, boolean_t *is_user, boolean_t *is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t *is_nt4, int *direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_namerule_parts_clear(windomain, winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname, is_user, is_wuser, is_nt4, direction);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (udthandle->commit_stat != IDMAP_ERR_W2U_NAMERULE_CONFLICT &&
8e22821528b08c6dba4e8176351560f316f6d0dedm udthandle->commit_stat != IDMAP_ERR_U2W_NAMERULE_CONFLICT) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (IDMAP_ERR_NORESULT);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm return (idmap_namerule2parts(
cd37da7426f0c49c14ad9a8a07638ca971477566nw &udthandle->conflict_rule,
cd37da7426f0c49c14ad9a8a07638ca971477566nw windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_user,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_nt4,
cd37da7426f0c49c14ad9a8a07638ca971477566nw direction));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Destroy the update handle
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwvoid
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_udt_destroy(idmap_udt_handle_t *udthandle)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (udthandle == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) xdr_free(xdr_idmap_update_batch, (caddr_t)&udthandle->batch);
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) xdr_free(xdr_idmap_namerule, (caddr_t)&udthandle->error_rule);
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) xdr_free(xdr_idmap_namerule, (caddr_t)&udthandle->conflict_rule);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(udthandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_udt_add_namerule(idmap_udt_handle_t *udthandle, const char *windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t is_user, boolean_t is_wuser, const char *winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw const char *unixname, boolean_t is_nt4, int direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_namerule *rule = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban retcode = _udt_extend_batch(udthandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule = &udthandle->batch.
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_update_batch_val[udthandle->next].
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_update_op_u.rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_user = is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw rule->is_wuser = is_wuser;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->direction = direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_nt4 = is_nt4;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->windomain, windomain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->winname, winname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->unixname, unixname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban OP_ADD_NAMERULE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban /* The batch should still be usable */
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (rule)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) xdr_free(xdr_idmap_namerule, (caddr_t)rule);
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t is_wuser, const char *windomain, const char *winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw const char *unixname, int direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_namerule *rule = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban retcode = _udt_extend_batch(udthandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule = &udthandle->batch.
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_update_batch_val[udthandle->next].
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_update_op_u.rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_user = is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw rule->is_wuser = is_wuser;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->direction = direction;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->windomain, windomain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->winname, winname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->unixname, unixname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban OP_RM_NAMERULE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (rule)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) xdr_free(xdr_idmap_namerule, (caddr_t)rule);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* ARGSUSED */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_udt_flush_namerules(idmap_udt_handle_t *udthandle)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban retcode = _udt_extend_batch(udthandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban OP_FLUSH_NAMERULES;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udthandle->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_iter_set_limit(idmap_iter_t *iter, uint64_t limit)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
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
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_iter_namerules(const char *windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t is_user, boolean_t is_wuser, const char *winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw const char *unixname, idmap_iter_t **iter)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_t *tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_namerules_1_argument *arg = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_namerule *rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh __ITER_CREATE(tmpiter, arg, IDMAP_LIST_NAMERULES);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule = &arg->rule;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rule->is_user = is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw rule->is_wuser = is_wuser;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban rule->direction = IDMAP_DIRECTION_UNDEF;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->windomain, windomain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->winname, winname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&rule->unixname, unixname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *iter = tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik if (arg) {
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik xdr_free(xdr_idmap_list_namerules_1_argument, (char *)arg);
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik free(arg);
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik }
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik if (tmpiter)
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik free(tmpiter);
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik
ad8ef92ae01ac09e533731f5a517162c634308b4Milan Jurik return (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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **winname, char **unixname, boolean_t *is_user,
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t *is_wuser, boolean_t *is_nt4, int *direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_namerules_res *namerules;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_namerules_1_argument *arg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_namerule_parts_clear(windomain, winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname, is_user, is_wuser, is_nt4, direction);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_CHECK(iter, IDMAP_LIST_NAMERULES);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw namerules = (idmap_namerules_res *)iter->retlist;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->retcode == IDMAP_NEXT && (namerules == NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw 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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw iter, arg,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (uchar_t **)&namerules, sizeof (*namerules),
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_list_namerules_1_argument,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (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
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(windomain,
8e22821528b08c6dba4e8176351560f316f6d0dedm namerules->rules.rules_val[iter->next].windomain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(winname,
8e22821528b08c6dba4e8176351560f316f6d0dedm namerules->rules.rules_val[iter->next].winname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(unixname,
8e22821528b08c6dba4e8176351560f316f6d0dedm namerules->rules.rules_val[iter->next].unixname);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_nt4)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_nt4 = namerules->rules.rules_val[iter->next].is_nt4;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_user)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_user = namerules->rules.rules_val[iter->next].is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_wuser)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = namerules->rules.rules_val[iter->next].is_wuser;
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 * Output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * iter - iterator
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwidmap_stat
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_iter_mappings(idmap_iter_t **iter, int flag)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_t *tmpiter;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_list_mappings_1_argument *arg = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh __ITER_CREATE(tmpiter, arg, IDMAP_LIST_MAPPINGS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp arg->flag = flag;
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_rid_t *rid, uid_t *pid, char **winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **windomain, char **unixname, boolean_t *is_user,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp boolean_t *is_wuser, int *direction, idmap_info *info)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
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;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_user)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_user = -1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_wuser)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban *direction = IDMAP_DIRECTION_UNDEF;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw __ITER_CHECK(iter, IDMAP_LIST_MAPPINGS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw mappings = (idmap_mappings_res *)iter->retlist;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (iter->retcode == IDMAP_NEXT && (mappings == NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw 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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw iter, arg,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (uchar_t **)&mappings, sizeof (*mappings),
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_list_mappings_1_argument,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (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.
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_id_u.sid.prefix;
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban if (str && *str != '\0') {
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.
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_id_u.sid.rid;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(windomain,
8e22821528b08c6dba4e8176351560f316f6d0dedm mappings->mappings.mappings_val[iter->next].id1domain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(winname,
8e22821528b08c6dba4e8176351560f316f6d0dedm mappings->mappings.mappings_val[iter->next].id1name);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(unixname,
8e22821528b08c6dba4e8176351560f316f6d0dedm mappings->mappings.mappings_val[iter->next].id2name);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto errout;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = mappings->mappings.mappings_val[iter->next].id2.
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = mappings->mappings.mappings_val[iter->next].
cd37da7426f0c49c14ad9a8a07638ca971477566nw direction;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_user)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_user = (mappings->mappings.mappings_val[iter->next].id2
cd37da7426f0c49c14ad9a8a07638ca971477566nw .idtype == IDMAP_UID)?1:0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_wuser)
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = (mappings->mappings.mappings_val[iter->next].id1
cd37da7426f0c49c14ad9a8a07638ca971477566nw .idtype == IDMAP_USID)?1:0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (info) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_info_mov(info,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &mappings->mappings.mappings_val[iter->next].info);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_iter_destroy(idmap_iter_t *iter)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
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
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_get_create(idmap_get_handle_t **gh)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_handle_t *tmp;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* allocate the handle */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((tmp = calloc(1, sizeof (*tmp))) == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = ENOMEM;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_MEMORY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw int flag, uid_t *uid, idmap_stat *stat)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (idmap_getext_uidbysid(gh, sidprefix, rid, flag, uid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp NULL, stat));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp/*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Given SID, get UID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Input:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * sidprefix - SID prefix
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * rid - RID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * flag - flag
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Output:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * stat - status of the get request
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * uid - POSIX UID if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * how - mapping type if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Note: The output parameters will be set by idmap_get_mappings()
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_stat
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_getext_uidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp int flag, uid_t *uid, idmap_info *info, idmap_stat *stat)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_mapping *mapping = NULL;
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
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen retcode = idmap_cache_lookup_uidbysid(sidprefix, rid, uid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (retcode == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *stat = retcode;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (retcode);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
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;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gh->retlist[gh->next].info = info;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban /* Batch created so far should still be usable */
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (mapping)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) memset(mapping, 0, sizeof (*mapping));
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw int flag, gid_t *gid, idmap_stat *stat)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (idmap_getext_gidbysid(gh, sidprefix, rid, flag, gid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp NULL, stat));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp/*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Given SID, get GID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Input:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * sidprefix - SID prefix
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * rid - rid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * flag - flag
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Output:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * stat - status of the get request
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * gid - POSIX GID if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * how - mapping type if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Note: The output parameters will be set by idmap_get_mappings()
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_stat
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_getext_gidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp int flag, gid_t *gid, idmap_info *info, idmap_stat *stat)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_mapping *mapping = NULL;
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
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen retcode = idmap_cache_lookup_gidbysid(sidprefix, rid, gid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (retcode == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *stat = retcode;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (retcode);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
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;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gh->retlist[gh->next].info = info;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (mapping)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) memset(mapping, 0, sizeof (*mapping));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = idmap_stat2errno(retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (retcode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw int flag, uid_t *pid, int *is_user, idmap_stat *stat)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (idmap_getext_pidbysid(gh, sidprefix, rid, flag, pid, is_user,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp NULL, stat));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp/*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Given SID, get POSIX ID i.e. UID/GID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Input:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * sidprefix - SID prefix
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * rid - rid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * flag - flag
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Output:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * stat - status of the get request
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * is_user - user or group
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * pid - POSIX UID if stat = 0 and is_user = 1
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * POSIX GID if stat = 0 and is_user = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * how - mapping type if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Note: The output parameters will be set by idmap_get_mappings()
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_stat
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_getext_pidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp int flag, uid_t *pid, int *is_user, idmap_info *info, idmap_stat *stat)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_mapping *mapping = NULL;
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
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen retcode = idmap_cache_lookup_pidbysid(sidprefix, rid, pid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen is_user);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (retcode == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *stat = retcode;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (retcode);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
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;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gh->retlist[gh->next].info = info;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (mapping)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) memset(mapping, 0, sizeof (*mapping));
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **sidprefix, idmap_rid_t *rid, idmap_stat *stat)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (idmap_getext_sidbyuid(gh, uid, flag, sidprefix, rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp NULL, stat));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp/*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Given UID, get SID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Input:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * uid - POSIX UID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * flag - flag
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Output:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * stat - status of the get request
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * sid - SID prefix (if stat == 0)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * rid - rid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * how - mapping type if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Note: The output parameters will be set by idmap_get_mappings()
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_stat
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_getext_sidbyuid(idmap_get_handle_t *gh, uid_t uid, int flag,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp char **sidprefix, idmap_rid_t *rid, idmap_info *info, idmap_stat *stat)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_mapping *mapping = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen retcode = idmap_cache_lookup_sidbyuid(sidprefix, rid, uid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (retcode == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *stat = retcode;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (retcode);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
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;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gh->retlist[gh->next].info = info;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (mapping)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) memset(mapping, 0, sizeof (*mapping));
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,
cd37da7426f0c49c14ad9a8a07638ca971477566nw char **sidprefix, idmap_rid_t *rid, idmap_stat *stat)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (idmap_getext_sidbygid(gh, gid, flag, sidprefix, rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp NULL, stat));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp/*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Given GID, get SID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Input:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * gid - POSIX GID
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * flag - flag
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Output:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * stat - status of the get request
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * sidprefix - SID prefix (if stat == 0)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * rid - rid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * how - mapping type if stat = 0
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Note: The output parameters will be set by idmap_get_mappings()
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_stat
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_getext_sidbygid(idmap_get_handle_t *gh, gid_t gid, int flag,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp char **sidprefix, idmap_rid_t *rid, idmap_info *info, idmap_stat *stat)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban idmap_mapping *mapping = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* sanity checks */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if ((flag & IDMAP_REQ_FLG_USE_CACHE) &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen !(flag & IDMAP_REQ_FLG_MAPPING_INFO)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen retcode = idmap_cache_lookup_sidbygid(sidprefix, rid, gid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (retcode == IDMAP_SUCCESS || retcode == IDMAP_ERR_MEMORY) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *stat = retcode;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (retcode);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
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;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gh->retlist[gh->next].info = info;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[gh->next].cache_res = flag & IDMAP_REQ_FLG_USE_CACHE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gh->next++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_SUCCESS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwerrout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban if (mapping)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban (void) memset(mapping, 0, sizeof (*mapping));
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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_get_mappings(idmap_get_handle_t *gh)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_ids_res res;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_id *res_id;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_id *req_id;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen int direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(&res, 0, sizeof (idmap_ids_res));
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh retcode = _idmap_clnt_call(IDMAP_GET_MAPPED_IDS,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_mapping_batch,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (caddr_t)&gh->batch,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_ids_res,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (caddr_t)&res,
cd37da7426f0c49c14ad9a8a07638ca971477566nw TIMEOUT);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (retcode != IDMAP_SUCCESS) {
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;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id = &res.ids.ids_val[i].id;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction = res.ids.ids_val[i].direction;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id = &gh->batch.idmap_mapping_batch_val[i].id1;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen switch (res_id->idtype) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_UID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].uid)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *gh->retlist[i].uid = res_id->idmap_id_u.uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].is_user = 1;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (res.ids.ids_val[i].retcode == IDMAP_SUCCESS &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[i].cache_res) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (gh->retlist[i].is_user != NULL)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_sid2pid(
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.prefix,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.rid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.uid, 1,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen else
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_sid2uid(
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.prefix,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.rid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.uid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_GID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].gid)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *gh->retlist[i].gid = res_id->idmap_id_u.gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].is_user)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].is_user = 0;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (res.ids.ids_val[i].retcode == IDMAP_SUCCESS &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[i].cache_res) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (gh->retlist[i].is_user != NULL)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_sid2pid(
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.prefix,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.rid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.gid, 0,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen else
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_sid2gid(
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.prefix,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.sid.rid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.gid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
62c6006265c37877b7a5b3c8ffce913ef559b955baban case IDMAP_POSIXID:
62c6006265c37877b7a5b3c8ffce913ef559b955baban if (gh->retlist[i].uid)
62c6006265c37877b7a5b3c8ffce913ef559b955baban *gh->retlist[i].uid = 60001;
62c6006265c37877b7a5b3c8ffce913ef559b955baban if (gh->retlist[i].is_user)
62c6006265c37877b7a5b3c8ffce913ef559b955baban *gh->retlist[i].is_user = -1;
62c6006265c37877b7a5b3c8ffce913ef559b955baban break;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_SID:
cd37da7426f0c49c14ad9a8a07638ca971477566nw case IDMAP_USID:
cd37da7426f0c49c14ad9a8a07638ca971477566nw case IDMAP_GSID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].rid)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *gh->retlist[i].rid =
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.sid.rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gh->retlist[i].sidprefix) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (res_id->idmap_id_u.sid.prefix == NULL ||
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen *res_id->idmap_id_u.sid.prefix == '\0') {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].sidprefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].sidprefix =
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen strdup(res_id->idmap_id_u.sid.prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*gh->retlist[i].sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].stat =
cd37da7426f0c49c14ad9a8a07638ca971477566nw IDMAP_ERR_MEMORY;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (res.ids.ids_val[i].retcode == IDMAP_SUCCESS &&
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gh->retlist[i].cache_res) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (req_id->idtype == IDMAP_UID)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_sid2uid(
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.sid.prefix,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.sid.rid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.uid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen else /* req_id->idtype == IDMAP_GID */
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_sid2gid(
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.sid.prefix,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen res_id->idmap_id_u.sid.rid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen req_id->idmap_id_u.gid,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_NONE:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *gh->retlist[i].stat = IDMAP_ERR_NORESULT;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (gh->retlist[i].info != NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_info_mov(gh->retlist[i].info,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &res.ids.ids_val[i].info);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw retcode = IDMAP_SUCCESS;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwout:
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban _IDMAP_RESET_GET_HANDLE(gh);
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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_get_destroy(idmap_get_handle_t *gh)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
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
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_get_w2u_mapping(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *sidprefix, idmap_rid_t *rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *winname, const char *windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw int flag, int *is_user, int *is_wuser,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp uid_t *pid, char **unixname, int *direction, idmap_info *info)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping request, *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mappings_res result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode, rc;
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)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban *direction = IDMAP_DIRECTION_UNDEF;
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) {
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&request.id1name, winname);
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban if (retcode != IDMAP_SUCCESS)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = idmap_strdupnull(&request.id1domain, windomain);
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban if (retcode != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.sid.prefix = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw 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
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (*is_wuser == 1)
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id1.idtype = IDMAP_USID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (*is_wuser == 0)
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id1.idtype = IDMAP_GSID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id1.idtype = IDMAP_SID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh retcode = _idmap_clnt_call(IDMAP_GET_MAPPED_ID_BY_NAME,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_mapping, (caddr_t)&request,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_mappings_res, (caddr_t)&result,
cd37da7426f0c49c14ad9a8a07638ca971477566nw TIMEOUT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (retcode != IDMAP_SUCCESS)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (retcode);
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
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (info != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_info_mov(info, &mapping->info);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
62c6006265c37877b7a5b3c8ffce913ef559b955baban if (mapping->id2.idtype == IDMAP_UID) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_user = 1;
62c6006265c37877b7a5b3c8ffce913ef559b955baban } else if (mapping->id2.idtype == IDMAP_GID) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_user = 0;
62c6006265c37877b7a5b3c8ffce913ef559b955baban } else {
62c6006265c37877b7a5b3c8ffce913ef559b955baban goto out;
62c6006265c37877b7a5b3c8ffce913ef559b955baban }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (mapping->id1.idtype == IDMAP_USID) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = 1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (mapping->id1.idtype == IDMAP_GSID) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw *is_wuser = 0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else {
cd37da7426f0c49c14ad9a8a07638ca971477566nw goto out;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (direction)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = mapping->direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (pid)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *pid = mapping->id2.idmap_id_u.uid;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = idmap_strdupnull(unixname, mapping->id2name);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwout:
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (request.id1name != NULL)
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp free(request.id1name);
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp if (request.id1domain != NULL)
f7b4b2fefbe31d31fbe1e6a4b494a8fbed3f49b1jp free(request.id1domain);
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
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_get_u2w_mapping(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid_t *pid, const char *unixname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw int flag, int is_user, int *is_wuser,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **sidprefix, idmap_rid_t *rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char **winname, char **windomain,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp int *direction, idmap_info *info)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mapping request, *mapping;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_mappings_res result;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_retcode retcode, rc;
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)
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban *direction = IDMAP_DIRECTION_UNDEF;
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) {
8e22821528b08c6dba4e8176351560f316f6d0dedm request.id1name = (char *)unixname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw request.id1.idmap_id_u.uid = UINT32_MAX;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw errno = EINVAL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_ARG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (is_wuser == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id2.idtype = IDMAP_SID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (*is_wuser == -1)
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id2.idtype = IDMAP_SID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (*is_wuser == 0)
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id2.idtype = IDMAP_GSID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (*is_wuser == 1)
cd37da7426f0c49c14ad9a8a07638ca971477566nw request.id2.idtype = IDMAP_USID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh retcode = _idmap_clnt_call(IDMAP_GET_MAPPED_ID_BY_NAME,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_mapping, (caddr_t)&request,
cd37da7426f0c49c14ad9a8a07638ca971477566nw (xdrproc_t)xdr_idmap_mappings_res, (caddr_t)&result,
cd37da7426f0c49c14ad9a8a07638ca971477566nw TIMEOUT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (retcode != IDMAP_SUCCESS)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (retcode);
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
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (info != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_info_mov(info, &mapping->info);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (direction != NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *direction = mapping->direction;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (is_wuser != NULL) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (mapping->id2.idtype == IDMAP_USID)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *is_wuser = 1;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp else if (mapping->id2.idtype == IDMAP_GSID)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *is_wuser = 0;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp else
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp *is_wuser = -1;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban if (sidprefix && mapping->id2.idmap_id_u.sid.prefix &&
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban *mapping->id2.idmap_id_u.sid.prefix != '\0') {
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;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = idmap_strdupnull(winname, mapping->id2name);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = rc;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = idmap_strdupnull(windomain, mapping->id2domain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm retcode = rc;
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#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},
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban {IDMAP_ERR_NOTSUPPORTED, gettext("Operation not supported"), ENOTSUP},
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},
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban {IDMAP_ERR_RPC_HANDLE, gettext("Bad RPC handle"), EBADF},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_RPC, gettext("RPC error"), EINVAL},
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {IDMAP_ERR_CLIENT_HANDLE, gettext("Bad client handle"), EINVAL},
651c0131ccc65381cbda174bee44a4fd7a518d6bbaban {IDMAP_ERR_BUSY, gettext("Server is busy"), EBUSY},
8edda6281c84e0632a22f9c8dbf0d6f1558878ebbaban {IDMAP_ERR_PERMISSION_DENIED, gettext("Permission denied"), EACCES},
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,
62c6006265c37877b7a5b3c8ffce913ef559b955baban gettext("Windows lookup failed"), EINVAL},
62c6006265c37877b7a5b3c8ffce913ef559b955baban {IDMAP_ERR_W2U_NAMERULE_CONFLICT,
62c6006265c37877b7a5b3c8ffce913ef559b955baban gettext("Duplicate rule or conflicts with an existing "
62c6006265c37877b7a5b3c8ffce913ef559b955baban "Windows to UNIX name-based rule"), EINVAL},
62c6006265c37877b7a5b3c8ffce913ef559b955baban {IDMAP_ERR_U2W_NAMERULE_CONFLICT,
62c6006265c37877b7a5b3c8ffce913ef559b955baban gettext("Duplicate rule or conflicts with an existing "
62c6006265c37877b7a5b3c8ffce913ef559b955baban "Unix to Windows name-based rule"), EINVAL},
0dcc71495bad040a0c83830efc85acf8d897350dnw {IDMAP_ERR_BAD_UTF8,
0dcc71495bad040a0c83830efc85acf8d897350dnw gettext("Invalid or illegal UTF-8 sequence found in "
0dcc71495bad040a0c83830efc85acf8d897350dnw "a given Windows entity name or domain name"), EINVAL},
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen {IDMAP_ERR_NONE_GENERATED,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gettext("Mapping not found and none created (see -c option)"),
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp EINVAL},
479ac37569625bae44ffb80071d4bc865fc710eddm {IDMAP_ERR_PROP_UNKNOWN,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Undefined property"),
479ac37569625bae44ffb80071d4bc865fc710eddm EINVAL},
479ac37569625bae44ffb80071d4bc865fc710eddm {IDMAP_ERR_NS_LDAP_CFG,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Native LDAP configuration error"), EINVAL},
479ac37569625bae44ffb80071d4bc865fc710eddm {IDMAP_ERR_NS_LDAP_PARTIAL,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Partial result from Native LDAP"), EINVAL},
479ac37569625bae44ffb80071d4bc865fc710eddm {IDMAP_ERR_NS_LDAP_OP_FAILED,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Native LDAP operation failed"), EINVAL},
479ac37569625bae44ffb80071d4bc865fc710eddm {IDMAP_ERR_NS_LDAP_BAD_WINNAME,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Improper winname form found in Native LDAP"), EINVAL},
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen {IDMAP_ERR_NO_ACTIVEDIRECTORY,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen gettext("No AD servers"),
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen 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 */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwconst char *
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_stat2string(idmap_stat status)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; stattable[i].msg; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stattable[i].retcode == status)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (dgettext(TEXT_DOMAIN, stattable[i].msg));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (dgettext(TEXT_DOMAIN, "Unknown error"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_stat2errno(idmap_stat stat)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_string2stat(const char *str)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
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);
62c6006265c37877b7a5b3c8ffce913ef559b955baban return_cmp(W2U_NAMERULE_CONFLICT);
62c6006265c37877b7a5b3c8ffce913ef559b955baban return_cmp(U2W_NAMERULE_CONFLICT);
479ac37569625bae44ffb80071d4bc865fc710eddm return_cmp(BAD_UTF8);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return_cmp(NONE_GENERATED);
479ac37569625bae44ffb80071d4bc865fc710eddm return_cmp(PROP_UNKNOWN);
479ac37569625bae44ffb80071d4bc865fc710eddm return_cmp(NS_LDAP_CFG);
479ac37569625bae44ffb80071d4bc865fc710eddm return_cmp(NS_LDAP_PARTIAL);
479ac37569625bae44ffb80071d4bc865fc710eddm return_cmp(NS_LDAP_OP_FAILED);
479ac37569625bae44ffb80071d4bc865fc710eddm return_cmp(NS_LDAP_BAD_WINNAME);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return_cmp(NO_ACTIVEDIRECTORY);
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
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_stat4prot(idmap_stat status)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (status) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_ERR_MEMORY:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case IDMAP_ERR_CACHE:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ERR_INTERNAL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (status);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
8e22821528b08c6dba4e8176351560f316f6d0dedm/*
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban * This is a convenience routine which duplicates a string after
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban * checking for NULL pointers. This function will return success if
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban * either the 'to' OR 'from' pointers are NULL.
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic idmap_stat
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_strdupnull(char **to, const char *from)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban if (to == NULL)
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban return (IDMAP_SUCCESS);
c5a946bac9ff4ebd4d874e1c94d41a5ffcbad287baban
8e22821528b08c6dba4e8176351560f316f6d0dedm if (from == NULL || *from == '\0') {
8e22821528b08c6dba4e8176351560f316f6d0dedm *to = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_SUCCESS);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm *to = strdup(from);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (*to == NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_ERR_MEMORY);
8e22821528b08c6dba4e8176351560f316f6d0dedm return (IDMAP_SUCCESS);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
8e22821528b08c6dba4e8176351560f316f6d0dedmidmap_stat
cd37da7426f0c49c14ad9a8a07638ca971477566nwidmap_namerule_cpy(idmap_namerule *to, idmap_namerule *from)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_stat retval;
8e22821528b08c6dba4e8176351560f316f6d0dedm
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (to == NULL)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (IDMAP_SUCCESS);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) memcpy(to, from, sizeof (idmap_namerule));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp to->windomain = NULL;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp to->winname = NULL;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp to->unixname = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retval = idmap_strdupnull(&to->windomain, from->windomain);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (retval != IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (retval);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retval = idmap_strdupnull(&to->winname, from->winname);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (retval != IDMAP_SUCCESS) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(to->windomain);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp to->windomain = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm return (retval);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm retval = idmap_strdupnull(&to->unixname, from->unixname);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (retval != IDMAP_SUCCESS) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(to->windomain);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp to->windomain = NULL;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(to->winname);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp to->winname = NULL;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (retval);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return (retval);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Move the contents of the "info" structure from "from" to "to".
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_info_mov(idmap_info *to, idmap_info *from)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) memcpy(to, from, sizeof (idmap_info));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) memset(from, 0, sizeof (idmap_info));
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpvoid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpidmap_info_free(idmap_info *info)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (info == NULL)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp return;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright xdr_free(xdr_idmap_info, (caddr_t)info);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) memset(info, 0, sizeof (idmap_info));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmap_how_clear(idmap_how *how)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright xdr_free(xdr_idmap_how, (caddr_t)how);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) memset(how, 0, sizeof (*how));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban/*
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * Get uid given Windows name
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbabanidmap_stat
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullenidmap_getuidbywinname(const char *name, const char *domain, int flag,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen uid_t *uid)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_retcode rc;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_user = 1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_wuser = -1;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen int direction;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if (uid == NULL)
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (IDMAP_ERR_ARG);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (flag & IDMAP_REQ_FLG_USE_CACHE) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen rc = idmap_cache_lookup_uidbywinname(name, domain, uid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (rc == IDMAP_SUCCESS || rc == IDMAP_ERR_MEMORY)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (rc);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban /* Get mapping */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = idmap_get_w2u_mapping(NULL, NULL, name, domain, flag,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen &is_user, &is_wuser, uid, NULL, &direction, NULL);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (rc == IDMAP_SUCCESS && (flag & IDMAP_REQ_FLG_USE_CACHE)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen /* If we have not got the domain don't store UID to winname */
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (domain == NULL)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction = IDMAP_DIRECTION_W2U;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_winname2uid(name, domain, *uid, direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (rc);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban}
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban/*
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * Get gid given Windows name
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbabanidmap_stat
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullenidmap_getgidbywinname(const char *name, const char *domain, int flag,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen gid_t *gid)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_retcode rc;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_user = 0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_wuser = -1;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen int direction;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if (gid == NULL)
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (IDMAP_ERR_ARG);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (flag & IDMAP_REQ_FLG_USE_CACHE) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen rc = idmap_cache_lookup_gidbywinname(name, domain, gid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (rc == IDMAP_SUCCESS || rc == IDMAP_ERR_MEMORY)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (rc);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban /* Get mapping */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = idmap_get_w2u_mapping(NULL, NULL, name, domain, flag,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen &is_user, &is_wuser, gid, NULL, &direction, NULL);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (rc == IDMAP_SUCCESS && (flag & IDMAP_REQ_FLG_USE_CACHE)) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen /* If we have not got the domain don't store GID to winname */
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (domain == NULL)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen direction = IDMAP_DIRECTION_W2U;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_winname2gid(name, domain, *gid, direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (rc);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban}
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban/*
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * Get winname given pid
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbabanstatic idmap_retcode
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullenidmap_getwinnamebypid(uid_t pid, int is_user, int flag, char **name,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen char **domain)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_retcode rc;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban int len;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban char *winname, *windomain;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen int direction;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if (name == NULL)
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (IDMAP_ERR_ARG);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (flag & IDMAP_REQ_FLG_USE_CACHE) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (is_user)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen rc = idmap_cache_lookup_winnamebyuid(&winname,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen &windomain, pid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen else
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen rc = idmap_cache_lookup_winnamebygid(&winname,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen &windomain, pid);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (rc == IDMAP_SUCCESS)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen goto out;
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (rc == IDMAP_ERR_MEMORY)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (rc);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban /* Get mapping */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc = idmap_get_u2w_mapping(&pid, NULL, flag, is_user, NULL,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen NULL, NULL, &winname, &windomain, &direction, NULL);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban /* Return on error */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if (rc != IDMAP_SUCCESS)
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (rc);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban /*
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * The given PID may have been mapped to a locally
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * generated SID in which case there isn't any
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * Windows name
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if (winname == NULL || windomain == NULL) {
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_free(winname);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_free(windomain);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (IDMAP_ERR_NORESULT);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban }
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (flag & IDMAP_REQ_FLG_USE_CACHE) {
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen if (is_user)
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_winname2uid(winname, windomain,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen pid, direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen else
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen idmap_cache_add_winname2gid(winname, windomain,
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen pid, direction);
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullenout:
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if (domain != NULL) {
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban *name = winname;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban *domain = windomain;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban } else {
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban len = strlen(winname) + strlen(windomain) + 2;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban if ((*name = malloc(len)) != NULL)
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban (void) snprintf(*name, len, "%s@%s", winname,
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban windomain);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban else
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban rc = IDMAP_ERR_MEMORY;
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_free(winname);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban idmap_free(windomain);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban }
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban return (rc);
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban}
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban/*
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * Get winname given uid
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbabanidmap_stat
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullenidmap_getwinnamebyuid(uid_t uid, int flag, char **name, char **domain)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (idmap_getwinnamebypid(uid, 1, flag, name, domain));
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban}
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban/*
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban * Get winname given gid
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban */
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbabanidmap_stat
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullenidmap_getwinnamebygid(gid_t gid, int flag, char **name, char **domain)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
3ee87bca47e74aa2719352485b80973ca6e079b7Julian Pullen return (idmap_getwinnamebypid(gid, 0, flag, name, domain));
dd5829d1456ba00e6f704e6a88e7eaae608e3c1bbaban}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesidmap_stat
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshidmap_flush(idmap_flush_op op)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_retcode rc1, rc2;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh rc1 = _idmap_clnt_call(IDMAP_FLUSH,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (xdrproc_t)xdr_idmap_flush_op, (caddr_t)&op,
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (xdrproc_t)xdr_idmap_retcode, (caddr_t)&rc2, TIMEOUT);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (rc1 != IDMAP_SUCCESS)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (rc1);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return (rc2);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * syslog is the default logger.
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * It can be overwritten by supplying a logger
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * with idmap_set_logger()
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaiidmap_logger_t logger = syslog;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaivoid
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaiidmap_set_logger(idmap_logger_t funct)
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai{
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai logger = funct;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Helper functions that concatenate two parts of a name and then
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * look up a value, so that the same set of functions can be used to
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * process both "in" and "out" parameters.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightboolean_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmap_trace_get_str(nvlist_t *entry, char *n1, char *n2, char **ret)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char name[IDMAP_TRACE_NAME_MAX+1]; /* Max used is about 11 */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int err;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) strlcpy(name, n1, sizeof (name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (n2 != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) strlcat(name, n2, sizeof (name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright err = nvlist_lookup_string(entry, name, ret);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (err == 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightboolean_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmap_trace_get_int(nvlist_t *entry, char *n1, char *n2, int64_t *ret)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char name[IDMAP_TRACE_NAME_MAX+1]; /* Max used is about 11 */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int err;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) strlcpy(name, n1, sizeof (name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (n2 != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) strlcat(name, n2, sizeof (name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright err = nvlist_lookup_int64(entry, name, ret);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (err == 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmap_trace_print_id(FILE *out, nvlist_t *entry, char *fromto)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *s;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int64_t i64;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (idmap_trace_get_int(entry, fromto, IDMAP_TRACE_TYPE, &i64)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright switch (i64) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_POSIXID:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "unixname ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_UID:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "unixuser ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_GID:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "unixgroup ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_SID:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "winname ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_USID:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "winuser ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_GSID:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "wingroup ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case IDMAP_NONE:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, gettext("unknown "));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright default:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, gettext("bad %d "), (int)i64);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (idmap_trace_get_str(entry, fromto, IDMAP_TRACE_NAME, &s))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "%s ", s);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (idmap_trace_get_str(entry, fromto, IDMAP_TRACE_SID, &s))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "%s ", s);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (idmap_trace_get_int(entry, fromto, IDMAP_TRACE_UNIXID, &i64))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "%u ", (uid_t)i64);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmap_trace_print_1(FILE *out, char *prefix, nvlist_t *entry)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *s;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int64_t i64;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "%s", prefix);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_trace_print_id(out, entry, "from");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "-> ");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_trace_print_id(out, entry, "to");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (idmap_trace_get_int(entry, IDMAP_TRACE_ERROR, NULL, &i64))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, gettext("Error %d "), (int)i64);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "-");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (idmap_trace_get_str(entry, IDMAP_TRACE_MESSAGE, NULL, &s))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, " %s", s);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(out, "\n");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightidmap_trace_print(FILE *out, char *prefix, nvlist_t *trace)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright nvpair_t *nvp;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (nvp = nvlist_next_nvpair(trace, NULL);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright nvp != NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright nvp = nvlist_next_nvpair(trace, nvp)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright nvlist_t *entry;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int err;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright err = nvpair_value_nvlist(nvp, &entry);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright assert(err == 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_trace_print_1(out, prefix, entry);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}