/** * Streams data out of the from IOBuf and into the to IOBuf * until it's moved total bytes between them. */ int IOBuf_stream(IOBuf *from, IOBuf *to, int total) { int need = 0; int remain = total; int avail = 0; int rc = 0; char *data = NULL; if(from->len > to->len) IOBuf_resize(to, from->len); while(remain > 0) { need = remain <= from->len ? remain : from->len; data = IOBuf_read(from, need, &avail); check_debug(avail > 0, "Nothing in read buffer."); rc = IOBuf_send_all(to, IOBuf_start(from), avail); check_debug(rc == avail, "Failed to send all of the data: %d of %d", rc, avail) // commit whatever we just did check(IOBuf_read_commit(from, rc) != -1, "Final commit failed during streaming."); // reduce it by the given amount remain -= rc; } assert(remain == 0 && "Buffer math is wrong."); return total - remain; error: return -1; }
int Connection_deliver_raw_internal(Connection *conn, bstring buf) { return IOBuf_send_all(conn->iob, bdata(buf), blength(buf)); }