From 1795dfd4549767bb5920eee0d5af2588d4a8b8ec Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 25 Aug 2004 09:22:47 +0000 Subject: r2061: - split libnet header files - add LIB_RPC_CONNECT_STANDARD level which takes a server name and the PIPE NAME,UUID and VERSION metze (This used to be commit 6aeaa6aca39c8c2a9edf8d4b3e538bebb68070d7) --- source4/libnet/libnet_rpc.c | 52 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 11 deletions(-) (limited to 'source4/libnet/libnet_rpc.c') diff --git a/source4/libnet/libnet_rpc.c b/source4/libnet/libnet_rpc.c index 4896236e68..01de99c167 100644 --- a/source4/libnet/libnet_rpc.c +++ b/source4/libnet/libnet_rpc.c @@ -56,11 +56,39 @@ NTSTATUS libnet_find_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union return NT_STATUS_INVALID_LEVEL; } -/* connect to a dcerpc interface of a domains PDC */ -static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r) +/* connect to a dcerpc interface of a server */ +static NTSTATUS libnet_rpc_connect_standard(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r) { NTSTATUS status; const char *binding = NULL; + + binding = talloc_asprintf(mem_ctx, "ncacn_np:%s", + r->standard.in.server_name); + + status = dcerpc_pipe_connect(&r->standard.out.dcerpc_pipe, + binding, + r->standard.in.dcerpc_iface_uuid, + r->standard.in.dcerpc_iface_version, + ctx->user.domain_name, + ctx->user.account_name, + ctx->user.password); + if (!NT_STATUS_IS_OK(status)) { + r->standard.out.error_string = talloc_asprintf(mem_ctx, + "dcerpc_pipe_connect to pipe %s failed with %s\n", + r->standard.in.dcerpc_iface_name, binding); + return status; + } + + r->standard.out.error_string = NULL; + + return status; +} + +/* connect to a dcerpc interface of a time server */ +static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r) +{ + NTSTATUS status; + union libnet_rpc_connect r2; union libnet_find_pdc f; f.generic.level = LIBNET_FIND_PDC_GENERIC; @@ -71,16 +99,16 @@ static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *m return status; } - binding = talloc_asprintf(mem_ctx, "ncacn_np:%s", - f.generic.out.pdc_name); + r2.standard.level = LIBNET_RPC_CONNECT_STANDARD; + r2.standard.in.server_name = f.generic.out.pdc_name; + r2.standard.in.dcerpc_iface_name = r->standard.in.dcerpc_iface_name; + r2.standard.in.dcerpc_iface_uuid = r->standard.in.dcerpc_iface_uuid; + r2.standard.in.dcerpc_iface_version = r->standard.in.dcerpc_iface_version; + + status = libnet_rpc_connect(ctx, mem_ctx, &r2); - status = dcerpc_pipe_connect(&r->pdc.out.dcerpc_pipe, - binding, - r->pdc.in.dcerpc_iface_uuid, - r->pdc.in.dcerpc_iface_version, - ctx->user.domain_name, - ctx->user.account_name, - ctx->user.password); + r->pdc.out.dcerpc_pipe = r2.standard.out.dcerpc_pipe; + r->pdc.out.error_string = r2.standard.out.error_string; return status; } @@ -89,6 +117,8 @@ static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *m NTSTATUS libnet_rpc_connect(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r) { switch (r->pdc.level) { + case LIBNET_RPC_CONNECT_STANDARD: + return libnet_rpc_connect_standard(ctx, mem_ctx, r); case LIBNET_RPC_CONNECT_PDC: return libnet_rpc_connect_pdc(ctx, mem_ctx, r); } -- cgit