summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2015-07-23 13:52:53 +0000
committered <ed@FreeBSD.org>2015-07-23 13:52:53 +0000
commitd1219ae7625a26239a0872a4caa2fa4c3750eb7d (patch)
tree2d92796d6dc389ebd27eae60d20860460af501aa /sys/compat
parent0b99f53326391fbbca41a039d77d700b2447ba38 (diff)
downloadFreeBSD-src-d1219ae7625a26239a0872a4caa2fa4c3750eb7d.zip
FreeBSD-src-d1219ae7625a26239a0872a4caa2fa4c3750eb7d.tar.gz
Allow us to create UNIX sockets and socketpairs in CloudABI processes.
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/cloudabi/cloudabi_fd.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/sys/compat/cloudabi/cloudabi_fd.c b/sys/compat/cloudabi/cloudabi_fd.c
index da3c0da..8b72c19 100644
--- a/sys/compat/cloudabi/cloudabi_fd.c
+++ b/sys/compat/cloudabi/cloudabi_fd.c
@@ -46,18 +46,51 @@ int
cloudabi_sys_fd_create1(struct thread *td,
struct cloudabi_sys_fd_create1_args *uap)
{
+ struct socket_args socket_args = {
+ .domain = AF_UNIX,
+ };
- /* Not implemented. */
- return (ENOSYS);
+ switch (uap->type) {
+ case CLOUDABI_FILETYPE_SOCKET_DGRAM:
+ socket_args.type = SOCK_DGRAM;
+ return (sys_socket(td, &socket_args));
+ case CLOUDABI_FILETYPE_SOCKET_SEQPACKET:
+ socket_args.type = SOCK_SEQPACKET;
+ return (sys_socket(td, &socket_args));
+ case CLOUDABI_FILETYPE_SOCKET_STREAM:
+ socket_args.type = SOCK_STREAM;
+ return (sys_socket(td, &socket_args));
+ default:
+ return (EINVAL);
+ }
}
int
cloudabi_sys_fd_create2(struct thread *td,
struct cloudabi_sys_fd_create2_args *uap)
{
+ int fds[2];
+ int error;
- /* Not implemented. */
- return (ENOSYS);
+ switch (uap->type) {
+ case CLOUDABI_FILETYPE_SOCKET_DGRAM:
+ error = kern_socketpair(td, AF_UNIX, SOCK_DGRAM, 0, fds);
+ break;
+ case CLOUDABI_FILETYPE_SOCKET_SEQPACKET:
+ error = kern_socketpair(td, AF_UNIX, SOCK_SEQPACKET, 0, fds);
+ break;
+ case CLOUDABI_FILETYPE_SOCKET_STREAM:
+ error = kern_socketpair(td, AF_UNIX, SOCK_STREAM, 0, fds);
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ if (error == 0) {
+ td->td_retval[0] = fds[0];
+ td->td_retval[1] = fds[1];
+ }
+ return (0);
}
int
OpenPOWER on IntegriCloud