#include <sys/systeminfo.h>
#include "ldap_common.h"
#ifdef DEBUG
int
printresult(ns_ldap_result_t *result)
{
int i, j, k;
ns_ldap_entry_t *curEntry;
printf("--------------------------------------\n");
printf("entries_count %d\n", result->entries_count);
curEntry = result->entry;
for (i = 0; i < result->entries_count; i++) {
printf("entry %d has attr_count = %d \n",
i, curEntry->attr_count);
for (j = 0; j < curEntry->attr_count; j++) {
printf("entry %d has attr_pair[%d] = %s \n",
i, j, curEntry->attr_pair[j]->attrname);
for (k = 0;
(k < curEntry->attr_pair[j]->value_count) &&
(curEntry->attr_pair[j]->attrvalue[k]);
k++)
printf("entry %d has "
"attr_pair[%d]->attrvalue[%d] = %s \n",
i, j, k,
curEntry->attr_pair[j]->attrvalue[k]);
}
printf("\n--------------------------------------\n");
curEntry = curEntry->next;
}
return (1);
}
#endif
ns_ldap_attr_t *
getattr(ns_ldap_result_t *result, int i)
{
ns_ldap_entry_t *entry;
#ifdef DEBUG
(void) fprintf(stdout, "\n[ldap_utils.c: getattr]\n");
#endif
if (result != NULL) {
entry = result->entry;
} else {
return (NULL);
}
if (result->entries_count == 0) {
return (NULL);
} else {
return (entry->attr_pair[i]);
}
}
char *
_get_domain_name(char *cdn)
{
char **rdns;
char *pdn, *domain = NULL;
int nrdns;
int len = 0;
const ns_cred_t *cred = NULL;
ns_ldap_error_t *error;
rdns = ldap_explode_dn(cdn, 0);
if (rdns == NULL || *rdns == NULL)
return (NULL);
for (nrdns = 1; rdns[nrdns]; nrdns++)
len += strlen(rdns[nrdns]) + 1;
if (len == 0)
len = strlen(rdns[0]);
pdn = (char *)malloc(len + 1);
if (pdn == NULL) {
ldap_value_free(rdns);
return (NULL);
}
*pdn = '\0';
if (nrdns == 1)
(void) strcat(pdn, rdns[0]);
else {
for (nrdns = 1; rdns[nrdns]; nrdns++) {
(void) strcat(pdn, rdns[nrdns]);
(void) strcat(pdn, ",");
}
pdn[strlen(pdn) - 1] = '\0';
}
(void) __ns_ldap_dn2domain(pdn, &domain, cred, &error);
ldap_value_free(rdns);
free(pdn);
return (domain);
}
const char *
_strip_quotes(char *ipaddress)
{
char *cp = (char *)NULL;
if ((cp = strchr(ipaddress, '"')) == NULL)
return ((char *)ipaddress);
ipaddress++;
if ((cp = strchr(ipaddress, '"')) == NULL)
return ((char *)ipaddress);
*cp++ = '\0';
return (ipaddress);
}
int
__nss2herrno(nss_status_t nsstat)
{
switch (nsstat) {
case NSS_SUCCESS:
return (0);
case NSS_NOTFOUND:
return (HOST_NOT_FOUND);
case NSS_TRYAGAIN:
return (TRY_AGAIN);
case NSS_UNAVAIL:
default:
return (NO_RECOVERY);
}
}
int
_merge_SSD_filter(const ns_ldap_search_desc_t *desc,
char **realfilter,
const void *userdata)
{
int len;
char *checker;
#ifdef DEBUG
(void) fprintf(stdout, "\n[ldap_utils.c: _merge_SSD_filter]\n");
#endif
if (realfilter == NULL)
return (NS_LDAP_INVALID_PARAM);
*realfilter = NULL;
if (desc == NULL || desc->filter == NULL || userdata == NULL)
return (NS_LDAP_INVALID_PARAM);
len = 0;
checker = (char *)userdata;
do {
checker = strchr(checker, '%');
if (checker != NULL) {
if (len > 0 || *(checker + 1) != 's')
return (NS_LDAP_INVALID_PARAM);
len++;
checker += 2;
} else if (len != 1)
return (NS_LDAP_INVALID_PARAM);
} while (checker != NULL);
#ifdef DEBUG
(void) fprintf(stdout, "\n[userdata: %s]\n", (char *)userdata);
(void) fprintf(stdout, "\n[SSD filter: %s]\n", desc->filter);
#endif
len = strlen(userdata) + strlen(desc->filter) + 1;
*realfilter = (char *)malloc(len);
if (*realfilter == NULL)
return (NS_LDAP_MEMORY);
(void) sprintf(*realfilter, (char *)userdata, desc->filter);
#ifdef DEBUG
(void) fprintf(stdout, "\n[new filter: %s]\n", *realfilter);
#endif
return (NS_LDAP_SUCCESS);
}
static char
hex_char(int n)
{
return ("0123456789abcdef"[n & 0xf]);
}
int
_ldap_filter_name(char *filter_name, const char *name, int filter_name_size)
{
char *end = filter_name + filter_name_size;
char c;
for (; *name; name++) {
c = *name;
switch (c) {
case '*':
case '(':
case ')':
case '\\':
if (end <= filter_name + 3)
return (-1);
*filter_name++ = '\\';
*filter_name++ = hex_char(c >> 4);
*filter_name++ = hex_char(c & 0xf);
break;
default:
if (end <= filter_name + 1)
return (-1);
*filter_name++ = c;
break;
}
}
if (end <= filter_name)
return (-1);
*filter_name = '\0';
return (0);
}