1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

r11607: switched the smb server to use the generic packet send code

(This used to be commit 9eee7bafa12553a894536db8ce5cc2d268e09ae6)
This commit is contained in:
Andrew Tridgell 2005-11-09 13:42:56 +00:00 committed by Gerald (Jerry) Carter
parent dce04d193e
commit 5c620048e3
3 changed files with 13 additions and 51 deletions

View File

@ -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);
}
/*

View File

@ -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);
}

View File

@ -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;