diff options
author | Simo Sorce <simo@redhat.com> | 2013-01-14 11:56:03 -0500 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2013-02-10 22:08:46 +0100 |
commit | aab938c5975f0e3b85c7c79a5d718e5fefed7217 (patch) | |
tree | 1ab6ab467b3c1a8ae99a0b684b7153d3623ccf40 /src | |
parent | b8dcd1216e5ea7065213c750a92dabfe01fa3b70 (diff) | |
download | sssd-aab938c5975f0e3b85c7c79a5d718e5fefed7217.tar.gz sssd-aab938c5975f0e3b85c7c79a5d718e5fefed7217.tar.bz2 sssd-aab938c5975f0e3b85c7c79a5d718e5fefed7217.zip |
Avoid sysdb_subdom in sysdb_get_subdomains()
Diffstat (limited to 'src')
-rw-r--r-- | src/db/sysdb.h | 6 | ||||
-rw-r--r-- | src/db/sysdb_subdomains.c | 90 | ||||
-rw-r--r-- | src/providers/ipa/ipa_subdomains.c | 4 | ||||
-rw-r--r-- | src/responder/common/responder_get_domains.c | 37 | ||||
-rw-r--r-- | src/tests/sysdb-tests.c | 22 | ||||
-rw-r--r-- | src/util/domain_info_utils.c | 3 |
6 files changed, 60 insertions, 102 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 5c33ab28..81048852 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -363,13 +363,13 @@ int sysdb_transaction_cancel(struct sysdb_ctx *sysdb); /* functions related to subdomains */ errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, - struct sysdb_ctx *sysdb, + struct sss_domain_info *domain, size_t *subdomain_count, - struct sysdb_subdom ***subdomain_list); + struct sss_domain_info ***subdomain_list); errno_t sysdb_domain_create(struct sysdb_ctx *sysdb, const char *domain_name); -errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, +errno_t sysdb_update_subdomains(struct sss_domain_info *domain, int num_subdoms, struct sysdb_subdom *subdoms); diff --git a/src/db/sysdb_subdomains.c b/src/db/sysdb_subdomains.c index 9b295d7e..eea27aad 100644 --- a/src/db/sysdb_subdomains.c +++ b/src/db/sysdb_subdomains.c @@ -23,9 +23,10 @@ #include "util/util.h" #include "db/sysdb_private.h" -errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, +errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, size_t *subdomain_count, - struct sysdb_subdom ***subdomain_list) + struct sss_domain_info ***subdomain_list) { int i; errno_t ret; @@ -36,9 +37,8 @@ errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, SYSDB_SUBDOMAIN_FLAT, SYSDB_SUBDOMAIN_ID, NULL}; - struct sysdb_subdom **list; + struct sss_domain_info **list; struct ldb_dn *basedn; - const char *tmp_str; tmp_ctx = talloc_new(NULL); if (tmp_ctx == NULL) { @@ -46,12 +46,12 @@ errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, goto done; } - basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); + basedn = ldb_dn_new(tmp_ctx, domain->sysdb->ldb, SYSDB_BASE); if (basedn == NULL) { ret = EIO; goto done; } - ret = ldb_search(sysdb->ldb, tmp_ctx, &res, + ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_ONELEVEL, attrs, "objectclass=%s", SYSDB_SUBDOMAIN_CLASS); if (ret != LDB_SUCCESS) { @@ -59,20 +59,21 @@ errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, goto done; } - list = talloc_zero_array(tmp_ctx, struct sysdb_subdom *, res->count + 1); + list = talloc_zero_array(tmp_ctx, struct sss_domain_info *, + res->count + 1); if (list == NULL) { ret = ENOMEM; goto done; } for (i = 0; i < res->count; i++) { - list[i] = talloc_zero(list, struct sysdb_subdom); - if (list[i] == NULL) { - ret = ENOMEM; - goto done; - } - tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL); - if (tmp_str == NULL) { + const char *name; + const char *realm; + const char *flat; + const char *id; + + name = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL); + if (name == NULL) { DEBUG(SSSDBG_MINOR_FAILURE, ("The object [%s] doesn't have a name\n", ldb_dn_get_linearized(res->msgs[i]->dn))); @@ -80,40 +81,19 @@ errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, goto done; } - list[i]->name = talloc_strdup(list, tmp_str); - if (list[i]->name == NULL) { - ret = ENOMEM; - goto done; - } + realm = ldb_msg_find_attr_as_string(res->msgs[i], + SYSDB_SUBDOMAIN_REALM, NULL); - tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], - SYSDB_SUBDOMAIN_REALM, NULL); - if (tmp_str != NULL) { - list[i]->realm = talloc_strdup(list, tmp_str); - if (list[i]->realm == NULL) { - ret = ENOMEM; - goto done; - } - } + flat = ldb_msg_find_attr_as_string(res->msgs[i], + SYSDB_SUBDOMAIN_FLAT, NULL); - tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], - SYSDB_SUBDOMAIN_FLAT, NULL); - if (tmp_str != NULL) { - list[i]->flat_name = talloc_strdup(list, tmp_str); - if (list[i]->flat_name == NULL) { - ret = ENOMEM; - goto done; - } - } + id = ldb_msg_find_attr_as_string(res->msgs[i], + SYSDB_SUBDOMAIN_ID, NULL); - tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], - SYSDB_SUBDOMAIN_ID, NULL); - if (tmp_str != NULL) { - list[i]->id = talloc_strdup(list, tmp_str); - if (list[i]->id == NULL) { - ret = ENOMEM; - goto done; - } + list[i] = new_subdomain(list, domain, name, realm, flat, id); + if (list[i] == NULL) { + ret = ENOMEM; + goto done; } } @@ -432,7 +412,7 @@ done: return ret; } -errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, +errno_t sysdb_update_subdomains(struct sss_domain_info *domain, int num_subdoms, struct sysdb_subdom *subdoms) { @@ -442,7 +422,7 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, size_t d; TALLOC_CTX *tmp_ctx = NULL; size_t cur_subdomains_count; - struct sysdb_subdom **cur_subdomains; + struct sss_domain_info **cur_subdomains; struct ldb_dn *dn; bool in_transaction = false; bool *keep_subdomain; @@ -454,7 +434,7 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, } /* Retrieve all subdomains that are currently in sysdb */ - ret = sysdb_get_subdomains(tmp_ctx, sysdb, &cur_subdomains_count, + ret = sysdb_get_subdomains(tmp_ctx, domain, &cur_subdomains_count, &cur_subdomains); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_subdomains failed.\n")); @@ -468,7 +448,7 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, goto done; } - ret = sysdb_transaction_start(sysdb); + ret = sysdb_transaction_start(domain->sysdb); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n")); goto done; @@ -492,13 +472,13 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, if (d == cur_subdomains_count) { DEBUG(SSSDBG_TRACE_FUNC, ("Adding sub-domain [%s].\n", subdoms[c].name)); - ret = sysdb_domain_create(sysdb, subdoms[c].name); + ret = sysdb_domain_create(domain->sysdb, subdoms[c].name); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n")); goto done; } - ret = sysdb_add_subdomain_attributes(sysdb, &subdoms[c]); + ret = sysdb_add_subdomain_attributes(domain->sysdb, &subdoms[c]); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("sysdb_add_subdomain_attributes failed.\n")); @@ -515,14 +495,14 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, if (!keep_subdomain[d]) { DEBUG(SSSDBG_TRACE_FUNC, ("Removing sub-domain [%s].\n", cur_subdomains[d]->name)); - dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE, + dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE, cur_subdomains[d]->name); if (dn == NULL) { ret = ENOMEM; goto done; } - ret = sysdb_delete_recursive(sysdb, dn, true); + ret = sysdb_delete_recursive(domain->sysdb, dn, true); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_recursive failed.\n")); goto done; @@ -530,7 +510,7 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, } } - ret = sysdb_transaction_commit(sysdb); + ret = sysdb_transaction_commit(domain->sysdb); if (ret != EOK) { DEBUG(SSSDBG_MINOR_FAILURE, ("Could not commit transaction\n")); goto done; @@ -539,7 +519,7 @@ errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb, done: if (in_transaction) { - sret = sysdb_transaction_cancel(sysdb); + sret = sysdb_transaction_cancel(domain->sysdb); if (sret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n")); } diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c index ef6195d1..114bd26e 100644 --- a/src/providers/ipa/ipa_subdomains.c +++ b/src/providers/ipa/ipa_subdomains.c @@ -674,13 +674,11 @@ static void ipa_subdomains_handler_done(struct tevent_req *req) size_t reply_count; struct sysdb_attrs **reply = NULL; struct ipa_subdomains_req_ctx *ctx; - struct sysdb_ctx *sysdb; struct sss_domain_info *domain; bool refresh_has_changes = false; ctx = tevent_req_callback_data(req, struct ipa_subdomains_req_ctx); domain = ctx->sd_ctx->be_ctx->domain; - sysdb = domain->sysdb; ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply); talloc_zfree(req); @@ -717,7 +715,7 @@ static void ipa_subdomains_handler_done(struct tevent_req *req) } if (refresh_has_changes) { - ret = sysdb_update_subdomains(sysdb, ctx->sd_ctx->num_subdoms, + ret = sysdb_update_subdomains(domain, ctx->sd_ctx->num_subdoms, ctx->sd_ctx->subdoms); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("sysdb_update_subdomains failed.\n")); diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c index e52d61c2..1ad9fbfa 100644 --- a/src/responder/common/responder_get_domains.c +++ b/src/responder/common/responder_get_domains.c @@ -281,15 +281,14 @@ process_subdomains(struct sss_domain_info *domain) { int ret; size_t c; - struct sss_domain_info **new_sd_list = NULL; size_t subdomain_count; - struct sysdb_subdom **subdomains; + struct sss_domain_info **subdomains; struct sysdb_subdom *master_info; /* Retrieve all subdomains of this domain from sysdb * and create their struct sss_domain_info representations */ - ret = sysdb_get_subdomains(domain, domain->sysdb, + ret = sysdb_get_subdomains(domain, domain, &subdomain_count, &subdomains); if (ret != EOK) { DEBUG(SSSDBG_FUNC_DATA, ("sysdb_get_subdomains failed.\n")); @@ -302,32 +301,11 @@ process_subdomains(struct sss_domain_info *domain) goto done; } - new_sd_list = talloc_zero_array(domain, struct sss_domain_info *, - subdomain_count); - if (new_sd_list == NULL) { - ret = ENOMEM; - goto done; - } - for (c = 0; c < subdomain_count; c++) { - DEBUG(SSSDBG_FUNC_DATA, ("Adding subdomain [%s] to the domain [%s]!\n", - subdomains[c]->name, domain->name)); - new_sd_list[c] = new_subdomain(new_sd_list, domain, - subdomains[c]->name, - subdomains[c]->realm, - subdomains[c]->flat_name, - subdomains[c]->id); - if (new_sd_list[c] == NULL) { - ret = ENOMEM; - goto done; - } - } - /* Link all subdomains into single-linked list * (the list is used when processing all domains) */ - while (c > 1) { - new_sd_list[c-1]->next = new_sd_list[c]; - --c; + for (c = 0; c < subdomain_count - 1; c++) { + subdomains[c]->next = subdomains[c + 1]; } if (domain->flat_name == NULL || domain->domain_id == NULL) { @@ -364,10 +342,9 @@ process_subdomains(struct sss_domain_info *domain) goto done; } - domain->subdomain_count = subdomain_count; talloc_zfree(domain->subdomains); - domain->subdomains = new_sd_list; - new_sd_list = NULL; + domain->subdomain_count = subdomain_count; + domain->subdomains = subdomains; ret = EOK; @@ -375,7 +352,7 @@ done: if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("Failed to update sub-domains " "of domain [%s].\n", domain->name)); - talloc_free(new_sd_list); + talloc_free(subdomains); } return ret; diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c index 6c723c72..0d46fc0a 100644 --- a/src/tests/sysdb-tests.c +++ b/src/tests/sysdb-tests.c @@ -4475,7 +4475,7 @@ START_TEST(test_sysdb_subdomain_create) { struct sysdb_test_ctx *test_ctx; errno_t ret; - struct sysdb_subdom **cur_subdomains = NULL; + struct sss_domain_info **cur_subdomains = NULL; size_t cur_subdomains_count; struct sysdb_subdom *new_subdom1 = &dom1; struct sysdb_subdom *new_subdom2 = &dom2; @@ -4485,18 +4485,18 @@ START_TEST(test_sysdb_subdomain_create) ret = setup_sysdb_tests(&test_ctx); fail_if(ret != EOK, "Could not set up the test"); - ret = sysdb_get_subdomains(test_ctx, test_ctx->sysdb, + ret = sysdb_get_subdomains(test_ctx, test_ctx->domain, &cur_subdomains_count, &cur_subdomains); fail_unless(ret == EOK, "sysdb_get_subdomains failed with [%d][%s]", ret, strerror(ret)); fail_unless(cur_subdomains != NULL, "No sub-domains returned."); fail_unless(cur_subdomains[0] == NULL, "No empty sub-domain list returned."); - ret = sysdb_update_subdomains(test_ctx->sysdb, num_subdom1, new_subdom1); + ret = sysdb_update_subdomains(test_ctx->domain, num_subdom1, new_subdom1); fail_unless(ret == EOK, "sysdb_update_subdomains failed with [%d][%s]", ret, strerror(ret)); - ret = sysdb_get_subdomains(test_ctx, test_ctx->sysdb, + ret = sysdb_get_subdomains(test_ctx, test_ctx->domain, &cur_subdomains_count, &cur_subdomains); fail_unless(ret == EOK, "sysdb_get_subdomains failed with [%d][%s]", ret, strerror(ret)); @@ -4506,11 +4506,11 @@ START_TEST(test_sysdb_subdomain_create) "Unexpected sub-domain found, expected [%s], got [%s]", new_subdom1[0].name, cur_subdomains[0]->name); - ret = sysdb_update_subdomains(test_ctx->sysdb, num_subdom2, new_subdom2); + ret = sysdb_update_subdomains(test_ctx->domain, num_subdom2, new_subdom2); fail_unless(ret == EOK, "sysdb_update_subdomains failed with [%d][%s]", ret, strerror(ret)); - ret = sysdb_get_subdomains(test_ctx, test_ctx->sysdb, + ret = sysdb_get_subdomains(test_ctx, test_ctx->domain, &cur_subdomains_count, &cur_subdomains); fail_unless(ret == EOK, "sysdb_get_subdomains failed with [%d][%s]", ret, strerror(ret)); @@ -4520,11 +4520,11 @@ START_TEST(test_sysdb_subdomain_create) "Unexpected sub-domain found, expected [%s], got [%s]", new_subdom2[0].name, cur_subdomains[0]->name); - ret = sysdb_update_subdomains(test_ctx->sysdb, 0, NULL); + ret = sysdb_update_subdomains(test_ctx->domain, 0, NULL); fail_unless(ret == EOK, "sysdb_update_subdomains failed with [%d][%s]", ret, strerror(ret)); - ret = sysdb_get_subdomains(test_ctx, test_ctx->sysdb, + ret = sysdb_get_subdomains(test_ctx, test_ctx->domain, &cur_subdomains_count, &cur_subdomains); fail_unless(ret == EOK, "sysdb_get_subdomains failed with [%d][%s]", ret, strerror(ret)); @@ -4547,7 +4547,7 @@ START_TEST(test_sysdb_subdomain_store_user) ret = setup_sysdb_tests(&test_ctx); fail_if(ret != EOK, "Could not set up the test"); - ret = sysdb_update_subdomains(test_ctx->sysdb, num_subdom, test_subdom); + ret = sysdb_update_subdomains(test_ctx->domain, num_subdom, test_subdom); fail_unless(ret == EOK, "sysdb_update_subdomains failed with [%d][%s]", ret, strerror(ret)); @@ -4603,7 +4603,7 @@ START_TEST(test_sysdb_subdomain_user_ops) ret = setup_sysdb_tests(&test_ctx); fail_if(ret != EOK, "Could not set up the test"); - ret = sysdb_update_subdomains(test_ctx->sysdb, num_subdom, test_subdom); + ret = sysdb_update_subdomains(test_ctx->domain, num_subdom, test_subdom); fail_unless(ret == EOK, "sysdb_update_subdomains failed with [%d][%s]", ret, strerror(ret)); @@ -4655,7 +4655,7 @@ START_TEST(test_sysdb_subdomain_group_ops) ret = setup_sysdb_tests(&test_ctx); fail_if(ret != EOK, "Could not set up the test"); - ret = sysdb_update_subdomains(test_ctx->sysdb, num_subdom, test_subdom); + ret = sysdb_update_subdomains(test_ctx->domain, num_subdom, test_subdom); fail_unless(ret == EOK, "sysdb_update_subdomains failed with [%d][%s]", ret, strerror(ret)); diff --git a/src/util/domain_info_utils.c b/src/util/domain_info_utils.c index c45c83d6..1ff7c0c6 100644 --- a/src/util/domain_info_utils.c +++ b/src/util/domain_info_utils.c @@ -31,6 +31,9 @@ struct sss_domain_info *new_subdomain(TALLOC_CTX *mem_ctx, { struct sss_domain_info *dom; + DEBUG(SSSDBG_TRACE_FUNC, + ("Creating [%s] as subdomain of [%s]!\n", name, parent->name)); + dom = talloc_zero(mem_ctx, struct sss_domain_info); if (dom == NULL) { DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero failed.\n")); |