summaryrefslogtreecommitdiff
path: root/source4/rpc_server/dcerpc_sock.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2006-03-16 18:46:49 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:57:32 -0500
commita949db7c6d4bd35df59ba066111e6566172d4814 (patch)
treec7978edc8c96fc63bb8333e4dd8703bc857a0215 /source4/rpc_server/dcerpc_sock.c
parent3948fcac493ed131bc40358138e8dc17a58853f7 (diff)
downloadsamba-a949db7c6d4bd35df59ba066111e6566172d4814.tar.gz
samba-a949db7c6d4bd35df59ba066111e6566172d4814.tar.bz2
samba-a949db7c6d4bd35df59ba066111e6566172d4814.zip
r14486: 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 (This used to be commit 56fac3ddbbeecb834e5c7a439df344e11fe12a7b)
Diffstat (limited to 'source4/rpc_server/dcerpc_sock.c')
-rw-r--r--source4/rpc_server/dcerpc_sock.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/source4/rpc_server/dcerpc_sock.c b/source4/rpc_server/dcerpc_sock.c
index 2cfce5303b..79cf1113eb 100644
--- a/source4/rpc_server/dcerpc_sock.c
+++ b/source4/rpc_server/dcerpc_sock.c
@@ -34,7 +34,7 @@
struct dcesrv_socket_context {
const struct dcesrv_endpoint *endpoint;
- struct dcesrv_context *dcesrv_ctx;
+ struct dcesrv_context *dcesrv_ctx;
};
/*
@@ -55,9 +55,41 @@ static NTSTATUS dcerpc_write_fn(void *private_data, DATA_BLOB *out, size_t *nwri
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)
{
@@ -69,7 +101,7 @@ static void dcesrv_sock_accept(struct stream_connection *srv_conn)
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 @@ static void dcesrv_sock_accept(struct stream_connection *srv_conn)
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");