VSockVmciShutdown(struct socket *sock, // IN
int mode) // IN
{
+ int32 err;
struct sock *sk;
/*
return -EINVAL;
}
+ /*
+ * If this is a STREAM socket and it is not connected then bail out
+ * immediately. If it is a DGRAM socket then we must first kick the socket
+ * so that it wakes up from any sleeping calls, for example recv(), and then
+ * afterwards return the error.
+ */
+
sk = sock->sk;
- if (sk->sk_type == SOCK_STREAM && sock->state == SS_UNCONNECTED) {
- return -ENOTCONN;
+ if (sock->state == SS_UNCONNECTED) {
+ err = -ENOTCONN;
+ if (sk->sk_type == SOCK_STREAM) {
+ return err;
+ }
+ } else {
+ sock->state = SS_DISCONNECTING;
+ err = 0;
}
- sock->state = SS_DISCONNECTING;
-
/* Receive and send shutdowns are treated alike. */
mode = mode & (RCV_SHUTDOWN | SEND_SHUTDOWN);
if (mode) {
VSOCK_SEND_SHUTDOWN(sk, mode);
}
- return 0;
+ return err;
}