2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * CDDL HEADER START
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * The contents of this file are subject to the terms of the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Common Development and Distribution License (the "License").
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * You may not use this file except in compliance with the License.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * or http://www.opensolaris.org/os/licensing.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * See the License for the specific language governing permissions
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * and limitations under the License.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * When distributing Covered Code, include this CDDL HEADER in each
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If applicable, add the following below this CDDL HEADER, with the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * fields enclosed by brackets "[]" replaced with your own identifying
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * information: Portions Copyright [yyyy] [name of copyright owner]
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * CDDL HEADER END
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Use is subject to license terms.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross *
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <malloc.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <synch.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <syslog.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <rpcsvc/ypclnt.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <rpcsvc/yp_prot.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <pthread.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <ctype.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <stdlib.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <stdio.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <signal.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <sys/stat.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <assert.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include "ad_common.h"
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic pthread_mutex_t statelock = PTHREAD_MUTEX_INITIALIZER;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic nssad_state_t state = {0};
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic void
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_free_props(nssad_prop_t *props)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (props->domain_name != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(props->domain_name);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_name = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (props->domain_controller != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(props->domain_controller);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_controller = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic int
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_discover_props(const char *domain, ad_disc_t ad_ctx,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_prop_t *props)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad_disc_refresh(ad_ctx);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ad_disc_set_DomainName(ad_ctx, domain) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (props->domain_controller == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_controller =
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_get_DomainController(ad_ctx, AD_DISC_PREFER_SITE,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic int
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_reload_ad(nssad_prop_t *props, adutils_ad_t **ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ad_t *new;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (props->domain_controller == NULL ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_controller[0].host[0] == '\0')
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adutils_ad_alloc(&new, props->domain_name,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ADUTILS_AD_DATA) != ADUTILS_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; props->domain_controller[i].host[0] != '\0'; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adutils_add_ds(new,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_controller[i].host,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_controller[i].port) != ADUTILS_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ad_free(&new);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*ad != NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ad_free(ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ad = new;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossupdate_dirs(ad_disc_ds_t **value, ad_disc_ds_t **new)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*value == *new)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*value != NULL && *new != NULL &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad_disc_compare_ds(*value, *new) == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(*new);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *new = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*value)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(*value);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *value = *new;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *new = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_refresh(nssad_cfg_t *cp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_prop_t props;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ad_disc_SubnetChanged(cp->ad_ctx);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) memset(&props, 0, sizeof (props));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_discover_props(cp->props.domain_name, cp->ad_ctx,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre &props) < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (update_dirs(&cp->props.domain_controller,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre &props.domain_controller)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (cp->props.domain_controller != NULL &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp->props.domain_controller[0].host[0] != '\0')
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) nssad_cfg_reload_ad(&cp->props, &cp->ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic void
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_destroy(nssad_cfg_t *cp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (cp != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_destroy(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad_disc_fini(cp->ad_ctx);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_free_props(&cp->props);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ad_free(&cp->ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic nssad_cfg_t *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_create(const char *domain)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_t *cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp = calloc(1, sizeof (*cp))) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (pthread_rwlock_init(&cp->lock, NULL) != 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp->ad_ctx = ad_disc_init()) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto errout;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp->props.domain_name = strdup(domain)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto errout;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_discover_props(domain, cp->ad_ctx, &cp->props) < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto errout;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_reload_ad(&cp->props, &cp->ad) < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto errout;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreerrout:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_destroy(cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#define hex_char(n) "0123456789abcdef"[n & 0xf]
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_ldap_filter_name(char *filter_name, const char *name, int filter_name_size)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *end = filter_name + filter_name_size;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char c;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (; *name; name++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre c = *name;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre switch (c) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case '*':
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case '(':
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case ')':
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case '\\':
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (end <= filter_name + 3)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *filter_name++ = '\\';
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *filter_name++ = hex_char(c >> 4);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *filter_name++ = hex_char(c & 0xf);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre default:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (end <= filter_name + 1)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *filter_name++ = c;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (end <= filter_name)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *filter_name = '\0';
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkremap_adrc2nssrc(adutils_rc adrc)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adrc == ADUTILS_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adrc == ADUTILS_ERR_NOTFOUND)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre errno = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_NOTFOUND);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_marshall_data(ad_backend_ptr be, nss_XbyY_args_t *argp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int stat;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (argp->buf.result == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This suggests that the process (e.g. nscd) expects
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * nssad to return the data in native file format in
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * argp->buf.buffer i.e. no need to marshall the data.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->returnval = argp->buf.buffer;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->returnlen = strlen(argp->buf.buffer);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_STR_PARSE_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (argp->str2ent == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_STR_PARSE_PARSE);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre stat = (*argp->str2ent)(be->buffer, be->buflen,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->buf.result, argp->buf.buffer, argp->buf.buflen);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (stat == NSS_STR_PARSE_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->returnval = argp->buf.result;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->returnlen = 1; /* irrelevant */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)stat);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_sanitize_status(ad_backend_ptr be, nss_XbyY_args_t *argp,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nss_status_t stat)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (be->buffer != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(be->buffer);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->buffer = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->buflen = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->db_type = NSS_AD_DB_NONE;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (stat == NSS_STR_PARSE_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else if (stat == NSS_STR_PARSE_PARSE) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->returnval = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_NOTFOUND);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else if (stat == NSS_STR_PARSE_ERANGE) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->erange = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_NOTFOUND);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_UNAVAIL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_t *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreget_cfg(const char *domain)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_t *cp, *lru, *prev;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Note about the queue:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * The queue is used to hold our per domain
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * configs. The queue is limited to CFG_QUEUE_MAX_SIZE.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If the queue increases beyond that point we toss
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * out the LRU entry. The entries are inserted into
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * the queue at state.qtail and the LRU entry is
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * removed from state.qhead. state.qnext points
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * from the qtail to the qhead. Everytime a config
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * is accessed it is moved to qtail.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (cp = state.qtail, prev = NULL; cp != NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre prev = cp, cp = cp->qnext) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (cp->props.domain_name == NULL ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre strcasecmp(cp->props.domain_name, domain) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Found config for the given domain. */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (state.qtail != cp) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Move the entry to the tail of the queue.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This way the LRU entry can be found at
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * the head of the queue.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre prev->qnext = cp->qnext;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (state.qhead == cp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qhead = prev;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp->qnext = state.qtail;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qtail = cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ad_disc_get_TTL(cp->ad_ctx) == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If there are expired items in the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * config, grab the write lock and
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * refresh the config.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_wrlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_refresh(cp) < 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_unlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_unlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Return the config found */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_rdlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Create new config entry for the domain */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp = nssad_cfg_create(domain)) == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Add it to the queue */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qcount++;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (state.qtail == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qtail = state.qhead = cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_rdlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp->qnext = state.qtail;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qtail = cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* If the queue has exceeded its size, remove the LRU entry */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (state.qcount >= CFG_QUEUE_MAX_SIZE) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Detach the lru entry and destroy */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre lru = state.qhead;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (pthread_rwlock_trywrlock(&lru->lock) == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (prev = state.qtail; prev != NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre prev = prev->qnext) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (prev->qnext != lru)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qhead = prev;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre prev->qnext = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state.qcount--;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_unlock(&lru->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_destroy(lru);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) assert(prev != NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_rdlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (cp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkread_lookup(const char *filter, const char **attrs,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *domain, adutils_result_t **result)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int retries = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_rc rc, brc;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t *qs;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_t *cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreretry:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp = get_cfg(domain)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_NOTFOUND);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_start(cp->ad, 1, NULL, NULL, &qs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_rwlock_unlock(&cp->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != ADUTILS_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_add(qs, filter, attrs, domain, result, &brc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != ADUTILS_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_lookup_batch_release(&qs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_end(&qs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != ADUTILS_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = brc;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreout:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc == ADUTILS_ERR_RETRIABLE_NET_ERR &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre retries++ < ADUTILS_DEF_NUM_RETRIES)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto retry;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (map_adrc2nssrc(rc));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_lookup(ad_backend_ptr be, nss_XbyY_args_t *argp,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *database, const char *searchfilter,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *dname, int *try_idmap)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nss_status_t stat;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *try_idmap = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Clear up results if any */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) adutils_freeresult(&be->result);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Lookup AD */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre stat = ad_lookup(searchfilter, be->attrs, dname, &be->result);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (stat != NSS_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->returnval = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *try_idmap = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (stat);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Map AD object(s) to string in native file format */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre stat = be->adobj2str(be, argp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (stat == NSS_STR_PARSE_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre stat = _nss_ad_marshall_data(be, argp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (_nss_ad_sanitize_status(be, argp, stat));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreclean_state()
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_t *cp, *curr;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (cp = state.qtail; cp != NULL; ) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre curr = cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp = cp->qnext;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre nssad_cfg_destroy(curr);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) memset(&state, 0, sizeof (state));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&statelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_clean_ad_backend(ad_backend_ptr be)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (be->tablename != NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(be->tablename);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (be->buffer != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(be->buffer);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->buffer = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(be);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * _nss_ad_destr frees allocated memory before exiting this nsswitch shared
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * backend library. This function is called before returning control back to
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * nsswitch.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*ARGSUSED*/
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_destr(ad_backend_ptr be, void *a)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) _clean_ad_backend(be);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre clean_state();
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*ARGSUSED*/
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_setent(ad_backend_ptr be, void *a)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_UNAVAIL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*ARGSUSED*/
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_endent(ad_backend_ptr be, void *a)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_UNAVAIL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*ARGSUSED*/
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_status_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_getent(ad_backend_ptr be, void *a)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_status_t)NSS_UNAVAIL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenss_backend_t *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_constr(ad_backend_op_t ops[], int nops, char *tablename,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char **attrs, fnf adobj2str)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad_backend_ptr be;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((be = (ad_backend_ptr) calloc(1, sizeof (*be))) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((be->tablename = (char *)strdup(tablename)) == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(be);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->ops = ops;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->nops = (nss_dbop_t)nops;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->attrs = attrs;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre be->adobj2str = adobj2str;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) memset(&state, 0, sizeof (state));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return ((nss_backend_t *)be);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}