summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/brand/lx/syscall/lx_socket.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_socket.c b/usr/src/uts/common/brand/lx/syscall/lx_socket.c
index 54e3ddfd17..f51e2c3932 100644
--- a/usr/src/uts/common/brand/lx/syscall/lx_socket.c
+++ b/usr/src/uts/common/brand/lx/syscall/lx_socket.c
@@ -1670,6 +1670,7 @@ lx_socket_sendmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop,
}
error = SOP_SENDMSG(so, msg, uiop, cr);
+
switch (error) {
case EINTR:
case ENOMEM:
@@ -1682,10 +1683,18 @@ lx_socket_sendmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop,
break;
case ENOTCONN:
+ /*
+ * The rules are different for non-blocking sockets which are
+ * still in the process of making a connection
+ */
+ if ((msg->msg_flags & MSG_DONTWAIT) != 0) {
+ error = EAGAIN;
+ break;
+ }
+
/* Appease LTP and match behavior detailed in the man page */
error = EPIPE;
/* FALLTHROUGH */
-
case EPIPE:
if (nosig == B_FALSE) {
tsignal(curthread, SIGPIPE);