summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSumit Bose <sbose@redhat.com>2014-12-05 11:11:49 +0100
committerJakub Hrozek <jhrozek@redhat.com>2015-01-14 12:15:24 +0100
commitc74de0bbed7729b44567ca1cf364ddca94a2acbf (patch)
treee20cba44425da2c050f5304d45afec712aecb8a4
parent24a53fe7f04c3d230b090efd76bc43692d4e2d78 (diff)
downloadsssd-c74de0bbed7729b44567ca1cf364ddca94a2acbf.tar.gz
sssd-c74de0bbed7729b44567ca1cf364ddca94a2acbf.tar.xz
sssd-c74de0bbed7729b44567ca1cf364ddca94a2acbf.zip
IPA: process_members() optionally return missing members list
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> (cherry picked from commit 942ebb62c8df766a22271103abd518ddae02ea3a)
-rw-r--r--src/providers/ipa/ipa_s2n_exop.c85
1 files changed, 67 insertions, 18 deletions
diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c
index 68f4cb7d8..bc476b469 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,9 +1232,12 @@ 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 = 0;
if (members == NULL) {
DEBUG(SSSDBG_TRACE_INTERNAL, "No members\n");
+ *_missing_members = NULL;
return EOK;
}
@@ -1243,6 +1247,17 @@ 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;
+ }
+ }
+
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);
@@ -1986,7 +2035,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;