Add MSG_NOSIGNAL flag to send call to avoid SIGPIPE (#128)
Add MSG_NOSIGNAL flag to send call to avoid SIGPIPE merged-on-behalf-of: Sönke Ludwig <s-ludwig@users.noreply.github.com>
This commit is contained in:
parent
bca94d5736
commit
782fc40152
|
@ -96,6 +96,16 @@ version (Windows) {
|
||||||
extern (C) int close(int fd) nothrow @safe;
|
extern (C) int close(int fd) nothrow @safe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version (Posix) {
|
||||||
|
version (OSX) {
|
||||||
|
enum SEND_FLAGS = 0;
|
||||||
|
} else {
|
||||||
|
enum SEND_FLAGS = MSG_NOSIGNAL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
enum SEND_FLAGS = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets {
|
final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets {
|
||||||
@safe: /*@nogc:*/ nothrow:
|
@safe: /*@nogc:*/ nothrow:
|
||||||
|
@ -464,7 +474,7 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets
|
||||||
}
|
}
|
||||||
|
|
||||||
sizediff_t ret;
|
sizediff_t ret;
|
||||||
() @trusted { ret = .send(cast(sock_t)socket, buffer.ptr, min(buffer.length, int.max), 0); } ();
|
() @trusted { ret = .send(cast(sock_t)socket, buffer.ptr, min(buffer.length, int.max), SEND_FLAGS); } ();
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
auto err = getSocketError();
|
auto err = getSocketError();
|
||||||
|
@ -517,7 +527,7 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets
|
||||||
auto socket = cast(StreamSocketFD)fd;
|
auto socket = cast(StreamSocketFD)fd;
|
||||||
|
|
||||||
sizediff_t ret;
|
sizediff_t ret;
|
||||||
() @trusted { ret = .send(cast(sock_t)socket, slot.writeBuffer.ptr, min(slot.writeBuffer.length, int.max), 0); } ();
|
() @trusted { ret = .send(cast(sock_t)socket, slot.writeBuffer.ptr, min(slot.writeBuffer.length, int.max), SEND_FLAGS); } ();
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
auto err = getSocketError();
|
auto err = getSocketError();
|
||||||
|
@ -792,10 +802,10 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets
|
||||||
|
|
||||||
sizediff_t ret;
|
sizediff_t ret;
|
||||||
if (target_address) {
|
if (target_address) {
|
||||||
() @trusted { ret = .sendto(cast(sock_t)socket, buffer.ptr, min(buffer.length, int.max), 0, target_address.name, target_address.nameLen); } ();
|
() @trusted { ret = .sendto(cast(sock_t)socket, buffer.ptr, min(buffer.length, int.max), SEND_FLAGS, target_address.name, target_address.nameLen); } ();
|
||||||
m_loop.m_fds[socket].datagramSocket.targetAddr = target_address;
|
m_loop.m_fds[socket].datagramSocket.targetAddr = target_address;
|
||||||
} else {
|
} else {
|
||||||
() @trusted { ret = .send(cast(sock_t)socket, buffer.ptr, min(buffer.length, int.max), 0); } ();
|
() @trusted { ret = .send(cast(sock_t)socket, buffer.ptr, min(buffer.length, int.max), SEND_FLAGS); } ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -838,9 +848,9 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets
|
||||||
|
|
||||||
sizediff_t ret;
|
sizediff_t ret;
|
||||||
if (slot.targetAddr) {
|
if (slot.targetAddr) {
|
||||||
() @trusted { ret = .sendto(cast(sock_t)socket, slot.writeBuffer.ptr, min(slot.writeBuffer.length, int.max), 0, slot.targetAddr.name, slot.targetAddr.nameLen); } ();
|
() @trusted { ret = .sendto(cast(sock_t)socket, slot.writeBuffer.ptr, min(slot.writeBuffer.length, int.max), SEND_FLAGS, slot.targetAddr.name, slot.targetAddr.nameLen); } ();
|
||||||
} else {
|
} else {
|
||||||
() @trusted { ret = .send(cast(sock_t)socket, slot.writeBuffer.ptr, min(slot.writeBuffer.length, int.max), 0); } ();
|
() @trusted { ret = .send(cast(sock_t)socket, slot.writeBuffer.ptr, min(slot.writeBuffer.length, int.max), SEND_FLAGS); } ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -940,6 +950,12 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets
|
||||||
() @trusted { sock = socket(family, type, 0); } ();
|
() @trusted { sock = socket(family, type, 0); } ();
|
||||||
if (sock == -1) return -1;
|
if (sock == -1) return -1;
|
||||||
setSocketNonBlocking(cast(SocketFD)sock, true);
|
setSocketNonBlocking(cast(SocketFD)sock, true);
|
||||||
|
|
||||||
|
// Prevent SIGPIPE on failed send
|
||||||
|
version (OSX) {
|
||||||
|
int val = 1;
|
||||||
|
() @trusted { setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &val, val.sizeof); } ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return sock;
|
return sock;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue