diff options
author | Joe Orton <joe@manyfish.uk> | 2020-11-21 11:23:27 +0000 |
---|---|---|
committer | Joe Orton <joe@manyfish.uk> | 2020-11-21 11:23:27 +0000 |
commit | 3870f2449c40fd943e1470a0365d4dfc89878bb7 (patch) | |
tree | 5c4bd6706eec1212b7387454a9280156def75b2c | |
parent | 0f2d07907722af1f18866b9a97c7b5debed1a3f2 (diff) | |
download | neon-git-3870f2449c40fd943e1470a0365d4dfc89878bb7.tar.gz |
* src/ne_socket.c (write_raw): Use send(,,,MSG_NOSIGNAL) if available.
(writev_raw): Use sendmsg(,,MSG_NOSIGNAL) if available.
* macros/neon.m4 (NEON_COMMON_CHECKS): Check for sendmsg.
-rw-r--r-- | macros/neon.m4 | 2 | ||||
-rw-r--r-- | src/ne_socket.c | 19 |
2 files changed, 19 insertions, 2 deletions
diff --git a/macros/neon.m4 b/macros/neon.m4 index ac72ce6..ccdc4a6 100644 --- a/macros/neon.m4 +++ b/macros/neon.m4 @@ -614,7 +614,7 @@ NE_LARGEFILE AC_REPLACE_FUNCS(strcasecmp) -AC_CHECK_FUNCS(signal setvbuf setsockopt stpcpy poll fcntl getsockopt) +AC_CHECK_FUNCS(signal setvbuf setsockopt stpcpy poll fcntl getsockopt sendmsg) if test "x${ac_cv_func_poll}${ac_cv_header_sys_poll_h}y" = "xyesyesy"; then AC_DEFINE([NE_USE_POLL], 1, [Define if poll() should be used]) diff --git a/src/ne_socket.c b/src/ne_socket.c index 52a0701..a6bc635 100644 --- a/src/ne_socket.c +++ b/src/ne_socket.c @@ -536,6 +536,12 @@ static ssize_t read_raw(ne_socket *sock, char *buffer, size_t len) #define MAP_ERR(e) (NE_ISCLOSED(e) ? NE_SOCK_CLOSED : \ (NE_ISRESET(e) ? NE_SOCK_RESET : NE_SOCK_ERROR)) +#ifdef MSG_NOSIGNAL +#define SEND_FLAGS MSG_NOSIGNAL +#else +#define SEND_FLAGS (0) +#endif + static ssize_t write_raw(ne_socket *sock, const char *data, size_t length) { ssize_t ret; @@ -547,7 +553,7 @@ static ssize_t write_raw(ne_socket *sock, const char *data, size_t length) #endif do { - ret = send(sock->fd, data, length, 0); + ret = send(sock->fd, data, length, SEND_FLAGS); } while (ret == -1 && NE_ISINTR(ne_errno)); if (ret < 0) { @@ -576,6 +582,17 @@ static ssize_t writev_raw(ne_socket *sock, const struct ne_iovec *vector, int co ret = total; ne_free(wasvector); +#elif defined(MSG_NOSIGNAL) && defined(HAVE_SENDMSG) + struct msghdr m; + + memset(&m, 0, sizeof m); + m.msg_iov = (struct iovec *)vector; + m.msg_iovlen = count; + + do { + ret = sendmsg(sock->fd, &m, MSG_NOSIGNAL); + } while (ret == -1 && NE_ISINTR(ne_errno)); + #else const struct iovec *vec = (const struct iovec *) vector; |