pass protocol number to PRU_ATTACH for above;
use mbuf clusters for sends of >= NBPG;
send access rights once only if more than 1 mbuf of ordinary data;
fix PEEK moff code in soreceive
SCCS-vsn: sys/kern/uipc_socket.c 6.12
-/* uipc_socket.c 6.11 85/05/27 */
+/* uipc_socket.c 6.12 85/06/02 */
#include "param.h"
#include "systm.h"
#include "param.h"
#include "systm.h"
* switching out to the protocol specific routines.
*
* TODO:
* switching out to the protocol specific routines.
*
* TODO:
- * PR_RIGHTS
- * clean up select, async
* out-of-band is a kludge
*/
/*ARGSUSED*/
* out-of-band is a kludge
*/
/*ARGSUSED*/
register int error;
if (proto)
register int error;
if (proto)
- prp = pffindproto(dom, proto);
+ prp = pffindproto(dom, proto, type);
else
prp = pffindtype(dom, type);
if (prp == 0)
else
prp = pffindtype(dom, type);
if (prp == 0)
so->so_proto = prp;
error =
(*prp->pr_usrreq)(so, PRU_ATTACH,
so->so_proto = prp;
error =
(*prp->pr_usrreq)(so, PRU_ATTACH,
- (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0);
+ (struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0);
if (error) {
so->so_state |= SS_NOFDREF;
sofree(so);
if (error) {
so->so_state |= SS_NOFDREF;
sofree(so);
register struct iovec *iov = uio->uio_iov;
MGET(m, M_WAIT, MT_DATA);
register struct iovec *iov = uio->uio_iov;
MGET(m, M_WAIT, MT_DATA);
- if (iov->iov_len >= CLBYTES && space >= CLBYTES) {
+ if (iov->iov_len >= NBPG && space >= CLBYTES) {
register struct mbuf *p;
MCLGET(p, 1);
if (p == 0)
goto nopages;
m->m_off = (int)p - (int)m;
register struct mbuf *p;
MCLGET(p, 1);
if (p == 0)
goto nopages;
m->m_off = (int)p - (int)m;
+ len = min(CLBYTES, iov->iov_len);
+ space -= CLBYTES;
} else {
nopages:
len = MIN(MLEN, iov->iov_len);
} else {
nopages:
len = MIN(MLEN, iov->iov_len);
}
error = uiomove(mtod(m, caddr_t), len, UIO_WRITE, uio);
m->m_len = len;
}
error = uiomove(mtod(m, caddr_t), len, UIO_WRITE, uio);
m->m_len = len;
if (error)
goto release;
mp = &m->m_next;
if (error)
goto release;
mp = &m->m_next;
if (uio->uio_resid <= 0)
break;
while (uio->uio_iov->iov_len == 0) {
if (uio->uio_resid <= 0)
break;
while (uio->uio_iov->iov_len == 0) {
splx(s);
if (dontroute)
so->so_options &= ~SO_DONTROUTE;
splx(s);
if (dontroute)
so->so_options &= ~SO_DONTROUTE;
top = 0;
first = 0;
if (error)
top = 0;
first = 0;
if (error)
m = sbdroprecord(&so->so_rcv);
}
}
m = sbdroprecord(&so->so_rcv);
}
}
+ if (m == 0 || m->m_type != MT_DATA)
panic("receive 3");
moff = 0;
tomark = so->so_oobmark;
panic("receive 3");
moff = 0;
tomark = so->so_oobmark;
so->so_state &= ~SS_RCVATMARK;
if (tomark && len > tomark)
len = tomark;
so->so_state &= ~SS_RCVATMARK;
if (tomark && len > tomark)
len = tomark;
- if (moff+len > m->m_len - moff)
+ if (len > m->m_len - moff)
len = m->m_len - moff;
splx(s);
error =
uiomove(mtod(m, caddr_t) + moff, (int)len, UIO_READ, uio);
s = splnet();
len = m->m_len - moff;
splx(s);
error =
uiomove(mtod(m, caddr_t) + moff, (int)len, UIO_READ, uio);
s = splnet();
+ if (len == m->m_len - moff) {
if ((flags & MSG_PEEK) == 0) {
nextrecord = m->m_act;
sbfree(&so->so_rcv, m);
if ((flags & MSG_PEEK) == 0) {
nextrecord = m->m_act;
sbfree(&so->so_rcv, m);