summaryrefslogtreecommitdiff
path: root/src/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/connection.c')
-rw-r--r--src/connection.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/connection.c b/src/connection.c
index 3a17d983d..11fc4ba28 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -178,6 +178,21 @@ static int connSocketWrite(connection *conn, const void *data, size_t data_len)
return ret;
}
+static int connSocketWritev(connection *conn, const struct iovec *iov, int iovcnt) {
+ int ret = writev(conn->fd, iov, iovcnt);
+ if (ret < 0 && errno != EAGAIN) {
+ conn->last_errno = errno;
+
+ /* Don't overwrite the state of a connection that is not already
+ * connected, not to mess with handler callbacks.
+ */
+ if (errno != EINTR && conn->state == CONN_STATE_CONNECTED)
+ conn->state = CONN_STATE_ERROR;
+ }
+
+ return ret;
+}
+
static int connSocketRead(connection *conn, void *buf, size_t buf_len) {
int ret = read(conn->fd, buf, buf_len);
if (!ret) {
@@ -349,6 +364,7 @@ ConnectionType CT_Socket = {
.ae_handler = connSocketEventHandler,
.close = connSocketClose,
.write = connSocketWrite,
+ .writev = connSocketWritev,
.read = connSocketRead,
.accept = connSocketAccept,
.connect = connSocketConnect,