Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Apr 2017 15:10:36 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r316574 - in stable/11/sys: amd64/cloudabi32 amd64/cloudabi64 arm/cloudabi32 arm64/cloudabi64 compat/cloudabi compat/cloudabi32 compat/cloudabi64 contrib/cloudabi i386/cloudabi32
Message-ID:  <201704061510.v36FAajp011618@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Thu Apr  6 15:10:36 2017
New Revision: 316574
URL: https://svnweb.freebsd.org/changeset/base/316574

Log:
  Bring kernel space CloudABI code in sync with HEAD.
  
  MFC r312353, r312354 and r312355:
  
    Sync in the latest CloudABI generated source files.
  
    Languages like C++17 and Go provide direct support for slice types:
    pointer/length pairs. The CloudABI generator now has more complete for
    this, meaning that for the C binding, pointer/length pairs now use an
    automatic naming scheme of ${name} and ${name}_len.
  
    Apart from this change and some reformatting, the ABI definitions are
    identical. Binary compatibility is preserved entirely.
  
  MFC r315700:
  
    Make file descriptor passing work for CloudABI's sendmsg().
  
    Reduce the potential amount of code duplication between cloudabi32 and
    cloudabi64 by creating a cloudabi_sock_recv() utility function. The
    cloudabi32 and cloudabi64 modules will then only contain code to convert
    the iovecs to the native pointer size.
  
    In cloudabi_sock_recv(), we can now construct an SCM_RIGHTS cmsghdr in
    an mbuf and pass that on to kern_sendit().
  
  MFC r315736:
  
    Make file descriptor passing for CloudABI's recvmsg() work.
  
    Similar to the change for sendmsg(), create a pointer size independent
    implementation of recvmsg() and let cloudabi32 and cloudabi64 call into
    it. In case userspace requests one or more file descriptors, call
    kern_recvit() in such a way that we get the control message headers in
    an mbuf. Iterate over all of the headers and copy the file descriptors
    to userspace.

Modified:
  stable/11/sys/amd64/cloudabi32/cloudabi32_sysvec.c
  stable/11/sys/amd64/cloudabi64/cloudabi64_sysvec.c
  stable/11/sys/arm/cloudabi32/cloudabi32_sysvec.c
  stable/11/sys/arm64/cloudabi64/cloudabi64_sysvec.c
  stable/11/sys/compat/cloudabi/cloudabi_file.c
  stable/11/sys/compat/cloudabi/cloudabi_mem.c
  stable/11/sys/compat/cloudabi/cloudabi_proc.c
  stable/11/sys/compat/cloudabi/cloudabi_random.c
  stable/11/sys/compat/cloudabi/cloudabi_sock.c
  stable/11/sys/compat/cloudabi/cloudabi_util.h
  stable/11/sys/compat/cloudabi32/cloudabi32_fd.c
  stable/11/sys/compat/cloudabi32/cloudabi32_poll.c
  stable/11/sys/compat/cloudabi32/cloudabi32_proto.h
  stable/11/sys/compat/cloudabi32/cloudabi32_sock.c
  stable/11/sys/compat/cloudabi32/cloudabi32_syscall.h
  stable/11/sys/compat/cloudabi32/cloudabi32_syscalls.c
  stable/11/sys/compat/cloudabi32/cloudabi32_sysent.c
  stable/11/sys/compat/cloudabi32/cloudabi32_systrace_args.c
  stable/11/sys/compat/cloudabi32/cloudabi32_thread.c
  stable/11/sys/compat/cloudabi64/cloudabi64_fd.c
  stable/11/sys/compat/cloudabi64/cloudabi64_poll.c
  stable/11/sys/compat/cloudabi64/cloudabi64_proto.h
  stable/11/sys/compat/cloudabi64/cloudabi64_sock.c
  stable/11/sys/compat/cloudabi64/cloudabi64_syscall.h
  stable/11/sys/compat/cloudabi64/cloudabi64_syscalls.c
  stable/11/sys/compat/cloudabi64/cloudabi64_sysent.c
  stable/11/sys/compat/cloudabi64/cloudabi64_systrace_args.c
  stable/11/sys/compat/cloudabi64/cloudabi64_thread.c
  stable/11/sys/contrib/cloudabi/cloudabi32_types.h
  stable/11/sys/contrib/cloudabi/cloudabi64_types.h
  stable/11/sys/contrib/cloudabi/cloudabi_types_common.h
  stable/11/sys/contrib/cloudabi/syscalls32.master
  stable/11/sys/contrib/cloudabi/syscalls64.master
  stable/11/sys/i386/cloudabi32/cloudabi32_sysvec.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/amd64/cloudabi32/cloudabi32_sysvec.c
==============================================================================
--- stable/11/sys/amd64/cloudabi32/cloudabi32_sysvec.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/amd64/cloudabi32/cloudabi32_sysvec.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -181,7 +181,7 @@ cloudabi32_thread_setregs(struct thread 
 
 	/* Perform standard register initialization. */
 	stack.ss_sp = TO_PTR(attr->stack);
-	stack.ss_size = attr->stack_size - sizeof(args);
+	stack.ss_size = attr->stack_len - sizeof(args);
 	cpu_set_upcall(td, TO_PTR(attr->entry_point), NULL, &stack);
 
 	/*

Modified: stable/11/sys/amd64/cloudabi64/cloudabi64_sysvec.c
==============================================================================
--- stable/11/sys/amd64/cloudabi64/cloudabi64_sysvec.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/amd64/cloudabi64/cloudabi64_sysvec.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -164,7 +164,7 @@ cloudabi64_thread_setregs(struct thread 
 	 * from the top of the stack to store a single element array,
 	 * containing a pointer to the TCB. %fs base will point to this.
 	 */
-	tcbptr = rounddown(attr->stack + attr->stack_size - sizeof(tcbptr),
+	tcbptr = rounddown(attr->stack + attr->stack_len - sizeof(tcbptr),
 	    _Alignof(tcbptr));
 	error = copyout(&tcb, (void *)tcbptr, sizeof(tcb));
 	if (error != 0)

Modified: stable/11/sys/arm/cloudabi32/cloudabi32_sysvec.c
==============================================================================
--- stable/11/sys/arm/cloudabi32/cloudabi32_sysvec.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/arm/cloudabi32/cloudabi32_sysvec.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -148,7 +148,7 @@ cloudabi32_thread_setregs(struct thread 
 
 	/* Perform standard register initialization. */
 	stack.ss_sp = TO_PTR(attr->stack);
-	stack.ss_size = attr->stack_size;
+	stack.ss_size = attr->stack_len;
 	cpu_set_upcall(td, TO_PTR(attr->entry_point), NULL, &stack);
 
 	/*

Modified: stable/11/sys/arm64/cloudabi64/cloudabi64_sysvec.c
==============================================================================
--- stable/11/sys/arm64/cloudabi64/cloudabi64_sysvec.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/arm64/cloudabi64/cloudabi64_sysvec.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -140,7 +140,7 @@ cloudabi64_thread_setregs(struct thread 
 
 	/* Perform standard register initialization. */
 	stack.ss_sp = TO_PTR(attr->stack);
-	stack.ss_size = attr->stack_size;
+	stack.ss_size = attr->stack_len;
 	cpu_set_upcall(td, TO_PTR(attr->entry_point), NULL, &stack);
 
 	/*

Modified: stable/11/sys/compat/cloudabi/cloudabi_file.c
==============================================================================
--- stable/11/sys/compat/cloudabi/cloudabi_file.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi/cloudabi_file.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -146,7 +146,7 @@ cloudabi_sys_file_create(struct thread *
 	char *path;
 	int error;
 
-	error = copyin_path(uap->path, uap->pathlen, &path);
+	error = copyin_path(uap->path, uap->path_len, &path);
 	if (error != 0)
 		return (error);
 
@@ -177,10 +177,10 @@ cloudabi_sys_file_link(struct thread *td
 	char *path1, *path2;
 	int error;
 
-	error = copyin_path(uap->path1, uap->path1len, &path1);
+	error = copyin_path(uap->path1, uap->path1_len, &path1);
 	if (error != 0)
 		return (error);
-	error = copyin_path(uap->path2, uap->path2len, &path2);
+	error = copyin_path(uap->path2, uap->path2_len, &path2);
 	if (error != 0) {
 		cloudabi_freestr(path1);
 		return (error);
@@ -261,7 +261,7 @@ cloudabi_sys_file_open(struct thread *td
 	fp->f_flag = fflags & FMASK;
 
 	/* Open path. */
-	error = copyin_path(uap->path, uap->pathlen, &path);
+	error = copyin_path(uap->path, uap->path_len, &path);
 	if (error != 0) {
 		fdrop(fp, td);
 		return (error);
@@ -380,7 +380,7 @@ cloudabi_sys_file_readdir(struct thread 
 {
 	struct iovec iov = {
 		.iov_base = uap->buf,
-		.iov_len = uap->nbyte
+		.iov_len = uap->buf_len
 	};
 	struct uio uio = {
 		.uio_iov = &iov,
@@ -494,7 +494,7 @@ done:
 		return (error);
 
 	/* Return number of bytes copied to userspace. */
-	td->td_retval[0] = uap->nbyte - uio.uio_resid;
+	td->td_retval[0] = uap->buf_len - uio.uio_resid;
 	return (0);
 }
 
@@ -505,12 +505,12 @@ cloudabi_sys_file_readlink(struct thread
 	char *path;
 	int error;
 
-	error = copyin_path(uap->path, uap->pathlen, &path);
+	error = copyin_path(uap->path, uap->path_len, &path);
 	if (error != 0)
 		return (error);
 
 	error = kern_readlinkat(td, uap->fd, path, UIO_SYSSPACE,
-	    uap->buf, UIO_USERSPACE, uap->bufsize);
+	    uap->buf, UIO_USERSPACE, uap->buf_len);
 	cloudabi_freestr(path);
 	return (error);
 }
@@ -522,16 +522,16 @@ cloudabi_sys_file_rename(struct thread *
 	char *old, *new;
 	int error;
 
-	error = copyin_path(uap->old, uap->oldlen, &old);
+	error = copyin_path(uap->path1, uap->path1_len, &old);
 	if (error != 0)
 		return (error);
-	error = copyin_path(uap->new, uap->newlen, &new);
+	error = copyin_path(uap->path2, uap->path2_len, &new);
 	if (error != 0) {
 		cloudabi_freestr(old);
 		return (error);
 	}
 
-	error = kern_renameat(td, uap->oldfd, old, uap->newfd, new,
+	error = kern_renameat(td, uap->fd1, old, uap->fd2, new,
 	    UIO_SYSSPACE);
 	cloudabi_freestr(old);
 	cloudabi_freestr(new);
@@ -653,7 +653,7 @@ cloudabi_sys_file_stat_get(struct thread
 	char *path;
 	int error;
 
-	error = copyin_path(uap->path, uap->pathlen, &path);
+	error = copyin_path(uap->path, uap->path_len, &path);
 	if (error != 0)
 		return (error);
 
@@ -707,7 +707,7 @@ cloudabi_sys_file_stat_put(struct thread
 	error = copyin(uap->buf, &fs, sizeof(fs));
 	if (error != 0)
 		return (error);
-	error = copyin_path(uap->path, uap->pathlen, &path);
+	error = copyin_path(uap->path, uap->path_len, &path);
 	if (error != 0)
 		return (error);
 
@@ -726,10 +726,10 @@ cloudabi_sys_file_symlink(struct thread 
 	char *path1, *path2;
 	int error;
 
-	error = copyin_path(uap->path1, uap->path1len, &path1);
+	error = copyin_path(uap->path1, uap->path1_len, &path1);
 	if (error != 0)
 		return (error);
-	error = copyin_path(uap->path2, uap->path2len, &path2);
+	error = copyin_path(uap->path2, uap->path2_len, &path2);
 	if (error != 0) {
 		cloudabi_freestr(path1);
 		return (error);
@@ -748,7 +748,7 @@ cloudabi_sys_file_unlink(struct thread *
 	char *path;
 	int error;
 
-	error = copyin_path(uap->path, uap->pathlen, &path);
+	error = copyin_path(uap->path, uap->path_len, &path);
 	if (error != 0)
 		return (error);
 

Modified: stable/11/sys/compat/cloudabi/cloudabi_mem.c
==============================================================================
--- stable/11/sys/compat/cloudabi/cloudabi_mem.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi/cloudabi_mem.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -85,7 +85,7 @@ cloudabi_sys_mem_advise(struct thread *t
 		return (EINVAL);
 	}
 
-	return (kern_madvise(td, (uintptr_t)uap->addr, uap->len,
+	return (kern_madvise(td, (uintptr_t)uap->mapping, uap->mapping_len,
 	    behav));
 }
 
@@ -94,7 +94,7 @@ cloudabi_sys_mem_lock(struct thread *td,
 {
 
 	return (kern_mlock(td->td_proc, td->td_ucred,
-	    __DECONST(uintptr_t, uap->addr), uap->len));
+	    __DECONST(uintptr_t, uap->mapping), uap->mapping_len));
 }
 
 int
@@ -133,7 +133,7 @@ cloudabi_sys_mem_protect(struct thread *
 	if (error != 0)
 		return (error);
 
-	return (kern_mprotect(td, (uintptr_t)uap->addr, uap->len,
+	return (kern_mprotect(td, (uintptr_t)uap->mapping, uap->mapping_len,
 	    prot));
 }
 
@@ -156,7 +156,7 @@ cloudabi_sys_mem_sync(struct thread *td,
 	if ((uap->flags & CLOUDABI_MS_INVALIDATE) != 0)
 		flags |= MS_INVALIDATE;
 
-	return (kern_msync(td, (uintptr_t)uap->addr, uap->len,
+	return (kern_msync(td, (uintptr_t)uap->mapping, uap->mapping_len,
 	    flags));
 }
 
@@ -165,8 +165,8 @@ cloudabi_sys_mem_unlock(struct thread *t
     struct cloudabi_sys_mem_unlock_args *uap)
 {
 
-	return (kern_munlock(td, __DECONST(uintptr_t, uap->addr),
-	    uap->len));
+	return (kern_munlock(td, __DECONST(uintptr_t, uap->mapping),
+	    uap->mapping_len));
 }
 
 int
@@ -174,5 +174,5 @@ cloudabi_sys_mem_unmap(struct thread *td
     struct cloudabi_sys_mem_unmap_args *uap)
 {
 
-	return (kern_munmap(td, (uintptr_t)uap->addr, uap->len));
+	return (kern_munmap(td, (uintptr_t)uap->mapping, uap->mapping_len));
 }

Modified: stable/11/sys/compat/cloudabi/cloudabi_proc.c
==============================================================================
--- stable/11/sys/compat/cloudabi/cloudabi_proc.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi/cloudabi_proc.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -53,8 +53,8 @@ cloudabi_sys_proc_exec(struct thread *td
 	error = pre_execve(td, &oldvmspace);
 	if (error != 0)
 		return (error);
-	error = exec_copyin_data_fds(td, &args, uap->data, uap->datalen,
-	    uap->fds, uap->fdslen);
+	error = exec_copyin_data_fds(td, &args, uap->data, uap->data_len,
+	    uap->fds, uap->fds_len);
 	if (error == 0) {
 		args.fd = uap->fd;
 		error = kern_execve(td, &args, NULL);

Modified: stable/11/sys/compat/cloudabi/cloudabi_random.c
==============================================================================
--- stable/11/sys/compat/cloudabi/cloudabi_random.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi/cloudabi_random.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -38,7 +38,7 @@ cloudabi_sys_random_get(struct thread *t
 {
 	struct iovec iov = {
 		.iov_base = uap->buf,
-		.iov_len = uap->nbyte
+		.iov_len = uap->buf_len
 	};
 	struct uio uio = {
 		.uio_iov = &iov,

Modified: stable/11/sys/compat/cloudabi/cloudabi_sock.c
==============================================================================
--- stable/11/sys/compat/cloudabi/cloudabi_sock.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi/cloudabi_sock.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2015 Nuxi, https://nuxi.nl/
+ * Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,7 +30,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/capsicum.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
+#include <sys/mbuf.h>
 #include <sys/mutex.h>
+#include <sys/proc.h>
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
@@ -48,7 +50,7 @@ __FBSDID("$FreeBSD$");
 #include <compat/cloudabi/cloudabi_util.h>
 
 /* Converts FreeBSD's struct sockaddr to CloudABI's cloudabi_sockaddr_t. */
-void
+static void
 cloudabi_convert_sockaddr(const struct sockaddr *sa, socklen_t sal,
     cloudabi_sockaddr_t *rsa)
 {
@@ -140,7 +142,7 @@ cloudabi_sys_sock_bind(struct thread *td
 	struct sockaddr_un sun;
 	int error;
 
-	error = copyin_sockaddr_un(uap->path, uap->pathlen, &sun);
+	error = copyin_sockaddr_un(uap->path, uap->path_len, &sun);
 	if (error != 0)
 		return (error);
 	return (kern_bindat(td, uap->fd, uap->sock, (struct sockaddr *)&sun));
@@ -153,7 +155,7 @@ cloudabi_sys_sock_connect(struct thread 
 	struct sockaddr_un sun;
 	int error;
 
-	error = copyin_sockaddr_un(uap->path, uap->pathlen, &sun);
+	error = copyin_sockaddr_un(uap->path, uap->path_len, &sun);
 	if (error != 0)
 		return (error);
 	return (kern_connectat(td, uap->fd, uap->sock,
@@ -243,3 +245,126 @@ cloudabi_sys_sock_stat_get(struct thread
 	fdrop(fp, td);
 	return (copyout(&ss, uap->buf, sizeof(ss)));
 }
+
+int
+cloudabi_sock_recv(struct thread *td, cloudabi_fd_t fd, struct iovec *data,
+    size_t datalen, cloudabi_fd_t *fds, size_t fdslen,
+    cloudabi_msgflags_t flags, size_t *rdatalen, size_t *rfdslen,
+    cloudabi_sockaddr_t *peername, cloudabi_msgflags_t *rflags)
+{
+	struct sockaddr_storage ss;
+	struct msghdr hdr = {
+		.msg_name = &ss,
+		.msg_namelen = sizeof(ss),
+		.msg_iov = data,
+		.msg_iovlen = datalen,
+	};
+	struct mbuf *control;
+	int error;
+
+	/* Convert flags. */
+	if (flags & CLOUDABI_MSG_PEEK)
+		hdr.msg_flags |= MSG_PEEK;
+	if (flags & CLOUDABI_MSG_WAITALL)
+		hdr.msg_flags |= MSG_WAITALL;
+
+	control = NULL;
+	error = kern_recvit(td, fd, &hdr, UIO_SYSSPACE,
+	    fdslen > 0 ? &control : NULL);
+	if (error != 0)
+		return (error);
+
+	/* Convert return values. */
+	*rdatalen = td->td_retval[0];
+	td->td_retval[0] = 0;
+	*rfdslen = 0;
+	cloudabi_convert_sockaddr((struct sockaddr *)&ss,
+	    MIN(hdr.msg_namelen, sizeof(ss)), peername);
+	*rflags = 0;
+	if (hdr.msg_flags & MSG_EOR)
+		*rflags |= CLOUDABI_MSG_EOR;
+	if (hdr.msg_flags & MSG_TRUNC)
+		*rflags |= CLOUDABI_MSG_TRUNC;
+
+	/* Extract file descriptors from SCM_RIGHTS messages. */
+	if (control != NULL) {
+		struct cmsghdr *chdr;
+
+		hdr.msg_control = mtod(control, void *);
+		hdr.msg_controllen = control->m_len;
+		for (chdr = CMSG_FIRSTHDR(&hdr); chdr != NULL;
+		    chdr = CMSG_NXTHDR(&hdr, chdr)) {
+			if (chdr->cmsg_level == SOL_SOCKET &&
+			    chdr->cmsg_type == SCM_RIGHTS) {
+				size_t nfds;
+
+				nfds = (chdr->cmsg_len - CMSG_LEN(0)) /
+				    sizeof(int);
+				if (nfds > fdslen) {
+					/* Unable to store file descriptors. */
+					nfds = fdslen;
+					*rflags |= CLOUDABI_MSG_CTRUNC;
+				}
+				error = copyout(CMSG_DATA(chdr), fds,
+				    nfds * sizeof(int));
+				if (error != 0) {
+					m_free(control);
+					return (error);
+				}
+				fds += nfds;
+				fdslen -= nfds;
+				*rfdslen += nfds;
+			}
+		}
+		m_free(control);
+	}
+	return (0);
+}
+
+int
+cloudabi_sock_send(struct thread *td, cloudabi_fd_t fd, struct iovec *data,
+    size_t datalen, const cloudabi_fd_t *fds, size_t fdslen,
+    cloudabi_msgflags_t flags, size_t *rdatalen)
+{
+	struct msghdr hdr = {
+		.msg_iov = data,
+		.msg_iovlen = datalen,
+	};
+	struct mbuf *control;
+	int error, mflags;
+
+	/* Convert flags. */
+	mflags = MSG_NOSIGNAL;
+	if (flags & CLOUDABI_MSG_EOR)
+		mflags |= MSG_EOR;
+
+	/* Convert file descriptor array to an SCM_RIGHTS message. */
+	if (fdslen > MCLBYTES || CMSG_SPACE(fdslen * sizeof(int)) > MCLBYTES) {
+		return (EINVAL);
+	} else if (fdslen > 0) {
+		struct cmsghdr *chdr;
+
+		control = m_get2(CMSG_SPACE(fdslen * sizeof(int)),
+		    M_WAITOK, MT_CONTROL, 0);
+		control->m_len = CMSG_SPACE(fdslen * sizeof(int));
+
+		chdr = mtod(control, struct cmsghdr *);
+		chdr->cmsg_len = CMSG_LEN(fdslen * sizeof(int));
+		chdr->cmsg_level = SOL_SOCKET;
+		chdr->cmsg_type = SCM_RIGHTS;
+		error = copyin(fds, CMSG_DATA(chdr), fdslen * sizeof(int));
+		if (error != 0) {
+			m_free(control);
+			return (error);
+		}
+	} else {
+		control = NULL;
+	}
+
+	error = kern_sendit(td, fd, &hdr, mflags, control, UIO_USERSPACE);
+	if (error != 0)
+		return (error);
+	*rdatalen = td->td_retval[0];
+	td->td_retval[0] = 0;
+	return (0);
+}

Modified: stable/11/sys/compat/cloudabi/cloudabi_util.h
==============================================================================
--- stable/11/sys/compat/cloudabi/cloudabi_util.h	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi/cloudabi_util.h	Thu Apr  6 15:10:36 2017	(r316574)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2015 Nuxi, https://nuxi.nl/
+ * Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -44,10 +44,6 @@ int cloudabi_clock_time_get(struct threa
 /* Converts a FreeBSD errno to a CloudABI errno. */
 cloudabi_errno_t cloudabi_convert_errno(int);
 
-/* Converts FreeBSD's struct sockaddr to CloudABI's cloudabi_sockaddr_t. */
-void cloudabi_convert_sockaddr(const struct sockaddr *, socklen_t,
-    cloudabi_sockaddr_t *);
-
 /* Converts a file descriptor to a CloudABI file descriptor type. */
 cloudabi_filetype_t cloudabi_convert_filetype(const struct file *);
 
@@ -77,6 +73,13 @@ int cloudabi_futex_lock_wrlock(struct th
     cloudabi_scope_t, cloudabi_clockid_t, cloudabi_timestamp_t,
     cloudabi_timestamp_t);
 
+/* Socket operations. */
+int cloudabi_sock_recv(struct thread *, cloudabi_fd_t, struct iovec *, size_t,
+    cloudabi_fd_t *, size_t, cloudabi_msgflags_t, size_t *, size_t *,
+    cloudabi_sockaddr_t *, cloudabi_msgflags_t *);
+int cloudabi_sock_send(struct thread *, cloudabi_fd_t, struct iovec *, size_t,
+    const cloudabi_fd_t *, size_t, cloudabi_msgflags_t, size_t *);
+
 /* vDSO setup and teardown. */
 void cloudabi_vdso_init(struct sysentvec *, char *, char *);
 void cloudabi_vdso_destroy(struct sysentvec *);

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_fd.c
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_fd.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_fd.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -71,8 +71,8 @@ cloudabi32_copyinuio(const cloudabi32_io
 			free(uio, M_IOV);
 			return (error);
 		}
-		iov[i].iov_base = TO_PTR(iovobj.iov_base);
-		iov[i].iov_len = iovobj.iov_len;
+		iov[i].iov_base = TO_PTR(iovobj.buf);
+		iov[i].iov_len = iovobj.buf_len;
 		if (iov[i].iov_len > INT32_MAX - uio->uio_resid) {
 			free(uio, M_IOV);
 			return (EINVAL);
@@ -91,7 +91,7 @@ cloudabi32_sys_fd_pread(struct thread *t
 	struct uio *uio;
 	int error;
 
-	error = cloudabi32_copyinuio(uap->iov, uap->iovcnt, &uio);
+	error = cloudabi32_copyinuio(uap->iovs, uap->iovs_len, &uio);
 	if (error != 0)
 		return (error);
 	error = kern_preadv(td, uap->fd, uio, uap->offset);
@@ -106,7 +106,7 @@ cloudabi32_sys_fd_pwrite(struct thread *
 	struct uio *uio;
 	int error;
 
-	error = cloudabi32_copyinuio(TO_PTR(uap->iov), uap->iovcnt, &uio);
+	error = cloudabi32_copyinuio(TO_PTR(uap->iovs), uap->iovs_len, &uio);
 	if (error != 0)
 		return (error);
 	error = kern_pwritev(td, uap->fd, uio, uap->offset);
@@ -121,7 +121,7 @@ cloudabi32_sys_fd_read(struct thread *td
 	struct uio *uio;
 	int error;
 
-	error = cloudabi32_copyinuio(uap->iov, uap->iovcnt, &uio);
+	error = cloudabi32_copyinuio(uap->iovs, uap->iovs_len, &uio);
 	if (error != 0)
 		return (error);
 	error = kern_readv(td, uap->fd, uio);
@@ -136,7 +136,7 @@ cloudabi32_sys_fd_write(struct thread *t
 	struct uio *uio;
 	int error;
 
-	error = cloudabi32_copyinuio(TO_PTR(uap->iov), uap->iovcnt, &uio);
+	error = cloudabi32_copyinuio(TO_PTR(uap->iovs), uap->iovs_len, &uio);
 	if (error != 0)
 		return (error);
 	error = kern_writev(td, uap->fd, uio);

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_poll.c
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_poll.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_poll.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -398,11 +398,11 @@ cloudabi32_sys_poll_fd(struct thread *td
 			return (EINVAL);
 		timeout.tv_sec = subtimo.clock.timeout / 1000000000;
 		timeout.tv_nsec = subtimo.clock.timeout % 1000000000;
-		return (kern_kevent(td, uap->fd, uap->nin, uap->nout, &copyops,
-		    &timeout));
+		return (kern_kevent(td, uap->fd, uap->in_len, uap->out_len,
+		    &copyops, &timeout));
 	} else {
 		/* Poll without a timeout. */
-		return (kern_kevent(td, uap->fd, uap->nin, uap->nout, &copyops,
-		    NULL));
+		return (kern_kevent(td, uap->fd, uap->in_len, uap->out_len,
+		    &copyops, NULL));
 	}
 }

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_proto.h
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_proto.h	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_proto.h	Thu Apr  6 15:10:36 2017	(r316574)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 304563 2016-08-21 15:56:19Z ed 
+ * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 312353 2017-01-17 22:03:08Z ed
  */
 
 #ifndef _CLOUDABI32_SYSPROTO_H_
@@ -63,20 +63,20 @@ struct cloudabi_sys_fd_dup_args {
 };
 struct cloudabi32_sys_fd_pread_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
-	char iov_l_[PADL_(const cloudabi32_iovec_t *)]; const cloudabi32_iovec_t * iov; char iov_r_[PADR_(const cloudabi32_iovec_t *)];
-	char iovcnt_l_[PADL_(size_t)]; size_t iovcnt; char iovcnt_r_[PADR_(size_t)];
+	char iovs_l_[PADL_(const cloudabi32_iovec_t *)]; const cloudabi32_iovec_t * iovs; char iovs_r_[PADR_(const cloudabi32_iovec_t *)];
+	char iovs_len_l_[PADL_(size_t)]; size_t iovs_len; char iovs_len_r_[PADR_(size_t)];
 	char offset_l_[PADL_(cloudabi_filesize_t)]; cloudabi_filesize_t offset; char offset_r_[PADR_(cloudabi_filesize_t)];
 };
 struct cloudabi32_sys_fd_pwrite_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
-	char iov_l_[PADL_(const cloudabi32_ciovec_t *)]; const cloudabi32_ciovec_t * iov; char iov_r_[PADR_(const cloudabi32_ciovec_t *)];
-	char iovcnt_l_[PADL_(size_t)]; size_t iovcnt; char iovcnt_r_[PADR_(size_t)];
+	char iovs_l_[PADL_(const cloudabi32_ciovec_t *)]; const cloudabi32_ciovec_t * iovs; char iovs_r_[PADR_(const cloudabi32_ciovec_t *)];
+	char iovs_len_l_[PADL_(size_t)]; size_t iovs_len; char iovs_len_r_[PADR_(size_t)];
 	char offset_l_[PADL_(cloudabi_filesize_t)]; cloudabi_filesize_t offset; char offset_r_[PADR_(cloudabi_filesize_t)];
 };
 struct cloudabi32_sys_fd_read_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
-	char iov_l_[PADL_(const cloudabi32_iovec_t *)]; const cloudabi32_iovec_t * iov; char iov_r_[PADR_(const cloudabi32_iovec_t *)];
-	char iovcnt_l_[PADL_(size_t)]; size_t iovcnt; char iovcnt_r_[PADR_(size_t)];
+	char iovs_l_[PADL_(const cloudabi32_iovec_t *)]; const cloudabi32_iovec_t * iovs; char iovs_r_[PADR_(const cloudabi32_iovec_t *)];
+	char iovs_len_l_[PADL_(size_t)]; size_t iovs_len; char iovs_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_fd_replace_args {
 	char from_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t from; char from_r_[PADR_(cloudabi_fd_t)];
@@ -101,8 +101,8 @@ struct cloudabi_sys_fd_sync_args {
 };
 struct cloudabi32_sys_fd_write_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
-	char iov_l_[PADL_(const cloudabi32_ciovec_t *)]; const cloudabi32_ciovec_t * iov; char iov_r_[PADR_(const cloudabi32_ciovec_t *)];
-	char iovcnt_l_[PADL_(size_t)]; size_t iovcnt; char iovcnt_r_[PADR_(size_t)];
+	char iovs_l_[PADL_(const cloudabi32_ciovec_t *)]; const cloudabi32_ciovec_t * iovs; char iovs_r_[PADR_(const cloudabi32_ciovec_t *)];
+	char iovs_len_l_[PADL_(size_t)]; size_t iovs_len; char iovs_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_file_advise_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
@@ -118,44 +118,44 @@ struct cloudabi_sys_file_allocate_args {
 struct cloudabi_sys_file_create_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 	char type_l_[PADL_(cloudabi_filetype_t)]; cloudabi_filetype_t type; char type_r_[PADR_(cloudabi_filetype_t)];
 };
 struct cloudabi_sys_file_link_args {
 	char fd1_l_[PADL_(cloudabi_lookup_t)]; cloudabi_lookup_t fd1; char fd1_r_[PADR_(cloudabi_lookup_t)];
 	char path1_l_[PADL_(const char *)]; const char * path1; char path1_r_[PADR_(const char *)];
-	char path1len_l_[PADL_(size_t)]; size_t path1len; char path1len_r_[PADR_(size_t)];
+	char path1_len_l_[PADL_(size_t)]; size_t path1_len; char path1_len_r_[PADR_(size_t)];
 	char fd2_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd2; char fd2_r_[PADR_(cloudabi_fd_t)];
 	char path2_l_[PADL_(const char *)]; const char * path2; char path2_r_[PADR_(const char *)];
-	char path2len_l_[PADL_(size_t)]; size_t path2len; char path2len_r_[PADR_(size_t)];
+	char path2_len_l_[PADL_(size_t)]; size_t path2_len; char path2_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_file_open_args {
 	char dirfd_l_[PADL_(cloudabi_lookup_t)]; cloudabi_lookup_t dirfd; char dirfd_r_[PADR_(cloudabi_lookup_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 	char oflags_l_[PADL_(cloudabi_oflags_t)]; cloudabi_oflags_t oflags; char oflags_r_[PADR_(cloudabi_oflags_t)];
 	char fds_l_[PADL_(const cloudabi_fdstat_t *)]; const cloudabi_fdstat_t * fds; char fds_r_[PADR_(const cloudabi_fdstat_t *)];
 };
 struct cloudabi_sys_file_readdir_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)];
-	char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
+	char buf_len_l_[PADL_(size_t)]; size_t buf_len; char buf_len_r_[PADR_(size_t)];
 	char cookie_l_[PADL_(cloudabi_dircookie_t)]; cloudabi_dircookie_t cookie; char cookie_r_[PADR_(cloudabi_dircookie_t)];
 };
 struct cloudabi_sys_file_readlink_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 	char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
-	char bufsize_l_[PADL_(size_t)]; size_t bufsize; char bufsize_r_[PADR_(size_t)];
+	char buf_len_l_[PADL_(size_t)]; size_t buf_len; char buf_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_file_rename_args {
-	char oldfd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t oldfd; char oldfd_r_[PADR_(cloudabi_fd_t)];
-	char old_l_[PADL_(const char *)]; const char * old; char old_r_[PADR_(const char *)];
-	char oldlen_l_[PADL_(size_t)]; size_t oldlen; char oldlen_r_[PADR_(size_t)];
-	char newfd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t newfd; char newfd_r_[PADR_(cloudabi_fd_t)];
-	char new_l_[PADL_(const char *)]; const char * new; char new_r_[PADR_(const char *)];
-	char newlen_l_[PADL_(size_t)]; size_t newlen; char newlen_r_[PADR_(size_t)];
+	char fd1_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd1; char fd1_r_[PADR_(cloudabi_fd_t)];
+	char path1_l_[PADL_(const char *)]; const char * path1; char path1_r_[PADR_(const char *)];
+	char path1_len_l_[PADL_(size_t)]; size_t path1_len; char path1_len_r_[PADR_(size_t)];
+	char fd2_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd2; char fd2_r_[PADR_(cloudabi_fd_t)];
+	char path2_l_[PADL_(const char *)]; const char * path2; char path2_r_[PADR_(const char *)];
+	char path2_len_l_[PADL_(size_t)]; size_t path2_len; char path2_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_file_stat_fget_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
@@ -169,27 +169,27 @@ struct cloudabi_sys_file_stat_fput_args 
 struct cloudabi_sys_file_stat_get_args {
 	char fd_l_[PADL_(cloudabi_lookup_t)]; cloudabi_lookup_t fd; char fd_r_[PADR_(cloudabi_lookup_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 	char buf_l_[PADL_(cloudabi_filestat_t *)]; cloudabi_filestat_t * buf; char buf_r_[PADR_(cloudabi_filestat_t *)];
 };
 struct cloudabi_sys_file_stat_put_args {
 	char fd_l_[PADL_(cloudabi_lookup_t)]; cloudabi_lookup_t fd; char fd_r_[PADR_(cloudabi_lookup_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 	char buf_l_[PADL_(const cloudabi_filestat_t *)]; const cloudabi_filestat_t * buf; char buf_r_[PADR_(const cloudabi_filestat_t *)];
 	char flags_l_[PADL_(cloudabi_fsflags_t)]; cloudabi_fsflags_t flags; char flags_r_[PADR_(cloudabi_fsflags_t)];
 };
 struct cloudabi_sys_file_symlink_args {
 	char path1_l_[PADL_(const char *)]; const char * path1; char path1_r_[PADR_(const char *)];
-	char path1len_l_[PADL_(size_t)]; size_t path1len; char path1len_r_[PADR_(size_t)];
+	char path1_len_l_[PADL_(size_t)]; size_t path1_len; char path1_len_r_[PADR_(size_t)];
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char path2_l_[PADL_(const char *)]; const char * path2; char path2_r_[PADR_(const char *)];
-	char path2len_l_[PADL_(size_t)]; size_t path2len; char path2len_r_[PADR_(size_t)];
+	char path2_len_l_[PADL_(size_t)]; size_t path2_len; char path2_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_file_unlink_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 	char flags_l_[PADL_(cloudabi_ulflags_t)]; cloudabi_ulflags_t flags; char flags_r_[PADR_(cloudabi_ulflags_t)];
 };
 struct cloudabi_sys_lock_unlock_args {
@@ -197,13 +197,13 @@ struct cloudabi_sys_lock_unlock_args {
 	char scope_l_[PADL_(cloudabi_scope_t)]; cloudabi_scope_t scope; char scope_r_[PADR_(cloudabi_scope_t)];
 };
 struct cloudabi_sys_mem_advise_args {
-	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
-	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+	char mapping_l_[PADL_(void *)]; void * mapping; char mapping_r_[PADR_(void *)];
+	char mapping_len_l_[PADL_(size_t)]; size_t mapping_len; char mapping_len_r_[PADR_(size_t)];
 	char advice_l_[PADL_(cloudabi_advice_t)]; cloudabi_advice_t advice; char advice_r_[PADR_(cloudabi_advice_t)];
 };
 struct cloudabi_sys_mem_lock_args {
-	char addr_l_[PADL_(const void *)]; const void * addr; char addr_r_[PADR_(const void *)];
-	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+	char mapping_l_[PADL_(const void *)]; const void * mapping; char mapping_r_[PADR_(const void *)];
+	char mapping_len_l_[PADL_(size_t)]; size_t mapping_len; char mapping_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_mem_map_args {
 	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
@@ -214,22 +214,22 @@ struct cloudabi_sys_mem_map_args {
 	char off_l_[PADL_(cloudabi_filesize_t)]; cloudabi_filesize_t off; char off_r_[PADR_(cloudabi_filesize_t)];
 };
 struct cloudabi_sys_mem_protect_args {
-	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
-	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+	char mapping_l_[PADL_(void *)]; void * mapping; char mapping_r_[PADR_(void *)];
+	char mapping_len_l_[PADL_(size_t)]; size_t mapping_len; char mapping_len_r_[PADR_(size_t)];
 	char prot_l_[PADL_(cloudabi_mprot_t)]; cloudabi_mprot_t prot; char prot_r_[PADR_(cloudabi_mprot_t)];
 };
 struct cloudabi_sys_mem_sync_args {
-	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
-	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+	char mapping_l_[PADL_(void *)]; void * mapping; char mapping_r_[PADR_(void *)];
+	char mapping_len_l_[PADL_(size_t)]; size_t mapping_len; char mapping_len_r_[PADR_(size_t)];
 	char flags_l_[PADL_(cloudabi_msflags_t)]; cloudabi_msflags_t flags; char flags_r_[PADR_(cloudabi_msflags_t)];
 };
 struct cloudabi_sys_mem_unlock_args {
-	char addr_l_[PADL_(const void *)]; const void * addr; char addr_r_[PADR_(const void *)];
-	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+	char mapping_l_[PADL_(const void *)]; const void * mapping; char mapping_r_[PADR_(const void *)];
+	char mapping_len_l_[PADL_(size_t)]; size_t mapping_len; char mapping_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_mem_unmap_args {
-	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
-	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+	char mapping_l_[PADL_(void *)]; void * mapping; char mapping_r_[PADR_(void *)];
+	char mapping_len_l_[PADL_(size_t)]; size_t mapping_len; char mapping_len_r_[PADR_(size_t)];
 };
 struct cloudabi32_sys_poll_args {
 	char in_l_[PADL_(const cloudabi32_subscription_t *)]; const cloudabi32_subscription_t * in; char in_r_[PADR_(const cloudabi32_subscription_t *)];
@@ -239,17 +239,17 @@ struct cloudabi32_sys_poll_args {
 struct cloudabi32_sys_poll_fd_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char in_l_[PADL_(const cloudabi32_subscription_t *)]; const cloudabi32_subscription_t * in; char in_r_[PADR_(const cloudabi32_subscription_t *)];
-	char nin_l_[PADL_(size_t)]; size_t nin; char nin_r_[PADR_(size_t)];
+	char in_len_l_[PADL_(size_t)]; size_t in_len; char in_len_r_[PADR_(size_t)];
 	char out_l_[PADL_(cloudabi32_event_t *)]; cloudabi32_event_t * out; char out_r_[PADR_(cloudabi32_event_t *)];
-	char nout_l_[PADL_(size_t)]; size_t nout; char nout_r_[PADR_(size_t)];
+	char out_len_l_[PADL_(size_t)]; size_t out_len; char out_len_r_[PADR_(size_t)];
 	char timeout_l_[PADL_(const cloudabi32_subscription_t *)]; const cloudabi32_subscription_t * timeout; char timeout_r_[PADR_(const cloudabi32_subscription_t *)];
 };
 struct cloudabi_sys_proc_exec_args {
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char data_l_[PADL_(const void *)]; const void * data; char data_r_[PADR_(const void *)];
-	char datalen_l_[PADL_(size_t)]; size_t datalen; char datalen_r_[PADR_(size_t)];
+	char data_len_l_[PADL_(size_t)]; size_t data_len; char data_len_r_[PADR_(size_t)];
 	char fds_l_[PADL_(const cloudabi_fd_t *)]; const cloudabi_fd_t * fds; char fds_r_[PADR_(const cloudabi_fd_t *)];
-	char fdslen_l_[PADL_(size_t)]; size_t fdslen; char fdslen_r_[PADR_(size_t)];
+	char fds_len_l_[PADL_(size_t)]; size_t fds_len; char fds_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_proc_exit_args {
 	char rval_l_[PADL_(cloudabi_exitcode_t)]; cloudabi_exitcode_t rval; char rval_r_[PADR_(cloudabi_exitcode_t)];
@@ -262,7 +262,7 @@ struct cloudabi_sys_proc_raise_args {
 };
 struct cloudabi_sys_random_get_args {
 	char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)];
-	char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
+	char buf_len_l_[PADL_(size_t)]; size_t buf_len; char buf_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_sock_accept_args {
 	char sock_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t sock; char sock_r_[PADR_(cloudabi_fd_t)];
@@ -272,13 +272,13 @@ struct cloudabi_sys_sock_bind_args {
 	char sock_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t sock; char sock_r_[PADR_(cloudabi_fd_t)];
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_sock_connect_args {
 	char sock_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t sock; char sock_r_[PADR_(cloudabi_fd_t)];
 	char fd_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t fd; char fd_r_[PADR_(cloudabi_fd_t)];
 	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
-	char pathlen_l_[PADL_(size_t)]; size_t pathlen; char pathlen_r_[PADR_(size_t)];
+	char path_len_l_[PADL_(size_t)]; size_t path_len; char path_len_r_[PADR_(size_t)];
 };
 struct cloudabi_sys_sock_listen_args {
 	char sock_l_[PADL_(cloudabi_fd_t)]; cloudabi_fd_t sock; char sock_r_[PADR_(cloudabi_fd_t)];

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_sock.c
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_sock.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_sock.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2015 Nuxi, https://nuxi.nl/
+ * Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,9 +29,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/malloc.h>
-#include <sys/proc.h>
-#include <sys/socket.h>
-#include <sys/syscallsubr.h>
 #include <sys/systm.h>
 #include <sys/uio.h>
 
@@ -48,53 +45,43 @@ int
 cloudabi32_sys_sock_recv(struct thread *td,
     struct cloudabi32_sys_sock_recv_args *uap)
 {
-	struct sockaddr_storage ss;
 	cloudabi32_recv_in_t ri;
 	cloudabi32_recv_out_t ro = {};
 	cloudabi32_iovec_t iovobj;
-	struct msghdr msghdr = {};
+	struct iovec *iov;
 	const cloudabi32_iovec_t *user_iov;
-	size_t i;
+	size_t i, rdatalen, rfdslen;
 	int error;
 
 	error = copyin(uap->in, &ri, sizeof(ri));
 	if (error != 0)
 		return (error);
 
-	/* Convert results in cloudabi_recv_in_t to struct msghdr. */
-	if (ri.ri_datalen > UIO_MAXIOV)
+	/* Convert iovecs to native format. */
+	if (ri.ri_data_len > UIO_MAXIOV)
 		return (EINVAL);
-	msghdr.msg_iovlen = ri.ri_datalen;
-	msghdr.msg_iov = malloc(msghdr.msg_iovlen * sizeof(struct iovec),
+	iov = malloc(ri.ri_data_len * sizeof(struct iovec),
 	    M_SOCKET, M_WAITOK);
 	user_iov = TO_PTR(ri.ri_data);
-	for (i = 0; i < msghdr.msg_iovlen; i++) {
+	for (i = 0; i < ri.ri_data_len; i++) {
 		error = copyin(&user_iov[i], &iovobj, sizeof(iovobj));
 		if (error != 0) {
-			free(msghdr.msg_iov, M_SOCKET);
+			free(iov, M_SOCKET);
 			return (error);
 		}
-		msghdr.msg_iov[i].iov_base = TO_PTR(iovobj.iov_base);
-		msghdr.msg_iov[i].iov_len = iovobj.iov_len;
+		iov[i].iov_base = TO_PTR(iovobj.buf);
+		iov[i].iov_len = iovobj.buf_len;
 	}
-	msghdr.msg_name = &ss;
-	msghdr.msg_namelen = sizeof(ss);
-	if (ri.ri_flags & CLOUDABI_MSG_PEEK)
-		msghdr.msg_flags |= MSG_PEEK;
-	if (ri.ri_flags & CLOUDABI_MSG_WAITALL)
-		msghdr.msg_flags |= MSG_WAITALL;
-
-	/* TODO(ed): Add file descriptor passing. */
-	error = kern_recvit(td, uap->sock, &msghdr, UIO_SYSSPACE, NULL);
-	free(msghdr.msg_iov, M_SOCKET);
+
+	error = cloudabi_sock_recv(td, uap->sock, iov, ri.ri_data_len,
+	    TO_PTR(ri.ri_fds), ri.ri_fds_len, ri.ri_flags, &rdatalen,
+	    &rfdslen, &ro.ro_peername, &ro.ro_flags);
+	free(iov, M_SOCKET);
 	if (error != 0)
 		return (error);
 
-	/* Convert results in msghdr to cloudabi_recv_out_t. */
-	ro.ro_datalen = td->td_retval[0];
-	cloudabi_convert_sockaddr((struct sockaddr *)&ss,
-	    MIN(msghdr.msg_namelen, sizeof(ss)), &ro.ro_peername);
-	td->td_retval[0] = 0;
+	ro.ro_datalen = rdatalen;
+	ro.ro_fdslen = rfdslen;
 	return (copyout(&ro, uap->out, sizeof(ro)));
 }
 
@@ -105,44 +92,37 @@ cloudabi32_sys_sock_send(struct thread *
 	cloudabi32_send_in_t si;
 	cloudabi32_send_out_t so = {};
 	cloudabi32_ciovec_t iovobj;
-	struct msghdr msghdr = {};
+	struct iovec *iov;
 	const cloudabi32_ciovec_t *user_iov;
-	size_t i;
-	int error, flags;
+	size_t datalen, i;
+	int error;
 
 	error = copyin(uap->in, &si, sizeof(si));
 	if (error != 0)
 		return (error);
 
-	/* Convert results in cloudabi_send_in_t to struct msghdr. */
-	if (si.si_datalen > UIO_MAXIOV)
+	/* Convert iovecs to native format. */
+	if (si.si_data_len > UIO_MAXIOV)
 		return (EINVAL);
-	msghdr.msg_iovlen = si.si_datalen;
-	msghdr.msg_iov = malloc(msghdr.msg_iovlen * sizeof(struct iovec),
+	iov = malloc(si.si_data_len * sizeof(struct iovec),
 	    M_SOCKET, M_WAITOK);
 	user_iov = TO_PTR(si.si_data);
-	for (i = 0; i < msghdr.msg_iovlen; i++) {
+	for (i = 0; i < si.si_data_len; i++) {
 		error = copyin(&user_iov[i], &iovobj, sizeof(iovobj));
 		if (error != 0) {
-			free(msghdr.msg_iov, M_SOCKET);
+			free(iov, M_SOCKET);
 			return (error);
 		}
-		msghdr.msg_iov[i].iov_base = TO_PTR(iovobj.iov_base);
-		msghdr.msg_iov[i].iov_len = iovobj.iov_len;
+		iov[i].iov_base = TO_PTR(iovobj.buf);
+		iov[i].iov_len = iovobj.buf_len;
 	}
 
-	flags = MSG_NOSIGNAL;
-	if (si.si_flags & CLOUDABI_MSG_EOR)
-		flags |= MSG_EOR;
-
-	/* TODO(ed): Add file descriptor passing. */
-	error = kern_sendit(td, uap->sock, &msghdr, flags, NULL, UIO_USERSPACE);
-	free(msghdr.msg_iov, M_SOCKET);
+	error = cloudabi_sock_send(td, uap->sock, iov, si.si_data_len,
+	    TO_PTR(si.si_fds), si.si_fds_len, si.si_flags, &datalen);
+	free(iov, M_SOCKET);
 	if (error != 0)
 		return (error);
 
-	/* Convert results in msghdr to cloudabi_send_out_t. */
-	so.so_datalen = td->td_retval[0];
-	td->td_retval[0] = 0;
+	so.so_datalen = datalen;
 	return (copyout(&so, uap->out, sizeof(so)));
 }

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_syscall.h
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_syscall.h	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_syscall.h	Thu Apr  6 15:10:36 2017	(r316574)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 304563 2016-08-21 15:56:19Z ed 
+ * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 312353 2017-01-17 22:03:08Z ed
  */
 
 #define	CLOUDABI32_SYS_cloudabi_sys_clock_res_get	0

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_syscalls.c
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_syscalls.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_syscalls.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 304563 2016-08-21 15:56:19Z ed 
+ * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 312353 2017-01-17 22:03:08Z ed
  */
 
 const char *cloudabi32_syscallnames[] = {

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_sysent.c
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_sysent.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_sysent.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -3,7 +3,7 @@
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 304563 2016-08-21 15:56:19Z ed 
+ * created from FreeBSD: head/sys/contrib/cloudabi/syscalls32.master 312353 2017-01-17 22:03:08Z ed
  */
 
 #include <sys/sysent.h>

Modified: stable/11/sys/compat/cloudabi32/cloudabi32_systrace_args.c
==============================================================================
--- stable/11/sys/compat/cloudabi32/cloudabi32_systrace_args.c	Thu Apr  6 14:50:15 2017	(r316573)
+++ stable/11/sys/compat/cloudabi32/cloudabi32_systrace_args.c	Thu Apr  6 15:10:36 2017	(r316574)
@@ -74,8 +74,8 @@ systrace_args(int sysnum, void *params, 
 	case 8: {
 		struct cloudabi32_sys_fd_pread_args *p = params;
 		iarg[0] = p->fd; /* cloudabi_fd_t */
-		uarg[1] = (intptr_t) p->iov; /* const cloudabi32_iovec_t * */
-		uarg[2] = p->iovcnt; /* size_t */
+		uarg[1] = (intptr_t) p->iovs; /* const cloudabi32_iovec_t * */
+		uarg[2] = p->iovs_len; /* size_t */
 		iarg[3] = p->offset; /* cloudabi_filesize_t */
 		*n_args = 4;
 		break;
@@ -84,8 +84,8 @@ systrace_args(int sysnum, void *params, 
 	case 9: {
 		struct cloudabi32_sys_fd_pwrite_args *p = params;
 		iarg[0] = p->fd; /* cloudabi_fd_t */
-		uarg[1] = (intptr_t) p->iov; /* const cloudabi32_ciovec_t * */
-		uarg[2] = p->iovcnt; /* size_t */
+		uarg[1] = (intptr_t) p->iovs; /* const cloudabi32_ciovec_t * */
+		uarg[2] = p->iovs_len; /* size_t */
 		iarg[3] = p->offset; /* cloudabi_filesize_t */
 		*n_args = 4;
 		break;
@@ -94,8 +94,8 @@ systrace_args(int sysnum, void *params, 
 	case 10: {
 		struct cloudabi32_sys_fd_read_args *p = params;
 		iarg[0] = p->fd; /* cloudabi_fd_t */
-		uarg[1] = (intptr_t) p->iov; /* const cloudabi32_iovec_t * */
-		uarg[2] = p->iovcnt; /* size_t */
+		uarg[1] = (intptr_t) p->iovs; /* const cloudabi32_iovec_t * */
+		uarg[2] = p->iovs_len; /* size_t */
 		*n_args = 3;
 		break;
 	}
@@ -144,8 +144,8 @@ systrace_args(int sysnum, void *params, 
 	case 16: {
 		struct cloudabi32_sys_fd_write_args *p = params;
 		iarg[0] = p->fd; /* cloudabi_fd_t */
-		uarg[1] = (intptr_t) p->iov; /* const cloudabi32_ciovec_t * */
-		uarg[2] = p->iovcnt; /* size_t */
+		uarg[1] = (intptr_t) p->iovs; /* const cloudabi32_ciovec_t * */
+		uarg[2] = p->iovs_len; /* size_t */
 		*n_args = 3;
 		break;
 	}
@@ -173,7 +173,7 @@ systrace_args(int sysnum, void *params, 
 		struct cloudabi_sys_file_create_args *p = params;
 		iarg[0] = p->fd; /* cloudabi_fd_t */
 		uarg[1] = (intptr_t) p->path; /* const char * */
-		uarg[2] = p->pathlen; /* size_t */
+		uarg[2] = p->path_len; /* size_t */
 		iarg[3] = p->type; /* cloudabi_filetype_t */
 		*n_args = 4;
 		break;
@@ -183,10 +183,10 @@ systrace_args(int sysnum, void *params, 
 		struct cloudabi_sys_file_link_args *p = params;
 		iarg[0] = p->fd1; /* cloudabi_lookup_t */
 		uarg[1] = (intptr_t) p->path1; /* const char * */

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704061510.v36FAajp011618>