* Delete several blocks of unused code.
Delete several pieces of code from libc-bottom-half/cloudlibc that aren't in
use on wasi-libc.
* Delete more of `_CLOCK_PROCESS_CPUTIME_ID` or `_CLOCK_THREAD_CPUTIME_ID`.
_CLOCK_MONOTONIC
-_CLOCK_PROCESS_CPUTIME_ID
_CLOCK_REALTIME
-_CLOCK_THREAD_CPUTIME_ID
_Exit
_IO_feof_unlocked
_IO_ferror_unlocked
#define CLNEXT CTRL('v')
#define CLOCKS_PER_SEC ((clock_t)1000000000)
#define CLOCK_MONOTONIC (&_CLOCK_MONOTONIC)
-#define CLOCK_PROCESS_CPUTIME_ID (&_CLOCK_PROCESS_CPUTIME_ID)
#define CLOCK_REALTIME (&_CLOCK_REALTIME)
-#define CLOCK_THREAD_CPUTIME_ID (&_CLOCK_THREAD_CPUTIME_ID)
#define CMIN 1
#define CMPLX(x,y) __CMPLX(x, y, double)
#define CMPLXF(x,y) __CMPLX(x, y, float)
+++ /dev/null
-// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
-//
-// SPDX-License-Identifier: BSD-2-Clause
-
-#ifndef COMMON_ERRNO_H
-#define COMMON_ERRNO_H
-
-#include <wasi/api.h>
-
-// WASI syscalls should just return ENOTDIR if that's what the problem is.
-static inline __wasi_errno_t errno_fixup_directory(__wasi_fd_t fd,
- __wasi_errno_t error) {
- return error;
-}
-
-// WASI syscalls should just return ENOTSOCK if that's what the problem is.
-static inline __wasi_errno_t errno_fixup_socket(__wasi_fd_t fd,
- __wasi_errno_t error) {
- return error;
-}
-
-#endif
+++ /dev/null
-// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
-//
-// SPDX-License-Identifier: BSD-2-Clause
-
-#ifndef COMMON_OVERFLOW_H
-#define COMMON_OVERFLOW_H
-
-// Performs an addition, subtraction or multiplication operation,
-// returning whether the computation caused an overflow. These
-// intrinsics are available as of Clang 3.8 and GCC 5.
-#define add_overflow(x, y, out) __builtin_add_overflow(x, y, out)
-#define sub_overflow(x, y, out) __builtin_sub_overflow(x, y, out)
-#define mul_overflow(x, y, out) __builtin_mul_overflow(x, y, out)
-
-#endif
#define COMMON_TIME_H
#include <common/limits.h>
-#include <common/overflow.h>
#include <sys/time.h>
#define NSEC_PER_SEC 1000000000
-// Timezone agnostic conversion routines.
-int __localtime_utc(time_t, struct tm *);
-void __mktime_utc(const struct tm *, struct timespec *);
-
-static inline bool is_leap(time_t year) {
- year %= 400;
- if (year < 0)
- year += 400;
- return ((year % 4) == 0 && (year % 100) != 0) || year == 100;
-}
-
-// Gets the length of the months in a year.
-static inline const char *get_months(time_t year) {
- static const char leap[12] = {
- 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
- };
- static const char common[12] = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
- };
- return is_leap(year) ? leap : common;
-}
-
-// Gets the cumulative length of the months in a year.
-static inline const short *get_months_cumulative(time_t year) {
- static const short leap[13] = {
- 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366,
- };
- static const short common[13] = {
- 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365,
- };
- return is_leap(year) ? leap : common;
-}
-
-static inline short get_ydays(time_t year) {
- return is_leap(year) ? 366 : 365;
-}
-
static inline bool timespec_to_timestamp_exact(
const struct timespec *timespec, __wasi_timestamp_t *timestamp) {
// Invalid nanoseconds field.
return false;
// Make sure our timestamp does not overflow.
- return !mul_overflow(timespec->tv_sec, NSEC_PER_SEC, timestamp) &&
- !add_overflow(*timestamp, timespec->tv_nsec, timestamp);
+ return !__builtin_mul_overflow(timespec->tv_sec, NSEC_PER_SEC, timestamp) &&
+ !__builtin_add_overflow(*timestamp, timespec->tv_nsec, timestamp);
}
static inline bool timespec_to_timestamp_clamp(
if (timespec->tv_sec < 0) {
// Timestamps before the Epoch are not supported.
*timestamp = 0;
- } else if (mul_overflow(timespec->tv_sec, NSEC_PER_SEC, timestamp) ||
- add_overflow(*timestamp, timespec->tv_nsec, timestamp)) {
+ } else if (__builtin_mul_overflow(timespec->tv_sec, NSEC_PER_SEC, timestamp) ||
+ __builtin_add_overflow(*timestamp, timespec->tv_nsec, timestamp)) {
// Make sure our timestamp does not overflow.
*timestamp = NUMERIC_MAX(__wasi_timestamp_t);
}
#ifndef ___CDEFS_H_
#define ___CDEFS_H_
-// Version information.
-#define __cloudlibc__ 1
-#define __cloudlibc_major__ 0
-#define __cloudlibc_minor__ 102
-
-#ifdef __cplusplus
-#define __BEGIN_DECLS extern "C" {
-#define __END_DECLS }
-#else
-#define __BEGIN_DECLS
-#define __END_DECLS
-#endif
-
-// Whether we should provide inline versions of functions. Due to C++'s
-// support for namespaces, it is generally a bad idea to declare
-// function macros.
-#ifdef __cplusplus
-#define _CLOUDLIBC_INLINE_FUNCTIONS 0
-#else
-#define _CLOUDLIBC_INLINE_FUNCTIONS 1
-#endif
-
// Compiler-independent annotations.
-#ifndef __has_builtin
-#define __has_builtin(x) 0
-#endif
-#ifndef __has_extension
-#define __has_extension(x) __has_feature(x)
-#endif
-#ifndef __has_feature
-#define __has_feature(x) 0
-#endif
-
-#define __offsetof(type, member) __builtin_offsetof(type, member)
-#define __containerof(ptr, type, member) \
- ((type *)((char *)(ptr)-__offsetof(type, member)))
-
-#define __extname(x) __asm__(x)
-#define __malloc_like __attribute__((__malloc__))
-#define __pure2 __attribute__((__const__))
-#define __pure __attribute__((__pure__))
-#define __section(x) __attribute__((__section__(x)))
-#define __unused __attribute__((__unused__))
-#define __used __attribute__((__used__))
-#define __weak_symbol __attribute__((__weak__))
-
-// Format string argument type checking.
-#define __printflike(format, va) \
- __attribute__((__format__(__printf__, format, va)))
-#define __scanflike(format, va) \
- __attribute__((__format__(__scanf__, format, va)))
-// TODO(ed): Enable this once supported by LLVM:
-// https://llvm.org/bugs/show_bug.cgi?id=16810
-#define __wprintflike(format, va)
-#define __wscanflike(format, va)
-
#define __strong_reference(oldsym, newsym) \
extern __typeof__(oldsym) newsym __attribute__((__alias__(#oldsym)))
// Convenience macros.
#define __arraycount(x) (sizeof(x) / sizeof((x)[0]))
-#define __howmany(x, y) (((x) + (y)-1) / (y))
-#define __rounddown(x, y) (((x) / (y)) * (y))
-#define __roundup(x, y) ((((x) + (y)-1) / (y)) * (y))
-
-// Lock annotations.
-
-#if __has_extension(c_thread_safety_attributes)
-#define __lock_annotate(x) __attribute__((x))
-#else
-#define __lock_annotate(x)
-#endif
-
-#define __lockable __lock_annotate(lockable)
-
-#define __locks_exclusive(...) \
- __lock_annotate(exclusive_lock_function(__VA_ARGS__))
-#define __locks_shared(...) __lock_annotate(shared_lock_function(__VA_ARGS__))
-
-#define __trylocks_exclusive(...) \
- __lock_annotate(exclusive_trylock_function(__VA_ARGS__))
-#define __trylocks_shared(...) \
- __lock_annotate(shared_trylock_function(__VA_ARGS__))
-
-#define __unlocks(...) __lock_annotate(unlock_function(__VA_ARGS__))
-
-#define __asserts_exclusive(...) \
- __lock_annotate(assert_exclusive_lock(__VA_ARGS__))
-#define __asserts_shared(...) __lock_annotate(assert_shared_lock(__VA_ARGS__))
-
-#define __requires_exclusive(...) \
- __lock_annotate(exclusive_locks_required(__VA_ARGS__))
-#define __requires_shared(...) \
- __lock_annotate(shared_locks_required(__VA_ARGS__))
-#define __requires_unlocked(...) __lock_annotate(locks_excluded(__VA_ARGS__))
-
-#define __no_lock_analysis __lock_annotate(no_thread_safety_analysis)
-
-#define __guarded_by(x) __lock_annotate(guarded_by(x))
-#define __pt_guarded_by(x) __lock_annotate(pt_guarded_by(x))
-
-// Const preservation.
-//
-// Functions like strchr() allow you to silently discard a const
-// qualifier from a string. This macro can be used to wrap such
-// functions to propagate the const keyword where possible.
-//
-// This macro has many limitations, such as only being able to detect
-// constness for void, char and wchar_t. For Clang, it also doesn't seem
-// to work on string literals.
-
-#define __preserve_const(type, name, arg, ...) \
- _Generic(arg, \
- const void *: (const type *)name(__VA_ARGS__), \
- const char *: (const type *)name(__VA_ARGS__), \
- const signed char *: (const type *)name(__VA_ARGS__), \
- const unsigned char *: (const type *)name(__VA_ARGS__), \
- const __wchar_t *: (const type *)name(__VA_ARGS__), \
- default: name(__VA_ARGS__))
#endif
+++ /dev/null
-// 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
-// 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.
-
-// <stdlib.h> - standard library definitions
-//
-// Extensions:
-// - MB_CUR_MAX_L(), mblen_l(), mbstowcs_l(), mbtowc_l(), wcstombs_l()
-// and wctomb_l():
-// Regular functions always use the C locale. Available on many other
-// operating systems.
-// - alloca():
-// Present on most other operating systems.
-// - arc4random(), arc4random_buf() and arc4random_uniform():
-// Secure random number generator. Available on many other operating
-// systems.
-// - l64a_r():
-// Thread-safe replacement for l64a(). Part of the SVID, 4th edition.
-// - qsort_r():
-// Available on many other operating systems, although the prototype
-// is not consistent. This implementation is compatible with glibc.
-// It is expected that this version will be standardized in the future.
-// - reallocarray():
-// Allows for reallocation of buffers without integer overflows.
-//
-// Features missing:
-// - initstate(), lcong48(), seed48(), setstate(), srand(), srand48()
-// and srandom():
-// Randomizer is seeded securely by default. There is no need to seed
-// manually.
-// - WEXITSTATUS(), WIFEXITED(), WIFSIGNALED(), WIFSTOPPED(), WNOHANG,
-// WSTOPSIG(), WTERMSIG(), WUNTRACED:
-// Only useful if system() would actually work.
-// - l64a():
-// Not thread-safe. Use l64a_r() instead.
-// - putenv(), setenv() and unsetenv():
-// Environment variables are not available.
-// - grantpt(), posix_openpt(), ptsname() and unlockpt():
-// Pseudo-terminals are not available.
-// - mkdtemp(), mkstemp() and realpath():
-// Requires global filesystem namespace.
-// - setkey():
-// Password database and encryption schemes not available.
-// - system():
-// Requires a command shell.
-
-#ifndef _STDLIB_H_
-#define _STDLIB_H_
-
-#include <_/limits.h>
-#include <_/types.h>
-
-__BEGIN_DECLS
-_Noreturn void _Exit(int);
-_Noreturn void abort(void);
-void *calloc(size_t, size_t);
-_Noreturn void exit(int);
-void free(void *);
-void *malloc(size_t);
-void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
-void *realloc(void *, size_t);
-__END_DECLS
-
-#if _CLOUDLIBC_INLINE_FUNCTIONS
-
-// qsort_r() implementation from Bentley and McIlroy's
-// "Engineering a Sort Function".
-//
-// This sorting function is inlined into this header, so that the
-// compiler can create an optimized version that takes the alignment and
-// size of the elements into account. It also reduces the overhead of
-// indirect function calls.
-
-static __inline void __qsort_r(void *, size_t, size_t,
- int (*)(const void *, const void *, void *),
- void *);
-
-static __inline size_t __qsort_min(size_t __a, size_t __b) {
- return __a < __b ? __a : __b;
-}
-
-// Swaps the contents of two buffers.
-static __inline void __qsort_swap(char *__a, char *__b, size_t __n) {
- char __t;
-
- while (__n-- > 0) {
- __t = *__a;
- *__a++ = *__b;
- *__b++ = __t;
- }
-}
-
-// Implementation of insertionsort for small lists.
-static __inline void __qsort_insertionsort(
- char *__a, size_t __nel, size_t __width,
- int (*__cmp)(const void *, const void *, void *), void *__thunk) {
- char *__pm, *__pl;
-
- for (__pm = __a + __width; __pm < __a + __nel * __width; __pm += __width)
- for (__pl = __pm; __pl > __a && __cmp(__pl - __width, __pl, __thunk) > 0;
- __pl -= __width)
- __qsort_swap(__pl, __pl - __width, __width);
-}
-
-// Returns the median of three elements.
-static __inline char *__qsort_med3(char *__a, char *__b, char *__c,
- int (*__cmp)(const void *, const void *,
- void *),
- void *__thunk) {
- return __cmp(__a, __b, __thunk) < 0
- ? (__cmp(__b, __c, __thunk) < 0
- ? __b
- : __cmp(__a, __c, __thunk) < 0 ? __c : __a)
- : (__cmp(__b, __c, __thunk) > 0
- ? __b
- : __cmp(__a, __c, __thunk) > 0 ? __c : __a);
-}
-
-// Picks a pivot based on a pseudo-median of three or nine.
-// TODO(ed): Does this still guarantee an O(n log n) running time?
-static __inline char *__qsort_pickpivot(char *__a, size_t __nel, size_t __width,
- int (*__cmp)(const void *, const void *,
- void *),
- void *__thunk) {
- char *__pl, *__pm, *__pn;
- size_t __s;
-
- __pl = __a;
- __pm = __a + (__nel / 2) * __width;
- __pn = __a + (__nel - 1) * __width;
- if (__nel > 40) {
- __s = (__nel / 8) * __width;
- __pl = __qsort_med3(__pl, __pl + __s, __pl + 2 * __s, __cmp, __thunk);
- __pm = __qsort_med3(__pm - __s, __pm, __pm + __s, __cmp, __thunk);
- __pn = __qsort_med3(__pn - 2 * __s, __pn - __s, __pn, __cmp, __thunk);
- }
- return __qsort_med3(__pl, __pm, __pn, __cmp, __thunk);
-}
-
-// Implementation of quicksort for larger lists.
-static __inline void __qsort_quicksort(char *__a, size_t __nel, size_t __width,
- int (*__cmp)(const void *, const void *,
- void *),
- void *__thunk) {
- char *__pa, *__pb, *__pc, *__pd, *__pn;
- int __r;
- size_t __s;
-
- // Select pivot and move it to the head of the list.
- __qsort_swap(__a, __qsort_pickpivot(__a, __nel, __width, __cmp, __thunk),
- __width);
-
- // Perform partitioning.
- __pa = __pb = __a;
- __pc = __pd = __a + (__nel - 1) * __width;
- for (;;) {
- while (__pb <= __pc && (__r = __cmp(__pb, __a, __thunk)) <= 0) {
- if (__r == 0) {
- __qsort_swap(__pa, __pb, __width);
- __pa += __width;
- }
- __pb += __width;
- }
- while (__pc >= __pb && (__r = __cmp(__pc, __a, __thunk)) >= 0) {
- if (__r == 0) {
- __qsort_swap(__pc, __pd, __width);
- __pd -= __width;
- }
- __pc -= __width;
- }
- if (__pb > __pc)
- break;
- __qsort_swap(__pb, __pc, __width);
- __pb += __width;
- __pc -= __width;
- }
-
- // Store pivot between the two partitions.
- __pn = __a + __nel * __width;
- __s = __qsort_min((size_t)(__pa - __a), (size_t)(__pb - __pa));
- __qsort_swap(__a, __pb - __s, __s);
- __s = __qsort_min((size_t)(__pd - __pc), (size_t)(__pn - __pd) - __width);
- __qsort_swap(__pb, __pn - __s, __s);
-
- // Sort the two partitions.
- __s = (size_t)(__pb - __pa);
- __qsort_r(__a, __s / __width, __width, __cmp, __thunk);
- __s = (size_t)(__pd - __pc);
- __qsort_r(__pn - __s, __s / __width, __width, __cmp, __thunk);
-}
-
-static __inline void __qsort_r(void *__base, size_t __nel, size_t __width,
- int (*__cmp)(const void *, const void *, void *),
- void *__thunk) {
- char *__a;
-
- __a = (char *)__base;
- if (__nel < 8) {
- __qsort_insertionsort(__a, __nel, __width, __cmp, __thunk);
- } else {
- __qsort_quicksort(__a, __nel, __width, __cmp, __thunk);
- }
-}
-#define qsort_r(base, nel, width, compar, thunk) \
- __qsort_r(base, nel, width, compar, thunk)
-
-// qsort(): Call into qsort_r(), providing the callback as the thunk.
-// We assume that the optimizer is smart enough to simplify.
-
-static __inline int __qsort_cmp(const void *__a, const void *__b,
- void *__thunk) {
- return ((int (*)(const void *, const void *))__thunk)(__a, __b);
-}
-
-static __inline void __qsort(void *__base, size_t __nel, size_t __width,
- int (*__cmp)(const void *, const void *)) {
- qsort_r(__base, __nel, __width, __qsort_cmp, (void *)__cmp);
-}
-#define qsort(base, nel, width, compar) __qsort(base, nel, width, compar)
-#endif
-
-#endif
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <dirent.h>
#include <errno.h>
if (error != 0) {
free(dirp->buffer);
free(dirp);
- errno = errno_fixup_directory(fd, error);
return NULL;
}
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <assert.h>
#include <wasi/api.h>
#include <wasi/libc.h>
fs_rights_base, fs_rights_inheriting, fs_flags,
&newfd);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
return newfd;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <errno.h>
#include <stdio.h>
int __wasilibc_nocwd_renameat(int oldfd, const char *old, int newfd, const char *new) {
__wasi_errno_t error = __wasi_path_rename(oldfd, old, newfd, new);
if (error != 0) {
- errno = errno_fixup_directory(oldfd, errno_fixup_directory(newfd, error));
return -1;
}
return 0;
// SPDX-License-Identifier: BSD-2-Clause
#include <wasi/api.h>
-#include <stdlib.h>
+#include <_/cdefs.h>
#include <stdnoreturn.h>
#include <unistd.h>
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <sys/socket.h>
#include <assert.h>
&ro_datalen,
&ro_flags);
if (error != 0) {
- errno = errno_fixup_socket(socket, error);
return -1;
}
return ro_datalen;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <sys/socket.h>
#include <assert.h>
size_t so_datalen;
__wasi_errno_t error = __wasi_sock_send(socket, si_data, si_data_len, si_flags, &so_datalen);
if (error != 0) {
- errno = errno_fixup_socket(socket, error);
return -1;
}
return so_datalen;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <sys/socket.h>
#include <assert.h>
__wasi_errno_t error = __wasi_sock_shutdown(socket, how);
if (error != 0) {
- errno = errno_fixup_socket(socket, error);
return -1;
}
return error;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <sys/stat.h>
#include <wasi/api.h>
__wasi_errno_t error =
__wasi_path_filestat_get(fd, lookup_flags, path, &internal_stat);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
to_public_stat(&internal_stat, buf);
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <sys/stat.h>
#include <wasi/api.h>
int __wasilibc_nocwd_mkdirat_nomode(int fd, const char *path) {
__wasi_errno_t error = __wasi_path_create_directory(fd, path);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
return 0;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <sys/stat.h>
#include <wasi/api.h>
__wasi_timestamp_t st_mtim;
__wasi_fstflags_t flags;
if (!utimens_get_timestamps(times, &st_atim, &st_mtim, &flags)) {
- errno = EINVAL;
return -1;
}
__wasi_errno_t error =
__wasi_path_filestat_set_times(fd, lookup_flags, path, st_atim, st_mtim, flags);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
return 0;
+++ /dev/null
-// Copyright (c) 2016 Nuxi, https://nuxi.nl/
-//
-// SPDX-License-Identifier: BSD-2-Clause
-
-#include <common/clock.h>
-
-#include <wasi/api.h>
-#include <time.h>
-
-const struct __clockid _CLOCK_PROCESS_CPUTIME_ID = {
- .id = __WASI_CLOCKID_PROCESS_CPUTIME_ID,
-};
+++ /dev/null
-// Copyright (c) 2016 Nuxi, https://nuxi.nl/
-//
-// SPDX-License-Identifier: BSD-2-Clause
-
-#include <common/clock.h>
-
-#include <wasi/api.h>
-#include <time.h>
-
-const struct __clockid _CLOCK_THREAD_CPUTIME_ID = {
- .id = __WASI_CLOCKID_THREAD_CPUTIME_ID,
-};
#include <errno.h>
#include <threads.h>
#include <time.h>
+#include <_/cdefs.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rem) {
int error = clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rem);
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <errno.h>
#include <fcntl.h>
__wasi_errno_t error =
__wasi_path_filestat_get(fd, lookup_flags, path, &file);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <errno.h>
#include <fcntl.h>
// Perform system call.
__wasi_errno_t error = __wasi_path_link(fd1, lookup1_flags, path1, fd2, path2);
if (error != 0) {
- errno = errno_fixup_directory(fd1, errno_fixup_directory(fd2, error));
return -1;
}
return 0;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <errno.h>
#include <string.h>
__wasi_errno_t error = __wasi_path_readlink(fd, path,
(uint8_t*)buf, bufsize, &bufused);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
return bufused;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <errno.h>
#include <string.h>
int __wasilibc_nocwd_symlinkat(const char *path1, int fd, const char *path2) {
__wasi_errno_t error = __wasi_path_symlink(path1, fd, path2);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
return 0;
//
// SPDX-License-Identifier: BSD-2-Clause
-#include <common/errno.h>
-
#include <wasi/api.h>
#include <wasi/libc.h>
#include <errno.h>
extern const struct __clockid _CLOCK_MONOTONIC;
#define CLOCK_MONOTONIC (&_CLOCK_MONOTONIC)
-extern const struct __clockid _CLOCK_PROCESS_CPUTIME_ID;
-#define CLOCK_PROCESS_CPUTIME_ID (&_CLOCK_PROCESS_CPUTIME_ID)
extern const struct __clockid _CLOCK_REALTIME;
#define CLOCK_REALTIME (&_CLOCK_REALTIME)
-extern const struct __clockid _CLOCK_THREAD_CPUTIME_ID;
-#define CLOCK_THREAD_CPUTIME_ID (&_CLOCK_THREAD_CPUTIME_ID)
/*
* TIME_UTC is the only standardized time base value.
-#include <common/errno.h>
#include <wasi/api.h>
#include <wasi/libc.h>
#include <errno.h>
int __wasilibc_nocwd___wasilibc_rmdirat(int fd, const char *path) {
__wasi_errno_t error = __wasi_path_remove_directory(fd, path);
if (error != 0) {
- errno = errno_fixup_directory(fd, error);
return -1;
}
return 0;
-#include <common/errno.h>
#include <wasi/api.h>
#include <wasi/libc.h>
#include <errno.h>