svn commit: samba r8075 - in branches/SAMBA_4_0/source/libnet: .

mimir at samba.org mimir at samba.org
Sat Jul 2 14:28:16 GMT 2005


Author: mimir
Date: 2005-07-02 14:28:15 +0000 (Sat, 02 Jul 2005)
New Revision: 8075

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8075

Log:
Make rpc connect function part of libnet api, as I suppose many
implementers of more complex function might need to use it.
Also simplify io structure which essentially does the same thing
when connecting arbitrary rpc server or a domain pdc.


rafal


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


Changeset:
Modified: branches/SAMBA_4_0/source/libnet/libnet_rpc.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet_rpc.c	2005-07-02 11:13:12 UTC (rev 8074)
+++ branches/SAMBA_4_0/source/libnet/libnet_rpc.c	2005-07-02 14:28:15 UTC (rev 8075)
@@ -87,29 +87,26 @@
  * @return nt status of the call
  **/
 
-static NTSTATUS libnet_rpc_connect_standard(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
+static NTSTATUS libnet_RpcConnectSrv(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_RpcConnect *r)
 {
 	NTSTATUS status;
 	const char *binding = NULL;
 
-	binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",
-					r->standard.in.server_name);
+	binding = talloc_asprintf(mem_ctx, "ncacn_np:%s", r->in.domain_name);
 
-	status = dcerpc_pipe_connect(mem_ctx, 
-				     &r->standard.out.dcerpc_pipe,
-				     binding,
-				     r->standard.in.dcerpc_iface_uuid,
-				     r->standard.in.dcerpc_iface_version,
+	status = dcerpc_pipe_connect(mem_ctx, &r->out.dcerpc_pipe,
+				     binding, r->in.dcerpc_iface_uuid,r->in.dcerpc_iface_version,
 				     ctx->cred, ctx->event_ctx);
 
 	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);
+		r->out.error_string = talloc_asprintf(mem_ctx,
+						      "dcerpc_pipe_connect to pipe %s failed with %s\n",
+						      r->in.dcerpc_iface_name, binding);
 		return status;
 	}
 
-	r->standard.out.error_string = NULL;
+	r->out.error_string = NULL;
+	ctx->pipe = r->out.dcerpc_pipe;
 
 	return status;
 }
@@ -124,31 +121,37 @@
  * @return nt status of the call
  **/
 
-static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
+static NTSTATUS libnet_RpcConnectPdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_RpcConnect *r)
 {
 	NTSTATUS status;
-	union libnet_rpc_connect r2;
-	union libnet_find_pdc f;
+	struct libnet_RpcConnect r2;
+	struct libnet_Lookup f;
+	char address[16];
 
-	f.generic.level			= LIBNET_FIND_PDC_GENERIC;
-	f.generic.in.domain_name	= r->pdc.in.domain_name;
+	f.in.hostname  = r->in.domain_name;
+	f.in.methods   = NULL;
+	f.out.address  = &address;
 
-	status = libnet_find_pdc(ctx, mem_ctx, &f);
+	status = libnet_LookupPdc(ctx, mem_ctx, &f);
 	if (!NT_STATUS_IS_OK(status)) {
+		r->out.error_string = talloc_asprintf(mem_ctx, "libnet_LookupPdc failed: %s",
+						      nt_errstr(status));
 		return status;
 	}
 
-	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;
+	r2.level		    = LIBNET_RPC_CONNECT_SERVER;
+	r2.in.domain_name	    = talloc_strdup(mem_ctx, *f.out.address);
+	r2.in.dcerpc_iface_name     = r->in.dcerpc_iface_name;
+	r2.in.dcerpc_iface_uuid	    = r->in.dcerpc_iface_uuid;
+	r2.in.dcerpc_iface_version  = r->in.dcerpc_iface_version;
 	
-	status = libnet_rpc_connect(ctx, mem_ctx, &r2);
+	status = libnet_RpcConnect(ctx, mem_ctx, &r2);
 
-	r->pdc.out.dcerpc_pipe		= r2.standard.out.dcerpc_pipe;
-	r->pdc.out.error_string		= r2.standard.out.error_string;
+	r->out.dcerpc_pipe          = r2.out.dcerpc_pipe;
+	r->out.error_string	    = r2.out.error_string;
 
+	ctx->pipe = r->out.dcerpc_pipe;
+
 	return status;
 }
 
@@ -162,13 +165,15 @@
  * @return nt status of the call
  **/
 
-NTSTATUS libnet_rpc_connect(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
+NTSTATUS libnet_RpcConnect(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_RpcConnect *r)
 {
-	switch (r->standard.level) {
-		case LIBNET_RPC_CONNECT_STANDARD:
-			return libnet_rpc_connect_standard(ctx, mem_ctx, r);
+	NTSTATUS status;
+
+	switch (r->level) {
+		case LIBNET_RPC_CONNECT_SERVER:
+			return libnet_RpcConnectSrv(ctx, mem_ctx, r);
 		case LIBNET_RPC_CONNECT_PDC:
-			return libnet_rpc_connect_pdc(ctx, mem_ctx, r);
+			return libnet_RpcConnectPdc(ctx, mem_ctx, r);
 	}
 
 	return NT_STATUS_INVALID_LEVEL;

Modified: branches/SAMBA_4_0/source/libnet/libnet_rpc.h
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet_rpc.h	2005-07-02 11:13:12 UTC (rev 8074)
+++ branches/SAMBA_4_0/source/libnet/libnet_rpc.h	2005-07-02 14:28:15 UTC (rev 8075)
@@ -18,6 +18,34 @@
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+
+/*
+ * struct definition for connecting to a dcerpc inferface
+ */
+
+enum libnet_RpcConnect_level {
+	LIBNET_RPC_CONNECT_SERVER,      /* connect to a standalone rpc server */
+	LIBNET_RPC_CONNECT_PDC          /* connect to a domain pdc */
+};
+
+struct libnet_RpcConnect {
+	enum libnet_RpcConnect_level level;
+
+	struct {
+		const char *domain_name;
+		const char *dcerpc_iface_name;
+		const char *dcerpc_iface_uuid;
+		uint32_t dcerpc_iface_version;
+	} in;
+	struct {
+		struct dcerpc_pipe *dcerpc_pipe;
+		const char *error_string;
+	} out;
+};
+
+
+
+
 /* struct and enum for finding a domain controller */
 enum libnet_find_pdc_level {
 	LIBNET_FIND_PDC_GENERIC
@@ -37,42 +65,3 @@
 		} out;
 	} generic;
 };
-
-/* struct and enum for connecting to a dcerpc inferface */
-enum libnet_rpc_connect_level {
-	LIBNET_RPC_CONNECT_STANDARD,
-	LIBNET_RPC_CONNECT_PDC
-};
-
-union libnet_rpc_connect {
-	/* connect to a standard server */
-	struct {
-		enum libnet_rpc_connect_level level;
-
-		struct {
-			const char *server_name;
-			const char *dcerpc_iface_name;
-			const char *dcerpc_iface_uuid;
-			uint32_t dcerpc_iface_version;
-		} in;
-
-		struct _libnet_rpc_connect_out {
-			struct dcerpc_pipe *dcerpc_pipe;
-			const char *error_string;
-		} out;
-	} standard;
-
-	/* connect to a domain PDC */
-	struct {
-		enum libnet_rpc_connect_level level;
-
-		struct {
-			const char *domain_name;
-			const char *dcerpc_iface_name;
-			const char *dcerpc_iface_uuid;
-			uint32_t dcerpc_iface_version;
-		} in;
-
-		struct _libnet_rpc_connect_out out;
-	} pdc;
-};



More information about the samba-cvs mailing list