[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