From c6dcdb109a1d6daa8f91b197a29f4551d9de8d8a Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Fri, 5 Dec 2014 11:11:49 +0100 Subject: [PATCH 4/7] IPA: process_members() optionally return missing members list --- src/providers/ipa/ipa_s2n_exop.c | 85 +++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c index 6bf492623f638a9900f997a937e05cd66fca09a2..b82cc7f34f6687523ae5a01e5ca95fc3a7780269 100644 --- a/src/providers/ipa/ipa_s2n_exop.c +++ b/src/providers/ipa/ipa_s2n_exop.c @@ -1222,7 +1222,8 @@ fail: static errno_t process_members(struct sss_domain_info *domain, struct sysdb_attrs *group_attrs, - char **members) + char **members, + TALLOC_CTX *mem_ctx, char ***_missing_members) { int ret; size_t c; @@ -1231,6 +1232,8 @@ static errno_t process_members(struct sss_domain_info *domain, const char *dn_str; struct sss_domain_info *obj_domain; struct sss_domain_info *parent_domain; + char **missing_members = NULL; + size_t miss_count; if (members == NULL) { DEBUG(SSSDBG_TRACE_INTERNAL, "No members\n"); @@ -1243,6 +1246,18 @@ static errno_t process_members(struct sss_domain_info *domain, return ENOMEM; } + if (_missing_members != NULL && mem_ctx != NULL) { + /* count members */ + for (c = 0; members[c] != NULL; c++); + missing_members = talloc_zero_array(tmp_ctx, char *, c + 1); + if (missing_members == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "talloc_array_zero failed.\n"); + ret = ENOMEM; + goto done; + } + miss_count = 0; + } + parent_domain = get_domains_head(domain); for (c = 0; members[c] != NULL; c++) { @@ -1256,27 +1271,46 @@ static errno_t process_members(struct sss_domain_info *domain, ret = sysdb_search_user_by_name(tmp_ctx, obj_domain, members[c], NULL, &msg); if (ret == EOK) { - dn_str = ldb_dn_get_linearized(msg->dn); - if (dn_str == NULL) { - DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_get_linearized failed.\n"); - goto done; - } + if (group_attrs != NULL) { + dn_str = ldb_dn_get_linearized(msg->dn); + if (dn_str == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_get_linearized failed.\n"); + goto done; + } - DEBUG(SSSDBG_TRACE_ALL, "Adding member [%s][%s]\n", - members[c], dn_str); + DEBUG(SSSDBG_TRACE_ALL, "Adding member [%s][%s]\n", + members[c], dn_str); - ret = sysdb_attrs_add_string(group_attrs, SYSDB_MEMBER, dn_str); - if (ret != EOK) { - DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_add_string failed.\n"); - goto done; + ret = sysdb_attrs_add_string(group_attrs, SYSDB_MEMBER, dn_str); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, + "sysdb_attrs_add_string failed.\n"); + goto done; + } } } else if (ret == ENOENT) { - DEBUG(SSSDBG_TRACE_ALL, "Adding ghost member [%s]\n", members[c]); + if (group_attrs != NULL) { + DEBUG(SSSDBG_TRACE_ALL, "Adding ghost member [%s]\n", + members[c]); - ret = sysdb_attrs_add_string(group_attrs, SYSDB_GHOST, members[c]); - if (ret != EOK) { - DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_add_string failed.\n"); - goto done; + ret = sysdb_attrs_add_string(group_attrs, SYSDB_GHOST, + members[c]); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, + "sysdb_attrs_add_string failed.\n"); + goto done; + } + } + + if (missing_members != NULL) { + missing_members[miss_count] = talloc_strdup(missing_members, + members[c]); + if (missing_members[miss_count] == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n"); + ret = ENOMEM; + goto done; + } + miss_count++; } } else { DEBUG(SSSDBG_OP_FAILURE, "sysdb_search_user_by_name failed.\n"); @@ -1284,6 +1318,21 @@ static errno_t process_members(struct sss_domain_info *domain, } } + if (_missing_members != NULL) { + if (miss_count == 0) { + *_missing_members = NULL; + } else { + if (mem_ctx != NULL) { + *_missing_members = talloc_steal(mem_ctx, missing_members); + } else { + DEBUG(SSSDBG_CRIT_FAILURE, + "Missing memory context for missing members list.\n"); + ret = EINVAL; + goto done; + } + } + } + ret = EOK; done: talloc_free(tmp_ctx); @@ -1836,7 +1885,7 @@ static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom, } ret = process_members(dom, attrs->sysdb_attrs, - attrs->a.group.gr_mem); + attrs->a.group.gr_mem, NULL, NULL); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "process_members failed.\n"); goto done; -- 2.1.0