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
correct no-such-process error
[unix-history]
/
usr
/
src
/
sys
/
kern
/
uipc_syscalls.c
diff --git
a/usr/src/sys/kern/uipc_syscalls.c
b/usr/src/sys/kern/uipc_syscalls.c
index
a76b4a1
..
727b9dd
100644
(file)
--- a/
usr/src/sys/kern/uipc_syscalls.c
+++ b/
usr/src/sys/kern/uipc_syscalls.c
@@
-1,18
+1,24
@@
-/* uipc_syscalls.c 4.48 83/07/25 */
-
-#include "../h/param.h"
-#include "../h/systm.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/proc.h"
-#include "../h/file.h"
-#include "../h/inode.h"
-#include "../h/buf.h"
-#include "../h/mbuf.h"
-#include "../h/protosw.h"
-#include "../h/socket.h"
-#include "../h/socketvar.h"
-#include "../h/uio.h"
+/*
+ * Copyright (c) 1982 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * @(#)uipc_syscalls.c 6.16 (Berkeley) %G%
+ */
+
+#include "param.h"
+#include "systm.h"
+#include "dir.h"
+#include "user.h"
+#include "proc.h"
+#include "file.h"
+#include "inode.h"
+#include "buf.h"
+#include "mbuf.h"
+#include "protosw.h"
+#include "socket.h"
+#include "socketvar.h"
+#include "uio.h"
/*
* System call interface to the socket abstraction.
/*
* System call interface to the socket abstraction.
@@
-59,7
+65,7
@@
bind()
fp = getsock(uap->s);
if (fp == 0)
return;
fp = getsock(uap->s);
if (fp == 0)
return;
- u.u_error = sockargs(&nam, uap->name, uap->namelen);
+ u.u_error = sockargs(&nam, uap->name, uap->namelen
, MT_SONAME
);
if (u.u_error)
return;
u.u_error = sobind((struct socket *)fp->f_data, nam);
if (u.u_error)
return;
u.u_error = sobind((struct socket *)fp->f_data, nam);
@@
-128,6
+134,7
@@
noname:
}
if (so->so_error) {
u.u_error = so->so_error;
}
if (so->so_error) {
u.u_error = so->so_error;
+ so->so_error = 0;
splx(s);
return;
}
splx(s);
return;
}
@@
-181,18
+188,18
@@
connect()
if (fp == 0)
return;
so = (struct socket *)fp->f_data;
if (fp == 0)
return;
so = (struct socket *)fp->f_data;
- u.u_error = sockargs(&nam, uap->name, uap->namelen);
+ if ((so->so_state & SS_NBIO) &&
+ (so->so_state & SS_ISCONNECTING)) {
+ u.u_error = EINPROGRESS;
+ return;
+ }
+ u.u_error = sockargs(&nam, uap->name, uap->namelen, MT_SONAME);
if (u.u_error)
return;
u.u_error = soconnect(so, nam);
if (u.u_error)
goto bad;
s = splnet();
if (u.u_error)
return;
u.u_error = soconnect(so, nam);
if (u.u_error)
goto bad;
s = splnet();
- if ((so->so_state & SS_NBIO) &&
- (so->so_state & SS_ISCONNECTING)) {
- u.u_error = EINPROGRESS;
- goto bad2;
- }
if (setjmp(&u.u_qsave)) {
if (u.u_error == 0)
u.u_error = EINTR;
if (setjmp(&u.u_qsave)) {
if (u.u_error == 0)
u.u_error = EINTR;
@@
-205,6
+212,7
@@
connect()
bad2:
splx(s);
bad:
bad2:
splx(s);
bad:
+ so->so_state &= ~SS_ISCONNECTING;
m_freem(nam);
}
m_freem(nam);
}
@@
-249,6
+257,15
@@
socketpair()
u.u_error = soconnect2(so1, so2);
if (u.u_error)
goto free4;
u.u_error = soconnect2(so1, so2);
if (u.u_error)
goto free4;
+ if (uap->type == SOCK_DGRAM) {
+ /*
+ * Datagram socket connection is asymmetric.
+ */
+ u.u_error = soconnect2(so2, so1);
+ if (u.u_error)
+ goto free4;
+ }
+ u.u_r.r_val1 = 0;
(void) copyout((caddr_t)sv, (caddr_t)uap->rsv, 2 * sizeof (int));
return;
free4:
(void) copyout((caddr_t)sv, (caddr_t)uap->rsv, 2 * sizeof (int));
return;
free4:
@@
-258,11
+275,9
@@
free3:
fp1->f_count = 0;
u.u_ofile[sv[0]] = 0;
free2:
fp1->f_count = 0;
u.u_ofile[sv[0]] = 0;
free2:
- so2->so_state |= SS_NOFDREF;
- sofree(so2);
+ (void)soclose(so2);
free:
free:
- so1->so_state |= SS_NOFDREF;
- sofree(so1);
+ (void)soclose(so1);
}
sendto()
}
sendto()
@@
-334,11
+349,6
@@
sendmsg()
if (u.u_error)
return;
msg.msg_iov = aiov;
if (u.u_error)
return;
msg.msg_iov = aiov;
-#ifdef notdef
-printf("sendmsg name %x namelen %d iov %x iovlen %d accrights %x &len %d\n",
-msg.msg_name, msg.msg_namelen, msg.msg_iov, msg.msg_iovlen,
-msg.msg_accrights, msg.msg_accrightslen);
-#endif
sendit(uap->s, &msg, uap->flags);
}
sendit(uap->s, &msg, uap->flags);
}
@@
-359,32
+369,34
@@
sendit(s, mp, flags)
return;
auio.uio_iov = mp->msg_iov;
auio.uio_iovcnt = mp->msg_iovlen;
return;
auio.uio_iov = mp->msg_iov;
auio.uio_iovcnt = mp->msg_iovlen;
- auio.uio_segflg =
0
;
+ auio.uio_segflg =
UIO_USERSPACE
;
auio.uio_offset = 0; /* XXX */
auio.uio_resid = 0;
iov = mp->msg_iov;
auio.uio_offset = 0; /* XXX */
auio.uio_resid = 0;
iov = mp->msg_iov;
- for (i = 0; i < mp->msg_iovlen; i++) {
+ for (i = 0; i < mp->msg_iovlen; i++
, iov++
) {
if (iov->iov_len < 0) {
u.u_error = EINVAL;
return;
}
if (iov->iov_len < 0) {
u.u_error = EINVAL;
return;
}
+ if (iov->iov_len == 0)
+ continue;
if (useracc(iov->iov_base, (u_int)iov->iov_len, B_READ) == 0) {
u.u_error = EFAULT;
return;
}
auio.uio_resid += iov->iov_len;
if (useracc(iov->iov_base, (u_int)iov->iov_len, B_READ) == 0) {
u.u_error = EFAULT;
return;
}
auio.uio_resid += iov->iov_len;
- iov++;
}
if (mp->msg_name) {
u.u_error =
}
if (mp->msg_name) {
u.u_error =
- sockargs(&to, mp->msg_name, mp->msg_namelen);
+ sockargs(&to, mp->msg_name, mp->msg_namelen
, MT_SONAME
);
if (u.u_error)
return;
} else
to = 0;
if (mp->msg_accrights) {
u.u_error =
if (u.u_error)
return;
} else
to = 0;
if (mp->msg_accrights) {
u.u_error =
- sockargs(&rights, mp->msg_accrights, mp->msg_accrightslen);
+ sockargs(&rights, mp->msg_accrights, mp->msg_accrightslen,
+ MT_RIGHTS);
if (u.u_error)
goto bad;
} else
if (u.u_error)
goto bad;
} else
@@
-503,21
+515,22
@@
recvit(s, mp, flags, namelenp, rightslenp)
return;
auio.uio_iov = mp->msg_iov;
auio.uio_iovcnt = mp->msg_iovlen;
return;
auio.uio_iov = mp->msg_iov;
auio.uio_iovcnt = mp->msg_iovlen;
- auio.uio_segflg =
0
;
+ auio.uio_segflg =
UIO_USERSPACE
;
auio.uio_offset = 0; /* XXX */
auio.uio_resid = 0;
iov = mp->msg_iov;
auio.uio_offset = 0; /* XXX */
auio.uio_resid = 0;
iov = mp->msg_iov;
- for (i = 0; i < mp->msg_iovlen; i++) {
+ for (i = 0; i < mp->msg_iovlen; i++
, iov++
) {
if (iov->iov_len < 0) {
u.u_error = EINVAL;
return;
}
if (iov->iov_len < 0) {
u.u_error = EINVAL;
return;
}
+ if (iov->iov_len == 0)
+ continue;
if (useracc(iov->iov_base, (u_int)iov->iov_len, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
}
auio.uio_resid += iov->iov_len;
if (useracc(iov->iov_base, (u_int)iov->iov_len, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
}
auio.uio_resid += iov->iov_len;
- iov++;
}
len = auio.uio_resid;
u.u_error =
}
len = auio.uio_resid;
u.u_error =
@@
-595,15
+608,14
@@
setsockopt()
}
u.u_error =
copyin(uap->val, mtod(m, caddr_t), (u_int)uap->valsize);
}
u.u_error =
copyin(uap->val, mtod(m, caddr_t), (u_int)uap->valsize);
- if (u.u_error)
- goto bad;
+ if (u.u_error) {
+ (void) m_free(m);
+ return;
+ }
m->m_len = uap->valsize;
}
u.u_error =
sosetopt((struct socket *)fp->f_data, uap->level, uap->name, m);
m->m_len = uap->valsize;
}
u.u_error =
sosetopt((struct socket *)fp->f_data, uap->level, uap->name, m);
-bad:
- if (m != NULL)
- (void) m_free(m);
}
getsockopt()
}
getsockopt()
@@
-627,17
+639,13
@@
getsockopt()
sizeof (valsize));
if (u.u_error)
return;
sizeof (valsize));
if (u.u_error)
return;
- m = m_get(M_WAIT, MT_SOOPTS);
- if (m == NULL) {
- u.u_error = ENOBUFS;
- return;
- }
- }
+ } else
+ valsize = 0;
u.u_error =
u.u_error =
- sogetopt((struct socket *)fp->f_data, uap->level, uap->name, m);
+ sogetopt((struct socket *)fp->f_data, uap->level, uap->name,
&
m);
if (u.u_error)
goto bad;
if (u.u_error)
goto bad;
- if (uap->val) {
+ if (uap->val
&& valsize && m != NULL
) {
if (valsize > m->m_len)
valsize = m->m_len;
u.u_error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize);
if (valsize > m->m_len)
valsize = m->m_len;
u.u_error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize);
@@
-680,8
+688,10
@@
pipe()
wf->f_data = (caddr_t)wso;
u.u_r.r_val2 = u.u_r.r_val1;
u.u_r.r_val1 = r;
wf->f_data = (caddr_t)wso;
u.u_r.r_val2 = u.u_r.r_val1;
u.u_r.r_val1 = r;
- if (
piconnect(wso, rso) == 0
)
+ if (
u.u_error = unp_connect2(wso, rso)
)
goto free4;
goto free4;
+ wso->so_state |= SS_CANTRCVMORE;
+ rso->so_state |= SS_CANTSENDMORE;
return;
free4:
wf->f_count = 0;
return;
free4:
wf->f_count = 0;
@@
-690,11
+700,9
@@
free3:
rf->f_count = 0;
u.u_ofile[r] = 0;
free2:
rf->f_count = 0;
u.u_ofile[r] = 0;
free2:
- wso->so_state |= SS_NOFDREF;
- sofree(wso);
+ (void)soclose(wso);
free:
free:
- rso->so_state |= SS_NOFDREF;
- sofree(rso);
+ (void)soclose(rso);
}
/*
}
/*
@@
-781,17
+789,17
@@
bad:
m_freem(m);
}
m_freem(m);
}
-sockargs(aname, name, namelen)
+sockargs(aname, name, namelen
, type
)
struct mbuf **aname;
caddr_t name;
struct mbuf **aname;
caddr_t name;
- int namelen;
+ int namelen
, type
;
{
register struct mbuf *m;
int error;
if (namelen > MLEN)
return (EINVAL);
{
register struct mbuf *m;
int error;
if (namelen > MLEN)
return (EINVAL);
- m = m_get(M_WAIT,
MT_SONAME
);
+ m = m_get(M_WAIT,
type
);
if (m == NULL)
return (ENOBUFS);
m->m_len = namelen;
if (m == NULL)
return (ENOBUFS);
m->m_len = namelen;