svn commit: samba r14486 - in branches/SAMBA_4_0/source: ntvfs/ipc rpc_server rpc_server/spoolss

metze at samba.org metze at samba.org
Thu Mar 16 18:46:50 GMT 2006


Author: metze
Date: 2006-03-16 18:46:49 +0000 (Thu, 16 Mar 2006)
New Revision: 14486

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

Log:
remove the need of a stream_connection on a dcesrv_connection,
and let the transport set callbacks for getting the own and peer 
socket_address

metze
Modified:
   branches/SAMBA_4_0/source/ntvfs/ipc/vfs_ipc.c
   branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c
   branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h
   branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c
   branches/SAMBA_4_0/source/rpc_server/spoolss/dcesrv_spoolss.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/ipc/vfs_ipc.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/ipc/vfs_ipc.c	2006-03-16 18:26:14 UTC (rev 14485)
+++ branches/SAMBA_4_0/source/ntvfs/ipc/vfs_ipc.c	2006-03-16 18:46:49 UTC (rev 14486)
@@ -32,6 +32,7 @@
 #include "libcli/rap/rap.h"
 #include "ntvfs/ipc/proto.h"
 #include "rpc_server/dcerpc_server.h"
+#include "smbd/service_stream.h"
 
 #define IPC_BASE_FNUM 0x400
 
@@ -41,6 +42,8 @@
 struct ipc_private {
 	struct idr_context *idtree_fnum;
 
+	struct stream_connection *stream_conn;
+
 	struct dcesrv_context *dcesrv;
 
 	/* a list of open pipes */
@@ -95,6 +98,8 @@
 
 	private->pipe_list = NULL;
 
+	private->stream_conn = req->smb_conn->connection;
+
 	private->idtree_fnum = idr_init(private);
 	NT_STATUS_HAVE_NO_MEMORY(private->idtree_fnum);
 
@@ -173,7 +178,20 @@
 	return 0;
 }
 
+static struct socket_address *ipc_get_my_addr(struct dcesrv_connection *dce_conn, TALLOC_CTX *mem_ctx)
+{
+	struct ipc_private *private = dce_conn->transport.private_data;
 
+	return socket_get_my_addr(private->stream_conn->socket, mem_ctx);
+}
+
+static struct socket_address *ipc_get_peer_addr(struct dcesrv_connection *dce_conn, TALLOC_CTX *mem_ctx)
+{
+	struct ipc_private *private = dce_conn->transport.private_data;
+
+	return socket_get_peer_addr(private->stream_conn->socket, mem_ctx);
+}
+
 /*
   open a file backend - used for MSRPC pipes
 */
@@ -227,7 +245,7 @@
 						p,
 						ep_description, 
 						req->session->session_info,
-						srv_conn,
+						srv_conn->event.ctx,
 						0,
 						&p->dce_conn);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -235,6 +253,11 @@
 		return status;
 	}
 
+	p->dce_conn->transport.private_data		= private;
+	p->dce_conn->transport.report_output_data	= NULL;
+	p->dce_conn->transport.get_my_addr		= ipc_get_my_addr;
+	p->dce_conn->transport.get_peer_addr		= ipc_get_peer_addr;
+	
 	DLIST_ADD(private->pipe_list, p);
 
 	p->smbpid = req->smbpid;

Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c	2006-03-16 18:26:14 UTC (rev 14485)
+++ branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c	2006-03-16 18:46:49 UTC (rev 14486)
@@ -289,7 +289,7 @@
 NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce_ctx,
 				 TALLOC_CTX *mem_ctx,
 				 const struct dcesrv_endpoint *ep,
-				 struct stream_connection *srv_conn,
+				 struct event_context *event_ctx,
 				 uint32_t state_flags,
 				 struct dcesrv_connection **_p)
 {
@@ -309,9 +309,10 @@
 	p->auth_state.gensec_security = NULL;
 	p->auth_state.session_info = NULL;
 	p->auth_state.session_key = dcesrv_generic_session_key;
-	p->srv_conn = srv_conn;
+	p->event_ctx = event_ctx;
 	p->processing = False;
 	p->state_flags = state_flags;
+	ZERO_STRUCT(p->transport);
 
 	talloc_set_destructor(p, dcesrv_endpoint_destructor);
 
@@ -326,7 +327,7 @@
 					TALLOC_CTX *mem_ctx,
 					const struct dcerpc_binding *ep_description,
 					struct auth_session_info *session_info,
-					struct stream_connection *srv_conn,
+					struct event_context *event_ctx,
 					uint32_t state_flags,
 					struct dcesrv_connection **dce_conn_p)
 {
@@ -339,7 +340,7 @@
 		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 	}
 
-	status = dcesrv_endpoint_connect(dce_ctx, mem_ctx, ep, srv_conn, state_flags, dce_conn_p);
+	status = dcesrv_endpoint_connect(dce_ctx, mem_ctx, ep, event_ctx, state_flags, dce_conn_p);
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -750,7 +751,7 @@
 	pull->flags |= LIBNDR_FLAG_REF_ALLOC;
 
 	call->context	= context;
-	call->event_ctx	= context->conn->srv_conn->event.ctx;
+	call->event_ctx	= context->conn->event_ctx;
 	call->ndr_pull	= pull;
 
 	if (call->pkt.pfc_flags & DCERPC_PFC_FLAG_ORPC) {
@@ -879,16 +880,32 @@
 	DLIST_ADD_END(call->conn->call_list, call, struct dcesrv_call_state *);
 
 	if (call->conn->call_list && call->conn->call_list->replies) {
-		if (call->conn->srv_conn &&
-		    call->conn->srv_conn->event.fde) {
-			EVENT_FD_WRITEABLE(call->conn->srv_conn->event.fde);
+		if (call->conn->transport.report_output_data) {
+			call->conn->transport.report_output_data(call->conn);
 		}
 	}
 
 	return NT_STATUS_OK;
 }
 
+struct socket_address *dcesrv_connection_get_my_addr(struct dcesrv_connection *conn, TALLOC_CTX *mem_ctx)
+{
+	if (!conn->transport.get_my_addr) {
+		return NULL;
+	}
 
+	return conn->transport.get_my_addr(conn, mem_ctx);
+}
+
+struct socket_address *dcesrv_connection_get_peer_addr(struct dcesrv_connection *conn, TALLOC_CTX *mem_ctx)
+{
+	if (!conn->transport.get_peer_addr) {
+		return NULL;
+	}
+
+	return conn->transport.get_peer_addr(conn, mem_ctx);
+}
+
 /*
   work out if we have a full packet yet
 */
@@ -939,7 +956,7 @@
 	call->conn      = dce_conn;
 	call->replies   = NULL;
 	call->context   = NULL;
-	call->event_ctx = dce_conn->srv_conn->event.ctx;
+	call->event_ctx = dce_conn->event_ctx;
 
 	blob = dce_conn->partial_input;
 	blob.length = dcerpc_get_frag_length(&blob);

Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h	2006-03-16 18:26:14 UTC (rev 14485)
+++ branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h	2006-03-16 18:46:49 UTC (rev 14486)
@@ -176,7 +176,8 @@
 	/* the current authentication state */
 	struct dcesrv_auth auth_state;
 
-	struct stream_connection *srv_conn;
+	/* the event_context that will be used for this connection */
+	struct event_context *event_ctx;
 
 	/* the transport level session key */
 	DATA_BLOB transport_session_key;
@@ -186,6 +187,12 @@
 	/* this is the default state_flags for dcesrv_call_state structs */
 	uint32_t state_flags;
 
+	struct {
+		void *private_data;
+		void (*report_output_data)(struct dcesrv_connection *);
+		struct socket_address *(*get_my_addr)(struct dcesrv_connection *, TALLOC_CTX *mem_ctx);
+		struct socket_address *(*get_peer_addr)(struct dcesrv_connection *, TALLOC_CTX *mem_ctx);
+	} transport;
 };
 
 

Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c	2006-03-16 18:26:14 UTC (rev 14485)
+++ branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c	2006-03-16 18:46:49 UTC (rev 14486)
@@ -34,7 +34,7 @@
 
 struct dcesrv_socket_context {
 	const struct dcesrv_endpoint *endpoint;
-	struct dcesrv_context *dcesrv_ctx;	
+	struct dcesrv_context *dcesrv_ctx;
 };
 
 /*
@@ -55,10 +55,42 @@
 
 static void dcesrv_terminate_connection(struct dcesrv_connection *dce_conn, const char *reason)
 {
-	stream_terminate_connection(dce_conn->srv_conn, reason);
+	struct stream_connection *srv_conn;
+	srv_conn = talloc_get_type(dce_conn->transport.private_data,
+				   struct stream_connection);
+
+	stream_terminate_connection(srv_conn, reason);
 }
 
+static void dcesrv_sock_report_output_data(struct dcesrv_connection *dcesrv_conn)
+{
+	struct stream_connection *srv_conn;
+	srv_conn = talloc_get_type(dcesrv_conn->transport.private_data,
+				   struct stream_connection);
 
+	if (srv_conn && srv_conn->event.fde) {
+		EVENT_FD_WRITEABLE(srv_conn->event.fde);
+	}
+}
+
+static struct socket_address *dcesrv_sock_get_my_addr(struct dcesrv_connection *dcesrv_conn, TALLOC_CTX *mem_ctx)
+{
+	struct stream_connection *srv_conn;
+	srv_conn = talloc_get_type(dcesrv_conn->transport.private_data,
+				   struct stream_connection);
+
+	return socket_get_my_addr(srv_conn->socket, mem_ctx);
+}
+
+static struct socket_address *dcesrv_sock_get_peer_addr(struct dcesrv_connection *dcesrv_conn, TALLOC_CTX *mem_ctx)
+{
+	struct stream_connection *srv_conn;
+	srv_conn = talloc_get_type(dcesrv_conn->transport.private_data,
+				   struct stream_connection);
+
+	return socket_get_peer_addr(srv_conn->socket, mem_ctx);
+}
+
 static void dcesrv_sock_accept(struct stream_connection *srv_conn)
 {
 	NTSTATUS status;
@@ -69,7 +101,7 @@
 	status = dcesrv_endpoint_connect(dcesrv_sock->dcesrv_ctx,
 					 srv_conn,
 					 dcesrv_sock->endpoint,
-					 srv_conn,
+					 srv_conn->event.ctx,
 					 DCESRV_CALL_STATE_FLAG_MAY_ASYNC,
 					 &dcesrv_conn);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -79,6 +111,11 @@
 		return;
 	}
 
+	dcesrv_conn->transport.private_data		= srv_conn;
+	dcesrv_conn->transport.report_output_data	= dcesrv_sock_report_output_data;
+	dcesrv_conn->transport.get_my_addr		= dcesrv_sock_get_my_addr;
+	dcesrv_conn->transport.get_peer_addr		= dcesrv_sock_get_peer_addr;
+
 	srv_conn->private = dcesrv_conn;
 
 	irpc_add_name(srv_conn->msg_ctx, "rpc_server");

Modified: branches/SAMBA_4_0/source/rpc_server/spoolss/dcesrv_spoolss.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/spoolss/dcesrv_spoolss.c	2006-03-16 18:26:14 UTC (rev 14485)
+++ branches/SAMBA_4_0/source/rpc_server/spoolss/dcesrv_spoolss.c	2006-03-16 18:46:49 UTC (rev 14486)
@@ -185,7 +185,7 @@
 		if (ret) return WERR_OK;
 	}
 
-	myaddr = socket_get_my_addr(dce_call->conn->srv_conn->socket, mem_ctx);
+	myaddr = dcesrv_connection_get_my_addr(dce_call->conn, mem_ctx);
 	W_ERROR_HAVE_NO_MEMORY(myaddr);
 
 	ret = strequal(myaddr->addr, server_name);



More information about the samba-cvs mailing list