diff options
Diffstat (limited to 'src/connection.c')
-rw-r--r-- | src/connection.c | 16 |
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, |