2015-07-16 18:24:06 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 2015 Nuxi, https://nuxi.nl/
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _CLOUDABI_UTIL_H_
|
|
|
|
#define _CLOUDABI_UTIL_H_
|
|
|
|
|
2015-08-05 08:18:05 +00:00
|
|
|
#include <sys/socket.h>
|
|
|
|
|
2015-07-16 18:24:06 +00:00
|
|
|
#include <compat/cloudabi/cloudabi_syscalldefs.h>
|
|
|
|
|
Make fstat() and friends work.
Summary:
CloudABI provides access to two different stat structures:
- fdstat, containing file descriptor level status: oflags, file
descriptor type and Capsicum rights, used by cap_rights_get(),
fcntl(F_GETFL), getsockopt(SO_TYPE).
- filestat, containing your regular file status: timestamps, inode
number, used by fstat().
Unlike FreeBSD's stat::st_mode, CloudABI file descriptor types don't
have overloaded meanings (e.g., returning S_ISCHR() for kqueues). Add a
utility function to extract the type of a file descriptor accurately.
CloudABI does not work with O_ACCMODEs. File descriptors have two sets
of Capsicum-style rights: rights that apply to the file descriptor
itself ('base') and rights that apply to any new file descriptors
yielded through openat() ('inheriting'). Though not perfect, we can
pretty safely decompose Capsicum rights to such a pair. This is done in
convert_capabilities().
Test Plan: Tests for these system calls are fairly extensive in cloudlibc.
Reviewers: jonathan, mjg, #manpages
Reviewed By: mjg
Subscribers: imp
Differential Revision: https://reviews.freebsd.org/D3171
2015-07-28 06:36:49 +00:00
|
|
|
struct file;
|
2015-07-27 10:07:29 +00:00
|
|
|
struct thread;
|
2015-07-21 15:08:13 +00:00
|
|
|
struct timespec;
|
|
|
|
|
2015-07-27 10:07:29 +00:00
|
|
|
/* Fetches the time value of a clock. */
|
|
|
|
int cloudabi_clock_time_get(struct thread *, cloudabi_clockid_t,
|
|
|
|
cloudabi_timestamp_t *);
|
|
|
|
|
2015-07-16 18:24:06 +00:00
|
|
|
/* Converts a FreeBSD errno to a CloudABI errno. */
|
|
|
|
cloudabi_errno_t cloudabi_convert_errno(int);
|
|
|
|
|
2015-08-05 08:18:05 +00:00
|
|
|
/* Converts FreeBSD's struct sockaddr to CloudABI's cloudabi_sockaddr_t. */
|
|
|
|
void cloudabi_convert_sockaddr(const struct sockaddr *, socklen_t,
|
|
|
|
cloudabi_sockaddr_t *);
|
|
|
|
|
Make fstat() and friends work.
Summary:
CloudABI provides access to two different stat structures:
- fdstat, containing file descriptor level status: oflags, file
descriptor type and Capsicum rights, used by cap_rights_get(),
fcntl(F_GETFL), getsockopt(SO_TYPE).
- filestat, containing your regular file status: timestamps, inode
number, used by fstat().
Unlike FreeBSD's stat::st_mode, CloudABI file descriptor types don't
have overloaded meanings (e.g., returning S_ISCHR() for kqueues). Add a
utility function to extract the type of a file descriptor accurately.
CloudABI does not work with O_ACCMODEs. File descriptors have two sets
of Capsicum-style rights: rights that apply to the file descriptor
itself ('base') and rights that apply to any new file descriptors
yielded through openat() ('inheriting'). Though not perfect, we can
pretty safely decompose Capsicum rights to such a pair. This is done in
convert_capabilities().
Test Plan: Tests for these system calls are fairly extensive in cloudlibc.
Reviewers: jonathan, mjg, #manpages
Reviewed By: mjg
Subscribers: imp
Differential Revision: https://reviews.freebsd.org/D3171
2015-07-28 06:36:49 +00:00
|
|
|
/* Converts a file descriptor to a CloudABI file descriptor type. */
|
|
|
|
cloudabi_filetype_t cloudabi_convert_filetype(const struct file *);
|
|
|
|
|
Add file_open(): the underlying system call of openat().
CloudABI purely operates on file descriptor rights (CAP_*). File
descriptor access modes (O_ACCMODE) are emulated on top of rights.
Instead of accepting the traditional flags argument, file_open() copies
in an fdstat_t object that contains the initial rights the descriptor
should have, but also file descriptor flags that should persist after
opening (APPEND, NONBLOCK, *SYNC). Only flags that don't persist (EXCL,
TRUNC, CREAT, DIRECTORY) are passed in as an argument.
file_open() first converts the rights, the persistent flags and the
non-persistent flags to fflags. It then calls into vn_open(). If
successful, it installs the file descriptor with the requested
rights, trimming off rights that don't apply to the type of
the file that has been opened.
Unlike kern_openat(), this function does not support /dev/fd/*. I can't
think of a reason why we need to support this for CloudABI.
Obtained from: https://github.com/NuxiNL/freebsd
Differential Revision: https://reviews.freebsd.org/D3235
2015-08-06 06:47:28 +00:00
|
|
|
/* Converts CloudABI rights to a set of Capsicum capabilities. */
|
|
|
|
int cloudabi_convert_rights(cloudabi_rights_t, cap_rights_t *);
|
|
|
|
|
|
|
|
/* Removes rights that conflict with the file descriptor type. */
|
|
|
|
void cloudabi_remove_conflicting_rights(cloudabi_filetype_t,
|
|
|
|
cloudabi_rights_t *, cloudabi_rights_t *);
|
|
|
|
|
2015-07-21 15:08:13 +00:00
|
|
|
/* Converts a struct timespec to a CloudABI timestamp. */
|
|
|
|
int cloudabi_convert_timespec(const struct timespec *, cloudabi_timestamp_t *);
|
|
|
|
|
2015-07-27 10:07:29 +00:00
|
|
|
/*
|
|
|
|
* Blocking futex functions.
|
|
|
|
*
|
|
|
|
* These functions are called by CloudABI's polling system calls to
|
|
|
|
* sleep on a lock or condition variable.
|
|
|
|
*/
|
|
|
|
int cloudabi_futex_condvar_wait(struct thread *, cloudabi_condvar_t *,
|
|
|
|
cloudabi_mflags_t, cloudabi_lock_t *, cloudabi_mflags_t, cloudabi_clockid_t,
|
|
|
|
cloudabi_timestamp_t, cloudabi_timestamp_t);
|
|
|
|
int cloudabi_futex_lock_rdlock(struct thread *, cloudabi_lock_t *,
|
|
|
|
cloudabi_mflags_t, cloudabi_clockid_t, cloudabi_timestamp_t,
|
|
|
|
cloudabi_timestamp_t);
|
|
|
|
int cloudabi_futex_lock_wrlock(struct thread *, cloudabi_lock_t *,
|
|
|
|
cloudabi_mflags_t, cloudabi_clockid_t, cloudabi_timestamp_t,
|
|
|
|
cloudabi_timestamp_t);
|
|
|
|
|
2015-07-16 18:24:06 +00:00
|
|
|
#endif
|