diff options
-rw-r--r-- | source4/smb_server/request.c | 16 | ||||
-rw-r--r-- | source4/smb_server/smb_server.c | 44 | ||||
-rw-r--r-- | source4/smb_server/smb_server.h | 4 |
3 files changed, 13 insertions, 51 deletions
diff --git a/source4/smb_server/request.c b/source4/smb_server/request.c index 93d9a160f3..5491089c8e 100644 --- a/source4/smb_server/request.c +++ b/source4/smb_server/request.c @@ -27,6 +27,7 @@ #include "dlinklist.h" #include "smb_server/smb_server.h" #include "smbd/service_stream.h" +#include "lib/stream/packet.h" /* we over allocate the data buffer to prevent too many realloc calls */ @@ -291,16 +292,19 @@ void req_grow_data(struct smbsrv_request *req, uint_t new_size) */ void req_send_reply_nosign(struct smbsrv_request *req) { + DATA_BLOB blob; + NTSTATUS status; + if (req->out.size > NBT_HDR_SIZE) { _smb_setlen(req->out.buffer, req->out.size - NBT_HDR_SIZE); } - /* add the request to the list of requests that need to be - sent to the client, then mark the socket event structure - ready for write events */ - DLIST_ADD_END(req->smb_conn->pending_send, req, struct smbsrv_request *); - - EVENT_FD_WRITEABLE(req->smb_conn->connection->event.fde); + blob = data_blob_const(req->out.buffer, req->out.size); + status = packet_send(req->smb_conn->packet, blob); + if (!NT_STATUS_IS_OK(status)) { + smbsrv_terminate_connection(req->smb_conn, nt_errstr(status)); + } + req_destroy(req); } /* diff --git a/source4/smb_server/smb_server.c b/source4/smb_server/smb_server.c index 0cdc2dc7e4..6d2ffc0274 100644 --- a/source4/smb_server/smb_server.c +++ b/source4/smb_server/smb_server.c @@ -620,47 +620,9 @@ static void smbsrv_recv(struct stream_connection *conn, uint16_t flags) */ static void smbsrv_send(struct stream_connection *conn, uint16_t flags) { - struct smbsrv_connection *smb_conn = talloc_get_type(conn->private, struct smbsrv_connection); - - while (smb_conn->pending_send) { - struct smbsrv_request *req = smb_conn->pending_send; - DATA_BLOB blob; - NTSTATUS status; - size_t sendlen; - - blob.data = req->out.buffer; - blob.length = req->out.size; - - /* send as much of this request as we can */ - status = socket_send(conn->socket, &blob, &sendlen, 0); - if (NT_STATUS_IS_ERR(status)) { - smbsrv_terminate_connection(req->smb_conn, nt_errstr(status)); - break; - } - if (sendlen == 0) { - break; - } - - req->out.buffer += sendlen; - req->out.size -= sendlen; - - /* is the whole request gone? */ - if (req->out.size == 0) { - DLIST_REMOVE(smb_conn->pending_send, req); - req_destroy(req); - } - } - - if (smb_conn->terminate) { - stream_terminate_connection(smb_conn->connection, smb_conn->terminate); - return; - } - - /* if no more requests are pending to be sent then - we should stop select for write */ - if (smb_conn->pending_send == NULL) { - EVENT_FD_NOT_WRITEABLE(conn->event.fde); - } + struct smbsrv_connection *smb_conn = talloc_get_type(conn->private, + struct smbsrv_connection); + packet_queue_run(smb_conn->packet); } diff --git a/source4/smb_server/smb_server.h b/source4/smb_server/smb_server.h index b6c9d5f985..4ab7637558 100644 --- a/source4/smb_server/smb_server.h +++ b/source4/smb_server/smb_server.h @@ -254,10 +254,6 @@ struct smbsrv_connection { /* this holds a partially received request */ struct packet_context *packet; - /* this holds list of replies that are waiting to be sent - to the client */ - struct smbsrv_request *pending_send; - /* a list of partially received transaction requests */ struct smbsrv_trans_partial { struct smbsrv_trans_partial *next, *prev; |