diff --git a/include/common/compat.h b/include/common/compat.h index 8d406e5c46..dec5d7d430 100644 --- a/include/common/compat.h +++ b/include/common/compat.h @@ -54,6 +54,11 @@ #define SHUT_WR 1 #endif +/* only Linux defines it */ +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + /* AIX does not define MSG_DONTWAIT. We'll define it to zero, and test it * wherever appropriate. */ diff --git a/src/checks.c b/src/checks.c index b4e985702e..26d4706bf6 100644 --- a/src/checks.c +++ b/src/checks.c @@ -358,11 +358,7 @@ static int event_srv_chk_w(int fd) memcpy(s->proxy->check_req + 11, &gmt_time, 4); } -#ifndef MSG_NOSIGNAL - ret = send(fd, s->proxy->check_req, s->proxy->check_len, MSG_DONTWAIT); -#else ret = send(fd, s->proxy->check_req, s->proxy->check_len, MSG_DONTWAIT | MSG_NOSIGNAL); -#endif if (ret == s->proxy->check_len) { /* we allow up to if nonzero for a responce */ if (s->proxy->timeout.check) @@ -454,15 +450,11 @@ static int event_srv_chk_r(int fd) goto out_wakeup; } -#ifndef MSG_NOSIGNAL - len = recv(fd, trash, sizeof(trash), 0); -#else /* Warning! Linux returns EAGAIN on SO_ERROR if data are still available * but the connection was closed on the remote end. Fortunately, recv still * works correctly and we don't need to do the getsockopt() on linux. */ len = recv(fd, trash, sizeof(trash), MSG_NOSIGNAL); -#endif if (unlikely(len < 0 && errno == EAGAIN)) { /* we want some polling to happen first */ fdtab[fd].ev &= ~FD_POLL_IN; diff --git a/src/haproxy.c b/src/haproxy.c index 607ff155f4..240b8ad8b2 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -933,7 +933,7 @@ int main(int argc, char **argv) /* on very high loads, a sigpipe sometimes happen just between the * getsockopt() which tells "it's OK to write", and the following write :-( */ -#if !defined(MSG_NOSIGNAL) || defined(CONFIG_HAP_LINUX_SPLICE) +#if !MSG_NOSIGNAL || defined(CONFIG_HAP_LINUX_SPLICE) signal(SIGPIPE, SIG_IGN); #endif diff --git a/src/log.c b/src/log.c index 8d71eae3f5..b323d7e89a 100644 --- a/src/log.c +++ b/src/log.c @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -30,10 +31,6 @@ #include -#ifndef MSG_NOSIGNAL -#define MSG_NOSIGNAL (0) -#endif /* !MSG_NOSIGNAL */ - const char *log_facilities[NB_LOG_FACILITIES] = { "kern", "user", "mail", "daemon", "auth", "syslog", "lpr", "news", diff --git a/src/stream_sock.c b/src/stream_sock.c index bd8d271c11..0ee339c0c0 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -301,8 +301,9 @@ int stream_sock_read(int fd) { /* * 2. read the largest possible block */ -#ifndef MSG_NOSIGNAL - { + if (MSG_NOSIGNAL) { + ret = recv(fd, b->r, max, MSG_NOSIGNAL); + } else { int skerr; socklen_t lskerr = sizeof(skerr); @@ -312,9 +313,7 @@ int stream_sock_read(int fd) { else ret = recv(fd, b->r, max, 0); } -#else - ret = recv(fd, b->r, max, MSG_NOSIGNAL); -#endif + if (ret > 0) { b->r += ret; b->l += ret; @@ -574,8 +573,9 @@ static int stream_sock_write_loop(struct stream_interface *si, struct buffer *b) if (max > b->send_max) max = b->send_max; -#ifndef MSG_NOSIGNAL - { + if (MSG_NOSIGNAL) { + ret = send(si->fd, b->w, max, MSG_DONTWAIT | MSG_NOSIGNAL); + } else { int skerr; socklen_t lskerr = sizeof(skerr); @@ -585,9 +585,6 @@ static int stream_sock_write_loop(struct stream_interface *si, struct buffer *b) else ret = send(si->fd, b->w, max, MSG_DONTWAIT); } -#else - ret = send(si->fd, b->w, max, MSG_DONTWAIT | MSG_NOSIGNAL); -#endif if (ret > 0) { if (fdtab[si->fd].state == FD_STCONN)