1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-12 04:23:49 +03:00

r4474: - converted ldb to use talloc internally

- added gcov flags to Makefile.ldb

- expanded ldb test suite to get more coverage
This commit is contained in:
Andrew Tridgell
2005-01-02 07:49:29 +00:00
committed by Gerald (Jerry) Carter
parent 98b5f73c1b
commit 0ab98f50a7
28 changed files with 748 additions and 1159 deletions

View File

@@ -72,26 +72,9 @@ static const char *lldb_option_find(const struct lldb_private *lldb, const char
*/
static int lldb_close(struct ldb_module *module)
{
int i, ret = 0;
struct ldb_context *ldb = module->ldb;
struct lldb_private *lldb = module->private_data;
if (ldap_unbind(lldb->ldap) != LDAP_SUCCESS) {
ret = -1;
}
ldb_set_alloc(ldb, NULL, NULL);
if (lldb->options) {
for (i=0;lldb->options[i];i++) {
ldb_free(ldb, lldb->options[i]);
}
ldb_free(ldb, lldb->options);
}
ldb_free(ldb, lldb);
free(ldb);
return ret;
talloc_free(ldb);
return 0;
}
/*
@@ -99,18 +82,18 @@ static int lldb_close(struct ldb_module *module)
*/
static int lldb_rename(struct ldb_module *module, const char *olddn, const char *newdn)
{
struct ldb_context *ldb = module->ldb;
struct lldb_private *lldb = module->private_data;
int ret = 0;
char *newrdn, *p;
const char *parentdn = "";
TALLOC_CTX *mem_ctx = talloc(lldb, 0);
/* ignore ltdb specials */
if (olddn[0] == '@' ||newdn[0] == '@') {
return 0;
}
newrdn = ldb_strdup(ldb, newdn);
newrdn = talloc_strdup(mem_ctx, newdn);
if (!newrdn) {
return -1;
}
@@ -122,11 +105,12 @@ static int lldb_rename(struct ldb_module *module, const char *olddn, const char
}
lldb->last_rc = ldap_rename_s(lldb->ldap, olddn, newrdn, parentdn, 1, NULL, NULL);
ldb_free(ldb, newrdn);
if (lldb->last_rc != LDAP_SUCCESS) {
ret = -1;
}
talloc_free(mem_ctx);
return ret;
}
@@ -151,40 +135,12 @@ static int lldb_delete(struct ldb_module *module, const char *dn)
return ret;
}
/*
free a search message
*/
static int lldb_msg_free(struct ldb_context *ldb, struct ldb_message *msg)
{
unsigned int i, j;
ldb_free(ldb, msg->dn);
for (i=0;i<msg->num_elements;i++) {
ldb_free(ldb, msg->elements[i].name);
for (j=0;j<msg->elements[i].num_values;j++) {
if (msg->elements[i].values[j].data) {
ldb_free(ldb, msg->elements[i].values[j].data);
}
}
ldb_free(ldb, msg->elements[i].values);
}
if (msg->elements) ldb_free(ldb, msg->elements);
ldb_free(ldb, msg);
return 0;
}
/*
free a search result
*/
static int lldb_search_free(struct ldb_module *module, struct ldb_message **res)
{
struct ldb_context *ldb = module->ldb;
int i;
for (i=0;res[i];i++) {
if (lldb_msg_free(ldb, res[i]) != 0) {
return -1;
}
}
ldb_free(ldb, res);
talloc_free(res);
return 0;
}
@@ -205,8 +161,8 @@ static int lldb_add_msg_attr(struct ldb_context *ldb,
return -1;
}
el = ldb_realloc_p(ldb, msg->elements, struct ldb_message_element,
msg->num_elements + 1);
el = talloc_realloc_p(msg, msg->elements, struct ldb_message_element,
msg->num_elements + 1);
if (!el) {
errno = ENOMEM;
return -1;
@@ -216,7 +172,7 @@ static int lldb_add_msg_attr(struct ldb_context *ldb,
el = &msg->elements[msg->num_elements];
el->name = ldb_strdup(ldb, attr);
el->name = talloc_strdup(msg->elements, attr);
if (!el->name) {
errno = ENOMEM;
return -1;
@@ -224,18 +180,17 @@ static int lldb_add_msg_attr(struct ldb_context *ldb,
el->flags = 0;
el->num_values = 0;
el->values = ldb_malloc_array_p(ldb, struct ldb_val, count);
el->values = talloc_array_p(msg->elements, struct ldb_val, count);
if (!el->values) {
errno = ENOMEM;
return -1;
}
for (i=0;i<count;i++) {
el->values[i].data = ldb_malloc(ldb, bval[i]->bv_len);
el->values[i].data = talloc_memdup(el->values, bval[i]->bv_val, bval[i]->bv_len);
if (!el->values[i].data) {
return -1;
}
memcpy(el->values[i].data, bval[i]->bv_val, bval[i]->bv_len);
el->values[i].length = bval[i]->bv_len;
el->num_values++;
}
@@ -275,7 +230,7 @@ static int lldb_search(struct ldb_module *module, const char *base,
return count;
}
(*res) = ldb_malloc_array_p(ldb, struct ldb_message *, count+1);
(*res) = talloc_array_p(lldb, struct ldb_message *, count+1);
if (! *res) {
ldap_msgfree(ldapres);
errno = ENOMEM;
@@ -299,7 +254,7 @@ static int lldb_search(struct ldb_module *module, const char *base,
break;
}
(*res)[msg_count] = ldb_malloc_p(ldb, struct ldb_message);
(*res)[msg_count] = talloc_p(*res, struct ldb_message);
if (!(*res)[msg_count]) {
goto failed;
}
@@ -310,7 +265,7 @@ static int lldb_search(struct ldb_module *module, const char *base,
goto failed;
}
(*res)[msg_count]->dn = ldb_strdup(ldb, dn);
(*res)[msg_count]->dn = talloc_strdup((*res)[msg_count], dn);
ldap_memfree(dn);
if (!(*res)[msg_count]->dn) {
goto failed;
@@ -350,28 +305,6 @@ failed:
}
/*
free a set of mods from lldb_msg_to_mods()
*/
static void lldb_mods_free(struct ldb_context *ldb, LDAPMod **mods)
{
int i, j;
if (!mods) return;
for (i=0;mods[i];i++) {
if (mods[i]->mod_vals.modv_bvals) {
for (j=0;mods[i]->mod_vals.modv_bvals[j];j++) {
ldb_free(ldb, mods[i]->mod_vals.modv_bvals[j]);
}
ldb_free(ldb, mods[i]->mod_vals.modv_bvals);
}
ldb_free(ldb, mods[i]);
}
ldb_free(ldb, mods);
}
/*
convert a ldb_message structure to a list of LDAPMod structures
ready for ldap_add() or ldap_modify()
@@ -384,7 +317,7 @@ static LDAPMod **lldb_msg_to_mods(struct ldb_context *ldb,
int num_mods = 0;
/* allocate maximum number of elements needed */
mods = ldb_malloc_array_p(ldb, LDAPMod *, msg->num_elements+1);
mods = talloc_array_p(ldb, LDAPMod *, msg->num_elements+1);
if (!mods) {
errno = ENOMEM;
return NULL;
@@ -394,7 +327,7 @@ static LDAPMod **lldb_msg_to_mods(struct ldb_context *ldb,
for (i=0;i<msg->num_elements;i++) {
const struct ldb_message_element *el = &msg->elements[i];
mods[num_mods] = ldb_malloc_p(ldb, LDAPMod);
mods[num_mods] = talloc_p(ldb, LDAPMod);
if (!mods[num_mods]) {
goto failed;
}
@@ -414,15 +347,16 @@ static LDAPMod **lldb_msg_to_mods(struct ldb_context *ldb,
}
}
mods[num_mods]->mod_type = el->name;
mods[num_mods]->mod_vals.modv_bvals = ldb_malloc_array_p(ldb,
struct berval *,
1+el->num_values);
mods[num_mods]->mod_vals.modv_bvals = talloc_array_p(mods[num_mods],
struct berval *,
1+el->num_values);
if (!mods[num_mods]->mod_vals.modv_bvals) {
goto failed;
}
for (j=0;j<el->num_values;j++) {
mods[num_mods]->mod_vals.modv_bvals[j] = ldb_malloc_p(ldb, struct berval);
mods[num_mods]->mod_vals.modv_bvals[j] = talloc_p(mods[num_mods]->mod_vals.modv_bvals,
struct berval);
if (!mods[num_mods]->mod_vals.modv_bvals[j]) {
goto failed;
}
@@ -436,7 +370,7 @@ static LDAPMod **lldb_msg_to_mods(struct ldb_context *ldb,
return mods;
failed:
lldb_mods_free(ldb, mods);
talloc_free(mods);
return NULL;
}
@@ -463,7 +397,7 @@ static int lldb_add(struct ldb_module *module, const struct ldb_message *msg)
ret = -1;
}
lldb_mods_free(ldb, mods);
talloc_free(mods);
return ret;
}
@@ -491,7 +425,7 @@ static int lldb_modify(struct ldb_module *module, const struct ldb_message *msg)
ret = -1;
}
lldb_mods_free(ldb, mods);
talloc_free(mods);
return ret;
}
@@ -547,6 +481,13 @@ static const struct ldb_module_ops lldb_ops = {
};
static int lldb_destructor(void *p)
{
struct lldb_private *lldb = p;
ldap_unbind(lldb->ldap);
return 0;
}
/*
connect to the database
*/
@@ -558,15 +499,14 @@ struct ldb_context *lldb_connect(const char *url,
struct lldb_private *lldb = NULL;
int i, version = 3;
ldb = calloc(1, sizeof(struct ldb_context));
ldb = talloc_p(NULL, struct ldb_context);
if (!ldb) {
errno = ENOMEM;
goto failed;
}
lldb = ldb_malloc_p(ldb, struct lldb_private);
lldb = talloc_p(ldb, struct lldb_private);
if (!lldb) {
ldb_free(ldb, ldb);
errno = ENOMEM;
goto failed;
}
@@ -579,14 +519,15 @@ struct ldb_context *lldb_connect(const char *url,
goto failed;
}
talloc_set_destructor(lldb, lldb_destructor);
lldb->last_rc = ldap_set_option(lldb->ldap, LDAP_OPT_PROTOCOL_VERSION, &version);
if (lldb->last_rc != LDAP_SUCCESS) {
goto failed;
}
ldb->modules = ldb_malloc_p(ldb, struct ldb_module);
ldb->modules = talloc_p(ldb, struct ldb_module);
if (!ldb->modules) {
ldb_free(ldb, ldb);
errno = ENOMEM;
goto failed;
}
@@ -600,14 +541,14 @@ struct ldb_context *lldb_connect(const char *url,
on the caller keeping it around (it might be dynamic) */
for (i=0;options[i];i++) ;
lldb->options = ldb_malloc_array_p(ldb, char *, i+1);
lldb->options = talloc_array_p(lldb, char *, i+1);
if (!lldb->options) {
goto failed;
}
for (i=0;options[i];i++) {
lldb->options[i+1] = NULL;
lldb->options[i] = ldb_strdup(ldb, options[i]);
lldb->options[i] = talloc_strdup(lldb->options, options[i]);
if (!lldb->options[i]) {
goto failed;
}
@@ -617,17 +558,7 @@ struct ldb_context *lldb_connect(const char *url,
return ldb;
failed:
if (lldb && lldb->options) {
for (i=0;lldb->options[i];i++) {
ldb_free(ldb, lldb->options[i]);
}
ldb_free(ldb, lldb->options);
}
if (lldb && lldb->ldap) {
ldap_unbind(lldb->ldap);
}
ldb_free(ldb, lldb);
if (ldb) free(ldb);
talloc_free(ldb);
return NULL;
}