summaryrefslogtreecommitdiff
path: root/usr/src/lib/libadutils
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libadutils')
-rw-r--r--usr/src/lib/libadutils/common/addisc.c5
-rw-r--r--usr/src/lib/libadutils/common/adutils.c95
-rw-r--r--usr/src/lib/libadutils/common/adutils_impl.h5
-rw-r--r--usr/src/lib/libadutils/common/libadutils.h7
-rw-r--r--usr/src/lib/libadutils/common/mapfile-vers4
5 files changed, 64 insertions, 52 deletions
diff --git a/usr/src/lib/libadutils/common/addisc.c b/usr/src/lib/libadutils/common/addisc.c
index aeda77fbe2..f98461554d 100644
--- a/usr/src/lib/libadutils/common/addisc.c
+++ b/usr/src/lib/libadutils/common/addisc.c
@@ -708,12 +708,13 @@ srv_query(res_state state, const char *svc_name, const char *dname,
return (NULL);
}
} else if (dname != NULL) {
- len = res_nquerydomain(state, svc_name, dname, C_IN, T_SRV,
- msg.buf, sizeof (msg.buf));
logger(LOG_DEBUG,
"Querying DNS for SRV RRs named '%s' for '%s' ",
svc_name, dname);
+ len = res_nquerydomain(state, svc_name, dname, C_IN, T_SRV,
+ msg.buf, sizeof (msg.buf));
+
if (len < 0) {
logger(LOG_DEBUG,
"DNS query for '%s' for '%s' failed (%s)",
diff --git a/usr/src/lib/libadutils/common/adutils.c b/usr/src/lib/libadutils/common/adutils.c
index 006236789e..d18ccc3ff3 100644
--- a/usr/src/lib/libadutils/common/adutils.c
+++ b/usr/src/lib/libadutils/common/adutils.c
@@ -396,9 +396,41 @@ adutils_sid_ber2str(BerValue *bval)
}
+/*
+ * Extract an int from the Ber value
+ * Return B_TRUE if a valid integer was found, B_FALSE if not.
+ */
+boolean_t
+adutils_bv_uint(BerValue *bval, unsigned int *result)
+{
+ char buf[40]; /* big enough for any int */
+ unsigned int tmp;
+ char *p;
+
+ *result = 0; /* for error cases */
+
+ if (bval == NULL || bval->bv_val == NULL)
+ return (B_FALSE);
+ if (bval->bv_len >= sizeof (buf))
+ return (B_FALSE);
+
+ (void) memcpy(buf, bval->bv_val, bval->bv_len);
+ buf[bval->bv_len] = '\0';
+
+ tmp = strtoul(buf, &p, 10);
+
+ /* Junk after the number? */
+ if (*p != '\0')
+ return (B_FALSE);
+
+ *result = tmp;
+
+ return (B_TRUE);
+}
+
/* Return a NUL-terminated string from the Ber value */
char *
-adutils_bv_name2str(BerValue *bval)
+adutils_bv_str(BerValue *bval)
{
char *s;
@@ -461,32 +493,38 @@ adutils_reap_idle_connections()
adutils_rc
-adutils_ad_alloc(adutils_ad_t **new_ad, const char *default_domain,
+adutils_ad_alloc(adutils_ad_t **new_ad, const char *domain_name,
adutils_ad_partition_t part)
{
adutils_ad_t *ad;
*new_ad = NULL;
- if ((default_domain == NULL || *default_domain == '\0') &&
- part != ADUTILS_AD_GLOBAL_CATALOG)
- return (ADUTILS_ERR_DOMAIN);
if ((ad = calloc(1, sizeof (*ad))) == NULL)
return (ADUTILS_ERR_MEMORY);
ad->ref = 1;
ad->partition = part;
- if (default_domain == NULL)
- default_domain = "";
- if ((ad->dflt_w2k_dom = strdup(default_domain)) == NULL)
+
+ /* domain_name is required iff we are talking directly to a DC */
+ if (part == ADUTILS_AD_DATA) {
+ assert(domain_name != NULL);
+ assert(*domain_name != '\0');
+
+ ad->basedn = adutils_dns2dn(domain_name);
+ } else {
+ assert(domain_name == NULL);
+ ad->basedn = strdup("");
+ }
+ if (ad->basedn == NULL)
goto err;
+
if (pthread_mutex_init(&ad->lock, NULL) != 0)
goto err;
*new_ad = ad;
return (ADUTILS_SUCCESS);
err:
- if (ad->dflt_w2k_dom != NULL)
- free(ad->dflt_w2k_dom);
+ free(ad->basedn);
free(ad);
return (ADUTILS_ERR_MEMORY);
}
@@ -531,7 +569,7 @@ adutils_ad_free(adutils_ad_t **ad)
if ((*ad)->known_domains)
free((*ad)->known_domains);
- free((*ad)->dflt_w2k_dom);
+ free((*ad)->basedn);
free(*ad);
*ad = NULL;
@@ -587,9 +625,10 @@ open_conn(adutils_host_t *adh, int timeoutsecs)
logger(LOG_INFO, "ldap_sasl_interactive_bind_s() to server "
"%s port %d failed. (%s)", adh->host, adh->port,
ldap_err2string(rc));
+ goto out;
}
- logger(LOG_DEBUG, "Using global catalog server %s:%d",
+ logger(LOG_DEBUG, "Using server %s:%d",
adh->host, adh->port);
out:
@@ -922,26 +961,6 @@ adutils_lookup_batch_start(adutils_ad_t *ad, int nqueries,
if (new_state == NULL)
return (ADUTILS_ERR_MEMORY);
- /*
- * Save default domain from the ad object so that we don't
- * have to access the 'ad' object later.
- */
- new_state->default_domain = strdup(adh->owner->dflt_w2k_dom);
- if (new_state->default_domain == NULL) {
- free(new_state);
- return (ADUTILS_ERR_MEMORY);
- }
-
- if (ad->partition == ADUTILS_AD_DATA)
- new_state->basedn = adutils_dns2dn(new_state->default_domain);
- else
- new_state->basedn = strdup("");
- if (new_state->basedn == NULL) {
- free(new_state->default_domain);
- free(new_state);
- return (ADUTILS_ERR_MEMORY);
- }
-
new_state->ref_cnt = 1;
new_state->qadh = adh;
new_state->qsize = nqueries;
@@ -1485,8 +1504,6 @@ adutils_lookup_batch_release(adutils_query_state_t **state)
adutils_freeresult((*state)->queries[i].result);
}
}
- free((*state)->default_domain);
- free((*state)->basedn);
free(*state);
*state = NULL;
}
@@ -1545,12 +1562,6 @@ adutils_lookup_batch_end(adutils_query_state_t **state)
return (ad_rc);
}
-const char *
-adutils_lookup_batch_getdefdomain(adutils_query_state_t *state)
-{
- return (state->default_domain);
-}
-
/*
* Send one prepared search, queue up msgid, process what results are
* available
@@ -1605,7 +1616,9 @@ adutils_lookup_batch_add(adutils_query_state_t *state,
if (!state->qadh->dead) {
state->qadh->idletime = time(NULL);
- lrc = ldap_search_ext(state->qadh->ld, state->basedn,
+
+ lrc = ldap_search_ext(state->qadh->ld,
+ state->qadh->owner->basedn,
LDAP_SCOPE_SUBTREE, filter, (char **)attrs,
0, NULL, NULL, NULL, -1, &q->msgid);
diff --git a/usr/src/lib/libadutils/common/adutils_impl.h b/usr/src/lib/libadutils/common/adutils_impl.h
index 563fa892ec..9660d585ec 100644
--- a/usr/src/lib/libadutils/common/adutils_impl.h
+++ b/usr/src/lib/libadutils/common/adutils_impl.h
@@ -60,13 +60,14 @@ struct known_domain {
/* A set of DSs for a given AD partition */
struct adutils_ad {
- char *dflt_w2k_dom; /* used to qualify bare names */
int num_known_domains;
struct known_domain *known_domains;
pthread_mutex_t lock;
uint32_t ref;
struct adutils_host *last_adh;
adutils_ad_partition_t partition; /* Data or global catalog? */
+ /* If this is a reference to DC, this is the base DN for that DC */
+ char *basedn;
};
typedef struct adutils_attr {
@@ -141,8 +142,6 @@ struct adutils_query_state {
uint64_t qadh_gen; /* same as qadh->generation */
adutils_ldap_res_search_cb ldap_res_search_cb;
void *ldap_res_search_argp;
- char *default_domain;
- char *basedn;
adutils_q_t queries[1]; /* array of query results */
};
diff --git a/usr/src/lib/libadutils/common/libadutils.h b/usr/src/lib/libadutils/common/libadutils.h
index 39adf1a677..a184769cd0 100644
--- a/usr/src/lib/libadutils/common/libadutils.h
+++ b/usr/src/lib/libadutils/common/libadutils.h
@@ -133,7 +133,7 @@ typedef void (*adutils_logger)(int, const char *, ...);
extern adutils_rc adutils_ad_alloc(adutils_ad_t **new_ad,
- const char *default_domain,
+ const char *domain_name,
adutils_ad_partition_t part);
extern void adutils_ad_free(adutils_ad_t **ad);
extern adutils_rc adutils_add_ds(adutils_ad_t *ad,
@@ -153,7 +153,8 @@ extern const adutils_entry_t *adutils_getfirstentry(
extern int adutils_txtsid2hexbinsid(const char *txt,
const uint32_t *rid,
char *hexbinsid, int hexbinsidlen);
-extern char *adutils_bv_name2str(BerValue *bval);
+extern char *adutils_bv_str(BerValue *bval);
+extern boolean_t adutils_bv_uint(BerValue *bval, unsigned int *result);
extern char *adutils_bv_objsid2sidstr(BerValue *bval,
uint32_t *rid);
extern void adutils_reap_idle_connections(void);
@@ -171,8 +172,6 @@ extern adutils_rc adutils_lookup_batch_end(
adutils_query_state_t **state);
extern void adutils_lookup_batch_release(
adutils_query_state_t **state);
-extern const char *adutils_lookup_batch_getdefdomain(
- adutils_query_state_t *state);
extern int adutils_lookup_check_domain(
adutils_query_state_t *state,
const char *domain);
diff --git a/usr/src/lib/libadutils/common/mapfile-vers b/usr/src/lib/libadutils/common/mapfile-vers
index ffde67ee30..d7e1687ef2 100644
--- a/usr/src/lib/libadutils/common/mapfile-vers
+++ b/usr/src/lib/libadutils/common/mapfile-vers
@@ -40,8 +40,9 @@
SUNWprivate {
global:
adutils_txtsid2hexbinsid;
- adutils_bv_name2str;
+ adutils_bv_uint;
adutils_bv_objsid2sidstr;
+ adutils_bv_str;
adutils_getattr;
adutils_getfirstentry;
adutils_freeresult;
@@ -50,7 +51,6 @@ SUNWprivate {
adutils_lookup_batch_add;
adutils_lookup_batch_end;
adutils_lookup_batch_release;
- adutils_lookup_batch_getdefdomain;
adutils_lookup_check_domain;
adutils_lookup_check_sid_prefix;
adutils_dn2dns;