r1925: now we lookup the domain controller
authorStefan Metzmacher <metze@samba.org>
Thu, 19 Aug 2004 15:04:14 +0000 (15:04 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:58:11 +0000 (12:58 -0500)
and fallback to a workstation name

metze
(This used to be commit 2012d90f268f69a3a4e5890a0f3615237853bd0b)

source4/libnet/libnet.h
source4/libnet/libnet_rpc.c

index 0a96e6c530ce5e662b49c54779bd9def34048337..72c2fecdad3d92f918e4859b71cff96a7f02b4f6 100644 (file)
@@ -32,6 +32,26 @@ struct libnet_context {
        } 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
index c76498d0bb8a064b1dc503c908fbc2f6d573e161..7cee7681e873a99aed9c8aa1006bdf210ab1ebd3 100644 (file)
 
 #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;
+
+       f.generic.level                 = LIBNET_FIND_PDC_GENERIC;
+       f.generic.in.domain_name        = r->pdc.in.domain_name;
 
-       /* 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();
+       status = libnet_find_pdc(ctx, mem_ctx, &f);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
 
-       binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",pdc);
+       binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",
+                                       f.generic.out.pdc_name);
 
        status = dcerpc_pipe_connect(&r->pdc.out.dcerpc_pipe,
                                        binding,