svn commit: samba r1925 - branches/SAMBA_4_0/source/libnet

metze at samba.org metze at samba.org
Thu Aug 19 15:04:15 GMT 2004


Author: metze
Date: 2004-08-19 15:04:14 +0000 (Thu, 19 Aug 2004)
New Revision: 1925

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/&rev=1925&nolog=1

Log:
now we lookup the domain controller
and fallback to a workstation name

metze

Modified:
   branches/SAMBA_4_0/source/libnet/libnet.h
   branches/SAMBA_4_0/source/libnet/libnet_rpc.c


Changeset:
Modified: branches/SAMBA_4_0/source/libnet/libnet.h
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet.h	2004-08-19 14:25:28 UTC (rev 1924)
+++ branches/SAMBA_4_0/source/libnet/libnet.h	2004-08-19 15:04:14 UTC (rev 1925)
@@ -32,6 +32,26 @@
 	} user;
 };
 
+/* struct and enum for finding a domain controller */
+enum libnet_find_pdc_level {
+	LIBNET_FIND_PDC_GENERIC
+};
+
+union libnet_find_pdc {
+	/* find to a domains PDC */
+	struct {
+		enum libnet_find_pdc_level level;
+
+		struct {
+			const char *domain_name;
+		} in;
+
+		struct	{
+			const char *pdc_name;
+		} out;
+	} generic;
+};
+
 /* struct and enum for connecting to a dcerpc inferface */
 enum libnet_rpc_connect_level {
 	LIBNET_RPC_CONNECT_PDC

Modified: branches/SAMBA_4_0/source/libnet/libnet_rpc.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet_rpc.c	2004-08-19 14:25:28 UTC (rev 1924)
+++ branches/SAMBA_4_0/source/libnet/libnet_rpc.c	2004-08-19 15:04:14 UTC (rev 1925)
@@ -20,22 +20,55 @@
 
 #include "includes.h"
 
+/* find a domain pdc generic */
+static NTSTATUS libnet_find_pdc_generic(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_find_pdc *r)
+{
+	BOOL ret;
+	struct in_addr ip;
+
+	ret = get_pdc_ip(mem_ctx, r->generic.in.domain_name, &ip);
+	if (!ret) {
+		/* fallback to a workstation name */
+		ret = resolve_name(mem_ctx, r->generic.in.domain_name, &ip, 0x20);
+		if (!ret) {
+			return NT_STATUS_NO_LOGON_SERVERS;
+		}
+	}
+
+	r->generic.out.pdc_name = talloc_strdup(mem_ctx, inet_ntoa(ip));
+
+	return NT_STATUS_OK;
+}
+
+/* find a domain pdc */
+NTSTATUS libnet_find_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_find_pdc *r)
+{
+	switch (r->generic.level) {
+		case LIBNET_FIND_PDC_GENERIC:
+			return libnet_find_pdc_generic(ctx, mem_ctx, r);
+	}
+
+	return NT_STATUS_INVALID_LEVEL;
+}
+
 /* connect to a dcerpc interface of a domains PDC */
-NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
+static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
 {
 	NTSTATUS status;
 	const char *binding = NULL;
-	const char *pdc = NULL;
+	union libnet_find_pdc f;
 
-	/* TODO: find real PDC!
-	 * 	 for now I use the  lp_netbios_name()
-	 *	 that's the most important for me as we don't have
-	 *	 smbpasswd in samba4 (and this is good!:-) --metze
-	 */
-	pdc = lp_netbios_name();
+	f.generic.level			= LIBNET_FIND_PDC_GENERIC;
+	f.generic.in.domain_name	= r->pdc.in.domain_name;
 
-	binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",pdc);
+	status = libnet_find_pdc(ctx, mem_ctx, &f);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
 
+	binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",
+					f.generic.out.pdc_name);
+
 	status = dcerpc_pipe_connect(&r->pdc.out.dcerpc_pipe,
 					binding,
 					r->pdc.in.dcerpc_iface_uuid,



More information about the samba-cvs mailing list