2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * See the License for the specific language governing permissions
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * and limitations under the License.
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 * CDDL HEADER END
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Use is subject to license terms.
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrestatic pthread_mutex_t statelock = PTHREAD_MUTEX_INITIALIZER;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_discover_props(const char *domain, ad_disc_t ad_ctx,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (ad_disc_set_DomainName(ad_ctx, domain) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
4d61c878ad5fbf36c5338bef5994cc5fe88a589aJulian Pullen ad_disc_get_DomainController(ad_ctx, AD_DISC_PREFER_SITE,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkrenssad_cfg_reload_ad(nssad_prop_t *props, adutils_ad_t **ad)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (i = 0; props->domain_controller[i].host[0] != '\0'; i++) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre props->domain_controller[i].port) != ADUTILS_SUCCESS) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
b3700b074e637f8c6991b70754c88a2cfffb246bGordon Rossupdate_dirs(ad_disc_ds_t **value, ad_disc_ds_t **new)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_discover_props(cp->props.domain_name, cp->ad_ctx,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre cp->props.domain_controller[0].host[0] != '\0')
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre (void) nssad_cfg_reload_ad(&cp->props, &cp->ad);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (pthread_rwlock_init(&cp->lock, NULL) != 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((cp->props.domain_name = strdup(domain)) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_discover_props(domain, cp->ad_ctx, &cp->props) < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (nssad_cfg_reload_ad(&cp->props, &cp->ad) < 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_ldap_filter_name(char *filter_name, const char *name, int filter_name_size)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre switch (c) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (-1);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_marshall_data(ad_backend_ptr be, nss_XbyY_args_t *argp)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This suggests that the process (e.g. nscd) expects
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * nssad to return the data in native file format in
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * argp->buf.buffer i.e. no need to marshall the data.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre stat = (*argp->str2ent)(be->buffer, be->buflen,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre argp->buf.result, argp->buf.buffer, argp->buf.buflen);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_sanitize_status(ad_backend_ptr be, nss_XbyY_args_t *argp,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Note about the queue:
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * The queue is used to hold our per domain
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * configs. The queue is limited to CFG_QUEUE_MAX_SIZE.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If the queue increases beyond that point we toss
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * out the LRU entry. The entries are inserted into
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * the queue at state.qtail and the LRU entry is
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * removed from state.qhead. state.qnext points
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * from the qtail to the qhead. Everytime a config
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * is accessed it is moved to qtail.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre for (cp = state.qtail, prev = NULL; cp != NULL;
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre strcasecmp(cp->props.domain_name, domain) != 0)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Found config for the given domain. */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * Move the entry to the tail of the queue.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * This way the LRU entry can be found at
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * the head of the queue.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * If there are expired items in the
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * config, grab the write lock and
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * refresh the config.
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Return the config found */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Create new config entry for the domain */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Add it to the queue */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* If the queue has exceeded its size, remove the LRU entry */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Detach the lru entry and destroy */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if (pthread_rwlock_trywrlock(&lru->lock) == 0) {
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkread_lookup(const char *filter, const char **attrs,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_start(cp->ad, 1, NULL, NULL, &qs);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre rc = adutils_lookup_batch_add(qs, filter, attrs, domain, result, &brc);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre/* ARGSUSED */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_lookup(ad_backend_ptr be, nss_XbyY_args_t *argp,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre const char *database, const char *searchfilter,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Clear up results if any */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Lookup AD */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre stat = ad_lookup(searchfilter, be->attrs, dname, &be->result);
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre /* Map AD object(s) to string in native file format */
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre return (_nss_ad_sanitize_status(be, argp, stat));
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * _nss_ad_destr frees allocated memory before exiting this nsswitch shared
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre * backend library. This function is called before returning control back to
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre_nss_ad_constr(ad_backend_op_t ops[], int nops, char *tablename,
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((be = (ad_backend_ptr) calloc(1, sizeof (*be))) == NULL)
2b4a78020b9c38d1b95e2f3fefa6d6e4be382d1fBaban Kenkre if ((be->tablename = (char *)strdup(tablename)) == NULL) {