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/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <alloca.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <string.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <strings.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <lber.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <sasl/sasl.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <string.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <ctype.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <synch.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <atomic.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <errno.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <assert.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <limits.h>
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen#include <syslog.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <sys/u8_textprep.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include <sys/varargs.h>
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include "libadutils.h"
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#include "adutils_impl.h"
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* List of DSs, needed by the idle connection reaper thread */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic pthread_mutex_t adhostlock = PTHREAD_MUTEX_INITIALIZER;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic adutils_host_t *host_head = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * List of query state structs -- needed so we can "route" LDAP results
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * to the right context if multiple threads should be using the same
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * connection concurrently
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic pthread_mutex_t qstatelock = PTHREAD_MUTEX_INITIALIZER;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic adutils_query_state_t *qstatehead = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic char *adutils_sid_ber2str(BerValue *bvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic void adutils_lookup_batch_unlock(adutils_query_state_t **state);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic void delete_ds(adutils_ad_t *ad, const char *host, int port);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightint ad_debug[AD_DEBUG_MAX+1] = {0};
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkretypedef struct binary_attrs {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *name;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *(*ber2str)(BerValue *bvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre} binary_attrs_t;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic binary_attrs_t binattrs[] = {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre {"objectSID", adutils_sid_ber2str},
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre {NULL, NULL}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre};
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullenadutils_logger logger = syslog;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullenadutils_set_logger(adutils_logger funct)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger = funct;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Turn "foo.bar.com" into "dc=foo,dc=bar,dc=com"
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_dns2dn(const char *dns)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen int num_parts;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen return (ldap_dns_to_dn((char *)dns, &num_parts));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Turn "dc=foo,dc=bar,dc=com" into "foo.bar.com"; ignores any other
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * attributes (CN, etc...).
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_dn2dns(const char *dn)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen return (DN_to_DNS(dn));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Convert a binary SID in a BerValue to a adutils_sid_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullenadutils_getsid(BerValue *bval, adutils_sid_t *sidp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i, j;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre uchar_t *v;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre uint32_t a;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * The binary format of a SID is as follows:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * byte #0: version, always 0x01
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * byte #1: RID count, always <= 0x0f
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * bytes #2-#7: SID authority, big-endian 48-bit unsigned int
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * followed by RID count RIDs, each a little-endian, unsigned
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * 32-bit int.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Sanity checks: must have at least one RID, version must be
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * 0x01, and the length must be 8 + rid count * 4
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (bval->bv_len > 8 && bval->bv_val[0] == 0x01 &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre bval->bv_len == 1 + 1 + 6 + bval->bv_val[1] * 4) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre v = (uchar_t *)bval->bv_val;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sidp->version = v[0];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sidp->sub_authority_count = v[1];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sidp->authority =
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* big endian -- so start from the left */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ((u_longlong_t)v[2] << 40) |
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ((u_longlong_t)v[3] << 32) |
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ((u_longlong_t)v[4] << 24) |
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ((u_longlong_t)v[5] << 16) |
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ((u_longlong_t)v[6] << 8) |
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (u_longlong_t)v[7];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < sidp->sub_authority_count; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre j = 8 + (i * 4);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* little endian -- so start from the right */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre a = (v[j + 3] << 24) | (v[j + 2] << 16) |
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (v[j + 1] << 8) | (v[j]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sidp->sub_authorities[i] = a;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Convert a adutils_sid_t to S-1-...
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullenadutils_sid2txt(adutils_sid_t *sidp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int rlen, i, len;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *str, *cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (sidp->version != 1)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre len = sizeof ("S-1-") - 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * We could optimize like so, but, why?
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * if (sidp->authority < 10)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * len += 2;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * else if (sidp->authority < 100)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * len += 3;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * else
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * len += snprintf(NULL, 0"%llu", sidp->authority);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre len += snprintf(NULL, 0, "%llu", sidp->authority);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Max length of a uint32_t printed out in ASCII is 10 bytes */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre len += 1 + (sidp->sub_authority_count + 1) * 10;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp = str = malloc(len)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rlen = snprintf(str, len, "S-1-%llu", sidp->authority);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp += rlen;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre len -= rlen;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < sidp->sub_authority_count; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre assert(len > 0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rlen = snprintf(cp, len, "-%u", sidp->sub_authorities[i]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp += rlen;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre len -= rlen;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre assert(len >= 0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (str);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Convert a adutils_sid_t to on-the-wire encoding
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkresid2binsid(adutils_sid_t *sid, uchar_t *binsid, int binsidlen)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre uchar_t *p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre uint64_t a;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre uint32_t r;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (sid->version != 1 ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre binsidlen != (1 + 1 + 6 + sid->sub_authority_count * 4))
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre p = binsid;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = 0x01; /* version */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* sub authority count */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = sid->sub_authority_count;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Authority */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre a = sid->authority;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* big-endian -- start from left */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (a >> 40) & 0xFF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (a >> 32) & 0xFF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (a >> 24) & 0xFF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (a >> 16) & 0xFF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (a >> 8) & 0xFF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = a & 0xFF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* sub-authorities */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < sid->sub_authority_count; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre r = sid->sub_authorities[i];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* little-endian -- start from right */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (r & 0x000000FF);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (r & 0x0000FF00) >> 8;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (r & 0x00FF0000) >> 16;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p++ = (r & 0xFF000000) >> 24;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Convert a stringified SID (S-1-...) into a hex-encoded version of the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * on-the-wire encoding, but with each pair of hex digits pre-pended
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * with a '\', so we can pass this to libldap.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_txtsid2hexbinsid(const char *txt, const uint32_t *rid,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *hexbinsid, int hexbinsidlen)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_sid_t sid = { 0 };
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i, j;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *cp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *ecp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre u_longlong_t a;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre unsigned long r;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre uchar_t *binsid, b, hb;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Only version 1 SIDs please */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (strncmp(txt, "S-1-", strlen("S-1-")) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (strlen(txt) < (strlen("S-1-") + 1))
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* count '-'s */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (j = 0, cp = strchr(txt, '-');
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp != NULL && *cp != '\0';
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre j++, cp = strchr(cp + 1, '-')) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* can't end on a '-' */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*(cp + 1) == '\0')
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Adjust count for version and authority */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre j -= 2;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* we know the version number and RID count */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sid.version = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sid.sub_authority_count = (rid != NULL) ? j + 1 : j;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* must have at least one RID, but not too many */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (sid.sub_authority_count < 1 ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sid.sub_authority_count > ADUTILS_SID_MAX_SUB_AUTHORITIES)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* check that we only have digits and '-' */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (strspn(txt + 1, "0123456789-") < (strlen(txt) - 1))
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp = txt + strlen("S-1-");
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* 64-bit safe parsing of unsigned 48-bit authority value */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre errno = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre a = strtoull(cp, &ecp, 10);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* errors parsing the authority or too many bits */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (cp == ecp || (a == 0 && errno == EINVAL) ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (a == ULLONG_MAX && errno == ERANGE) ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (a & 0x0000ffffffffffffULL) != a)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp = ecp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sid.authority = (uint64_t)a;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < j; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*cp++ != '-')
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* 64-bit safe parsing of unsigned 32-bit RID */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre errno = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre r = strtoul(cp, &ecp, 10);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* errors parsing the RID or too many bits */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (cp == ecp || (r == 0 && errno == EINVAL) ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (r == ULONG_MAX && errno == ERANGE) ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (r & 0xffffffffUL) != r)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sid.sub_authorities[i] = (uint32_t)r;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp = ecp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* check that all of the string SID has been consumed */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*cp != '\0')
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rid != NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sid.sub_authorities[j] = *rid;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre j = 1 + 1 + 6 + sid.sub_authority_count * 4;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (hexbinsidlen < (j * 3))
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-2);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* binary encode the SID */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre binsid = (uchar_t *)alloca(j);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) sid2binsid(&sid, binsid, j);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* hex encode, with a backslash before each byte */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (ecp = hexbinsid, i = 0; i < j; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre b = binsid[i];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ecp++ = '\\';
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre hb = (b >> 4) & 0xF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ecp++ = (hb <= 0x9 ? hb + '0' : hb - 10 + 'A');
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre hb = b & 0xF;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ecp++ = (hb <= 0x9 ? hb + '0' : hb - 10 + 'A');
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ecp = '\0';
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreconvert_bval2sid(BerValue *bval, uint32_t *rid)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_sid_t sid;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen if (adutils_getsid(bval, &sid) < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If desired and if the SID is what should be a domain/computer
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * user or group SID (i.e., S-1-5-w-x-y-z-<user/group RID>) then
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * save the last RID and truncate the SID
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rid != NULL && sid.authority == 5 && sid.sub_authority_count == 5)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *rid = sid.sub_authorities[--sid.sub_authority_count];
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen return (adutils_sid2txt(&sid));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Return a NUL-terminated stringified SID from the value of an
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * objectSid attribute and put the last RID in *rid.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_bv_objsid2sidstr(BerValue *bval, uint32_t *rid)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *sid;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (bval == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* objectSid is single valued */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((sid = convert_bval2sid(bval, rid)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (sid);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_sid_ber2str(BerValue *bval)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (adutils_bv_objsid2sidstr(bval, NULL));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai/*
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Extract an int from the Ber value
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai * Return B_TRUE if a valid integer was found, B_FALSE if not.
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiboolean_t
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiadutils_bv_uint(BerValue *bval, unsigned int *result)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai{
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char buf[40]; /* big enough for any int */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai unsigned int tmp;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai char *p;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *result = 0; /* for error cases */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (bval == NULL || bval->bv_val == NULL)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (B_FALSE);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (bval->bv_len >= sizeof (buf))
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (B_FALSE);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) memcpy(buf, bval->bv_val, bval->bv_len);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai buf[bval->bv_len] = '\0';
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai tmp = strtoul(buf, &p, 10);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* Junk after the number? */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (*p != '\0')
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (B_FALSE);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai *result = tmp;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai return (B_TRUE);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai}
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* Return a NUL-terminated string from the Ber value */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar *
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiadutils_bv_str(BerValue *bval)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *s;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (bval == NULL || bval->bv_val == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((s = malloc(bval->bv_len + 1)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) snprintf(s, bval->bv_len + 1, "%.*s", bval->bv_len,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre bval->bv_val);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (s);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*ARGSUSED*/
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkresaslcallback(LDAP *ld, unsigned flags, void *defaults, void *prompts)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sasl_interact_t *interact;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (prompts == NULL || flags != LDAP_SASL_INTERACTIVE)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (LDAP_PARAM_ERROR);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* There should be no extra arguemnts for SASL/GSSAPI authentication */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (interact = prompts; interact->id != SASL_CB_LIST_END;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre interact++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre interact->result = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre interact->len = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (LDAP_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre#define ADCONN_TIME 300
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Idle connection reaping side of connection management
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_reap_idle_connections()
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *adh;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre time_t now;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre now = time(NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (adh = host_head; adh != NULL; adh = adh->next) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->ref == 0 && adh->idletime != 0 &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->idletime + ADCONN_TIME < now) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->ld) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_unbind(adh->ld);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ld = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->idletime = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ref = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_rc
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desaiadutils_ad_alloc(adutils_ad_t **new_ad, const char *domain_name,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ad_partition_t part)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ad_t *ad;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *new_ad = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((ad = calloc(1, sizeof (*ad))) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_ERR_MEMORY);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad->ref = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad->partition = part;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* domain_name is required iff we are talking directly to a DC */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (part == ADUTILS_AD_DATA) {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai assert(domain_name != NULL);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai assert(*domain_name != '\0');
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ad->basedn = adutils_dns2dn(domain_name);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai } else {
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai assert(domain_name == NULL);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai ad->basedn = strdup("");
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai }
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (ad->basedn == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto err;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (pthread_mutex_init(&ad->lock, NULL) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto err;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *new_ad = ad;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreerr:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai free(ad->basedn);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_ERR_MEMORY);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_ad_free(adutils_ad_t **ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *prev;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ad == NULL || *ad == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&(*ad)->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (atomic_dec_32_nv(&(*ad)->ref) > 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&(*ad)->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ad = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre prev = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre p = host_head;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre while (p != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (p->owner != (*ad)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre prev = p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre p = p->next;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre delete_ds((*ad), p->host, p->port);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (prev == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre p = host_head;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre else
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre p = prev->next;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&(*ad)->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_destroy(&(*ad)->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if ((*ad)->known_domains)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free((*ad)->known_domains);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai free((*ad)->basedn);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(*ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *ad = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreopen_conn(adutils_host_t *adh, int timeoutsecs)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int zero = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int ldversion, rc;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int timeoutms = timeoutsecs * 1000;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (!adh->dead && adh->ld != NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* done! */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->ld != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_unbind(adh->ld);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ld = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->num_requests = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre atomic_inc_64(&adh->generation);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Open and bind an LDAP connection */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ld = ldap_init(adh->host, adh->port);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->ld == NULL) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_INFO, "ldap_init() to server "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "%s port %d failed. (%s)", adh->host,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->port, strerror(errno));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldversion = LDAP_VERSION3;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_set_option(adh->ld, LDAP_OPT_PROTOCOL_VERSION, &ldversion);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_set_option(adh->ld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_set_option(adh->ld, LDAP_OPT_TIMELIMIT, &zero);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_set_option(adh->ld, LDAP_OPT_SIZELIMIT, &zero);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_set_option(adh->ld, LDAP_X_OPT_CONNECT_TIMEOUT, &timeoutms);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_set_option(adh->ld, LDAP_OPT_RESTART, LDAP_OPT_ON);
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen rc = adutils_set_thread_functions(adh->ld);
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen if (rc != LDAP_SUCCESS) {
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen /* Error has already been logged */
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen (void) ldap_unbind(adh->ld);
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen adh->ld = NULL;
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen goto out;
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen }
bd42852645f5ef79a1729096abd7405b72e159f7Julian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = ldap_sasl_interactive_bind_s(adh->ld, "" /* binddn */,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->saslmech, NULL, NULL, adh->saslflags, &saslcallback,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != LDAP_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_unbind(adh->ld);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ld = NULL;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_INFO, "ldap_sasl_interactive_bind_s() to server "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "%s port %d failed. (%s)", adh->host, adh->port,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_err2string(rc));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai logger(LOG_DEBUG, "Using server %s:%d",
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->host, adh->port);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreout:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->ld != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre atomic_inc_32(&adh->ref);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->idletime = time(NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->dead = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Connection management: find an open connection or open one
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_host_t *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreget_conn(adutils_ad_t *ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *adh = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int tries;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int dscount = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int timeoutsecs = ADUTILS_LDAP_OPEN_TIMEOUT;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreretry:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (host_head == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (dscount == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * First try: count the number of DSes.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Integer overflow is not an issue -- we can't have so many
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * DSes because they won't fit even DNS over TCP, and SMF
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * shouldn't let you set so many.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (adh = host_head, tries = 0; adh != NULL; adh = adh->next) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->owner == ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre dscount++;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (dscount == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre tries = dscount * 3; /* three tries per-ds */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Begin round-robin at the next DS in the list after the last
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * one that we had a connection to, else start with the first
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * DS in the list.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh = ad->last_adh;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Round-robin -- pick the next one on the list; if the list
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * changes on us, no big deal, we'll just potentially go
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * around the wrong number of times.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (;;) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (adh != NULL && adh->owner == ad && adh->ld != NULL &&
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen !adh->dead)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh == NULL || (adh = adh->next) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh = host_head;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->owner == ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad->last_adh = adh;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Found suitable DS, open it if not already opened */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (open_conn(adh, timeoutsecs))
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (adh);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre tries--;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((tries % dscount) == 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre timeoutsecs *= 2;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (tries > 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto retry;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreout:
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_NOTICE, "Couldn't open an LDAP connection to any global "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "catalog server!");
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrerelease_conn(adutils_host_t *adh)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int delete = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (atomic_dec_32_nv(&adh->ref) == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->owner == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre delete = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->idletime = time(NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Free this host if its owner no longer exists. */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (delete) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre delete_ds(NULL, adh->host, adh->port);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Create a adutils_host_t, populate it and add it to the list of hosts.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_rc
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_add_ds(adutils_ad_t *ad, const char *host, int port)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *new = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int ret;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_rc rc;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (p = host_head; p != NULL; p = p->next) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (p->owner != ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (strcmp(host, p->host) == 0 && p->port == port) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* already added */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = ADUTILS_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto err;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = ADUTILS_ERR_MEMORY;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* add new entry */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new = (adutils_host_t *)calloc(1, sizeof (*new));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (new == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto err;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->owner = ad;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->port = port;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->dead = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->max_requests = 80;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->num_requests = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((new->host = strdup(host)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto err;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->saslflags = LDAP_SASL_INTERACTIVE;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->saslmech = "GSSAPI";
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((ret = pthread_mutex_init(&new->lock, NULL)) != 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(new->host);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->host = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre errno = ret;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = ADUTILS_ERR_INTERNAL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto err;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* link in */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = ADUTILS_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new->next = host_head;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre host_head = new;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreerr:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adhostlock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != 0 && new != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (new->host != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_destroy(&new->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(new->host);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(new);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (rc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Free a DS configuration.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Caller must lock the adhostlock mutex
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkredelete_ds(adutils_ad_t *ad, const char *host, int port)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t **p, *q;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (p = &host_head; *p != NULL; p = &((*p)->next)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((*p)->owner != ad || strcmp(host, (*p)->host) != 0 ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (*p)->port != port)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* found */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&((*p)->lock));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((*p)->ref > 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Still in use. Set its owner to NULL so
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * that it can be freed when its ref count
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * becomes 0.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (*p)->owner = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&((*p)->lock));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&((*p)->lock));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre q = *p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p = (*p)->next;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_destroy(&q->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (q->ld)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_unbind(q->ld);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (q->host)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(q->host);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(q);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Add known domain name and domain SID to AD configuration.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenadutils_rc
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenadutils_add_domain(adutils_ad_t *ad, const char *domain, const char *sid)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen struct known_domain *new;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int num = ad->num_known_domains;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad->num_known_domains++;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen new = realloc(ad->known_domains,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen sizeof (struct known_domain) * ad->num_known_domains);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (new != NULL) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad->known_domains = new;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen (void) strlcpy(ad->known_domains[num].name, domain,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen sizeof (ad->known_domains[num].name));
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen (void) strlcpy(ad->known_domains[num].sid, sid,
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen sizeof (ad->known_domains[num].sid));
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (ADUTILS_SUCCESS);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen } else {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (ad->known_domains != NULL) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen free(ad->known_domains);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad->known_domains = NULL;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad->num_known_domains = 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (ADUTILS_ERR_MEMORY);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Check that this AD supports this domain.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If there are no known domains assume that the
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * domain is supported by this AD.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Returns 1 if this domain is supported by this AD
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * else returns 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenint
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenadutils_lookup_check_domain(adutils_query_state_t *qs, const char *domain)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen adutils_ad_t *ad = qs->qadh->owner;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int i;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; i < ad->num_known_domains; i++) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (domain_eq(domain, ad->known_domains[i].name))
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return ((i == 0) ? 1 : 0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen/*
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Check that this AD supports the SID prefix.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * The SID prefix should match the domain SID.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * If there are no known domains assume that the
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * SID prefix is supported by this AD.
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen *
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * Returns 1 if this sid prefix is supported by this AD
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen * else returns 0;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen */
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenint
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullenadutils_lookup_check_sid_prefix(adutils_query_state_t *qs, const char *sid)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen{
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen adutils_ad_t *ad = qs->qadh->owner;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen int i;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen for (i = 0; i < ad->num_known_domains; i++) {
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen if (strcmp(sid, ad->known_domains[i].sid) == 0)
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return (1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen }
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen return ((i == 0) ? 1 : 0);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen}
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_rc
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup_batch_start(adutils_ad_t *ad, int nqueries,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_ldap_res_search_cb ldap_res_search_cb,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre void *ldap_res_search_argp,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t **state)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t *new_state;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_host_t *adh = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ad == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_ERR_INTERNAL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *state = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh = get_conn(ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_ERR_RETRIABLE_NET_ERR);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state = calloc(1, sizeof (adutils_query_state_t) +
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (nqueries - 1) * sizeof (adutils_q_t));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (new_state == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_ERR_MEMORY);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state->ref_cnt = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state->qadh = adh;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen new_state->qsize = nqueries;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state->qadh_gen = adh->generation;
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen new_state->qcount = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state->ldap_res_search_cb = ldap_res_search_cb;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state->ldap_res_search_argp = ldap_res_search_argp;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_cond_init(&new_state->cv, NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre new_state->next = qstatehead;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre qstatehead = new_state;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *state = new_state;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Find the adutils_query_state_t to which a given LDAP result msgid on a
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * given connection belongs. This routine increaments the reference count
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * so that the object can not be freed. adutils_lookup_batch_unlock()
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * must be called to decreament the reference count.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkremsgid2query(adutils_host_t *adh, int msgid,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t **state, int *qid)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t *p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int ret;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (p = qstatehead; p != NULL; p = p->next) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (p->qadh != adh || adh->generation != p->qadh_gen)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < p->qcount; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((p->queries[i]).msgid == msgid) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (!p->qdead) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre p->ref_cnt++;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *state = p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *qid = i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ret);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrecheck_for_binary_attrs(const char *attr)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; binattrs[i].name != NULL; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (strcasecmp(binattrs[i].name, attr) == 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (i);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrefree_entry(adutils_entry_t *entry)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i, j;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_attr_t *ap;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (entry == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (entry->attr_nvpairs == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(entry);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < entry->num_nvpairs; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap = &entry->attr_nvpairs[i];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->attr_name == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_value_free(ap->attr_values);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (check_for_binary_attrs(ap->attr_name) >= 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ap->attr_name);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->attr_values == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (j = 0; j < ap->num_values; j++)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ap->attr_values[j]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ap->attr_values);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else if (strcasecmp(ap->attr_name, "dn") == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ap->attr_name);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(ap->attr_values[0]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ap->attr_values);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(ap->attr_name);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_value_free(ap->attr_values);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(entry->attr_nvpairs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(entry);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_freeresult(adutils_result_t **result)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_entry_t *e, *next;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (result == NULL || *result == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((*result)->entries == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(*result);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *result = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (e = (*result)->entries; e != NULL; e = next) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre next = e->next;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free_entry(e);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(*result);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *result = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreconst adutils_entry_t *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_getfirstentry(adutils_result_t *result)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (result != NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (result->entries);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrechar **
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_getattr(const adutils_entry_t *entry, const char *attrname)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_attr_t *ap;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (entry == NULL || entry->attr_nvpairs == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < entry->num_nvpairs; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap = &entry->attr_nvpairs[i];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->attr_name != NULL &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre strcasecmp(ap->attr_name, attrname) == 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ap->attr_values);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (NULL);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Queue LDAP result for the given query.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Return values:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * 0 success
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * -1 ignore result
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * -2 error
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkremake_entry(adutils_q_t *q, adutils_host_t *adh, LDAPMessage *search_res,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_entry_t **entry)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre BerElement *ber = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre BerValue **bvalues = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char **strvalues;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre char *attr = NULL, *dn = NULL, *domain = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_entry_t *ep;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_attr_t *ap;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int i, j, b, ret = -2;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *entry = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Check that this is the domain that we were looking for */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((dn = ldap_get_dn(adh->ld, search_res)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-2);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((domain = adutils_dn2dns(dn)) == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(dn);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-2);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (q->edomain != NULL) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (!domain_eq(q->edomain, domain)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(dn);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(domain);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(domain);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Allocate memory for the entry */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((ep = calloc(1, sizeof (*ep))) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* For 'dn' */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ep->num_nvpairs = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Count the number of name-value pairs for this entry */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (attr = ldap_first_attribute(adh->ld, search_res, &ber);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre attr != NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre attr = ldap_next_attribute(adh->ld, search_res, ber)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ep->num_nvpairs++;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(attr);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ber_free(ber, 0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ber = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Allocate array for the attribute name-value pairs */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ep->attr_nvpairs = calloc(ep->num_nvpairs, sizeof (*ep->attr_nvpairs));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ep->attr_nvpairs == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ep->num_nvpairs = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* For dn */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap = &ep->attr_nvpairs[0];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((ap->attr_name = strdup("dn")) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->num_values = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->attr_values = calloc(ap->num_values, sizeof (*ap->attr_values));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->attr_values == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->num_values = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->attr_values[0] = dn;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre dn = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (attr = ldap_first_attribute(adh->ld, search_res, &ber), i = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre attr != NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(attr), i++,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre attr = ldap_next_attribute(adh->ld, search_res, ber)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap = &ep->attr_nvpairs[i];
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((ap->attr_name = strdup(attr)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((b = check_for_binary_attrs(attr)) >= 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre bvalues =
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_get_values_len(adh->ld, search_res, attr);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (bvalues == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->num_values = ldap_count_values_len(bvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->num_values == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_value_free_len(bvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre bvalues = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->attr_values = calloc(ap->num_values,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre sizeof (*ap->attr_values));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->attr_values == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->num_values = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (j = 0; j < ap->num_values; j++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->attr_values[j] =
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre binattrs[b].ber2str(bvalues[j]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->attr_values[j] == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_value_free_len(bvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre bvalues = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre strvalues = ldap_get_values(adh->ld, search_res, attr);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (strvalues == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->num_values = ldap_count_values(strvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ap->num_values == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_value_free(strvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre continue;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ap->attr_values = strvalues;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreout:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(attr);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_memfree(dn);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ber_free(ber, 0);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_value_free_len(bvalues);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ret < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free_entry(ep);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre else
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *entry = ep;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ret);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Put the search result onto the given adutils_q_t.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Returns: 0 success
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * < 0 error
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadd_entry(adutils_host_t *adh, adutils_q_t *q, LDAPMessage *search_res)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int ret = -1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_entry_t *entry = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_result_t *res;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = make_entry(q, adh, search_res, &entry);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ret < -1) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *q->rc = ADUTILS_ERR_MEMORY;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else if (ret == -1) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* ignore result */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*q->result == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre res = calloc(1, sizeof (*res));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (res == NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *q->rc = ADUTILS_ERR_MEMORY;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre goto out;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre res->num_entries = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre res->entries = entry;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *q->result = res;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre res = *q->result;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre entry->next = res->entries;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre res->entries = entry;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre res->num_entries++;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *q->rc = ADUTILS_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre entry = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreout:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free_entry(entry);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ret);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Try to get a result; if there is one, find the corresponding
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * adutils_q_t and process the result.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Returns: 0 success
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * -1 error
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreint
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreget_adobject_batch(adutils_host_t *adh, struct timeval *timeout)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t *query_state;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre LDAPMessage *res = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int rc, ret, msgid, qid;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_q_t *que;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int num;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->dead || adh->num_requests == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = (adh->dead) ? -1 : -2;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ret);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Get one result */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = ldap_result(adh->ld, LDAP_RES_ANY, 0, timeout, &res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((timeout != NULL && timeout->tv_sec > 0 && rc == LDAP_SUCCESS) ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->dead = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc == LDAP_RES_SEARCH_RESULT && adh->num_requests > 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->num_requests--;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (adh->dead) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre num = adh->num_requests;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_DEBUG,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "AD ldap_result error - %d queued requests", num);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre switch (rc) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case LDAP_RES_SEARCH_RESULT:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre msgid = ldap_msgid(res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (msgid2query(adh, msgid, &query_state, &qid)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (query_state->ldap_res_search_cb != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * We use the caller-provided callback
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * to process the result.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre query_state->ldap_res_search_cb(
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ld, &res, rc, qid,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre query_state->ldap_res_search_argp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * No callback. We fallback to our
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * default behaviour. All the entries
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * gotten from this search have been
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * added to the result list during
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * LDAP_RES_SEARCH_ENTRY (see below).
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Here we set the return status to
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * notfound if the result is still empty.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre que = &(query_state->queries[qid]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*que->result == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *que->rc = ADUTILS_ERR_NOTFOUND;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre atomic_dec_32(&query_state->qinflight);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_lookup_batch_unlock(&query_state);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre num = adh->num_requests;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_DEBUG,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "AD cannot find message ID (%d) "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "- %d queued requests",
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre msgid, num);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_msgfree(res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case LDAP_RES_SEARCH_ENTRY:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre msgid = ldap_msgid(res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (msgid2query(adh, msgid, &query_state, &qid)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (query_state->ldap_res_search_cb != NULL) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * We use the caller-provided callback
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * to process the entry.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre query_state->ldap_res_search_cb(
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adh->ld, &res, rc, qid,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre query_state->ldap_res_search_argp);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * No callback. We fallback to our
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * default behaviour. This entry
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * will be added to the result list.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre que = &(query_state->queries[qid]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = add_entry(adh, que, res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc < 0) {
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_DEBUG,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "Failed to queue entry by "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "message ID (%d) "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "- %d queued requests",
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre msgid, num);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_lookup_batch_unlock(&query_state);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre num = adh->num_requests;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_DEBUG,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "AD cannot find message ID (%d) "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "- %d queued requests",
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre msgid, num);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_msgfree(res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre case LDAP_RES_SEARCH_REFERENCE:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * We have no need for these at the moment. Eventually,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * when we query things that we can't expect to find in
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * the Global Catalog then we'll need to learn to follow
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * references.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) ldap_msgfree(res);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre default:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* timeout or error; treat the same */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&adh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ret = -1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ret);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This routine decreament the reference count of the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * adutils_query_state_t
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic void
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup_batch_unlock(adutils_query_state_t **state)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Decrement reference count with qstatelock locked
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (*state)->ref_cnt--;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If there are no references wakup the allocating thread
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((*state)->ref_cnt <= 1)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_cond_signal(&(*state)->cv);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *state = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This routine frees the adutils_query_state_t structure
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If the reference count is greater than 1 it waits
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * for the other threads to finish using it.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup_batch_release(adutils_query_state_t **state)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t **p;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int i;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (state == NULL || *state == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Set state to dead to stop further operations.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Wait for reference count with qstatelock locked
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * to get to one.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (*state)->qdead = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre while ((*state)->ref_cnt > 1) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_cond_wait(&(*state)->cv, &qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Remove this state struct from the list of state structs */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (p = &qstatehead; *p != NULL; p = &(*p)->next) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*p == (*state)) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *p = (*state)->next;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_cond_destroy(&(*state)->cv);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre release_conn((*state)->qadh);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Clear results for queries that failed */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; i < (*state)->qcount; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (*(*state)->queries[i].rc != ADUTILS_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_freeresult((*state)->queries[i].result);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre free(*state);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *state = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This routine waits for other threads using the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * adutils_query_state_t structure to finish.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If the reference count is greater than 1 it waits
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * for the other threads to finish using it.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrevoid
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup_batch_wait(adutils_query_state_t *state)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Set state to dead to stop further operation.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * stating.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Wait for reference count to get to one
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * with qstatelock locked.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state->qdead = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre while (state->ref_cnt > 1) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_cond_wait(&state->cv, &qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&qstatelock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Process active queries in the AD lookup batch and then finalize the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * result.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_rc
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup_batch_end(adutils_query_state_t **state)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int rc = LDAP_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_rc ad_rc = ADUTILS_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre struct timeval tv;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre tv.tv_sec = ADUTILS_SEARCH_TIMEOUT;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre tv.tv_usec = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Process results until done or until timeout, if given */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre while ((*state)->qinflight > 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((rc = get_adobject_batch((*state)->qadh,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre &tv)) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (*state)->qdead = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Wait for other threads processing search result to finish */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_lookup_batch_wait(*state);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc == -1 || (*state)->qinflight != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ad_rc = ADUTILS_ERR_RETRIABLE_NET_ERR;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_lookup_batch_release(state);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ad_rc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Send one prepared search, queue up msgid, process what results are
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * available
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_rc
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup_batch_add(adutils_query_state_t *state,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown const char *filter, const char * const *attrs, const char *edomain,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_result_t **result, adutils_rc *rc)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_rc retcode = ADUTILS_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int lrc, qid;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int num;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre int dead;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre struct timeval tv;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_q_t *q;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen qid = atomic_inc_32_nv(&state->qcount) - 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre q = &(state->queries[qid]);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen assert(qid < state->qsize);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Remember the expected domain so we can check the results
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * against it
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre q->edomain = edomain;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Remember where to put the results */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre q->result = result;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre q->rc = rc;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Provide sane defaults for the results in case we never hear
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * back from the DS before closing the connection.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *rc = ADUTILS_ERR_RETRIABLE_NET_ERR;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (result != NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre *result = NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Check the number of queued requests first */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre tv.tv_sec = ADUTILS_SEARCH_TIMEOUT;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre tv.tv_usec = 0;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre while (!state->qadh->dead &&
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state->qadh->num_requests > state->qadh->max_requests) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (get_adobject_batch(state->qadh, &tv) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre break;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Send this lookup, don't wait for a result here */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre lrc = LDAP_SUCCESS;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_lock(&state->qadh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (!state->qadh->dead) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state->qadh->idletime = time(NULL);
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai lrc = ldap_search_ext(state->qadh->ld,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai state->qadh->owner->basedn,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre LDAP_SCOPE_SUBTREE, filter, (char **)attrs,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre 0, NULL, NULL, NULL, -1, &q->msgid);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (lrc == LDAP_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state->qadh->num_requests++;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else if (lrc == LDAP_BUSY || lrc == LDAP_UNAVAILABLE ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre lrc == LDAP_CONNECT_ERROR || lrc == LDAP_SERVER_DOWN ||
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre lrc == LDAP_UNWILLING_TO_PERFORM) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre retcode = ADUTILS_ERR_RETRIABLE_NET_ERR;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state->qadh->dead = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre } else {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre retcode = ADUTILS_ERR_OTHER;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre state->qadh->dead = 1;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre dead = state->qadh->dead;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre num = state->qadh->num_requests;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) pthread_mutex_unlock(&state->qadh->lock);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (dead) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (lrc != LDAP_SUCCESS)
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen logger(LOG_DEBUG,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "AD ldap_search_ext error (%s) "
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre "- %d queued requests",
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ldap_err2string(lrc), num);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (retcode);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre atomic_inc_32(&state->qinflight);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Reap as many requests as we can _without_ waiting to prevent
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * any possible TCP socket buffer starvation deadlocks.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) memset(&tv, 0, sizeof (tv));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre while (get_adobject_batch(state->qadh, &tv) == 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre ;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (ADUTILS_SUCCESS);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/*
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Single AD lookup request implemented on top of the batch API.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_rc
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkreadutils_lookup(adutils_ad_t *ad, const char *filter, const char **attrs,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *domain, adutils_result_t **result)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre{
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_rc rc, brc;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre adutils_query_state_t *qs;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_start(ad, 1, NULL, NULL, &qs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != ADUTILS_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (rc);
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 return (rc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre }
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_end(&qs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (rc != ADUTILS_SUCCESS)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (rc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (brc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownboolean_t
1fcced4c370617db71610fecffd5451a5894ca5eJordan Browndomain_eq(const char *a, const char *b)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int err;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (u8_strcmp(a, b, 0, U8_STRCMP_CI_LOWER, U8_UNICODE_LATEST, &err)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown == 0 && err == 0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightadutils_set_debug(enum ad_debug item, int value)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (item >= 0 && item <= AD_DEBUG_MAX)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ad_debug[item] = value;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}