| version 1.40, 1998/12/16 00:26:10 |
version 1.41, 1999/01/20 09:15:41 |
|
|
| register struct socket *so; |
register struct socket *so; |
| { |
{ |
| |
|
| if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
/* |
| |
* We must not decommission a socket that's on the accept(2) queue. |
| |
* If we do, then accept(2) may hang even after select(2) indicated |
| |
* that the listening socket was ready. |
| |
*/ |
| |
if (so->so_pcb || so->so_head || (so->so_state & SS_NOFDREF) == 0) |
| return; |
return; |
| if (so->so_head) { |
|
| if (!soqremque(so, 0) && !soqremque(so, 1)) |
|
| panic("sofree dq"); |
|
| so->so_head = 0; |
|
| } |
|
| sbrelease(&so->so_snd); |
sbrelease(&so->so_snd); |
| sorflush(so); |
sorflush(so); |
| pool_put(&socket_pool, so); |
pool_put(&socket_pool, so); |
|
|
| soclose(so) |
soclose(so) |
| register struct socket *so; |
register struct socket *so; |
| { |
{ |
| |
struct socket *so2; |
| int s = splsoftnet(); /* conservative */ |
int s = splsoftnet(); /* conservative */ |
| int error = 0; |
int error = 0; |
| |
|
| if (so->so_options & SO_ACCEPTCONN) { |
if (so->so_options & SO_ACCEPTCONN) { |
| while (so->so_q0.tqh_first) |
while ((so2 = so->so_q0.tqh_first) != 0) { |
| (void) soabort(so->so_q0.tqh_first); |
so2->so_head = 0; |
| while (so->so_q.tqh_first) |
(void) soabort(so2); |
| (void) soabort(so->so_q.tqh_first); |
} |
| |
while ((so2 = so->so_q.tqh_first) != 0) { |
| |
so2->so_head = 0; |
| |
(void) soabort(so2); |
| |
} |
| } |
} |
| if (so->so_pcb == 0) |
if (so->so_pcb == 0) |
| goto discard; |
goto discard; |
| Line 253 soaccept(so, nam) |
|
| Line 258 soaccept(so, nam) |
|
| if ((so->so_state & SS_NOFDREF) == 0) |
if ((so->so_state & SS_NOFDREF) == 0) |
| panic("soaccept: !NOFDREF"); |
panic("soaccept: !NOFDREF"); |
| so->so_state &= ~SS_NOFDREF; |
so->so_state &= ~SS_NOFDREF; |
| error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, (struct mbuf *)0, |
if ((so->so_state & SS_ISDISCONNECTED) == 0) |
| nam, (struct mbuf *)0, (struct proc *)0); |
error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, |
| |
(struct mbuf *)0, nam, (struct mbuf *)0, (struct proc *)0); |
| |
else |
| |
error = 0; |
| splx(s); |
splx(s); |
| return (error); |
return (error); |
| } |
} |