In preparation for the next commit.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
return res;
}
+static int
+send_input(int fd, struct ring *inbuf)
+{
+ struct iovec iov[2];
+ int cnt;
+ ssize_t res;
+
+ cnt = ring_to_iovec(inbuf, iov);
+ res = writev(fd, iov, cnt);
+ if (res < 0)
+ return res;
+ ring_discard(inbuf, res);
+ return res;
+}
+
static void
intr(int sig)
{
/* send it to the server */
if (FD_ISSET(sock, &wrfd)) {
- n = ring_to_file(&inbuf, sock);
+ n = send_input(sock, &inbuf);
if (n < 0) {
perror("write socket");
return -1;
#include <assert.h>
#include <stdio.h>
#include <string.h>
-#include <sys/uio.h>
#include "ringbuf.h"
/*
* @iov[] must have at least two elements.
* Return number of elements used (zero for an empty ring buffer).
*/
-static int
+int
ring_to_iovec(struct ring *r, struct iovec iov[])
{
unsigned cons = r->cons % RING_SIZE;
* ringbuf.h: Simple ring buffer
*
* Known contributors to this file:
- * Markus Armbruster, 2007-2015
+ * Markus Armbruster, 2007-2017
*/
#ifndef RINGBUF_H
#define RINGBUF_H
#include <stddef.h>
+#include <sys/uio.h>
#define RING_SIZE 4096
extern void ring_discard(struct ring *, int);
extern int ring_search(struct ring *, char *, int);
extern int ring_from_file(struct ring *, int fd);
+extern int ring_to_iovec(struct ring *, struct iovec[]);
extern int ring_to_file(struct ring *, int fd);
#endif