Index: sys/kern/uipc_socket.c =================================================================== --- sys/kern/uipc_socket.c +++ sys/kern/uipc_socket.c @@ -2340,13 +2340,18 @@ soshutdown(struct socket *so, int how) { struct protosw *pr = so->so_proto; - int error; + int error, fakeerror; if (!(how == SHUT_RD || how == SHUT_WR || how == SHUT_RDWR)) return (EINVAL); + + fakeerror = 0; if ((so->so_state & - (SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING)) == 0) - return (ENOTCONN); + (SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING)) == 0) { + fakeerror = ENOTCONN; + if (so->so_type != SOCK_DGRAM) + return (fakeerror); + } CURVNET_SET(so->so_vnet); if (pr->pr_usrreqs->pru_flush != NULL) @@ -2357,11 +2362,12 @@ error = (*pr->pr_usrreqs->pru_shutdown)(so); wakeup(&so->so_timeo); CURVNET_RESTORE(); - return (error); + return (error == 0 ? fakeerror : error); } wakeup(&so->so_timeo); CURVNET_RESTORE(); - return (0); + + return (fakeerror); } void