version 1.223, 2014/05/18 14:46:15 |
version 1.232, 2014/08/05 07:55:31 |
|
|
* |
* |
* => Caller may specify another socket for lock sharing (must not be held). |
* => Caller may specify another socket for lock sharing (must not be held). |
* => Returns the new socket without lock held. |
* => Returns the new socket without lock held. |
*/ |
*/ |
int |
int |
socreate(int dom, struct socket **aso, int type, int proto, struct lwp *l, |
socreate(int dom, struct socket **aso, int type, int proto, struct lwp *l, |
struct socket *lockso) |
struct socket *lockso) |
Line 538 socreate(int dom, struct socket **aso, i |
|
Line 538 socreate(int dom, struct socket **aso, i |
|
uid = kauth_cred_geteuid(l->l_cred); |
uid = kauth_cred_geteuid(l->l_cred); |
so->so_uidinfo = uid_find(uid); |
so->so_uidinfo = uid_find(uid); |
so->so_cpid = l->l_proc->p_pid; |
so->so_cpid = l->l_proc->p_pid; |
if (lockso != NULL) { |
|
/* Caller wants us to share a lock. */ |
/* |
|
* Lock assigned and taken during PCB attach, unless we share |
|
* the lock with another socket, e.g. socketpair(2) case. |
|
*/ |
|
if (lockso) { |
lock = lockso->so_lock; |
lock = lockso->so_lock; |
so->so_lock = lock; |
so->so_lock = lock; |
mutex_obj_hold(lock); |
mutex_obj_hold(lock); |
/* XXX Why is this not solock, to match sounlock? */ |
|
mutex_enter(lock); |
mutex_enter(lock); |
} else { |
|
/* Lock assigned and taken during PRU_ATTACH. */ |
|
} |
} |
error = (*prp->pr_usrreqs->pr_generic)(so, PRU_ATTACH, NULL, |
|
(struct mbuf *)(long)proto, NULL, l); |
/* Attach the PCB (returns with the socket lock held). */ |
|
error = (*prp->pr_usrreqs->pr_attach)(so, proto); |
KASSERT(solocked(so)); |
KASSERT(solocked(so)); |
if (error != 0) { |
|
|
if (error) { |
KASSERT(so->so_pcb == NULL); |
KASSERT(so->so_pcb == NULL); |
so->so_state |= SS_NOFDREF; |
so->so_state |= SS_NOFDREF; |
sofree(so); |
sofree(so); |
Line 559 socreate(int dom, struct socket **aso, i |
|
Line 562 socreate(int dom, struct socket **aso, i |
|
} |
} |
so->so_cred = kauth_cred_dup(l->l_cred); |
so->so_cred = kauth_cred_dup(l->l_cred); |
sounlock(so); |
sounlock(so); |
|
|
*aso = so; |
*aso = so; |
return 0; |
return 0; |
} |
} |
Line 625 sobind(struct socket *so, struct mbuf *n |
|
Line 629 sobind(struct socket *so, struct mbuf *n |
|
int error; |
int error; |
|
|
solock(so); |
solock(so); |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam, l); |
PRU_BIND, NULL, nam, NULL, l); |
|
sounlock(so); |
sounlock(so); |
return error; |
return error; |
} |
} |
Line 642 solisten(struct socket *so, int backlog, |
|
Line 645 solisten(struct socket *so, int backlog, |
|
sounlock(so); |
sounlock(so); |
return EINVAL; |
return EINVAL; |
} |
} |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
error = (*so->so_proto->pr_usrreqs->pr_listen)(so, l); |
PRU_LISTEN, NULL, NULL, NULL, l); |
|
if (error != 0) { |
if (error != 0) { |
sounlock(so); |
sounlock(so); |
return error; |
return error; |
Line 752 soclose(struct socket *so) |
|
Line 754 soclose(struct socket *so) |
|
} |
} |
drop: |
drop: |
if (so->so_pcb) { |
if (so->so_pcb) { |
int error2 = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
KASSERT(solocked(so)); |
PRU_DETACH, NULL, NULL, NULL, NULL); |
(*so->so_proto->pr_usrreqs->pr_detach)(so); |
if (error == 0) |
|
error = error2; |
|
} |
} |
discard: |
discard: |
KASSERT((so->so_state & SS_NOFDREF) == 0); |
KASSERT((so->so_state & SS_NOFDREF) == 0); |
Line 778 soabort(struct socket *so) |
|
Line 778 soabort(struct socket *so) |
|
KASSERT(so->so_head == NULL); |
KASSERT(so->so_head == NULL); |
|
|
so->so_aborting++; /* XXX */ |
so->so_aborting++; /* XXX */ |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
error = (*so->so_proto->pr_usrreqs->pr_abort)(so); |
PRU_ABORT, NULL, NULL, NULL, NULL); |
|
refs = --so->so_aborting; /* XXX */ |
refs = --so->so_aborting; /* XXX */ |
if (error || (refs == 0)) { |
if (error || (refs == 0)) { |
sofree(so); |
sofree(so); |
Line 800 soaccept(struct socket *so, struct mbuf |
|
Line 799 soaccept(struct socket *so, struct mbuf |
|
so->so_state &= ~SS_NOFDREF; |
so->so_state &= ~SS_NOFDREF; |
if ((so->so_state & SS_ISDISCONNECTED) == 0 || |
if ((so->so_state & SS_ISDISCONNECTED) == 0 || |
(so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0) |
(so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0) |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam); |
PRU_ACCEPT, NULL, nam, NULL, NULL); |
|
else |
else |
error = ECONNABORTED; |
error = ECONNABORTED; |
|
|
Line 828 soconnect(struct socket *so, struct mbuf |
|
Line 826 soconnect(struct socket *so, struct mbuf |
|
(error = sodisconnect(so)))) |
(error = sodisconnect(so)))) |
error = EISCONN; |
error = EISCONN; |
else |
else |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l); |
PRU_CONNECT, NULL, nam, NULL, l); |
|
|
|
return error; |
return error; |
} |
} |
Line 855 sodisconnect(struct socket *so) |
|
Line 852 sodisconnect(struct socket *so) |
|
} else if (so->so_state & SS_ISDISCONNECTING) { |
} else if (so->so_state & SS_ISDISCONNECTING) { |
error = EALREADY; |
error = EALREADY; |
} else { |
} else { |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
error = (*so->so_proto->pr_usrreqs->pr_disconnect)(so); |
PRU_DISCONNECT, NULL, NULL, NULL, NULL); |
|
} |
} |
return (error); |
return (error); |
} |
} |
Line 1052 sosend(struct socket *so, struct mbuf *a |
|
Line 1048 sosend(struct socket *so, struct mbuf *a |
|
so->so_options |= SO_DONTROUTE; |
so->so_options |= SO_DONTROUTE; |
if (resid > 0) |
if (resid > 0) |
so->so_state |= SS_MORETOCOME; |
so->so_state |= SS_MORETOCOME; |
error = (*so->so_proto->pr_usrreqs->pr_generic)(so, |
if (flags & MSG_OOB) |
(flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND, |
error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so, |
top, addr, control, curlwp); |
top, control); |
|
else |
|
error = (*so->so_proto->pr_usrreqs->pr_send)(so, |
|
top, addr, control, l); |
if (dontroute) |
if (dontroute) |
so->so_options &= ~SO_DONTROUTE; |
so->so_options &= ~SO_DONTROUTE; |
if (resid > 0) |
if (resid > 0) |
Line 1166 soreceive(struct socket *so, struct mbuf |
|
Line 1165 soreceive(struct socket *so, struct mbuf |
|
if (flags & MSG_OOB) { |
if (flags & MSG_OOB) { |
m = m_get(M_WAIT, MT_DATA); |
m = m_get(M_WAIT, MT_DATA); |
solock(so); |
solock(so); |
error = (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVOOB, m, |
error = (*pr->pr_usrreqs->pr_recvoob)(so, m, flags & MSG_PEEK); |
(struct mbuf *)(long)(flags & MSG_PEEK), NULL, l); |
|
sounlock(so); |
sounlock(so); |
if (error) |
if (error) |
goto bad; |
goto bad; |
Line 1611 soshutdown(struct socket *so, int how) |
|
Line 1609 soshutdown(struct socket *so, int how) |
|
error = 0; |
error = 0; |
} |
} |
if (how == SHUT_WR || how == SHUT_RDWR) |
if (how == SHUT_WR || how == SHUT_RDWR) |
error = (*pr->pr_usrreqs->pr_generic)(so, |
error = (*pr->pr_usrreqs->pr_shutdown)(so); |
PRU_SHUTDOWN, NULL, NULL, NULL, NULL); |
|
|
|
return error; |
return error; |
} |
} |