1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-31 17:18:04 +03:00

r11605: added handling of the send queue to the generic packet handling code

(This used to be commit f98d499b2e)
This commit is contained in:
Andrew Tridgell 2005-11-09 13:33:53 +00:00 committed by Gerald (Jerry) Carter
parent 188a75b4a0
commit fc5a11829d
2 changed files with 65 additions and 0 deletions

View File

@ -44,6 +44,12 @@ struct packet_context {
struct fd_event *fde;
BOOL serialise;
BOOL processing;
struct send_element {
struct send_element *next, *prev;
DATA_BLOB blob;
size_t nsent;
} *send_queue;
};
/*
@ -323,6 +329,61 @@ next_partial:
}
/*
trigger a run of the send queue
*/
void packet_queue_run(struct packet_context *pc)
{
while (pc->send_queue) {
struct send_element *el = pc->send_queue;
NTSTATUS status;
size_t nwritten;
DATA_BLOB blob = data_blob_const(el->blob.data + el->nsent,
el->blob.length - el->nsent);
if (pc->tls) {
status = tls_socket_send(pc->tls, &blob, &nwritten);
} else {
status = socket_send(pc->sock, &blob, &nwritten, 0);
}
if (NT_STATUS_IS_ERR(status)) {
packet_error(pc, NT_STATUS_NET_WRITE_FAULT);
return;
}
if (!NT_STATUS_IS_OK(status)) {
return;
}
el->nsent += nwritten;
if (el->nsent == el->blob.length) {
DLIST_REMOVE(pc->send_queue, el);
talloc_free(el);
}
}
/* we're out of requests to send, so don't wait for write
events any more */
EVENT_FD_NOT_WRITEABLE(pc->fde);
}
/*
put a packet in the send queue
*/
NTSTATUS packet_send(struct packet_context *pc, DATA_BLOB blob)
{
struct send_element *el;
el = talloc(pc, struct send_element);
NT_STATUS_HAVE_NO_MEMORY(el);
DLIST_ADD_END(pc->send_queue, el, struct send_element *);
el->blob = blob;
el->nsent = 0;
talloc_steal(el, blob.data);
EVENT_FD_WRITEABLE(pc->fde);
return NT_STATUS_OK;
}
/*
a full request checker for NBT formatted packets (first 3 bytes are length)
@ -338,3 +399,5 @@ NTSTATUS packet_full_request_nbt(void *private, DATA_BLOB blob, size_t *packet_s
}
return NT_STATUS_OK;
}

View File

@ -40,6 +40,8 @@ void packet_set_socket(struct packet_context *pc, struct socket_context *sock);
void packet_set_event_context(struct packet_context *pc, struct event_context *ev);
void packet_set_serialise(struct packet_context *pc, struct fd_event *fde);
void packet_recv(struct packet_context *pc);
NTSTATUS packet_send(struct packet_context *pc, DATA_BLOB blob);
void packet_queue_run(struct packet_context *pc);
/*
pre-canned handlers