[PATCHES] refactor wb_grent and wb_pwent a bit
Michael Adam
obnox at samba.org
Tue Mar 10 17:20:00 MDT 2015
forgot to mention that this is on top of the previous patch
that fixes nss group enum (bug 8905).
Michael
On 2015-03-11 at 00:17 +0100, Michael Adam wrote:
> Attached find a patchset that refactors the code for
> nss user and group enumeration a bit to remove some
> code duplication.
>
> Thanks for review / comments.
>
> Michael
> From 44dae326f6efdeda7176be75a8ed42cc0c7873d4 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Mon, 19 Jan 2015 08:14:44 +0100
> Subject: [PATCH 01/14] s3:util_sid: donate an empty line.
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/lib/util_sid_passdb.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/source3/lib/util_sid_passdb.c b/source3/lib/util_sid_passdb.c
> index b56837e..0ff64cc 100644
> --- a/source3/lib/util_sid_passdb.c
> +++ b/source3/lib/util_sid_passdb.c
> @@ -62,6 +62,7 @@ bool sid_check_object_is_for_passdb(const struct dom_sid *sid)
>
> return false;
> }
> +
> /**
> * check whether this is an object- or domain-sid that should
> * be treated by the passdb, e.g. for id-mapping.
> --
> 2.1.0
>
>
> From d478884c1a42ceee634481434a635c290cc6d767 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Tue, 20 Jan 2015 08:39:58 +0100
> Subject: [PATCH 02/14] s3:winbind:util: fix comment typo
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/winbindd_util.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/source3/winbindd/winbindd_util.c b/source3/winbindd/winbindd_util.c
> index 8dab36e..b1b9326 100644
> --- a/source3/winbindd/winbindd_util.c
> +++ b/source3/winbindd/winbindd_util.c
> @@ -34,7 +34,7 @@
> extern struct winbindd_methods cache_methods;
>
> /**
> - * @file winbindd_util.cq
> + * @file winbindd_util.c
> *
> * Winbind daemon for NT domain authentication nss module.
> **/
> --
> 2.1.0
>
>
> From 0c7dae9d8afc135305cdea8677bd70ce40a6e4e8 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Sat, 17 Jan 2015 23:34:37 +0100
> Subject: [PATCH 03/14] s3:winbind:pwent: use wb_next_find_domain()
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_pwent.c | 8 +-------
> 1 file changed, 1 insertion(+), 7 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_pwent.c b/source3/winbindd/wb_next_pwent.c
> index ade74e3..77e4c96 100644
> --- a/source3/winbindd/wb_next_pwent.c
> +++ b/source3/winbindd/wb_next_pwent.c
> @@ -111,13 +111,7 @@ static void wb_next_pwent_fetch_done(struct tevent_req *subreq)
> }
>
> if (state->gstate->num_users == 0) {
> - state->gstate->domain = state->gstate->domain->next;
> -
> - if ((state->gstate->domain != NULL)
> - && sid_check_is_our_sam(&state->gstate->domain->sid)) {
> - state->gstate->domain = state->gstate->domain->next;
> - }
> -
> + state->gstate->domain = wb_next_find_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> return;
> --
> 2.1.0
>
>
> From e04fab2cfd3ab1a894c79b29f2091ab064bd207c Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Tue, 20 Jan 2015 09:41:31 +0100
> Subject: [PATCH 04/14] s3:winbind:pwent: rename wb_next_find_domain to
> wb_next_domain
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_pwent.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_pwent.c b/source3/winbindd/wb_next_pwent.c
> index 77e4c96..0de7fd1 100644
> --- a/source3/winbindd/wb_next_pwent.c
> +++ b/source3/winbindd/wb_next_pwent.c
> @@ -31,7 +31,7 @@ struct wb_next_pwent_state {
> static void wb_next_pwent_fetch_done(struct tevent_req *subreq);
> static void wb_next_pwent_fill_done(struct tevent_req *subreq);
>
> -static struct winbindd_domain *wb_next_find_domain(struct winbindd_domain *domain)
> +static struct winbindd_domain *wb_next_domain(struct winbindd_domain *domain)
> {
> if (domain == NULL) {
> domain = domain_list();
> @@ -65,7 +65,7 @@ struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
> if (state->gstate->next_user >= state->gstate->num_users) {
> TALLOC_FREE(state->gstate->users);
>
> - state->gstate->domain = wb_next_find_domain(state->gstate->domain);
> + state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> return tevent_req_post(req, ev);
> @@ -111,7 +111,7 @@ static void wb_next_pwent_fetch_done(struct tevent_req *subreq)
> }
>
> if (state->gstate->num_users == 0) {
> - state->gstate->domain = wb_next_find_domain(state->gstate->domain);
> + state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> return;
> @@ -157,7 +157,7 @@ static void wb_next_pwent_fill_done(struct tevent_req *subreq)
> if (state->gstate->next_user >= state->gstate->num_users) {
> TALLOC_FREE(state->gstate->users);
>
> - state->gstate->domain = wb_next_find_domain(state->gstate->domain);
> + state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> return;
> --
> 2.1.0
>
>
> From b1f19a36b96f2bd05bb0e97533b4d11c358dc443 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Tue, 20 Jan 2015 10:07:59 +0100
> Subject: [PATCH 05/14] s3:winbind:pwent: move wb_next_domain() to
> winbindd_util.c for re-use
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_pwent.c | 15 ---------------
> source3/winbindd/winbindd_proto.h | 1 +
> source3/winbindd/winbindd_util.c | 19 +++++++++++++++++++
> 3 files changed, 20 insertions(+), 15 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_pwent.c b/source3/winbindd/wb_next_pwent.c
> index 0de7fd1..9bd2a09 100644
> --- a/source3/winbindd/wb_next_pwent.c
> +++ b/source3/winbindd/wb_next_pwent.c
> @@ -31,21 +31,6 @@ struct wb_next_pwent_state {
> static void wb_next_pwent_fetch_done(struct tevent_req *subreq);
> static void wb_next_pwent_fill_done(struct tevent_req *subreq);
>
> -static struct winbindd_domain *wb_next_domain(struct winbindd_domain *domain)
> -{
> - if (domain == NULL) {
> - domain = domain_list();
> - } else {
> - domain = domain->next;
> - }
> -
> - if ((domain != NULL)
> - && sid_check_is_our_sam(&domain->sid)) {
> - domain = domain->next;
> - }
> - return domain;
> -}
> -
> struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
> struct tevent_context *ev,
> struct getpwent_state *gstate,
> diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h
> index e0b7aad..ba4ef0a 100644
> --- a/source3/winbindd/winbindd_proto.h
> +++ b/source3/winbindd/winbindd_proto.h
> @@ -404,6 +404,7 @@ NTSTATUS winbind_dual_SamLogon(struct winbindd_domain *domain,
> /* The following definitions come from winbindd/winbindd_util.c */
>
> struct winbindd_domain *domain_list(void);
> +struct winbindd_domain *wb_next_domain(struct winbindd_domain *domain);
> bool domain_is_forest_root(const struct winbindd_domain *domain);
> void rescan_trusted_domains(struct tevent_context *ev, struct tevent_timer *te,
> struct timeval now, void *private_data);
> diff --git a/source3/winbindd/winbindd_util.c b/source3/winbindd/winbindd_util.c
> index b1b9326..a0d42a5 100644
> --- a/source3/winbindd/winbindd_util.c
> +++ b/source3/winbindd/winbindd_util.c
> @@ -73,6 +73,25 @@ static void free_domain_list(void)
> }
> }
>
> +/**
> + * Iterator for winbindd's domain list.
> + * To be used (e.g.) in tevent based loops.
> + */
> +struct winbindd_domain *wb_next_domain(struct winbindd_domain *domain)
> +{
> + if (domain == NULL) {
> + domain = domain_list();
> + } else {
> + domain = domain->next;
> + }
> +
> + if ((domain != NULL)
> + && sid_check_is_our_sam(&domain->sid)) {
> + domain = domain->next;
> + }
> + return domain;
> +}
> +
> static bool is_internal_domain(const struct dom_sid *sid)
> {
> if (sid == NULL)
> --
> 2.1.0
>
>
> From fadd1df255e043a3b72fb87facfbf42fc9a5808b Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Tue, 20 Jan 2015 11:06:51 +0100
> Subject: [PATCH 06/14] s3:winbind:pwent: move resetting next_user up.
>
> This does not change the behaviour and makes it more evident
> that we have anothe code duplication here:
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> if (state->gstate->num_users == 0) {
> ...
> }
>
> subreq = wb_fill_pwent_send(...)
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> is for the current setting of variables equivalent
> to the block found elsewhere:
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> if (state->gstate->next_user >= state->gstate->num_users) {
> ...
> }
>
> subreq = wb_fill_pwent_send(...)
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> because both num_users is set to a non-negative
> value and num_users starts at 0 and is incremented up to
> num_users.
>
> The code duplication will be factored out next.
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_pwent.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_pwent.c b/source3/winbindd/wb_next_pwent.c
> index 9bd2a09..a6159de 100644
> --- a/source3/winbindd/wb_next_pwent.c
> +++ b/source3/winbindd/wb_next_pwent.c
> @@ -95,6 +95,8 @@ static void wb_next_pwent_fetch_done(struct tevent_req *subreq)
> state->gstate->num_users = 0;
> }
>
> + state->gstate->next_user = 0;
> +
> if (state->gstate->num_users == 0) {
> state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> @@ -110,8 +112,6 @@ static void wb_next_pwent_fetch_done(struct tevent_req *subreq)
> return;
> }
>
> - state->gstate->next_user = 0;
> -
> subreq = wb_fill_pwent_send(
> state, state->ev,
> &state->gstate->users[state->gstate->next_user],
> --
> 2.1.0
>
>
> From 17f6062211ebbb92f426284bd0bf543aa9c3293b Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Mon, 19 Jan 2015 13:51:39 +0100
> Subject: [PATCH 07/14] s3:winbind:pwent: refactor duplication into
> wb_next_pwent_send_do()
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_pwent.c | 109 ++++++++++++++-------------------------
> 1 file changed, 38 insertions(+), 71 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_pwent.c b/source3/winbindd/wb_next_pwent.c
> index a6159de..af5e8d9 100644
> --- a/source3/winbindd/wb_next_pwent.c
> +++ b/source3/winbindd/wb_next_pwent.c
> @@ -31,21 +31,10 @@ struct wb_next_pwent_state {
> static void wb_next_pwent_fetch_done(struct tevent_req *subreq);
> static void wb_next_pwent_fill_done(struct tevent_req *subreq);
>
> -struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
> - struct tevent_context *ev,
> - struct getpwent_state *gstate,
> - struct winbindd_pw *pw)
> +static void wb_next_pwent_send_do(struct tevent_req *req,
> + struct wb_next_pwent_state *state)
> {
> - struct tevent_req *req, *subreq;
> - struct wb_next_pwent_state *state;
> -
> - req = tevent_req_create(mem_ctx, &state, struct wb_next_pwent_state);
> - if (req == NULL) {
> - return NULL;
> - }
> - state->ev = ev;
> - state->gstate = gstate;
> - state->pw = pw;
> + struct tevent_req *subreq;
>
> if (state->gstate->next_user >= state->gstate->num_users) {
> TALLOC_FREE(state->gstate->users);
> @@ -53,25 +42,50 @@ struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
> state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> - return tevent_req_post(req, ev);
> + return;
> }
> +
> subreq = wb_query_user_list_send(state, state->ev,
> state->gstate->domain);
> if (tevent_req_nomem(subreq, req)) {
> - return tevent_req_post(req, ev);
> + return;
> }
> +
> tevent_req_set_callback(subreq, wb_next_pwent_fetch_done, req);
> - return req;
> + return;
> }
>
> - subreq = wb_fill_pwent_send(
> - state, state->ev,
> - &state->gstate->users[state->gstate->next_user],
> - state->pw);
> + subreq = wb_fill_pwent_send(state, state->ev,
> + &state->gstate->users[state->gstate->next_user],
> + state->pw);
> if (tevent_req_nomem(subreq, req)) {
> - return tevent_req_post(req, ev);
> + return;
> }
> +
> tevent_req_set_callback(subreq, wb_next_pwent_fill_done, req);
> +}
> +
> +struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
> + struct tevent_context *ev,
> + struct getpwent_state *gstate,
> + struct winbindd_pw *pw)
> +{
> + struct tevent_req *req;
> + struct wb_next_pwent_state *state;
> +
> + req = tevent_req_create(mem_ctx, &state, struct wb_next_pwent_state);
> + if (req == NULL) {
> + return NULL;
> + }
> + state->ev = ev;
> + state->gstate = gstate;
> + state->pw = pw;
> +
> + wb_next_pwent_send_do(req, state);
> + if (!tevent_req_is_in_progress(req)) {
> + return tevent_req_post(req, ev);
> + }
> +
> return req;
> }
>
> @@ -97,29 +111,7 @@ static void wb_next_pwent_fetch_done(struct tevent_req *subreq)
>
> state->gstate->next_user = 0;
>
> - if (state->gstate->num_users == 0) {
> - state->gstate->domain = wb_next_domain(state->gstate->domain);
> - if (state->gstate->domain == NULL) {
> - tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> - return;
> - }
> - subreq = wb_query_user_list_send(state, state->ev,
> - state->gstate->domain);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_pwent_fetch_done, req);
> - return;
> - }
> -
> - subreq = wb_fill_pwent_send(
> - state, state->ev,
> - &state->gstate->users[state->gstate->next_user],
> - state->pw);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_pwent_fill_done, req);
> + wb_next_pwent_send_do(req, state);
> }
>
> static void wb_next_pwent_fill_done(struct tevent_req *subreq)
> @@ -139,32 +131,7 @@ static void wb_next_pwent_fill_done(struct tevent_req *subreq)
> if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {
> state->gstate->next_user += 1;
>
> - if (state->gstate->next_user >= state->gstate->num_users) {
> - TALLOC_FREE(state->gstate->users);
> -
> - state->gstate->domain = wb_next_domain(state->gstate->domain);
> - if (state->gstate->domain == NULL) {
> - tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> - return;
> - }
> -
> - subreq = wb_query_user_list_send(state, state->ev,
> - state->gstate->domain);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_pwent_fetch_done, req);
> - return;
> - }
> -
> - subreq = wb_fill_pwent_send(state,
> - state->ev,
> - &state->gstate->users[state->gstate->next_user],
> - state->pw);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_pwent_fill_done, req);
> + wb_next_pwent_send_do(req, state);
>
> return;
> } else if (tevent_req_nterror(req, status)) {
> --
> 2.1.0
>
>
> From a36086df165bd54b09c2c3aeb58e1946d4f085f4 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Sun, 25 Jan 2015 12:20:35 +0100
> Subject: [PATCH 08/14] s3:winbind:grent: fix a debug message.
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_grent.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_grent.c b/source3/winbindd/wb_next_grent.c
> index 58e161d..02f929a 100644
> --- a/source3/winbindd/wb_next_grent.c
> +++ b/source3/winbindd/wb_next_grent.c
> @@ -103,14 +103,14 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> TALLOC_FREE(subreq);
> if (tevent_req_nterror(req, status)) {
> /* Ignore errors here, just log it */
> - DEBUG(10, ("query_user_list for domain %s returned %s\n",
> + DEBUG(10, ("QueryGroupList for domain %s returned %s\n",
> state->gstate->domain->name,
> nt_errstr(status)));
> return;
> }
> if (!NT_STATUS_IS_OK(result)) {
> /* Ignore errors here, just log it */
> - DEBUG(10, ("query_user_list for domain %s returned %s/%s\n",
> + DEBUG(10, ("QueryGroupList for domain %s returned %s/%s\n",
> state->gstate->domain->name,
> nt_errstr(status), nt_errstr(result)));
> tevent_req_nterror(req, result);
> --
> 2.1.0
>
>
> From cf902571df9c8e5e291e1f3ad1cf8e9b081c7420 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Tue, 20 Jan 2015 10:25:37 +0100
> Subject: [PATCH 09/14] s3:winbind:grent: use wb_next_domain() in
> wb_next_grent.c
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_grent.c | 32 +++-----------------------------
> 1 file changed, 3 insertions(+), 29 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_grent.c b/source3/winbindd/wb_next_grent.c
> index 02f929a..108be35 100644
> --- a/source3/winbindd/wb_next_grent.c
> +++ b/source3/winbindd/wb_next_grent.c
> @@ -55,17 +55,7 @@ struct tevent_req *wb_next_grent_send(TALLOC_CTX *mem_ctx,
> if (state->gstate->next_group >= state->gstate->num_groups) {
> TALLOC_FREE(state->gstate->groups);
>
> - if (state->gstate->domain == NULL) {
> - state->gstate->domain = domain_list();
> - } else {
> - state->gstate->domain = state->gstate->domain->next;
> - }
> -
> - if ((state->gstate->domain != NULL)
> - && sid_check_is_our_sam(&state->gstate->domain->sid)) {
> - state->gstate->domain = state->gstate->domain->next;
> - }
> -
> + state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> return tevent_req_post(req, ev);
> @@ -122,13 +112,7 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> state->gstate, &state->next_groups.principals);
>
> if (state->gstate->num_groups == 0) {
> - state->gstate->domain = state->gstate->domain->next;
> -
> - if ((state->gstate->domain != NULL)
> - && sid_check_is_our_sam(&state->gstate->domain->sid)) {
> - state->gstate->domain = state->gstate->domain->next;
> - }
> -
> + state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> return;
> @@ -175,18 +159,8 @@ static void wb_next_grent_getgrsid_done(struct tevent_req *subreq)
> if (state->gstate->next_group >= state->gstate->num_groups) {
> TALLOC_FREE(state->gstate->groups);
>
> - if (state->gstate->domain == NULL) {
> - state->gstate->domain = domain_list();
> - } else {
> - state->gstate->domain = state->gstate->domain->next;
> - }
> -
> - if ((state->gstate->domain != NULL) &&
> - sid_check_is_our_sam(&state->gstate->domain->sid))
> - {
> - state->gstate->domain = state->gstate->domain->next;
> - }
>
> + state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req,
> NT_STATUS_NO_MORE_ENTRIES);
> --
> 2.1.0
>
>
> From 52e9dcb896e3eb1ef4757a668f264ee0bc6dd350 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Tue, 20 Jan 2015 12:25:29 +0100
> Subject: [PATCH 10/14] s3:winbind:grent: move resetting next_group up.
>
> This is to make it more obvious that this is a case
> of code duplication.
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_grent.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_grent.c b/source3/winbindd/wb_next_grent.c
> index 108be35..d5cff18 100644
> --- a/source3/winbindd/wb_next_grent.c
> +++ b/source3/winbindd/wb_next_grent.c
> @@ -110,6 +110,7 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> state->gstate->num_groups = state->next_groups.num_principals;
> state->gstate->groups = talloc_move(
> state->gstate, &state->next_groups.principals);
> + state->gstate->next_group = 0;
>
> if (state->gstate->num_groups == 0) {
> state->gstate->domain = wb_next_domain(state->gstate->domain);
> @@ -127,8 +128,6 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> return;
> }
>
> - state->gstate->next_group = 0;
> -
> subreq = wb_getgrsid_send(
> state, state->ev,
> &state->gstate->groups[state->gstate->next_group].sid,
> --
> 2.1.0
>
>
> From 97c2809561e2970df7aa194e72f98271c3580389 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Wed, 21 Jan 2015 12:32:04 +0100
> Subject: [PATCH 11/14] s3:winbind:grent: refactor duplication into
> wb_next_grent_send_do()
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_grent.c | 115 +++++++++++++--------------------------
> 1 file changed, 37 insertions(+), 78 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_grent.c b/source3/winbindd/wb_next_grent.c
> index d5cff18..4161425 100644
> --- a/source3/winbindd/wb_next_grent.c
> +++ b/source3/winbindd/wb_next_grent.c
> @@ -34,23 +34,10 @@ struct wb_next_grent_state {
> static void wb_next_grent_fetch_done(struct tevent_req *subreq);
> static void wb_next_grent_getgrsid_done(struct tevent_req *subreq);
>
> -struct tevent_req *wb_next_grent_send(TALLOC_CTX *mem_ctx,
> - struct tevent_context *ev,
> - int max_nesting,
> - struct getgrent_state *gstate,
> - struct winbindd_gr *gr)
> +static void wb_next_grent_send_do(struct tevent_req *req,
> + struct wb_next_grent_state *state)
> {
> - struct tevent_req *req, *subreq;
> - struct wb_next_grent_state *state;
> -
> - req = tevent_req_create(mem_ctx, &state, struct wb_next_grent_state);
> - if (req == NULL) {
> - return NULL;
> - }
> - state->ev = ev;
> - state->gstate = gstate;
> - state->gr = gr;
> - state->max_nesting = max_nesting;
> + struct tevent_req *subreq;
>
> if (state->gstate->next_group >= state->gstate->num_groups) {
> TALLOC_FREE(state->gstate->groups);
> @@ -58,16 +45,18 @@ struct tevent_req *wb_next_grent_send(TALLOC_CTX *mem_ctx,
> state->gstate->domain = wb_next_domain(state->gstate->domain);
> if (state->gstate->domain == NULL) {
> tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> - return tevent_req_post(req, ev);
> + return;
> }
> +
> subreq = dcerpc_wbint_QueryGroupList_send(
> - state, state->ev, dom_child_handle(state->gstate->domain),
> + state, state->ev,
> + dom_child_handle(state->gstate->domain),
> &state->next_groups);
> if (tevent_req_nomem(subreq, req)) {
> - return tevent_req_post(req, ev);
> + return;
> }
> tevent_req_set_callback(subreq, wb_next_grent_fetch_done, req);
> - return req;
> + return;
> }
>
> subreq = wb_getgrsid_send(
> @@ -75,9 +64,34 @@ struct tevent_req *wb_next_grent_send(TALLOC_CTX *mem_ctx,
> &state->gstate->groups[state->gstate->next_group].sid,
> state->max_nesting);
> if (tevent_req_nomem(subreq, req)) {
> - return tevent_req_post(req, ev);
> + return;
> }
> tevent_req_set_callback(subreq, wb_next_grent_getgrsid_done, req);
> +}
> +
> +struct tevent_req *wb_next_grent_send(TALLOC_CTX *mem_ctx,
> + struct tevent_context *ev,
> + int max_nesting,
> + struct getgrent_state *gstate,
> + struct winbindd_gr *gr)
> +{
> + struct tevent_req *req;
> + struct wb_next_grent_state *state;
> +
> + req = tevent_req_create(mem_ctx, &state, struct wb_next_grent_state);
> + if (req == NULL) {
> + return NULL;
> + }
> + state->ev = ev;
> + state->gstate = gstate;
> + state->gr = gr;
> + state->max_nesting = max_nesting;
> +
> + wb_next_grent_send_do(req, state);
> + if (!tevent_req_is_in_progress(req)) {
> + return tevent_req_post(req, ev);
> + }
> +
> return req;
> }
>
> @@ -112,31 +126,7 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> state->gstate, &state->next_groups.principals);
> state->gstate->next_group = 0;
>
> - if (state->gstate->num_groups == 0) {
> - state->gstate->domain = wb_next_domain(state->gstate->domain);
> - if (state->gstate->domain == NULL) {
> - tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
> - return;
> - }
> - subreq = dcerpc_wbint_QueryGroupList_send(
> - state, state->ev, dom_child_handle(state->gstate->domain),
> - &state->next_groups);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_grent_fetch_done, req);
> - return;
> - }
> -
> - subreq = wb_getgrsid_send(
> - state, state->ev,
> - &state->gstate->groups[state->gstate->next_group].sid,
> - state->max_nesting);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_grent_getgrsid_done, req);
> - return;
> + wb_next_grent_send_do(req, state);
> }
>
> static void wb_next_grent_getgrsid_done(struct tevent_req *subreq)
> @@ -155,39 +145,8 @@ static void wb_next_grent_getgrsid_done(struct tevent_req *subreq)
> if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {
> state->gstate->next_group += 1;
>
> - if (state->gstate->next_group >= state->gstate->num_groups) {
> - TALLOC_FREE(state->gstate->groups);
> -
> + wb_next_grent_send_do(req, state);
>
> - state->gstate->domain = wb_next_domain(state->gstate->domain);
> - if (state->gstate->domain == NULL) {
> - tevent_req_nterror(req,
> - NT_STATUS_NO_MORE_ENTRIES);
> - return;
> - }
> -
> - subreq = dcerpc_wbint_QueryGroupList_send(
> - state, state->ev,
> - dom_child_handle(state->gstate->domain),
> - &state->next_groups);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> -
> - tevent_req_set_callback(subreq,
> - wb_next_grent_fetch_done, req);
> - return;
> - }
> -
> - subreq = wb_getgrsid_send(
> - state, state->ev,
> - &state->gstate->groups[state->gstate->next_group].sid,
> - state->max_nesting);
> - if (tevent_req_nomem(subreq, req)) {
> - return;
> - }
> - tevent_req_set_callback(subreq, wb_next_grent_getgrsid_done,
> - req);
> return;
> } else if (tevent_req_nterror(req, status)) {
> return;
> --
> 2.1.0
>
>
> From d3f9aa1794bc8004fd7adc19a6f68c08d63602ee Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Fri, 23 Jan 2015 14:06:40 +0100
> Subject: [PATCH 12/14] s3:winbind: add wb_query_group_list module - async
> query group list
>
> Modeled after wb_query_user_list.c
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_query_group_list.c | 93 ++++++++++++++++++++++++++++++++++
> source3/winbindd/winbindd_proto.h | 8 +++
> source3/wscript_build | 1 +
> 3 files changed, 102 insertions(+)
> create mode 100644 source3/winbindd/wb_query_group_list.c
>
> diff --git a/source3/winbindd/wb_query_group_list.c b/source3/winbindd/wb_query_group_list.c
> new file mode 100644
> index 0000000..703d331
> --- /dev/null
> +++ b/source3/winbindd/wb_query_group_list.c
> @@ -0,0 +1,93 @@
> +/*
> + Unix SMB/CIFS implementation.
> + async query_group_list
> + Copyright (C) Volker Lendecke 2009
> + Copyright (C) Michael Adam 2015
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +#include "includes.h"
> +#include "winbindd.h"
> +#include "librpc/gen_ndr/ndr_winbind_c.h"
> +
> +
> +struct wb_query_group_list_state {
> + struct wbint_Principals groups;
> +};
> +
> +static void wb_query_group_list_done(struct tevent_req *subreq);
> +
> +struct tevent_req *wb_query_group_list_send(TALLOC_CTX *mem_ctx,
> + struct tevent_context *ev,
> + struct winbindd_domain *domain)
> +{
> + struct tevent_req *req, *subreq;
> + struct wb_query_group_list_state *state;
> +
> + req = tevent_req_create(mem_ctx, &state,
> + struct wb_query_group_list_state);
> + if (req == NULL) {
> + return NULL;
> + }
> +
> + subreq = dcerpc_wbint_QueryGroupList_send(state, ev,
> + dom_child_handle(domain),
> + &state->groups);
> + if (tevent_req_nomem(subreq, req)) {
> + return tevent_req_post(req, ev);
> + }
> +
> + tevent_req_set_callback(subreq, wb_query_group_list_done, req);
> + return req;
> +}
> +
> +static void wb_query_group_list_done(struct tevent_req *subreq)
> +{
> + struct tevent_req *req = tevent_req_callback_data(
> + subreq, struct tevent_req);
> + struct wb_query_group_list_state *state = tevent_req_data(
> + req, struct wb_query_group_list_state);
> + NTSTATUS status, result;
> +
> + status = dcerpc_wbint_QueryGroupList_recv(subreq, state, &result);
> + TALLOC_FREE(subreq);
> + if (any_nt_status_not_ok(status, result, &status)) {
> + tevent_req_nterror(req, status);
> + return;
> + }
> +
> + DEBUG(10, ("dcerpc_wbint_QueryGroupList returned %d groups\n",
> + state->groups.num_principals));
> +
> + tevent_req_done(req);
> +}
> +
> +NTSTATUS wb_query_group_list_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> + int *num_groups,
> + struct wbint_Principal **groups)
> +{
> + struct wb_query_group_list_state *state = tevent_req_data(
> + req, struct wb_query_group_list_state);
> + NTSTATUS status;
> +
> + if (tevent_req_is_nterror(req, &status)) {
> + return status;
> + }
> +
> + *num_groups = state->groups.num_principals;
> + *groups = talloc_move(mem_ctx, &state->groups.principals);
> +
> + return NT_STATUS_OK;
> +}
> diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h
> index ba4ef0a..10650af 100644
> --- a/source3/winbindd/winbindd_proto.h
> +++ b/source3/winbindd/winbindd_proto.h
> @@ -715,6 +715,14 @@ NTSTATUS wb_query_user_list_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> int *num_users,
> struct wbint_userinfo **users);
>
> +struct tevent_req *wb_query_group_list_send(TALLOC_CTX *mem_ctx,
> + struct tevent_context *ev,
> + struct winbindd_domain *domain);
> +NTSTATUS wb_query_group_list_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> + int *num_users,
> + struct wbint_Principal **groups);
> +
> +
> struct tevent_req *wb_fill_pwent_send(TALLOC_CTX *mem_ctx,
> struct tevent_context *ev,
> struct wbint_userinfo *info,
> diff --git a/source3/wscript_build b/source3/wscript_build
> index 24cf06c..654e0dd 100755
> --- a/source3/wscript_build
> +++ b/source3/wscript_build
> @@ -931,6 +931,7 @@ bld.SAMBA3_BINARY('winbindd/winbindd',
> winbindd/wb_group_members.c
> winbindd/wb_getgrsid.c
> winbindd/wb_query_user_list.c
> + winbindd/wb_query_group_list.c
> winbindd/wb_fill_pwent.c
> winbindd/wb_next_pwent.c
> winbindd/wb_next_grent.c
> --
> 2.1.0
>
>
> From 725b37b330c4757eaef35d1575afac73cd7e2d6e Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Fri, 23 Jan 2015 14:23:16 +0100
> Subject: [PATCH 13/14] s3:winbind:grent: convert wb_next_grent to use
> wb_query_group_list.
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_grent.c | 32 ++++++++++----------------------
> 1 file changed, 10 insertions(+), 22 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_grent.c b/source3/winbindd/wb_next_grent.c
> index 4161425..db6f924 100644
> --- a/source3/winbindd/wb_next_grent.c
> +++ b/source3/winbindd/wb_next_grent.c
> @@ -26,7 +26,6 @@ struct wb_next_grent_state {
> struct tevent_context *ev;
> int max_nesting;
> struct getgrent_state *gstate;
> - struct wbint_Principals next_groups;
> struct winbindd_gr *gr;
> struct talloc_dict *members;
> };
> @@ -48,10 +47,8 @@ static void wb_next_grent_send_do(struct tevent_req *req,
> return;
> }
>
> - subreq = dcerpc_wbint_QueryGroupList_send(
> - state, state->ev,
> - dom_child_handle(state->gstate->domain),
> - &state->next_groups);
> + subreq = wb_query_group_list_send(state, state->ev,
> + state->gstate->domain);
> if (tevent_req_nomem(subreq, req)) {
> return;
> }
> @@ -101,29 +98,20 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> subreq, struct tevent_req);
> struct wb_next_grent_state *state = tevent_req_data(
> req, struct wb_next_grent_state);
> - NTSTATUS status, result;
> + NTSTATUS status;
>
> - status = dcerpc_wbint_QueryGroupList_recv(subreq, state, &result);
> + status = wb_query_group_list_recv(subreq, state->gstate,
> + &state->gstate->num_groups,
> + &state->gstate->groups);
> TALLOC_FREE(subreq);
> - if (tevent_req_nterror(req, status)) {
> - /* Ignore errors here, just log it */
> - DEBUG(10, ("QueryGroupList for domain %s returned %s\n",
> - state->gstate->domain->name,
> - nt_errstr(status)));
> - return;
> - }
> - if (!NT_STATUS_IS_OK(result)) {
> + if (!NT_STATUS_IS_OK(status)) {
> /* Ignore errors here, just log it */
> - DEBUG(10, ("QueryGroupList for domain %s returned %s/%s\n",
> - state->gstate->domain->name,
> - nt_errstr(status), nt_errstr(result)));
> - tevent_req_nterror(req, result);
> + DEBUG(10, ("query_group_list for domain %s returned %s\n",
> + state->gstate->domain->name, nt_errstr(status)));
> + tevent_req_nterror(req, status);
> return;
> }
>
> - state->gstate->num_groups = state->next_groups.num_principals;
> - state->gstate->groups = talloc_move(
> - state->gstate, &state->next_groups.principals);
> state->gstate->next_group = 0;
>
> wb_next_grent_send_do(req, state);
> --
> 2.1.0
>
>
> From 962c2b38b7c4f2da8dd49bb15a257ce5228def37 Mon Sep 17 00:00:00 2001
> From: Michael Adam <obnox at samba.org>
> Date: Sun, 25 Jan 2015 12:16:50 +0100
> Subject: [PATCH 14/14] s3:winbind:grent: don't stop when querying one domain
> fails.
>
> Just continue with the next domain.
>
> Signed-off-by: Michael Adam <obnox at samba.org>
> ---
> source3/winbindd/wb_next_grent.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/source3/winbindd/wb_next_grent.c b/source3/winbindd/wb_next_grent.c
> index db6f924..fd925b6 100644
> --- a/source3/winbindd/wb_next_grent.c
> +++ b/source3/winbindd/wb_next_grent.c
> @@ -108,8 +108,7 @@ static void wb_next_grent_fetch_done(struct tevent_req *subreq)
> /* Ignore errors here, just log it */
> DEBUG(10, ("query_group_list for domain %s returned %s\n",
> state->gstate->domain->name, nt_errstr(status)));
> - tevent_req_nterror(req, status);
> - return;
> + state->gstate->num_groups = 0;
> }
>
> state->gstate->next_group = 0;
> --
> 2.1.0
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20150311/c4073ad3/attachment.pgp>
More information about the samba-technical
mailing list