version 1.133, 2010/11/19 06:44:43 |
version 1.133.2.1, 2011/06/06 09:09:40 |
Line 124 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 124 __KERNEL_RCSID(0, "$NetBSD$"); |
|
* Unix communications domain. |
* Unix communications domain. |
* |
* |
* TODO: |
* TODO: |
* SEQPACKET, RDM |
* RDM |
* rethink name space problems |
* rethink name space problems |
* need a proper out-of-band |
* need a proper out-of-band |
* |
* |
Line 487 uipc_usrreq(struct socket *so, int req, |
|
Line 487 uipc_usrreq(struct socket *so, int req, |
|
panic("uipc 1"); |
panic("uipc 1"); |
/*NOTREACHED*/ |
/*NOTREACHED*/ |
|
|
|
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
case SOCK_STREAM: |
case SOCK_STREAM: |
#define rcv (&so->so_rcv) |
#define rcv (&so->so_rcv) |
#define snd (&so2->so_snd) |
#define snd (&so2->so_snd) |
Line 567 uipc_usrreq(struct socket *so, int req, |
|
Line 568 uipc_usrreq(struct socket *so, int req, |
|
break; |
break; |
} |
} |
|
|
|
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
case SOCK_STREAM: |
case SOCK_STREAM: |
#define rcv (&so2->so_rcv) |
#define rcv (&so2->so_rcv) |
#define snd (&so->so_snd) |
#define snd (&so->so_snd) |
Line 579 uipc_usrreq(struct socket *so, int req, |
|
Line 581 uipc_usrreq(struct socket *so, int req, |
|
if (unp->unp_conn->unp_flags & UNP_WANTCRED) { |
if (unp->unp_conn->unp_flags & UNP_WANTCRED) { |
/* |
/* |
* Credentials are passed only once on |
* Credentials are passed only once on |
* SOCK_STREAM. |
* SOCK_STREAM and SOCK_SEQPACKET. |
*/ |
*/ |
unp->unp_conn->unp_flags &= ~UNP_WANTCRED; |
unp->unp_conn->unp_flags &= ~UNP_WANTCRED; |
control = unp_addsockcred(l, control); |
control = unp_addsockcred(l, control); |
Line 592 uipc_usrreq(struct socket *so, int req, |
|
Line 594 uipc_usrreq(struct socket *so, int req, |
|
if (control) { |
if (control) { |
if (sbappendcontrol(rcv, m, control) != 0) |
if (sbappendcontrol(rcv, m, control) != 0) |
control = NULL; |
control = NULL; |
} else |
} else { |
sbappend(rcv, m); |
switch(so->so_type) { |
|
case SOCK_SEQPACKET: |
|
sbappendrecord(rcv, m); |
|
break; |
|
case SOCK_STREAM: |
|
sbappend(rcv, m); |
|
break; |
|
default: |
|
panic("uipc_usrreq"); |
|
break; |
|
} |
|
} |
snd->sb_mbmax -= |
snd->sb_mbmax -= |
rcv->sb_mbcnt - unp->unp_conn->unp_mbcnt; |
rcv->sb_mbcnt - unp->unp_conn->unp_mbcnt; |
unp->unp_conn->unp_mbcnt = rcv->sb_mbcnt; |
unp->unp_conn->unp_mbcnt = rcv->sb_mbcnt; |
Line 629 uipc_usrreq(struct socket *so, int req, |
|
Line 642 uipc_usrreq(struct socket *so, int req, |
|
|
|
case PRU_SENSE: |
case PRU_SENSE: |
((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat; |
((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat; |
if (so->so_type == SOCK_STREAM && unp->unp_conn != 0) { |
switch (so->so_type) { |
|
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
|
case SOCK_STREAM: |
|
if (unp->unp_conn == 0) |
|
break; |
|
|
so2 = unp->unp_conn->unp_socket; |
so2 = unp->unp_conn->unp_socket; |
KASSERT(solocked2(so, so2)); |
KASSERT(solocked2(so, so2)); |
((struct stat *) m)->st_blksize += so2->so_rcv.sb_cc; |
((struct stat *) m)->st_blksize += so2->so_rcv.sb_cc; |
|
break; |
|
default: |
|
break; |
} |
} |
((struct stat *) m)->st_dev = NODEV; |
((struct stat *) m)->st_dev = NODEV; |
if (unp->unp_ino == 0) |
if (unp->unp_ino == 0) |
Line 767 unp_attach(struct socket *so) |
|
Line 788 unp_attach(struct socket *so) |
|
int error; |
int error; |
|
|
switch (so->so_type) { |
switch (so->so_type) { |
|
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
case SOCK_STREAM: |
case SOCK_STREAM: |
if (so->so_lock == NULL) { |
if (so->so_lock == NULL) { |
/* |
/* |
Line 1093 unp_connect2(struct socket *so, struct s |
|
Line 1115 unp_connect2(struct socket *so, struct s |
|
soisconnected(so); |
soisconnected(so); |
break; |
break; |
|
|
|
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
case SOCK_STREAM: |
case SOCK_STREAM: |
unp2->unp_conn = unp; |
unp2->unp_conn = unp; |
if (req == PRU_CONNECT && |
if (req == PRU_CONNECT && |
Line 1150 unp_disconnect(struct unpcb *unp) |
|
Line 1173 unp_disconnect(struct unpcb *unp) |
|
so->so_state &= ~SS_ISCONNECTED; |
so->so_state &= ~SS_ISCONNECTED; |
break; |
break; |
|
|
|
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
case SOCK_STREAM: |
case SOCK_STREAM: |
KASSERT(solocked2(so, unp2->unp_socket)); |
KASSERT(solocked2(so, unp2->unp_socket)); |
soisdisconnected(so); |
soisdisconnected(so); |
Line 1171 unp_shutdown(struct unpcb *unp) |
|
Line 1195 unp_shutdown(struct unpcb *unp) |
|
{ |
{ |
struct socket *so; |
struct socket *so; |
|
|
if (unp->unp_socket->so_type == SOCK_STREAM && unp->unp_conn && |
switch(unp->unp_socket->so_type) { |
(so = unp->unp_conn->unp_socket)) |
case SOCK_SEQPACKET: /* FALLTHROUGH */ |
socantrcvmore(so); |
case SOCK_STREAM: |
|
if (unp->unp_conn && (so = unp->unp_conn->unp_socket)) |
|
socantrcvmore(so); |
|
break; |
|
default: |
|
break; |
|
} |
} |
} |
|
|
bool |
bool |