code rewrite from Luke Howard <lukeh@PADL.COM>

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12642 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2003-08-25 20:29:03 +00:00
parent 1026a01bec
commit 1c5aca620c

View File

@@ -62,69 +62,101 @@ static char *krb5principal_attrs[] =
NULL NULL
}; };
/* based on samba: source/passdb/ldap.c */
static krb5_error_code static krb5_error_code
LDAP_addmod_len(LDAPMod *** modlist, int modop, const char *attribute, LDAP__setmod(LDAPMod *** modlist, int modop, const char *attribute,
unsigned char *value, size_t len) int *pIndex)
{ {
LDAPMod **mods = *modlist; int cMods;
int i, j;
if (mods == NULL) { if (*modlist == NULL) {
mods = (LDAPMod **) calloc(1, sizeof(LDAPMod *)); *modlist = (LDAPMod **)ber_memcalloc(1, sizeof(LDAPMod *));
if (mods == NULL) { if (*modlist == NULL) {
return ENOMEM; return ENOMEM;
} }
mods[0] = NULL;
} }
for (i = 0; mods[i] != NULL; ++i) { for (cMods = 0; (*modlist)[cMods] != NULL; cMods++) {
if ((mods[i]->mod_op & (~LDAP_MOD_BVALUES)) == modop if ((*modlist)[cMods]->mod_op == modop &&
&& (!strcasecmp(mods[i]->mod_type, attribute))) { strcasecmp((*modlist)[cMods]->mod_type, attribute) == 0) {
break; break;
} }
} }
if (mods[i] == NULL) { *pIndex = cMods;
mods = (LDAPMod **) realloc(mods, (i + 2) * sizeof(LDAPMod *));
if (mods == NULL) { if ((*modlist)[cMods] == NULL) {
LDAPMod *mod;
*modlist = (LDAPMod **)ber_memrealloc(*modlist,
(cMods + 2) * sizeof(LDAPMod *));
if (*modlist == NULL) {
return ENOMEM; return ENOMEM;
} }
mods[i] = (LDAPMod *) malloc(sizeof(LDAPMod)); (*modlist)[cMods] = (LDAPMod *)ber_memalloc(sizeof(LDAPMod));
if (mods[i] == NULL) { if ((*modlist)[cMods] == NULL) {
return ENOMEM; return ENOMEM;
} }
mods[i]->mod_op = modop | LDAP_MOD_BVALUES;
mods[i]->mod_bvalues = NULL; mod = (*modlist)[cMods];
mods[i]->mod_type = strdup(attribute); mod->mod_op = modop;
if (mods[i]->mod_type == NULL) { mod->mod_type = ber_strdup(attribute);
if (mod->mod_type == NULL) {
ber_memfree(mod);
(*modlist)[cMods] = NULL;
return ENOMEM; return ENOMEM;
} }
mods[i + 1] = NULL;
if (modop & LDAP_MOD_BVALUES) {
mod->mod_bvalues = NULL;
} else {
mod->mod_values = NULL;
}
(*modlist)[cMods + 1] = NULL;
}
return 0;
}
static krb5_error_code
LDAP_addmod_len(LDAPMod *** modlist, int modop, const char *attribute,
unsigned char *value, size_t len)
{
int cMods, cValues = 0;
krb5_error_code ret;
ret = LDAP__setmod(modlist, modop | LDAP_MOD_BVALUES, attribute, &cMods);
if (ret != 0) {
return ret;
} }
if (value != NULL) { if (value != NULL) {
j = 0; struct berval *bValue;
if (mods[i]->mod_bvalues != NULL) { struct berval ***pbValues = &((*modlist)[cMods]->mod_bvalues);
for (; mods[i]->mod_bvalues[j] != NULL; j++);
if (*pbValues != NULL) {
for (cValues = 0; (*pbValues)[cValues] != NULL; cValues++)
;
*pbValues = (struct berval **)ber_memrealloc(*pbValues, (cValues + 2)
* sizeof(struct berval *));
} else {
*pbValues = (struct berval **)ber_memalloc(2 * sizeof(struct berval *));
} }
mods[i]->mod_bvalues = if (*pbValues == NULL) {
(struct berval **) realloc(mods[i]->mod_bvalues,
(j + 2) * sizeof(struct berval *));
if (mods[i]->mod_bvalues == NULL) {
return ENOMEM; return ENOMEM;
} }
/* Caller allocates memory on our behalf, unlike LDAP_addmod. */ (*pbValues)[cValues] = (struct berval *)ber_memalloc(sizeof(struct berval));;
mods[i]->mod_bvalues[j] = if ((*pbValues)[cValues] == NULL) {
(struct berval *) malloc(sizeof(struct berval));
if (mods[i]->mod_bvalues[j] == NULL) {
return ENOMEM; return ENOMEM;
} }
mods[i]->mod_bvalues[j]->bv_val = value;
mods[i]->mod_bvalues[j]->bv_len = len; bValue = (*pbValues)[cValues];
mods[i]->mod_bvalues[j + 1] = NULL; bValue->bv_val = value;
bValue->bv_len = len;
(*pbValues)[cValues + 1] = NULL;
} }
*modlist = mods;
return 0; return 0;
} }
@@ -132,59 +164,34 @@ static krb5_error_code
LDAP_addmod(LDAPMod *** modlist, int modop, const char *attribute, LDAP_addmod(LDAPMod *** modlist, int modop, const char *attribute,
const char *value) const char *value)
{ {
LDAPMod **mods = *modlist; int cMods, cValues = 0;
int i, j; krb5_error_code ret;
if (mods == NULL) { ret = LDAP__setmod(modlist, modop, attribute, &cMods);
mods = (LDAPMod **) calloc(1, sizeof(LDAPMod *)); if (ret != 0) {
if (mods == NULL) { return ret;
return ENOMEM;
}
mods[0] = NULL;
}
for (i = 0; mods[i] != NULL; ++i) {
if (mods[i]->mod_op == modop
&& (!strcasecmp(mods[i]->mod_type, attribute))) {
break;
}
}
if (mods[i] == NULL) {
mods = (LDAPMod **) realloc(mods, (i + 2) * sizeof(LDAPMod *));
if (mods == NULL) {
return ENOMEM;
}
mods[i] = (LDAPMod *) malloc(sizeof(LDAPMod));
if (mods[i] == NULL) {
return ENOMEM;
}
mods[i]->mod_op = modop;
mods[i]->mod_values = NULL;
mods[i]->mod_type = strdup(attribute);
if (mods[i]->mod_type == NULL) {
return ENOMEM;
}
mods[i + 1] = NULL;
} }
if (value != NULL) { if (value != NULL) {
j = 0; char ***pValues = &((*modlist)[cMods]->mod_values);
if (mods[i]->mod_values != NULL) {
for (; mods[i]->mod_values[j] != NULL; j++); if (*pValues != NULL) {
for (cValues = 0; (*pValues)[cValues] != NULL; cValues++)
;
*pValues = (char **)ber_memrealloc(*pValues, (cValues + 2) * sizeof(char *));
} else {
*pValues = (char **)ber_memalloc(2 * sizeof(char *));
} }
mods[i]->mod_values = (char **) realloc(mods[i]->mod_values, if (*pValues == NULL) {
(j + 2) * sizeof(char *));
if (mods[i]->mod_values == NULL) {
return ENOMEM; return ENOMEM;
} }
mods[i]->mod_values[j] = strdup(value); (*pValues)[cValues] = ber_strdup(value);
if (mods[i]->mod_values[j] == NULL) { if ((*pValues)[cValues] == NULL) {
return ENOMEM; return ENOMEM;
} }
mods[i]->mod_values[j + 1] = NULL; (*pValues)[cValues + 1] = NULL;
} }
*modlist = mods;
return 0; return 0;
} }