Author: metze Date: 2007-02-22 13:15:49 +0000 (Thu, 22 Feb 2007) New Revision: 21499
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21499 Log: fill in the correct forest dns name metze Modified: branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c Changeset: Modified: branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c =================================================================== --- branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c 2007-02-22 02:11:28 UTC (rev 21498) +++ branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c 2007-02-22 13:15:49 UTC (rev 21499) @@ -53,10 +53,12 @@ struct sidmap_context *sidmap; uint32_t access_mask; struct ldb_dn *domain_dn; + struct ldb_dn *forest_dn; struct ldb_dn *builtin_dn; struct ldb_dn *system_dn; const char *domain_name; const char *domain_dns; + const char *forest_dns; struct dom_sid *domain_sid; struct GUID domain_guid; struct dom_sid *builtin_sid; @@ -281,6 +283,7 @@ NULL }; struct ldb_result *ref_res; + struct ldb_result *forest_ref_res; const char *ref_attrs[] = { "nETBIOSName", "dnsRoot", @@ -313,6 +316,13 @@ return NT_STATUS_NO_MEMORY; } + /* work out the forest root_dn - useful for so many calls its worth + fetching here */ + state->forest_dn = samdb_root_dn(state->sam_ldb); + if (!state->forest_dn) { + return NT_STATUS_NO_MEMORY; + } + ret = ldb_search(state->sam_ldb, state->domain_dn, LDB_SCOPE_BASE, NULL, dom_attrs, &dom_res); if (ret != LDB_SUCCESS) { @@ -367,6 +377,29 @@ talloc_free(ref_res); + ret = ldb_search_exp_fmt(state->sam_ldb, state, &forest_ref_res, + partitions_basedn, LDB_SCOPE_SUBTREE, ref_attrs, + "(&(objectclass=crossRef)(ncName=%s))", + ldb_dn_get_linearized(state->forest_dn)); + + if (ret != LDB_SUCCESS) { + talloc_free(forest_ref_res); + return NT_STATUS_INVALID_SYSTEM_SERVICE; + } + if (ref_res->count != 1) { + talloc_free(forest_ref_res); + return NT_STATUS_NO_SUCH_DOMAIN; + } + + state->forest_dns = ldb_msg_find_attr_as_string(forest_ref_res->msgs[0], "dnsRoot", NULL); + if (!state->forest_dns) { + talloc_free(forest_ref_res); + return NT_STATUS_NO_SUCH_DOMAIN; + } + talloc_steal(state, state->forest_dns); + + talloc_free(forest_ref_res); + /* work out the builtin_dn - useful for so many calls its worth fetching here */ state->builtin_dn = samdb_search_dn(state->sam_ldb, state, state->domain_dn, "(objectClass=builtinDomain)"); @@ -460,7 +493,7 @@ domain = state->domain_name; dns_domain = state->domain_dns; - forest = state->domain_dns; + forest = state->forest_dns; domain_guid = state->domain_guid; flags |= DS_ROLE_PRIMARY_DOMAIN_GUID_PRESENT; @@ -575,7 +608,7 @@ info->name.string = state->domain_name; info->sid = state->domain_sid; info->dns_domain.string = state->domain_dns; - info->dns_forest.string = state->domain_dns; + info->dns_forest.string = state->forest_dns; info->domain_guid = state->domain_guid; return NT_STATUS_OK;