summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c642
1 files changed, 344 insertions, 298 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 89b7ffd..800434c 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -30,10 +30,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94
+ * @(#)uipc_syscalls.c 8.6 (Berkeley) 2/14/95
*/
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/filedesc.h>
#include <sys/proc.h>
#include <sys/file.h>
@@ -47,6 +48,9 @@
#include <sys/ktrace.h>
#endif
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
/*
* System call interface to the socket abstraction.
*/
@@ -56,15 +60,15 @@
extern struct fileops socketops;
-struct socket_args {
- int domain;
- int type;
- int protocol;
-};
+int
socket(p, uap, retval)
struct proc *p;
- register struct socket_args *uap;
- int *retval;
+ register struct socket_args /* {
+ syscallarg(int) domain;
+ syscallarg(int) type;
+ syscallarg(int) protocol;
+ } */ *uap;
+ register_t *retval;
{
struct filedesc *fdp = p->p_fd;
struct socket *so;
@@ -76,7 +80,8 @@ socket(p, uap, retval)
fp->f_flag = FREAD|FWRITE;
fp->f_type = DTYPE_SOCKET;
fp->f_ops = &socketops;
- if (error = socreate(uap->domain, &so, uap->type, uap->protocol)) {
+ if (error = socreate(SCARG(uap, domain), &so, SCARG(uap, type),
+ SCARG(uap, protocol))) {
fdp->fd_ofiles[fd] = 0;
ffree(fp);
} else {
@@ -86,96 +91,102 @@ socket(p, uap, retval)
return (error);
}
-struct bind_args {
- int s;
- caddr_t name;
- int namelen;
-};
/* ARGSUSED */
+int
bind(p, uap, retval)
struct proc *p;
- register struct bind_args *uap;
- int *retval;
+ register struct bind_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) name;
+ syscallarg(int) namelen;
+ } */ *uap;
+ register_t *retval;
{
struct file *fp;
struct mbuf *nam;
int error;
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
- if (error = sockargs(&nam, uap->name, uap->namelen, MT_SONAME))
+ if (error = sockargs(&nam, SCARG(uap, name), SCARG(uap, namelen),
+ MT_SONAME))
return (error);
error = sobind((struct socket *)fp->f_data, nam);
m_freem(nam);
return (error);
}
-struct listen_args {
- int s;
- int backlog;
-};
/* ARGSUSED */
+int
listen(p, uap, retval)
struct proc *p;
- register struct listen_args *uap;
- int *retval;
+ register struct listen_args /* {
+ syscallarg(int) s;
+ syscallarg(int) backlog;
+ } */ *uap;
+ register_t *retval;
{
struct file *fp;
int error;
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
- return (solisten((struct socket *)fp->f_data, uap->backlog));
+ return (solisten((struct socket *)fp->f_data, SCARG(uap, backlog)));
}
-struct accept_args {
- int s;
- caddr_t name;
- int *anamelen;
-#ifdef COMPAT_OLDSOCK
- int compat_43; /* pseudo */
-#endif
-};
-
#ifdef COMPAT_OLDSOCK
+int
accept(p, uap, retval)
struct proc *p;
- struct accept_args *uap;
- int *retval;
+ struct accept_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) name;
+ syscallarg(int *) anamelen;
+ } */ *uap;
+ register_t *retval;
{
- uap->compat_43 = 0;
- return (accept1(p, uap, retval));
+ return (accept1(p, uap, retval, 0));
}
-oaccept(p, uap, retval)
+int
+compat_43_accept(p, uap, retval)
struct proc *p;
- struct accept_args *uap;
- int *retval;
+ struct accept_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) name;
+ syscallarg(int *) anamelen;
+ } */ *uap;
+ register_t *retval;
{
- uap->compat_43 = 1;
- return (accept1(p, uap, retval));
+ return (accept1(p, uap, retval, 1));
}
#else /* COMPAT_OLDSOCK */
#define accept1 accept
#endif
-accept1(p, uap, retval)
+int
+accept1(p, uap, retval, compat_43)
struct proc *p;
- register struct accept_args *uap;
- int *retval;
+ register struct accept_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) name;
+ syscallarg(int *) anamelen;
+ } */ *uap;
+ register_t *retval;
+ int compat_43;
{
struct file *fp;
struct mbuf *nam;
- int namelen, error, s;
+ int namelen, error, s, tmpfd;
register struct socket *so;
- if (uap->name && (error = copyin((caddr_t)uap->anamelen,
+ if (SCARG(uap, name) && (error = copyin((caddr_t)SCARG(uap, anamelen),
(caddr_t)&namelen, sizeof (namelen))))
return (error);
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
s = splnet();
so = (struct socket *)fp->f_data;
@@ -204,10 +215,11 @@ accept1(p, uap, retval)
splx(s);
return (error);
}
- if (error = falloc(p, &fp, retval)) {
+ if (error = falloc(p, &fp, &tmpfd)) {
splx(s);
return (error);
}
+ *retval = tmpfd;
{ struct socket *aso = so->so_q;
if (soqremque(aso, 1) == 0)
panic("accept");
@@ -219,47 +231,49 @@ accept1(p, uap, retval)
fp->f_data = (caddr_t)so;
nam = m_get(M_WAIT, MT_SONAME);
(void) soaccept(so, nam);
- if (uap->name) {
+ if (SCARG(uap, name)) {
#ifdef COMPAT_OLDSOCK
- if (uap->compat_43)
+ if (compat_43)
mtod(nam, struct osockaddr *)->sa_family =
mtod(nam, struct sockaddr *)->sa_family;
#endif
if (namelen > nam->m_len)
namelen = nam->m_len;
/* SHOULD COPY OUT A CHAIN HERE */
- if ((error = copyout(mtod(nam, caddr_t), (caddr_t)uap->name,
- (u_int)namelen)) == 0)
+ if ((error = copyout(mtod(nam, caddr_t),
+ (caddr_t)SCARG(uap, name), (u_int)namelen)) == 0)
error = copyout((caddr_t)&namelen,
- (caddr_t)uap->anamelen, sizeof (*uap->anamelen));
+ (caddr_t)SCARG(uap, anamelen),
+ sizeof (*SCARG(uap, anamelen)));
}
m_freem(nam);
splx(s);
return (error);
}
-struct connect_args {
- int s;
- caddr_t name;
- int namelen;
-};
/* ARGSUSED */
+int
connect(p, uap, retval)
struct proc *p;
- register struct connect_args *uap;
- int *retval;
+ register struct connect_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) name;
+ syscallarg(int) namelen;
+ } */ *uap;
+ register_t *retval;
{
struct file *fp;
register struct socket *so;
struct mbuf *nam;
int error, s;
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
so = (struct socket *)fp->f_data;
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING))
return (EALREADY);
- if (error = sockargs(&nam, uap->name, uap->namelen, MT_SONAME))
+ if (error = sockargs(&nam, SCARG(uap, name), SCARG(uap, namelen),
+ MT_SONAME))
return (error);
error = soconnect(so, nam);
if (error)
@@ -286,25 +300,27 @@ bad:
return (error);
}
-struct socketpair_args {
- int domain;
- int type;
- int protocol;
- int *rsv;
-};
+int
socketpair(p, uap, retval)
struct proc *p;
- register struct socketpair_args *uap;
- int retval[];
+ register struct socketpair_args /* {
+ syscallarg(int) domain;
+ syscallarg(int) type;
+ syscallarg(int) protocol;
+ syscallarg(int *) rsv;
+ } */ *uap;
+ register_t *retval;
{
register struct filedesc *fdp = p->p_fd;
struct file *fp1, *fp2;
struct socket *so1, *so2;
int fd, error, sv[2];
- if (error = socreate(uap->domain, &so1, uap->type, uap->protocol))
+ if (error = socreate(SCARG(uap, domain), &so1, SCARG(uap, type),
+ SCARG(uap, protocol)))
return (error);
- if (error = socreate(uap->domain, &so2, uap->type, uap->protocol))
+ if (error = socreate(SCARG(uap, domain), &so2, SCARG(uap, type),
+ SCARG(uap, protocol)))
goto free1;
if (error = falloc(p, &fp1, &fd))
goto free2;
@@ -322,14 +338,15 @@ socketpair(p, uap, retval)
sv[1] = fd;
if (error = soconnect2(so1, so2))
goto free4;
- if (uap->type == SOCK_DGRAM) {
+ if (SCARG(uap, type) == SOCK_DGRAM) {
/*
* Datagram socket connection is asymmetric.
*/
if (error = soconnect2(so2, so1))
goto free4;
}
- error = copyout((caddr_t)sv, (caddr_t)uap->rsv, 2 * sizeof (int));
+ error = copyout((caddr_t)sv, (caddr_t)SCARG(uap, rsv),
+ 2 * sizeof (int));
retval[0] = sv[0]; /* XXX ??? */
retval[1] = sv[1]; /* XXX ??? */
return (error);
@@ -346,46 +363,46 @@ free1:
return (error);
}
-struct sendto_args {
- int s;
- caddr_t buf;
- size_t len;
- int flags;
- caddr_t to;
- int tolen;
-};
+int
sendto(p, uap, retval)
struct proc *p;
- register struct sendto_args *uap;
- int *retval;
+ register struct sendto_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) buf;
+ syscallarg(size_t) len;
+ syscallarg(int) flags;
+ syscallarg(caddr_t) to;
+ syscallarg(int) tolen;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov;
- msg.msg_name = uap->to;
- msg.msg_namelen = uap->tolen;
+ msg.msg_name = SCARG(uap, to);
+ msg.msg_namelen = SCARG(uap, tolen);
msg.msg_iov = &aiov;
msg.msg_iovlen = 1;
msg.msg_control = 0;
#ifdef COMPAT_OLDSOCK
msg.msg_flags = 0;
#endif
- aiov.iov_base = uap->buf;
- aiov.iov_len = uap->len;
- return (sendit(p, uap->s, &msg, uap->flags, retval));
+ aiov.iov_base = SCARG(uap, buf);
+ aiov.iov_len = SCARG(uap, len);
+ return (sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval));
}
#ifdef COMPAT_OLDSOCK
-struct osend_args {
- int s;
- caddr_t buf;
- int len;
- int flags;
-};
-osend(p, uap, retval)
+int
+compat_43_send(p, uap, retval)
struct proc *p;
- register struct osend_args *uap;
- int *retval;
+ register struct compat_43_send_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) buf;
+ syscallarg(int) len;
+ syscallarg(int) flags;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov;
@@ -394,29 +411,30 @@ osend(p, uap, retval)
msg.msg_namelen = 0;
msg.msg_iov = &aiov;
msg.msg_iovlen = 1;
- aiov.iov_base = uap->buf;
- aiov.iov_len = uap->len;
+ aiov.iov_base = SCARG(uap, buf);
+ aiov.iov_len = SCARG(uap, len);
msg.msg_control = 0;
msg.msg_flags = 0;
- return (sendit(p, uap->s, &msg, uap->flags, retval));
+ return (sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval));
}
#define MSG_COMPAT 0x8000
-struct osendmsg_args {
- int s;
- caddr_t msg;
- int flags;
-};
-osendmsg(p, uap, retval)
+int
+compat_43_sendmsg(p, uap, retval)
struct proc *p;
- register struct osendmsg_args *uap;
- int *retval;
+ register struct compat_43_sendmsg_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) msg;
+ syscallarg(int) flags;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov[UIO_SMALLIOV], *iov;
int error;
- if (error = copyin(uap->msg, (caddr_t)&msg, sizeof (struct omsghdr)))
+ if (error = copyin(SCARG(uap, msg), (caddr_t)&msg,
+ sizeof (struct omsghdr)))
return (error);
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
@@ -431,7 +449,7 @@ osendmsg(p, uap, retval)
goto done;
msg.msg_flags = MSG_COMPAT;
msg.msg_iov = iov;
- error = sendit(p, uap->s, &msg, uap->flags, retval);
+ error = sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
done:
if (iov != aiov)
FREE(iov, M_IOV);
@@ -439,21 +457,21 @@ done:
}
#endif
-struct sendmsg_args {
- int s;
- caddr_t msg;
- int flags;
-};
+int
sendmsg(p, uap, retval)
struct proc *p;
- register struct sendmsg_args *uap;
- int *retval;
+ register struct sendmsg_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) msg;
+ syscallarg(int) flags;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov[UIO_SMALLIOV], *iov;
int error;
- if (error = copyin(uap->msg, (caddr_t)&msg, sizeof (msg)))
+ if (error = copyin(SCARG(uap, msg), (caddr_t)&msg, sizeof (msg)))
return (error);
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
@@ -471,18 +489,20 @@ sendmsg(p, uap, retval)
#ifdef COMPAT_OLDSOCK
msg.msg_flags = 0;
#endif
- error = sendit(p, uap->s, &msg, uap->flags, retval);
+ error = sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
done:
if (iov != aiov)
FREE(iov, M_IOV);
return (error);
}
+int
sendit(p, s, mp, flags, retsize)
register struct proc *p;
int s;
register struct msghdr *mp;
- int flags, *retsize;
+ int flags;
+ register_t *retsize;
{
struct file *fp;
struct uio auio;
@@ -505,10 +525,9 @@ sendit(p, s, mp, flags, retsize)
auio.uio_resid = 0;
iov = mp->msg_iov;
for (i = 0; i < mp->msg_iovlen; i++, iov++) {
- if (iov->iov_len < 0)
- return (EINVAL);
- if ((auio.uio_resid += iov->iov_len) < 0)
+ if (auio.uio_resid + iov->iov_len < auio.uio_resid)
return (EINVAL);
+ auio.uio_resid += iov->iov_len;
}
if (mp->msg_name) {
if (error = sockargs(&to, mp->msg_name, mp->msg_namelen,
@@ -579,63 +598,71 @@ bad:
return (error);
}
-struct recvfrom_args {
- int s;
- caddr_t buf;
- size_t len;
- int flags;
- caddr_t from;
- int *fromlenaddr;
-};
-
#ifdef COMPAT_OLDSOCK
-orecvfrom(p, uap, retval)
+int
+compat_43_recvfrom(p, uap, retval)
struct proc *p;
- struct recvfrom_args *uap;
- int *retval;
+ struct recvfrom_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) buf;
+ syscallarg(size_t) len;
+ syscallarg(int) flags;
+ syscallarg(caddr_t) from;
+ syscallarg(int *) fromlenaddr;
+ } */ *uap;
+ register_t *retval;
{
- uap->flags |= MSG_COMPAT;
+ SCARG(uap, flags) |= MSG_COMPAT;
return (recvfrom(p, uap, retval));
}
#endif
+int
recvfrom(p, uap, retval)
struct proc *p;
- register struct recvfrom_args *uap;
- int *retval;
+ register struct recvfrom_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) buf;
+ syscallarg(size_t) len;
+ syscallarg(int) flags;
+ syscallarg(caddr_t) from;
+ syscallarg(int *) fromlenaddr;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov;
int error;
- if (uap->fromlenaddr) {
- if (error = copyin((caddr_t)uap->fromlenaddr,
+ if (SCARG(uap, fromlenaddr)) {
+ if (error = copyin((caddr_t)SCARG(uap, fromlenaddr),
(caddr_t)&msg.msg_namelen, sizeof (msg.msg_namelen)))
return (error);
} else
msg.msg_namelen = 0;
- msg.msg_name = uap->from;
+ msg.msg_name = SCARG(uap, from);
msg.msg_iov = &aiov;
msg.msg_iovlen = 1;
- aiov.iov_base = uap->buf;
- aiov.iov_len = uap->len;
+ aiov.iov_base = SCARG(uap, buf);
+ aiov.iov_len = SCARG(uap, len);
msg.msg_control = 0;
- msg.msg_flags = uap->flags;
- return (recvit(p, uap->s, &msg, (caddr_t)uap->fromlenaddr, retval));
+ msg.msg_flags = SCARG(uap, flags);
+ return (recvit(p, SCARG(uap, s), &msg,
+ (caddr_t)SCARG(uap, fromlenaddr), retval));
}
#ifdef COMPAT_OLDSOCK
-struct orecv_args {
- int s;
- caddr_t buf;
- int len;
- int flags;
-};
-orecv(p, uap, retval)
+int
+compat_43_recv(p, uap, retval)
struct proc *p;
- register struct orecv_args *uap;
- int *retval;
+ register struct compat_43_recv_args /* {
+ syscallarg(int) s;
+ syscallarg(caddr_t) buf;
+ syscallarg(int) len;
+ syscallarg(int) flags;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov;
@@ -644,11 +671,11 @@ orecv(p, uap, retval)
msg.msg_namelen = 0;
msg.msg_iov = &aiov;
msg.msg_iovlen = 1;
- aiov.iov_base = uap->buf;
- aiov.iov_len = uap->len;
+ aiov.iov_base = SCARG(uap, buf);
+ aiov.iov_len = SCARG(uap, len);
msg.msg_control = 0;
- msg.msg_flags = uap->flags;
- return (recvit(p, uap->s, &msg, (caddr_t)0, retval));
+ msg.msg_flags = SCARG(uap, flags);
+ return (recvit(p, SCARG(uap, s), &msg, (caddr_t)0, retval));
}
/*
@@ -656,21 +683,21 @@ orecv(p, uap, retval)
* overlays the new one, missing only the flags, and with the (old) access
* rights where the control fields are now.
*/
-struct orecvmsg_args {
- int s;
- struct omsghdr *msg;
- int flags;
-};
-orecvmsg(p, uap, retval)
+int
+compat_43_recvmsg(p, uap, retval)
struct proc *p;
- register struct orecvmsg_args *uap;
- int *retval;
+ register struct compat_43_recvmsg_args /* {
+ syscallarg(int) s;
+ syscallarg(struct omsghdr *) msg;
+ syscallarg(int) flags;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov[UIO_SMALLIOV], *iov;
int error;
- if (error = copyin((caddr_t)uap->msg, (caddr_t)&msg,
+ if (error = copyin((caddr_t)SCARG(uap, msg), (caddr_t)&msg,
sizeof (struct omsghdr)))
return (error);
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
@@ -681,16 +708,17 @@ orecvmsg(p, uap, retval)
M_WAITOK);
} else
iov = aiov;
- msg.msg_flags = uap->flags | MSG_COMPAT;
+ msg.msg_flags = SCARG(uap, flags) | MSG_COMPAT;
if (error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
(unsigned)(msg.msg_iovlen * sizeof (struct iovec))))
goto done;
msg.msg_iov = iov;
- error = recvit(p, uap->s, &msg, (caddr_t)&uap->msg->msg_namelen, retval);
+ error = recvit(p, SCARG(uap, s), &msg,
+ (caddr_t)&SCARG(uap, msg)->msg_namelen, retval);
if (msg.msg_controllen && error == 0)
error = copyout((caddr_t)&msg.msg_controllen,
- (caddr_t)&uap->msg->msg_accrightslen, sizeof (int));
+ (caddr_t)&SCARG(uap, msg)->msg_accrightslen, sizeof (int));
done:
if (iov != aiov)
FREE(iov, M_IOV);
@@ -698,21 +726,22 @@ done:
}
#endif
-struct recvmsg_args {
- int s;
- struct msghdr *msg;
- int flags;
-};
+int
recvmsg(p, uap, retval)
struct proc *p;
- register struct recvmsg_args *uap;
- int *retval;
+ register struct recvmsg_args /* {
+ syscallarg(int) s;
+ syscallarg(struct msghdr *) msg;
+ syscallarg(int) flags;
+ } */ *uap;
+ register_t *retval;
{
struct msghdr msg;
struct iovec aiov[UIO_SMALLIOV], *uiov, *iov;
register int error;
- if (error = copyin((caddr_t)uap->msg, (caddr_t)&msg, sizeof (msg)))
+ if (error = copyin((caddr_t)SCARG(uap, msg), (caddr_t)&msg,
+ sizeof (msg)))
return (error);
if ((u_int)msg.msg_iovlen >= UIO_SMALLIOV) {
if ((u_int)msg.msg_iovlen >= UIO_MAXIOV)
@@ -723,18 +752,19 @@ recvmsg(p, uap, retval)
} else
iov = aiov;
#ifdef COMPAT_OLDSOCK
- msg.msg_flags = uap->flags &~ MSG_COMPAT;
+ msg.msg_flags = SCARG(uap, flags) &~ MSG_COMPAT;
#else
- msg.msg_flags = uap->flags;
+ msg.msg_flags = SCARG(uap, flags);
#endif
uiov = msg.msg_iov;
msg.msg_iov = iov;
if (error = copyin((caddr_t)uiov, (caddr_t)iov,
(unsigned)(msg.msg_iovlen * sizeof (struct iovec))))
goto done;
- if ((error = recvit(p, uap->s, &msg, (caddr_t)0, retval)) == 0) {
+ if ((error = recvit(p, SCARG(uap, s), &msg, (caddr_t)0, retval)) == 0) {
msg.msg_iov = uiov;
- error = copyout((caddr_t)&msg, (caddr_t)uap->msg, sizeof(msg));
+ error = copyout((caddr_t)&msg, (caddr_t)SCARG(uap, msg),
+ sizeof(msg));
}
done:
if (iov != aiov)
@@ -742,12 +772,13 @@ done:
return (error);
}
+int
recvit(p, s, mp, namelenp, retsize)
register struct proc *p;
int s;
register struct msghdr *mp;
caddr_t namelenp;
- int *retsize;
+ register_t *retsize;
{
struct file *fp;
struct uio auio;
@@ -770,10 +801,9 @@ recvit(p, s, mp, namelenp, retsize)
auio.uio_resid = 0;
iov = mp->msg_iov;
for (i = 0; i < mp->msg_iovlen; i++, iov++) {
- if (iov->iov_len < 0)
- return (EINVAL);
- if ((auio.uio_resid += iov->iov_len) < 0)
+ if (auio.uio_resid + iov->iov_len < auio.uio_resid)
return (EINVAL);
+ auio.uio_resid += iov->iov_len;
}
#ifdef KTRACE
if (KTRPOINT(p, KTR_GENIO)) {
@@ -872,107 +902,107 @@ out:
return (error);
}
-struct shutdown_args {
- int s;
- int how;
-};
/* ARGSUSED */
+int
shutdown(p, uap, retval)
struct proc *p;
- register struct shutdown_args *uap;
- int *retval;
+ register struct shutdown_args /* {
+ syscallarg(int) s;
+ syscallarg(int) how;
+ } */ *uap;
+ register_t *retval;
{
struct file *fp;
int error;
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
- return (soshutdown((struct socket *)fp->f_data, uap->how));
+ return (soshutdown((struct socket *)fp->f_data, SCARG(uap, how)));
}
-struct setsockopt_args {
- int s;
- int level;
- int name;
- caddr_t val;
- int valsize;
-};
/* ARGSUSED */
+int
setsockopt(p, uap, retval)
struct proc *p;
- register struct setsockopt_args *uap;
- int *retval;
+ register struct setsockopt_args /* {
+ syscallarg(int) s;
+ syscallarg(int) level;
+ syscallarg(int) name;
+ syscallarg(caddr_t) val;
+ syscallarg(int) valsize;
+ } */ *uap;
+ register_t *retval;
{
struct file *fp;
struct mbuf *m = NULL;
int error;
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
- if (uap->valsize > MLEN)
+ if (SCARG(uap, valsize) > MLEN)
return (EINVAL);
- if (uap->val) {
+ if (SCARG(uap, val)) {
m = m_get(M_WAIT, MT_SOOPTS);
if (m == NULL)
return (ENOBUFS);
- if (error = copyin(uap->val, mtod(m, caddr_t),
- (u_int)uap->valsize)) {
+ if (error = copyin(SCARG(uap, val), mtod(m, caddr_t),
+ (u_int)SCARG(uap, valsize))) {
(void) m_free(m);
return (error);
}
- m->m_len = uap->valsize;
+ m->m_len = SCARG(uap, valsize);
}
- return (sosetopt((struct socket *)fp->f_data, uap->level,
- uap->name, m));
+ return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ SCARG(uap, name), m));
}
-struct getsockopt_args {
- int s;
- int level;
- int name;
- caddr_t val;
- int *avalsize;
-};
/* ARGSUSED */
+int
getsockopt(p, uap, retval)
struct proc *p;
- register struct getsockopt_args *uap;
- int *retval;
+ register struct getsockopt_args /* {
+ syscallarg(int) s;
+ syscallarg(int) level;
+ syscallarg(int) name;
+ syscallarg(caddr_t) val;
+ syscallarg(int *) avalsize;
+ } */ *uap;
+ register_t *retval;
{
struct file *fp;
struct mbuf *m = NULL;
int valsize, error;
- if (error = getsock(p->p_fd, uap->s, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, s), &fp))
return (error);
- if (uap->val) {
- if (error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize,
- sizeof (valsize)))
+ if (SCARG(uap, val)) {
+ if (error = copyin((caddr_t)SCARG(uap, avalsize),
+ (caddr_t)&valsize, sizeof (valsize)))
return (error);
} else
valsize = 0;
- if ((error = sogetopt((struct socket *)fp->f_data, uap->level,
- uap->name, &m)) == 0 && uap->val && valsize && m != NULL) {
+ if ((error = sogetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ SCARG(uap, name), &m)) == 0 && SCARG(uap, val) && valsize &&
+ m != NULL) {
if (valsize > m->m_len)
valsize = m->m_len;
- error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize);
+ error = copyout(mtod(m, caddr_t), SCARG(uap, val),
+ (u_int)valsize);
if (error == 0)
error = copyout((caddr_t)&valsize,
- (caddr_t)uap->avalsize, sizeof (valsize));
+ (caddr_t)SCARG(uap, avalsize), sizeof (valsize));
}
if (m != NULL)
(void) m_free(m);
return (error);
}
-struct pipe_args {
- int dummy;
-};
/* ARGSUSED */
+int
pipe(p, uap, retval)
struct proc *p;
- struct pipe_args *uap;
- int retval[];
+ void *uap;
+ register_t *retval;
{
register struct filedesc *fdp = p->p_fd;
struct file *rf, *wf;
@@ -1016,33 +1046,33 @@ free1:
/*
* Get socket name.
*/
-struct getsockname_args {
- int fdes;
- caddr_t asa;
- int *alen;
-#ifdef COMPAT_OLDSOCK
- int compat_43; /* pseudo */
-#endif
-};
#ifdef COMPAT_OLDSOCK
+int
getsockname(p, uap, retval)
struct proc *p;
- struct getsockname_args *uap;
- int *retval;
+ struct getsockname_args /* {
+ syscallarg(int) fdes;
+ syscallarg(caddr_t) asa;
+ syscallarg(int *) alen;
+ } */ *uap;
+ register_t *retval;
{
- uap->compat_43 = 0;
- return (getsockname1(p, uap, retval));
+ return (getsockname1(p, uap, retval, 0));
}
-ogetsockname(p, uap, retval)
+int
+compat_43_getsockname(p, uap, retval)
struct proc *p;
- struct getsockname_args *uap;
- int *retval;
+ struct getsockname_args /* {
+ syscallarg(int) fdes;
+ syscallarg(caddr_t) asa;
+ syscallarg(int *) alen;
+ } */ *uap;
+ register_t *retval;
{
- uap->compat_43 = 1;
- return (getsockname1(p, uap, retval));
+ return (getsockname1(p, uap, retval, 1));
}
#else /* COMPAT_OLDSOCK */
@@ -1050,19 +1080,26 @@ ogetsockname(p, uap, retval)
#endif
/* ARGSUSED */
-getsockname1(p, uap, retval)
+int
+getsockname1(p, uap, retval, compat_43)
struct proc *p;
- register struct getsockname_args *uap;
- int *retval;
+ register struct getsockname_args /* {
+ syscallarg(int) fdes;
+ syscallarg(caddr_t) asa;
+ syscallarg(int *) alen;
+ } */ *uap;
+ register_t *retval;
+ int compat_43;
{
struct file *fp;
register struct socket *so;
struct mbuf *m;
int len, error;
- if (error = getsock(p->p_fd, uap->fdes, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, fdes), &fp))
return (error);
- if (error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len)))
+ if (error = copyin((caddr_t)SCARG(uap, alen), (caddr_t)&len,
+ sizeof (len)))
return (error);
so = (struct socket *)fp->f_data;
m = m_getclr(M_WAIT, MT_SONAME);
@@ -1073,13 +1110,13 @@ getsockname1(p, uap, retval)
if (len > m->m_len)
len = m->m_len;
#ifdef COMPAT_OLDSOCK
- if (uap->compat_43)
+ if (compat_43)
mtod(m, struct osockaddr *)->sa_family =
mtod(m, struct sockaddr *)->sa_family;
#endif
- error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa, (u_int)len);
+ error = copyout(mtod(m, caddr_t), (caddr_t)SCARG(uap, asa), (u_int)len);
if (error == 0)
- error = copyout((caddr_t)&len, (caddr_t)uap->alen,
+ error = copyout((caddr_t)&len, (caddr_t)SCARG(uap, alen),
sizeof (len));
bad:
m_freem(m);
@@ -1089,34 +1126,33 @@ bad:
/*
* Get name of peer for connected socket.
*/
-struct getpeername_args {
- int fdes;
- caddr_t asa;
- int *alen;
-#ifdef COMPAT_OLDSOCK
- int compat_43; /* pseudo */
-#endif
-};
-
#ifdef COMPAT_OLDSOCK
+int
getpeername(p, uap, retval)
struct proc *p;
- struct getpeername_args *uap;
- int *retval;
+ struct getpeername_args /* {
+ syscallarg(int) fdes;
+ syscallarg(caddr_t) asa;
+ syscallarg(int *) alen;
+ } */ *uap;
+ register_t *retval;
{
- uap->compat_43 = 0;
- return (getpeername1(p, uap, retval));
+ return (getpeername1(p, uap, retval, 0));
}
-ogetpeername(p, uap, retval)
+int
+compat_43_getpeername(p, uap, retval)
struct proc *p;
- struct getpeername_args *uap;
- int *retval;
+ struct getpeername_args /* {
+ syscallarg(int) fdes;
+ syscallarg(caddr_t) asa;
+ syscallarg(int *) alen;
+ } */ *uap;
+ register_t *retval;
{
- uap->compat_43 = 1;
- return (getpeername1(p, uap, retval));
+ return (getpeername1(p, uap, retval, 1));
}
#else /* COMPAT_OLDSOCK */
@@ -1124,22 +1160,29 @@ ogetpeername(p, uap, retval)
#endif
/* ARGSUSED */
-getpeername1(p, uap, retval)
+int
+getpeername1(p, uap, retval, compat_43)
struct proc *p;
- register struct getpeername_args *uap;
- int *retval;
+ register struct getpeername_args /* {
+ syscallarg(int) fdes;
+ syscallarg(caddr_t) asa;
+ syscallarg(int *) alen;
+ } */ *uap;
+ register_t *retval;
+ int compat_43;
{
struct file *fp;
register struct socket *so;
struct mbuf *m;
int len, error;
- if (error = getsock(p->p_fd, uap->fdes, &fp))
+ if (error = getsock(p->p_fd, SCARG(uap, fdes), &fp))
return (error);
so = (struct socket *)fp->f_data;
if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0)
return (ENOTCONN);
- if (error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len)))
+ if (error =
+ copyin((caddr_t)SCARG(uap, alen), (caddr_t)&len, sizeof (len)))
return (error);
m = m_getclr(M_WAIT, MT_SONAME);
if (m == NULL)
@@ -1149,18 +1192,20 @@ getpeername1(p, uap, retval)
if (len > m->m_len)
len = m->m_len;
#ifdef COMPAT_OLDSOCK
- if (uap->compat_43)
+ if (compat_43)
mtod(m, struct osockaddr *)->sa_family =
mtod(m, struct sockaddr *)->sa_family;
#endif
- if (error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa, (u_int)len))
+ if (error =
+ copyout(mtod(m, caddr_t), (caddr_t)SCARG(uap, asa), (u_int)len))
goto bad;
- error = copyout((caddr_t)&len, (caddr_t)uap->alen, sizeof (len));
+ error = copyout((caddr_t)&len, (caddr_t)SCARG(uap, alen), sizeof (len));
bad:
m_freem(m);
return (error);
}
+int
sockargs(mp, buf, buflen, type)
struct mbuf **mp;
caddr_t buf;
@@ -1183,23 +1228,24 @@ sockargs(mp, buf, buflen, type)
return (ENOBUFS);
m->m_len = buflen;
error = copyin(buf, mtod(m, caddr_t), (u_int)buflen);
- if (error)
+ if (error) {
(void) m_free(m);
- else {
- *mp = m;
- if (type == MT_SONAME) {
- sa = mtod(m, struct sockaddr *);
+ return (error);
+ }
+ *mp = m;
+ if (type == MT_SONAME) {
+ sa = mtod(m, struct sockaddr *);
#if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN
- if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
- sa->sa_family = sa->sa_len;
+ if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
+ sa->sa_family = sa->sa_len;
#endif
- sa->sa_len = buflen;
- }
+ sa->sa_len = buflen;
}
- return (error);
+ return (0);
}
+int
getsock(fdp, fdes, fpp)
struct filedesc *fdp;
int fdes;
OpenPOWER on IntegriCloud