/* * Write data to file from buffer */ ssize_t buffer_write(struct Buffer *buffer, int fd) { ssize_t bytes; struct iovec iov[2]; bytes = writev(fd, iov, setup_read_iov(buffer, iov, 0)); if (bytes > 0) advance_read_position(buffer, bytes); return bytes; }
size_t buffer_peek(const struct Buffer *src, void *dst, size_t len) { struct iovec iov[2]; size_t bytes_copied = 0; size_t iov_len = setup_read_iov(src, iov, len); for (size_t i = 0; i < iov_len; i++) { memcpy((char *)dst + bytes_copied, iov[i].iov_base, iov[i].iov_len); bytes_copied += iov[i].iov_len; } return bytes_copied; }
ssize_t buffer_send(struct Buffer *buffer, int sockfd, int flags) { ssize_t bytes; struct iovec iov[2]; struct msghdr msg; msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = iov; msg.msg_iovlen = setup_read_iov(buffer, iov, 0); msg.msg_control = NULL; msg.msg_controllen = 0; msg.msg_flags = 0; bytes = sendmsg(sockfd, &msg, flags); buffer->last_send = ev_now(EV_DEFAULT); if (bytes > 0) advance_read_position(buffer, bytes); return bytes; }
ssize_t buffer_send(struct Buffer *buffer, int sockfd, int flags) { ssize_t bytes; struct iovec iov[2]; struct msghdr msg; msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = iov; msg.msg_iovlen = setup_read_iov(buffer, iov, 0); msg.msg_control = NULL; msg.msg_controllen = 0; msg.msg_flags = 0; bytes = sendmsg(sockfd, &msg, flags); if (clock_gettime(CLOCK_MONOTONIC, &buffer->last_send) < 0) err("clock_gettime() failed: %s", strerror(errno)); if (bytes > 0) advance_read_position(buffer, bytes); return bytes; }