summaryrefslogtreecommitdiff
path: root/source4/librpc/rpc/dcerpc_sock.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2007-04-22 23:00:22 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:51:29 -0500
commit1912124dbfc501c5109f6ac36e125406078d408c (patch)
treea863846bd767627125f22abd26be74db66d81664 /source4/librpc/rpc/dcerpc_sock.c
parentcc5ad07d84df94f8f2bc16fcb8015f1cf843c1e3 (diff)
downloadsamba-1912124dbfc501c5109f6ac36e125406078d408c.tar.gz
samba-1912124dbfc501c5109f6ac36e125406078d408c.tar.bz2
samba-1912124dbfc501c5109f6ac36e125406078d408c.zip
r22470: merge handling of broken connections from wins replication client code
to the rpc client code we need to always ask for read events on the socket otherwise we never get the connection error reported. shutdown the transport when a request timeout. metze (This used to be commit 3403c0cb15e08ec838b0bc834f941051fb94d124)
Diffstat (limited to 'source4/librpc/rpc/dcerpc_sock.c')
-rw-r--r--source4/librpc/rpc/dcerpc_sock.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/source4/librpc/rpc/dcerpc_sock.c b/source4/librpc/rpc/dcerpc_sock.c
index ae7d00b669..fd54a20afc 100644
--- a/source4/librpc/rpc/dcerpc_sock.c
+++ b/source4/librpc/rpc/dcerpc_sock.c
@@ -48,12 +48,34 @@ static void sock_dead(struct dcerpc_connection *p, NTSTATUS status)
{
struct sock_private *sock = p->transport.private;
- if (sock && sock->sock != NULL) {
+ if (!sock) return;
+
+ if (sock->fde) {
+ talloc_free(sock->fde);
+ sock->fde = NULL;
+ }
+
+ if (sock->sock) {
talloc_free(sock->fde);
+ sock->fde = NULL;
talloc_free(sock->sock);
sock->sock = NULL;
}
+ if (sock->packet) {
+ packet_recv_disable(sock->packet);
+ packet_set_fde(sock->packet, NULL);
+ packet_set_socket(sock->packet, NULL);
+ }
+
+ if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) {
+ status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
+ }
+
+ if (NT_STATUS_EQUAL(NT_STATUS_OK, status)) {
+ status = NT_STATUS_END_OF_FILE;
+ }
+
if (!NT_STATUS_IS_OK(status)) {
p->transport.recv_data(p, NULL, status);
}
@@ -172,15 +194,15 @@ static NTSTATUS sock_send_request(struct dcerpc_connection *p, DATA_BLOB *data,
/*
shutdown sock pipe connection
*/
-static NTSTATUS sock_shutdown_pipe(struct dcerpc_connection *p)
+static NTSTATUS sock_shutdown_pipe(struct dcerpc_connection *p, NTSTATUS status)
{
struct sock_private *sock = p->transport.private;
if (sock && sock->sock) {
- sock_dead(p, NT_STATUS_OK);
+ sock_dead(p, status);
}
- return NT_STATUS_OK;
+ return status;
}
/*
@@ -253,7 +275,7 @@ static void continue_socket_connect(struct composite_context *ctx)
sock->server_name = strupper_talloc(sock, s->target_hostname);
sock->fde = event_add_fd(conn->event_ctx, sock->sock, socket_get_fd(sock->sock),
- 0, sock_io_handler, conn);
+ EVENT_FD_READ, sock_io_handler, conn);
conn->transport.private = sock;
@@ -272,7 +294,6 @@ static void continue_socket_connect(struct composite_context *ctx)
packet_set_event_context(sock->packet, conn->event_ctx);
packet_set_fde(sock->packet, sock->fde);
packet_set_serialise(sock->packet);
- packet_recv_disable(sock->packet);
packet_set_initial_read(sock->packet, 16);
/* ensure we don't get SIGPIPE */