summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Orton <joe@manyfish.uk>2020-11-21 11:23:27 +0000
committerJoe Orton <joe@manyfish.uk>2020-11-21 11:23:27 +0000
commit3870f2449c40fd943e1470a0365d4dfc89878bb7 (patch)
tree5c4bd6706eec1212b7387454a9280156def75b2c
parent0f2d07907722af1f18866b9a97c7b5debed1a3f2 (diff)
downloadneon-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.m42
-rw-r--r--src/ne_socket.c19
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;