summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Antonuk <alan.antonuk@gmail.com>2012-06-06 15:02:14 -0700
committerAlan Antonuk <alan.antonuk@gmail.com>2012-06-06 15:02:14 -0700
commit42e3f34dce8933be40913b693159e83642f461ac (patch)
treecfc7421b2d4bf97fd50941f87598b81aa081349d
parentfe5a35ae194307aef7cd0da2cb5265cbdff005fc (diff)
parentd2462806af2a2f58a689211f5b381c3a3eea1e8e (diff)
downloadrabbitmq-c-github-ask-42e3f34dce8933be40913b693159e83642f461ac.tar.gz
Merge pull request #24 from alanxz/issue23
Disable SIGPIPE on sockets (Issue #23)
-rw-r--r--librabbitmq/amqp_connection.c2
-rw-r--r--librabbitmq/amqp_socket.c10
-rw-r--r--librabbitmq/unix/socket.h8
-rw-r--r--librabbitmq/win32/socket.h4
4 files changed, 22 insertions, 2 deletions
diff --git a/librabbitmq/amqp_connection.c b/librabbitmq/amqp_connection.c
index 561d496..4639b68 100644
--- a/librabbitmq/amqp_connection.c
+++ b/librabbitmq/amqp_connection.c
@@ -413,7 +413,7 @@ int amqp_send_frame(amqp_connection_state_t state,
amqp_e32(out_frame, 3, out_frame_len);
amqp_e8(out_frame, out_frame_len + HEADER_SIZE, AMQP_FRAME_END);
res = send(state->sockfd, out_frame,
- out_frame_len + HEADER_SIZE + FOOTER_SIZE, 0);
+ out_frame_len + HEADER_SIZE + FOOTER_SIZE, MSG_NOSIGNAL);
}
if (res < 0)
diff --git a/librabbitmq/amqp_socket.c b/librabbitmq/amqp_socket.c
index 6b9486c..2034f17 100644
--- a/librabbitmq/amqp_socket.c
+++ b/librabbitmq/amqp_socket.c
@@ -66,6 +66,14 @@ int amqp_open_socket(char const *hostname,
if (sockfd == -1)
return -amqp_socket_error();
+#ifdef DISABLE_SIGPIPE_WITH_SETSOCKOPT
+ if (0 != amqp_socket_setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &one,
+ sizeof(one)))
+ {
+ return -amqp_socket_error();
+ }
+#endif
+
if (amqp_socket_setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &one,
sizeof(one)) < 0
|| connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
@@ -83,7 +91,7 @@ int amqp_send_header(amqp_connection_state_t state) {
AMQP_PROTOCOL_VERSION_MAJOR,
AMQP_PROTOCOL_VERSION_MINOR,
AMQP_PROTOCOL_VERSION_REVISION };
- return send(state->sockfd, (void *)header, 8, 0);
+ return send(state->sockfd, (void *)header, 8, MSG_NOSIGNAL);
}
static amqp_bytes_t sasl_method_name(amqp_sasl_method_enum method) {
diff --git a/librabbitmq/unix/socket.h b/librabbitmq/unix/socket.h
index ff6fa73..d57cb7b 100644
--- a/librabbitmq/unix/socket.h
+++ b/librabbitmq/unix/socket.h
@@ -55,4 +55,12 @@ amqp_socket_error(void);
#define amqp_socket_close close
#define amqp_socket_writev writev
+#ifndef MSG_NOSIGNAL
+# define MSG_NOSIGNAL 0x0
+#endif
+
+#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
+# define DISABLE_SIGPIPE_WITH_SETSOCKOPT
+#endif
+
#endif
diff --git a/librabbitmq/win32/socket.h b/librabbitmq/win32/socket.h
index 4572410..3b9c452 100644
--- a/librabbitmq/win32/socket.h
+++ b/librabbitmq/win32/socket.h
@@ -57,4 +57,8 @@ amqp_socket_writev(int sock, struct iovec *iov, int nvecs);
int
amqp_socket_error(void);
+#ifndef MSG_NOSIGNAL
+# define MSG_NOSIGNAL 0x0
+#endif
+
#endif