mirror of
https://github.com/freebsd/freebsd-src
synced 2024-07-09 04:36:31 +00:00
sockets: provide correct pr_shutdown for keysock and SDP
My failure to run all kinds of kernel builds lead to missing the keysock
and incorrectly assuming SDP as not having a shutdown method.
Fixes: 5bba272807
This commit is contained in:
parent
61a0eaca0d
commit
296a4cb5c5
|
@ -310,9 +310,24 @@ key_detach(struct socket *so)
|
|||
}
|
||||
|
||||
static int
|
||||
key_shutdown(struct socket *so)
|
||||
key_shutdown(struct socket *so, enum shutdown_how how)
|
||||
{
|
||||
socantsendmore(so);
|
||||
/*
|
||||
* Note: key socket marks itself as connected through its lifetime.
|
||||
*/
|
||||
switch (how) {
|
||||
case SHUT_RD:
|
||||
socantrcvmore(so);
|
||||
sbrelease(so, SO_RCV);
|
||||
break;
|
||||
case SHUT_RDWR:
|
||||
socantrcvmore(so);
|
||||
sbrelease(so, SO_RCV);
|
||||
/* FALLTHROUGH */
|
||||
case SHUT_WR:
|
||||
socantsendmore(so);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
@ -787,24 +787,50 @@ sdp_accept(struct socket *so, struct sockaddr *sa)
|
|||
* Mark the connection as being incapable of further output.
|
||||
*/
|
||||
static int
|
||||
sdp_shutdown(struct socket *so)
|
||||
sdp_shutdown(struct socket *so, enum shutdown_how how)
|
||||
{
|
||||
struct sdp_sock *ssk = sdp_sk(so);
|
||||
int error = 0;
|
||||
struct sdp_sock *ssk;
|
||||
|
||||
ssk = sdp_sk(so);
|
||||
SDP_WLOCK(ssk);
|
||||
if (ssk->flags & (SDP_TIMEWAIT | SDP_DROPPED)) {
|
||||
error = ECONNRESET;
|
||||
goto out;
|
||||
SOCK_LOCK(so);
|
||||
if ((so->so_state &
|
||||
(SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING)) == 0) {
|
||||
SOCK_UNLOCK(so);
|
||||
return (ENOTCONN);
|
||||
}
|
||||
socantsendmore(so);
|
||||
sdp_usrclosed(ssk);
|
||||
if (!(ssk->flags & SDP_DROPPED))
|
||||
sdp_output_disconnect(ssk);
|
||||
if (SOLISTENING(so)) {
|
||||
if (how != SHUT_WR) {
|
||||
so->so_error = ECONNABORTED;
|
||||
solisten_wakeup(so); /* unlocks so */
|
||||
} else
|
||||
SOCK_UNLOCK(so);
|
||||
return (0);
|
||||
}
|
||||
SOCK_UNLOCK(so);
|
||||
|
||||
out:
|
||||
SDP_WUNLOCK(ssk);
|
||||
switch (how) {
|
||||
case SHUT_RD:
|
||||
socantrcvmore(so);
|
||||
sbrelease(so, SO_RCV);
|
||||
break;
|
||||
case SHUT_RDWR:
|
||||
socantrcvmore(so);
|
||||
sbrelease(so, SO_RCV);
|
||||
/* FALLTHROUGH */
|
||||
case SHUT_WR:
|
||||
SDP_WLOCK(ssk);
|
||||
if (ssk->flags & (SDP_TIMEWAIT | SDP_DROPPED)) {
|
||||
SDP_WUNLOCK(ssk);
|
||||
error = ECONNRESET;
|
||||
break;
|
||||
}
|
||||
socantsendmore(so);
|
||||
sdp_usrclosed(ssk);
|
||||
if (!(ssk->flags & SDP_DROPPED))
|
||||
sdp_output_disconnect(ssk);
|
||||
SDP_WUNLOCK(ssk);
|
||||
}
|
||||
wakeup(&so->so_timeo);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user