Просмотр исходного кода

core: network: avoid raising SIGPIPE

Daniele Bartolini 6 лет назад
Родитель
Сommit
6cbb501776
2 измененных файлов с 5 добавлено и 1 удалено
  1. 4 1
      src/core/network/socket.cpp
  2. 1 0
      src/core/network/socket.h

+ 4 - 1
src/core/network/socket.cpp

@@ -24,6 +24,7 @@
 	#define WSAEWOULDBLOCK EWOULDBLOCK
 	#define WSAEWOULDBLOCK EWOULDBLOCK
 #elif CROWN_PLATFORM_WINDOWS
 #elif CROWN_PLATFORM_WINDOWS
 	#include <winsock2.h>
 	#include <winsock2.h>
+	#define MSG_NOSIGNAL 0
 #endif // CROWN_PLATFORM_POSIX
 #endif // CROWN_PLATFORM_POSIX
 
 
 namespace crown
 namespace crown
@@ -130,7 +131,7 @@ namespace socket_internal
 			int bytes_wrote = ::send(socket
 			int bytes_wrote = ::send(socket
 				, (char*)data + wr.bytes_wrote
 				, (char*)data + wr.bytes_wrote
 				, to_write
 				, to_write
-				, 0
+				, MSG_NOSIGNAL // Don't generate SIGPIPE, return EPIPE instead.
 				);
 				);
 
 
 			if (bytes_wrote == SOCKET_ERROR)
 			if (bytes_wrote == SOCKET_ERROR)
@@ -139,6 +140,8 @@ namespace socket_internal
 					wr.error = WriteResult::WOULDBLOCK;
 					wr.error = WriteResult::WOULDBLOCK;
 				else if (last_error() == WSAETIMEDOUT)
 				else if (last_error() == WSAETIMEDOUT)
 					wr.error = WriteResult::TIMEOUT;
 					wr.error = WriteResult::TIMEOUT;
+				else if (last_error() == EPIPE)
+					wr.error = WriteResult::PIPE;
 				else
 				else
 					wr.error = WriteResult::UNKNOWN;
 					wr.error = WriteResult::UNKNOWN;
 				return wr;
 				return wr;

+ 1 - 0
src/core/network/socket.h

@@ -62,6 +62,7 @@ struct WriteResult
 		WOULDBLOCK,
 		WOULDBLOCK,
 		REMOTE_CLOSED,
 		REMOTE_CLOSED,
 		TIMEOUT,
 		TIMEOUT,
+		PIPE,
 		UNKNOWN
 		UNKNOWN
 	} error;
 	} error;
 	u32 bytes_wrote;
 	u32 bytes_wrote;