}
// See if we need to split across the circular buffer.
- int ret;
+ ssize_t ret;
if ((client->bytes_sent % BACKLOG_SIZE) + bytes_to_send > BACKLOG_SIZE) {
- // TODO: writev
- assert(false);
+ size_t bytes_first_part = BACKLOG_SIZE - (client->bytes_sent % BACKLOG_SIZE);
+
+ iovec iov[2];
+ iov[0].iov_base = const_cast<char *>(stream.data + (client->bytes_sent % BACKLOG_SIZE));
+ iov[0].iov_len = bytes_first_part;
+
+ iov[1].iov_base = const_cast<char *>(stream.data);
+ iov[1].iov_len = bytes_to_send - bytes_first_part;
+
+ ret = writev(client->sock, iov, 2);
} else {
ret = write(client->sock,
stream.data + (client->bytes_sent % BACKLOG_SIZE),