How about this new patch (as in the attachment). The change I made from your
patch, is to add the while loop in pull_c_zero_string which was adopted from
pull_dotted_string. Now my domains are all happy. Otherwise, a grandchild
domain complains.
I am posting this to samba-technical list, since I though it was what you
intended to do, and we might get more testing of this.
Chere
On Monday 24 February 2003 01:21 pm, Anthony Liguori wrote:
> Lotus Notes won't let me send patches to the samba-technical list anymore
> (I've got to get a forwarding account it seems) but I haven't tested this
> patch enough to apply it to HEAD anyway.
>
> I know it works with your traffic though as I used your dumps as test data.
> This patch gives a _lot_ more information and makes various fixes.
>
> Note: the patch you submitted to the list doesn't actually work for domain
> controllers without forests. The 0xc0 stuff are deliminators for these
> strings.
>
> Let me know how this patch works out for you:
>
> (See attached file: net_ads_lookup.patch)
>
> Anthony Liguori
> Linux/Active Directory Interoperability
> Linux Technology Center (LTC) - IBM Austin
> E-mail: [EMAIL PROTECTED]
> Phone: (512) 838-1208
> Tie Line: 678-1208
>
>
>
--- utils/net_ads_cldap.c.orig Mon Feb 24 14:27:29 2003
+++ utils/net_ads_cldap.c Tue Feb 25 11:27:50 2003
@@ -24,15 +24,25 @@
#ifdef HAVE_ADS
struct cldap_netlogon_reply {
- uint32 version;
+ uint32 type;
uint32 flags;
GUID guid;
char *domain;
- char *server_name;
- char *domain_flatname;
- char *server_flatname;
- char *dns_name;
- uint32 unknown2[2];
+
+ char *dns_domain;
+ uint8 domain_flag;
+ char *dns_hostname;
+ uint8 hostname_flag;
+
+ char *netbios_domain;
+ char *netbios_hostname;
+
+ char *user_name;
+ char *site_name;
+
+ uint32 version;
+ uint16 lmnt_token;
+ uint16 lm20_token;
};
@@ -76,6 +86,33 @@
return total_len + 1;
}
+static unsigned pull_c_zero_string(char **ret, uint8 *flag,
+ const unsigned char *p)
+{
+ unsigned len = 0, total_len=0;
+ char *s;
+
+ *ret = NULL;
+
+ /* TODO: see what happends when a domain controller name == 0xc0 */
+ while (*p != 0xc0) {
+ len = pull_len_string(&s, p);
+ if (total_len) {
+ char *s2;
+ asprintf(&s2, "%s.%s", *ret, s);
+ SAFE_FREE(*ret);
+ (*ret) = s2;
+ } else {
+ (*ret) = s;
+ }
+ total_len += len;
+ p += len;
+ }
+
+ *flag = p[1];
+
+ return (total_len + 2);
+}
/*
do a cldap netlogon query
@@ -190,19 +227,27 @@
p = os3.data;
- reply->version = IVAL(p, 0); p += 4;
+ reply->type = IVAL(p, 0); p += 4;
reply->flags = IVAL(p, 0); p += 4;
+
memcpy(&reply->guid.info, p, GUID_SIZE);
p += GUID_SIZE;
p += pull_dotted_string(&reply->domain, p);
- p += 2; /* 0xc018 - whats this? */
- p += pull_len_string(&reply->server_name, p);
- p += 2; /* 0xc018 - whats this? */
- p += pull_len_string(&reply->domain_flatname, p);
- p += 1;
- p += pull_len_string(&reply->server_flatname, p);
- p += 2;
- p += pull_len_string(&reply->dns_name, p);
+
+ p += pull_c_zero_string(&reply->dns_domain, &reply->domain_flag, p);
+ p += pull_c_zero_string(&reply->dns_hostname, &reply->hostname_flag,p);
+
+ p += pull_dotted_string(&reply->netbios_domain, p);
+ p += pull_dotted_string(&reply->netbios_hostname, p);
+
+ p += pull_len_string(&reply->user_name, p);
+ p += pull_len_string(&reply->site_name, p);
+
+ p += 2; /* is this two empty strings? */
+
+ reply->version = IVAL(p, 0);
+ reply->lmnt_token = SVAL(p, 4);
+ reply->lm20_token = SVAL(p, 6);
data_blob_free(&os1);
data_blob_free(&os2);
@@ -219,10 +264,12 @@
static void cldap_reply_free(struct cldap_netlogon_reply *reply)
{
SAFE_FREE(reply->domain);
- SAFE_FREE(reply->server_name);
- SAFE_FREE(reply->domain_flatname);
- SAFE_FREE(reply->server_flatname);
- SAFE_FREE(reply->dns_name);
+ SAFE_FREE(reply->dns_domain);
+ SAFE_FREE(reply->dns_hostname);
+ SAFE_FREE(reply->netbios_domain);
+ SAFE_FREE(reply->netbios_hostname);
+ SAFE_FREE(reply->user_name);
+ SAFE_FREE(reply->site_name);
}
/*
@@ -246,7 +293,6 @@
if (ret != 0) {
return ret;
}
-
ret = recv_cldap_netlogon(sock, &reply);
close(sock);
@@ -254,15 +300,51 @@
return -1;
}
- d_printf("Version: 0x%x\n", reply.version);
+ d_printf("Response Type: 0x%x\n", reply.type);
d_printf("GUID: ");
print_guid(&reply.guid);
- d_printf("Flags: 0x%x\n", reply.flags);
- d_printf("Domain: %s\n", reply.domain);
- d_printf("Server Name: %s\n", reply.server_name);
- d_printf("Flatname: %s\n", reply.domain_flatname);
- d_printf("Server Name2: %s\n", reply.server_flatname);
- d_printf("DNS Name: %s\n", reply.dns_name);
+ d_printf("Flags:\n"
+ "\tIs a PDC: %s\n"
+ "\tIs a GC of the forest: %s\n"
+ "\tIs an LDAP server: %s\n"
+ "\tSupports DS: %s\n"
+ "\tIs running a KDC: %s\n"
+ "\tIs running time services: %s\n"
+ "\tIs the closest DC: %s\n"
+ "\tIs writable: %s\n"
+ "\tHas a hardware clock: %s\n"
+ "\tIs a non-domain NC serviced by LDAP server: %s\n",
+ (reply.flags & ADS_PDC) ? "yes" : "no",
+ (reply.flags & ADS_GC) ? "yes" : "no",
+ (reply.flags & ADS_LDAP) ? "yes" : "no",
+ (reply.flags & ADS_DS) ? "yes" : "no",
+ (reply.flags & ADS_KDC) ? "yes" : "no",
+ (reply.flags & ADS_TIMESERV) ? "yes" : "no",
+ (reply.flags & ADS_CLOSEST) ? "yes" : "no",
+ (reply.flags & ADS_WRITABLE) ? "yes" : "no",
+ (reply.flags & ADS_GOOD_TIMESERV) ? "yes" : "no",
+ (reply.flags & ADS_NDNC) ? "yes" : "no");
+
+ d_printf("Fully Qualified Domain: %s\n", reply.domain);
+
+ if (reply.dns_domain) {
+ d_printf("DNS Domain (%d): %s\n", reply.domain_flag,
+ reply.dns_domain);
+ }
+ d_printf("DNS Hostname (%d): %s\n", reply.hostname_flag,
+ reply.dns_hostname);
+ d_printf("NetBIOS Domain: %s\n", reply.netbios_domain);
+ d_printf("NetBIOS Hostname: %s\n", reply.netbios_hostname);
+
+ if (reply.user_name) {
+ d_printf("User name: %s\n", reply.user_name);
+ }
+
+ d_printf("Site Name: %s\n", reply.site_name);
+
+ d_printf("DC NT Version: %d\n", reply.version);
+ d_printf("LMNT Token: %0.2x\n", reply.lmnt_token);
+ d_printf("LM20 Token: %0.2x\n", reply.lm20_token);
cldap_reply_free(&reply);