diff options
Diffstat (limited to 'src/providers/ad/ad_domain_info.c')
-rw-r--r-- | src/providers/ad/ad_domain_info.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/providers/ad/ad_domain_info.c b/src/providers/ad/ad_domain_info.c index 95944840c..a71323849 100644 --- a/src/providers/ad/ad_domain_info.c +++ b/src/providers/ad/ad_domain_info.c @@ -44,7 +44,9 @@ static errno_t netlogon_get_domain_info(TALLOC_CTX *mem_ctx, struct sysdb_attrs *reply, - char **_flat_name, char **_forest) + char **_flat_name, + char **_site, + char **_forest) { errno_t ret; struct ldb_message_element *el; @@ -53,6 +55,7 @@ netlogon_get_domain_info(TALLOC_CTX *mem_ctx, enum ndr_err_code ndr_err; struct netlogon_samlogon_response response; const char *flat_name; + const char *site; const char *forest; ret = sysdb_attrs_get_el(reply, AD_AT_NETLOGON, &el); @@ -129,6 +132,22 @@ netlogon_get_domain_info(TALLOC_CTX *mem_ctx, goto done; } + /* get site name */ + if (response.data.nt5_ex.client_site != NULL + && response.data.nt5_ex.client_site[0] != '\0') { + site = response.data.nt5_ex.client_site; + } else { + ret = ENOENT; + goto done; + } + + *_site = talloc_strdup(mem_ctx, site); + if (*_site == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n"); + ret = ENOMEM; + goto done; + } + ret = EOK; done: talloc_free(ndr_pull); @@ -146,6 +165,7 @@ struct ad_master_domain_state { int base_iter; char *flat; + char *site; char *forest; char *sid; }; @@ -362,14 +382,16 @@ ad_master_domain_netlogon_done(struct tevent_req *subreq) /* Exactly one flat name. Carry on */ ret = netlogon_get_domain_info(state, reply[0], &state->flat, - &state->forest); + &state->site, &state->forest); if (ret != EOK) { DEBUG(SSSDBG_MINOR_FAILURE, "Could not get the flat name or forest\n"); /* Not fatal. Just quit. */ goto done; } + DEBUG(SSSDBG_TRACE_FUNC, "Found flat name [%s].\n", state->flat); + DEBUG(SSSDBG_TRACE_FUNC, "Found site [%s].\n", state->site); DEBUG(SSSDBG_TRACE_FUNC, "Found forest [%s].\n", state->forest); done: @@ -382,6 +404,7 @@ ad_master_domain_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, char **_flat, char **_id, + char **_site, char **_forest) { struct ad_master_domain_state *state = tevent_req_data(req, @@ -393,6 +416,10 @@ ad_master_domain_recv(struct tevent_req *req, *_flat = talloc_steal(mem_ctx, state->flat); } + if (_site) { + *_site = talloc_steal(mem_ctx, state->site); + } + if (_forest) { *_forest = talloc_steal(mem_ctx, state->forest); } |