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,