projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
new clock style; select not tested
[unix-history]
/
usr
/
src
/
sys
/
kern
/
uipc_socket.c
diff --git
a/usr/src/sys/kern/uipc_socket.c
b/usr/src/sys/kern/uipc_socket.c
index
1193d69
..
9e3032a
100644
(file)
--- a/
usr/src/sys/kern/uipc_socket.c
+++ b/
usr/src/sys/kern/uipc_socket.c
@@
-1,4
+1,4
@@
-/* uipc_socket.c 4.4
7 82/08/14
*/
+/* uipc_socket.c 4.4
8 82/08/22
*/
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
@@
-121,7
+121,6
@@
soclose(so, exiting)
int exiting;
{
int s = splnet(); /* conservative */
int exiting;
{
int s = splnet(); /* conservative */
- register struct socket *so2;
if (so->so_options & SO_ACCEPTCONN) {
while (so->so_q0 != so)
if (so->so_options & SO_ACCEPTCONN) {
while (so->so_q0 != so)
@@
-252,16
+251,17
@@
bad:
* If must go all at once and not enough room now, then
* inform user that this would block and do nothing.
*/
* If must go all at once and not enough room now, then
* inform user that this would block and do nothing.
*/
-sosend(so, asa)
+sosend(so, asa
, uio
)
register struct socket *so;
struct sockaddr *asa;
register struct socket *so;
struct sockaddr *asa;
+ struct uio *uio;
{
struct mbuf *top = 0;
register struct mbuf *m, **mp = ⊤
register u_int len;
int error = 0, space, s;
{
struct mbuf *top = 0;
register struct mbuf *m, **mp = ⊤
register u_int len;
int error = 0, space, s;
- if (sosendallatonce(so) && u
.u_count
> so->so_snd.sb_hiwat)
+ if (sosendallatonce(so) && u
io->uio_resid
> so->so_snd.sb_hiwat)
return (EMSGSIZE);
#ifdef notdef
/* NEED TO PREVENT BUSY WAITING IN SELECT FOR WRITING */
return (EMSGSIZE);
#ifdef notdef
/* NEED TO PREVENT BUSY WAITING IN SELECT FOR WRITING */
@@
-299,12
+299,12
@@
again:
}
mp = ⊤
}
}
mp = ⊤
}
- if (u
.u_count
== 0) {
+ if (u
io->uio_resid
== 0) {
splx(s);
goto release;
}
space = sbspace(&so->so_snd);
splx(s);
goto release;
}
space = sbspace(&so->so_snd);
- if (space <= 0 || sosendallatonce(so) && space < u
.u_count
) {
+ if (space <= 0 || sosendallatonce(so) && space < u
io->uio_resid
) {
if (so->so_state & SS_NBIO)
snderr(EWOULDBLOCK);
sbunlock(&so->so_snd);
if (so->so_state & SS_NBIO)
snderr(EWOULDBLOCK);
sbunlock(&so->so_snd);
@@
-313,13
+313,22
@@
again:
goto restart;
}
splx(s);
goto restart;
}
splx(s);
- while (u.u_count && space > 0) {
+ while (uio->uio_resid > 0 && space > 0) {
+ register struct iovec *iov = uio->uio_iov;
+
+ if (iov->iov_len == 0) {
+ uio->uio_iov++;
+ uio->uio_iovcnt--;
+ if (uio->uio_iovcnt < 0)
+ panic("sosend");
+ continue;
+ }
MGET(m, 1);
if (m == NULL) {
error = ENOBUFS; /* SIGPIPE? */
goto release;
}
MGET(m, 1);
if (m == NULL) {
error = ENOBUFS; /* SIGPIPE? */
goto release;
}
- if (
u.u_count
>= CLBYTES && space >= CLBYTES) {
+ if (
iov->iov_len
>= CLBYTES && space >= CLBYTES) {
register struct mbuf *p;
MCLGET(p, 1);
if (p == 0)
register struct mbuf *p;
MCLGET(p, 1);
if (p == 0)
@@
-329,9
+338,9
@@
again:
} else {
nopages:
m->m_off = MMINOFF;
} else {
nopages:
m->m_off = MMINOFF;
- len = MIN(MLEN,
u.u_count
);
+ len = MIN(MLEN,
iov->iov_len
);
}
}
-
iomove(mtod(m, caddr_t), len, B_WRITE
);
+
uiomove(mtod(m, caddr_t), len, UIO_WRITE, uio
);
m->m_len = len;
*mp = m;
mp = &m->m_next;
m->m_len = len;
*mp = m;
mp = &m->m_next;
@@
-354,8
+363,7
@@
soreceive(so, asa, uio)
register struct iovec *iov;
register struct mbuf *m, *n;
u_int len;
register struct iovec *iov;
register struct mbuf *m, *n;
u_int len;
- int eor, s, error = 0, resid = uio->uio_resid;
- int cnt;
+ int eor, s, error = 0;
restart:
sblock(&so->so_rcv);
restart:
sblock(&so->so_rcv);
@@
-400,17
+408,16
@@
restart:
}
eor = 0;
do {
}
eor = 0;
do {
- if (uio->uio_
iovcnt =
= 0)
+ if (uio->uio_
resid <
= 0)
break;
break;
- iov = uio->uio_iov;
- len = iov->iov_len;
+ len = uio->uio_resid;
so->so_state &= ~SS_RCVATMARK;
if (so->so_oobmark && len > so->so_oobmark)
len = so->so_oobmark;
if (len > m->m_len)
len = m->m_len;
splx(s);
so->so_state &= ~SS_RCVATMARK;
if (so->so_oobmark && len > so->so_oobmark)
len = so->so_oobmark;
if (len > m->m_len)
len = m->m_len;
splx(s);
- uiomove(mtod(m, caddr_t),
len, UIO_WRITETO
, uio);
+ uiomove(mtod(m, caddr_t),
(int)len, UIO_READ
, uio);
s = splnet();
if (len == m->m_len) {
eor = (int)m->m_act;
s = splnet();
if (len == m->m_len) {
eor = (int)m->m_act;