| version 1.29.4.1, 1998/01/30 19:24:12 |
version 1.29.4.2, 1999/01/25 05:49:42 |
|
|
| if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
| return; |
return; |
| if (so->so_head) { |
if (so->so_head) { |
| if (!soqremque(so, 0) && !soqremque(so, 1)) |
/* |
| panic("sofree dq"); |
* We must not decommission a socket that's on the accept(2) |
| so->so_head = 0; |
* queue. If we do, then accept(2) may hang after select(2) |
| |
* indicated that the listening socket was ready. |
| |
*/ |
| |
if (!soqremque(so, 0)) |
| |
return; |
| } |
} |
| sbrelease(&so->so_snd); |
sbrelease(&so->so_snd); |
| sorflush(so); |
sorflush(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); |
(void) soqremque(so2, 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) { |
| |
(void) soqremque(so2, 1); |
| |
(void) soabort(so2); |
| |
} |
| } |
} |
| if (so->so_pcb == 0) |
if (so->so_pcb == 0) |
| goto discard; |
goto discard; |
| Line 234 soaccept(so, nam) |
|
| Line 243 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); |
| } |
} |