[SCM] Samba Shared Repository - branch v3-2-test updated -
release-3-2-0pre2-2207-gd8b2ff3
Günther Deschner
gd at samba.org
Thu Apr 24 20:02:52 GMT 2008
The branch, v3-2-test has been updated
via d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3 (commit)
via 2b178dcae608ecc05f62593a7a0c2a127b8b7ca2 (commit)
via c6ce07fdf57c8b63ba6d72b622be261723cb55e3 (commit)
via ce3728191b23badfd5eb92701e4cebf84273b61e (commit)
via c15b5d73badafdc93066197aefaaaa72e37a8b99 (commit)
from a132cc3c6243c049860378f56c4d415d6cb35570 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test
- Log -----------------------------------------------------------------
commit d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3
Author: Günther Deschner <gd at samba.org>
Date: Thu Apr 24 21:53:55 2008 +0200
mailslot/dsgetdcname: do what XP does and request nt_version 11.
This allows dsgetdcname to query for a flat, non-dns domain name and
come back with all information about the DC (site names, guid, forest,
etc.) based on a mailslot reply. The version 11 request is downgraded
to version 1 in case we do a query against NT4.
Guenther
commit 2b178dcae608ecc05f62593a7a0c2a127b8b7ca2
Author: Günther Deschner <gd at samba.org>
Date: Thu Apr 24 21:37:42 2008 +0200
mailslot: allow to give back struct nbt_ntlogon_packet.
Guenther
commit c6ce07fdf57c8b63ba6d72b622be261723cb55e3
Author: Günther Deschner <gd at samba.org>
Date: Thu Apr 24 21:29:48 2008 +0200
mailslot: make sure we are looking at the correct reply structure.
Guenther
commit ce3728191b23badfd5eb92701e4cebf84273b61e
Author: Günther Deschner <gd at samba.org>
Date: Thu Apr 24 21:28:03 2008 +0200
mailslot: allow to define nt_version in send_getdc_request().
Guenther
commit c15b5d73badafdc93066197aefaaaa72e37a8b99
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 23 10:55:26 2008 +0200
rpcclient: Add tiny fix for cmd_samr_get_dispinfo_idx().
Guenther
-----------------------------------------------------------------------
Summary of changes:
source/libsmb/clidgram.c | 41 +++++++++++++++++++++++++++++++++------
source/libsmb/dsgetdcname.c | 42 +++++++++++++++++++++++++++++++++++-----
source/rpcclient/cmd_samr.c | 5 ++-
source/winbindd/winbindd_cm.c | 5 ++-
4 files changed, 76 insertions(+), 17 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source/libsmb/clidgram.c b/source/libsmb/clidgram.c
index 83e50e5..fba009d 100644
--- a/source/libsmb/clidgram.c
+++ b/source/libsmb/clidgram.c
@@ -130,7 +130,8 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
struct messaging_context *msg_ctx,
struct sockaddr_storage *dc_ss,
const char *domain_name,
- const DOM_SID *sid)
+ const DOM_SID *sid,
+ uint32_t nt_version)
{
struct in_addr dc_ip;
const char *my_acct_name = NULL;
@@ -172,7 +173,7 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
s->mailslot_name = my_mailslot;
s->acct_control = ACB_WSTRUST;
s->sid = my_sid;
- s->nt_version = 1;
+ s->nt_version = nt_version;
s->lmnt_token = 0xffff;
s->lm20_token = 0xffff;
@@ -196,7 +197,8 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
bool receive_getdc_response(TALLOC_CTX *mem_ctx,
struct sockaddr_storage *dc_ss,
const char *domain_name,
- const char **dc_name)
+ const char **dc_name,
+ struct nbt_ntlogon_packet **reply)
{
struct packet_struct *packet;
const char *my_mailslot = NULL;
@@ -206,6 +208,9 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
union dgram_message_body p;
enum ndr_err_code ndr_err;
+ const char *returned_dc = NULL;
+ const char *returned_domain = NULL;
+
if (dc_ss->ss_family != AF_INET) {
return false;
}
@@ -267,13 +272,27 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
NDR_PRINT_DEBUG(nbt_ntlogon_packet, &r);
}
- if (!strequal(r.req.reply.domain, domain_name)) {
+ switch (r.command) {
+ case NTLOGON_SAM_LOGON_REPLY:
+ case NTLOGON_SAM_LOGON_REPLY15:
+ returned_domain = r.req.reply.domain;
+ returned_dc = r.req.reply.server;
+ break;
+ case NTLOGON_RESPONSE_FROM_PDC2:
+ returned_domain = r.req.reply2.domain;
+ returned_dc = r.req.reply2.pdc_name;
+ break;
+ default:
+ return false;
+ }
+
+ if (!strequal(returned_domain, domain_name)) {
DEBUG(3, ("GetDC: Expected domain %s, got %s\n",
- domain_name, r.req.reply.domain));
+ domain_name, returned_domain));
return false;
}
- *dc_name = talloc_strdup(mem_ctx, r.req.reply.server);
+ *dc_name = talloc_strdup(mem_ctx, returned_dc);
if (!*dc_name) {
return false;
}
@@ -281,8 +300,16 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
if (**dc_name == '\\') *dc_name += 1;
if (**dc_name == '\\') *dc_name += 1;
+ if (reply) {
+ *reply = talloc_memdup(mem_ctx, &r,
+ sizeof(struct nbt_ntlogon_packet));
+ if (!*reply) {
+ return false;
+ }
+ }
+
DEBUG(10, ("GetDC gave name %s for domain %s\n",
- *dc_name, r.req.reply.domain));
+ *dc_name, returned_domain));
return True;
}
diff --git a/source/libsmb/dsgetdcname.c b/source/libsmb/dsgetdcname.c
index 5af65c5..fbc3bda 100644
--- a/source/libsmb/dsgetdcname.c
+++ b/source/libsmb/dsgetdcname.c
@@ -777,8 +777,13 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
uint32_t dc_address_type;
uint32_t dc_flags = 0;
const char *dc_name = NULL;
+ const char *dc_forest = NULL;
+ const char *dc_server_site = NULL;
+ const char *dc_client_site = NULL;
+ struct GUID *dc_domain_guid = NULL;
fstring tmp_dc_name;
struct messaging_context *msg_ctx = msg_context(mem_ctx);
+ struct nbt_ntlogon_packet *reply = NULL;
if (flags & DS_PDC_REQUIRED) {
name_type = NBT_NAME_PDC;
@@ -796,7 +801,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
}
if (send_getdc_request(mem_ctx, msg_ctx,
- &dclist[i].ss, domain_name, NULL))
+ &dclist[i].ss, domain_name,
+ NULL, 11))
{
int k;
smb_msleep(100);
@@ -804,7 +810,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
if (receive_getdc_response(mem_ctx,
&dclist[i].ss,
domain_name,
- &dc_name)) {
+ &dc_name,
+ &reply)) {
namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list);
dc_hostname = dc_name;
dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name);
@@ -832,6 +839,25 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
make_reply:
+ if (reply && reply->command == NTLOGON_RESPONSE_FROM_PDC2) {
+
+ dc_flags |= reply->req.reply2.server_type;
+ dc_forest = reply->req.reply2.forest;
+ dc_server_site = reply->req.reply2.server_site;
+ dc_client_site = reply->req.reply2.client_site;
+
+ dc_domain_guid = &reply->req.reply2.domain_uuid;
+
+ if (flags & DS_RETURN_DNS_NAME) {
+ dc_domain_name = reply->req.reply2.dns_domain;
+ dc_hostname = reply->req.reply2.pdc_dns_name;
+ dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+ } else if (flags & DS_RETURN_FLAT_NAME) {
+ dc_domain_name = reply->req.reply2.domain;
+ dc_hostname = reply->req.reply2.pdc_name;
+ }
+ }
+
if (flags & DS_IP_REQUIRED) {
char addr[INET6_ADDRSTRLEN];
print_sockaddr(addr, sizeof(addr), &dclist[i].ss);
@@ -846,16 +872,20 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
dc_flags |= NBT_SERVER_PDC | NBT_SERVER_WRITABLE;
}
+ if (dc_forest) {
+ dc_flags |= DS_DNS_FOREST;
+ }
+
return make_domain_controller_info(mem_ctx,
dc_hostname,
dc_address,
dc_address_type,
- NULL,
+ dc_domain_guid,
dc_domain_name,
- NULL,
+ dc_forest,
dc_flags,
- NULL,
- NULL,
+ dc_server_site,
+ dc_client_site,
info);
}
diff --git a/source/rpcclient/cmd_samr.c b/source/rpcclient/cmd_samr.c
index 9220c20..cc92fef 100644
--- a/source/rpcclient/cmd_samr.c
+++ b/source/rpcclient/cmd_samr.c
@@ -2612,8 +2612,9 @@ static NTSTATUS cmd_samr_get_dispinfo_idx(struct rpc_pipe_client *cli,
&name,
&idx);
- if (NT_STATUS_IS_OK(status)) {
- printf("idx: %d\n", idx);
+ if (NT_STATUS_IS_OK(status) ||
+ NT_STATUS_EQUAL(status, NT_STATUS_NO_MORE_ENTRIES)) {
+ printf("idx: %d (0x%08x)\n", idx, idx);
}
done:
diff --git a/source/winbindd/winbindd_cm.c b/source/winbindd/winbindd_cm.c
index 822f946..d27f3e4 100644
--- a/source/winbindd/winbindd_cm.c
+++ b/source/winbindd/winbindd_cm.c
@@ -1093,12 +1093,13 @@ static bool dcip_to_name(TALLOC_CTX *mem_ctx,
/* try GETDC requests next */
if (send_getdc_request(mem_ctx, winbind_messaging_context(),
- pss, domain->name, &domain->sid)) {
+ pss, domain->name, &domain->sid, 1)) {
const char *dc_name = NULL;
int i;
smb_msleep(100);
for (i=0; i<5; i++) {
- if (receive_getdc_response(mem_ctx, pss, domain->name, &dc_name)) {
+ if (receive_getdc_response(mem_ctx, pss, domain->name,
+ &dc_name, NULL)) {
fstrcpy(name, dc_name);
namecache_store(name, 0x20, 1, &ip_list);
return True;
--
Samba Shared Repository
More information about the samba-cvs
mailing list