diff --git a/headers/posix/sys/socket.h b/headers/posix/sys/socket.h index 16547a8752..ec67563b82 100644 --- a/headers/posix/sys/socket.h +++ b/headers/posix/sys/socket.h @@ -121,6 +121,7 @@ struct msghdr { #define MSG_BCAST 0x0100 /* this message rec'd as broadcast */ #define MSG_MCAST 0x0200 /* this message rec'd as multicast */ #define MSG_EOF 0x0400 /* data completes connection */ +#define MSG_NOSIGNAL 0x0800 /* don't raise SIGPIPE if socket is closed */ struct cmsghdr { socklen_t cmsg_len; diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index ce4769bda0..20261ca0e5 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -785,8 +785,10 @@ TCPEndpoint::SendData(net_buffer *buffer) MutexLocker lock(fLock); TRACE("SendData(buffer %p, size %lu, flags %lx) [total %lu bytes, has %lu]", - buffer, buffer->size, buffer->flags, fSendQueue.Size(), - fSendQueue.Free()); + buffer, buffer->size, buffer->flags, fSendQueue.Size(), + fSendQueue.Free()); + + uint32 flags = buffer->flags; if (fState == CLOSED) return ENOTCONN; @@ -794,12 +796,11 @@ TCPEndpoint::SendData(net_buffer *buffer) return EDESTADDRREQ; if (!is_writable(fState) && !is_establishing(fState)) { // we only send signals when called from userland - if (gStackModule->is_syscall()) + if (gStackModule->is_syscall() && (flags & MSG_NOSIGNAL != 0)) send_signal(find_thread(NULL), SIGPIPE); return EPIPE; } - uint32 flags = buffer->flags; size_t left = buffer->size; bigtime_t timeout = absolute_timeout(socket->send.timeout);