diff options
Diffstat (limited to 'source4/libcli/raw/clitransport.c')
-rw-r--r-- | source4/libcli/raw/clitransport.c | 100 |
1 files changed, 23 insertions, 77 deletions
diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c index 15959ce272..aafdfca74c 100644 --- a/source4/libcli/raw/clitransport.c +++ b/source4/libcli/raw/clitransport.c @@ -28,8 +28,6 @@ #include "lib/stream/packet.h" -static void smbcli_transport_process_send(struct smbcli_transport *transport); - /* an event has happened on the socket */ @@ -44,7 +42,7 @@ static void smbcli_transport_event_handler(struct event_context *ev, return; } if (flags & EVENT_FD_WRITE) { - smbcli_transport_process_send(transport); + packet_queue_run(transport->packet); } } @@ -122,6 +120,8 @@ struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock, smbcli_transport_event_handler, transport); + packet_set_serialise(transport->packet, transport->socket->event.fde); + talloc_set_destructor(transport, transport_destructor); return transport; @@ -134,18 +134,7 @@ void smbcli_transport_dead(struct smbcli_transport *transport) { smbcli_sock_dead(transport->socket); - /* all pending sends become errors */ - while (transport->pending_send) { - struct smbcli_request *req = transport->pending_send; - req->state = SMBCLI_REQUEST_ERROR; - req->status = NT_STATUS_NET_WRITE_FAULT; - DLIST_REMOVE(transport->pending_send, req); - if (req->async.fn) { - req->async.fn(req); - } - } - - /* as do all pending receives */ + /* kill all pending receives */ while (transport->pending_recv) { struct smbcli_request *req = transport->pending_recv; req->state = SMBCLI_REQUEST_ERROR; @@ -159,24 +148,6 @@ void smbcli_transport_dead(struct smbcli_transport *transport) /* - enable select for write on a transport -*/ -static void smbcli_transport_write_enable(struct smbcli_transport *transport) -{ - struct fd_event *fde = transport->socket->event.fde; - EVENT_FD_WRITEABLE(fde); -} - -/* - disable select for write on a transport -*/ -static void smbcli_transport_write_disable(struct smbcli_transport *transport) -{ - struct fd_event *fde = transport->socket->event.fde; - EVENT_FD_NOT_WRITEABLE(fde); -} - -/* send a session request */ struct smbcli_request *smbcli_transport_connect_send(struct smbcli_transport *transport, @@ -365,44 +336,6 @@ void smbcli_transport_idle_handler(struct smbcli_transport *transport, } /* - process some pending sends -*/ -static void smbcli_transport_process_send(struct smbcli_transport *transport) -{ - while (transport->pending_send) { - struct smbcli_request *req = transport->pending_send; - NTSTATUS status; - size_t nwritten; - - status = smbcli_sock_write(transport->socket, req->out.buffer, - req->out.size, &nwritten); - if (NT_STATUS_IS_ERR(status)) { - smbcli_transport_dead(transport); - return; - } - if (!NT_STATUS_IS_OK(status)) { - return; - } - req->out.buffer += nwritten; - req->out.size -= nwritten; - if (req->out.size == 0) { - DLIST_REMOVE(transport->pending_send, req); - if (req->one_way_request) { - req->state = SMBCLI_REQUEST_DONE; - smbcli_request_destroy(req); - } else { - req->state = SMBCLI_REQUEST_RECV; - DLIST_ADD(transport->pending_recv, req); - } - } - } - - /* we're out of requests to send, so don't wait for write - events any more */ - smbcli_transport_write_disable(transport); -} - -/* we have a full request in our receive buffer - match it to a pending request and process */ @@ -558,7 +491,7 @@ BOOL smbcli_transport_process(struct smbcli_transport *transport) NTSTATUS status; size_t npending; - smbcli_transport_process_send(transport); + packet_queue_run(transport->packet); if (transport->socket->sock == NULL) { return False; } @@ -616,6 +549,9 @@ static int smbcli_request_destructor(void *ptr) */ void smbcli_transport_send(struct smbcli_request *req) { + DATA_BLOB blob; + NTSTATUS status; + /* check if the transport is dead */ if (req->transport->socket->sock == NULL) { req->state = SMBCLI_REQUEST_ERROR; @@ -623,12 +559,22 @@ void smbcli_transport_send(struct smbcli_request *req) return; } - /* put it on the outgoing socket queue */ - req->state = SMBCLI_REQUEST_SEND; - DLIST_ADD_END(req->transport->pending_send, req, struct smbcli_request *); + /* put it on the socket queue */ + blob = data_blob_const(req->out.buffer, req->out.size); + status = packet_send(req->transport->packet, blob); + if (!NT_STATUS_IS_OK(status)) { + req->state = SMBCLI_REQUEST_ERROR; + req->status = status; + return; + } - /* make sure we look for write events */ - smbcli_transport_write_enable(req->transport); + if (req->one_way_request) { + req->state = SMBCLI_REQUEST_DONE; + smbcli_request_destroy(req); + } else { + req->state = SMBCLI_REQUEST_RECV; + DLIST_ADD(req->transport->pending_recv, req); + } /* add a timeout */ if (req->transport->options.request_timeout) { |