aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/client.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/client.c b/src/client.c
index b646a1b67..da1358e54 100644
--- a/src/client.c
+++ b/src/client.c
@@ -719,33 +719,40 @@ int client_print(int fd, const char *buffer, size_t buflen)
return 0;
}
+static void client_defer_output(struct client *client,
+ const void *data, size_t length)
+{
+ struct sllnode *buf = client->deferred_send;
+
+ assert(client->deferred_send != NULL);
+
+ client->deferred_bytes += sizeof(struct sllnode) + length;
+ if (client->deferred_bytes > client_max_output_buffer_size) {
+ ERROR("client %i: output buffer size (%lu) is "
+ "larger than the max (%lu)\n",
+ client->num,
+ (unsigned long)client->deferred_bytes,
+ (unsigned long)client_max_output_buffer_size);
+ /* cause client to close */
+ client->expired = 1;
+ } else {
+ while (buf->next)
+ buf = buf->next;
+ buf->next = new_sllnode(data, length);
+ }
+}
+
static void client_write_output(struct client *client)
{
ssize_t ret;
- struct sllnode *buf;
if (client->expired || !client->send_buf_used)
return;
- if ((buf = client->deferred_send)) {
- client->deferred_bytes += sizeof(struct sllnode)
- + client->send_buf_used;
- if (client->deferred_bytes >
- client_max_output_buffer_size) {
- ERROR("client %i: output buffer size (%lu) is "
- "larger than the max (%lu)\n",
- client->num,
- (unsigned long)client->deferred_bytes,
- (unsigned long)client_max_output_buffer_size);
- /* cause client to close */
- client->expired = 1;
- } else {
- while (buf->next)
- buf = buf->next;
- buf->next = new_sllnode(client->send_buf,
- client->send_buf_used);
- }
- } else {
+ if (client->deferred_send != NULL)
+ client_defer_output(client, client->send_buf,
+ client->send_buf_used);
+ else {
if ((ret = write(client->fd, client->send_buf,
client->send_buf_used)) < 0) {
if (errno == EAGAIN || errno == EINTR) {