mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 06:15:21 +00:00
Update the WASI libc
Update our copy of wasi-libc up to the commit 30094b6ed05f19cee102115215863d185f2db4f0 from the upstream repository.
This commit is contained in:
parent
47c4d44502
commit
8c63037695
@ -75,14 +75,18 @@ static inline bool utimens_get_timestamps(const struct timespec *times,
|
||||
if (times == NULL) {
|
||||
// Update both timestamps.
|
||||
*flags = __WASI_FSTFLAGS_ATIM_NOW | __WASI_FSTFLAGS_MTIM_NOW;
|
||||
*st_atim = (__wasi_timestamp_t) { 0 };
|
||||
*st_mtim = (__wasi_timestamp_t) { 0 };
|
||||
} else {
|
||||
// Set individual timestamps.
|
||||
*flags = 0;
|
||||
switch (times[0].tv_nsec) {
|
||||
case UTIME_NOW:
|
||||
*flags |= __WASI_FSTFLAGS_ATIM_NOW;
|
||||
*st_atim = (__wasi_timestamp_t) { 0 };
|
||||
break;
|
||||
case UTIME_OMIT:
|
||||
*st_atim = (__wasi_timestamp_t) { 0 };
|
||||
break;
|
||||
default:
|
||||
*flags |= __WASI_FSTFLAGS_ATIM;
|
||||
@ -94,8 +98,10 @@ static inline bool utimens_get_timestamps(const struct timespec *times,
|
||||
switch (times[1].tv_nsec) {
|
||||
case UTIME_NOW:
|
||||
*flags |= __WASI_FSTFLAGS_MTIM_NOW;
|
||||
*st_mtim = (__wasi_timestamp_t) { 0 };
|
||||
break;
|
||||
case UTIME_OMIT:
|
||||
*st_mtim = (__wasi_timestamp_t) { 0 };
|
||||
break;
|
||||
default:
|
||||
*flags |= __WASI_FSTFLAGS_MTIM;
|
||||
|
||||
@ -9,8 +9,10 @@
|
||||
#include <wasi/api.h>
|
||||
|
||||
int gettimeofday(struct timeval *restrict tp, void *tz) {
|
||||
__wasi_timestamp_t ts = 0;
|
||||
(void)__wasi_clock_time_get(__WASI_CLOCKID_REALTIME, 1000, &ts);
|
||||
*tp = timestamp_to_timeval(ts);
|
||||
if (tp != NULL) {
|
||||
__wasi_timestamp_t ts = 0;
|
||||
(void)__wasi_clock_time_get(__WASI_CLOCKID_REALTIME, 1000, &ts);
|
||||
*tp = timestamp_to_timeval(ts);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -574,18 +574,6 @@ _Noreturn void __wasi_proc_exit(
|
||||
__imported_wasi_snapshot_preview1_proc_exit((int32_t) rval);
|
||||
}
|
||||
|
||||
int32_t __imported_wasi_snapshot_preview1_proc_raise(int32_t arg0) __attribute__((
|
||||
__import_module__("wasi_snapshot_preview1"),
|
||||
__import_name__("proc_raise")
|
||||
));
|
||||
|
||||
__wasi_errno_t __wasi_proc_raise(
|
||||
__wasi_signal_t sig
|
||||
){
|
||||
int32_t ret = __imported_wasi_snapshot_preview1_proc_raise((int32_t) sig);
|
||||
return (uint16_t) ret;
|
||||
}
|
||||
|
||||
int32_t __imported_wasi_snapshot_preview1_sched_yield() __attribute__((
|
||||
__import_module__("wasi_snapshot_preview1"),
|
||||
__import_name__("sched_yield")
|
||||
|
||||
51
lib/libc/wasi/libc-bottom-half/sources/accept.c
Normal file
51
lib/libc/wasi/libc-bottom-half/sources/accept.c
Normal file
@ -0,0 +1,51 @@
|
||||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <wasi/api.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
int accept(int socket, struct sockaddr *restrict addr, socklen_t *restrict addrlen) {
|
||||
int ret = -1;
|
||||
|
||||
__wasi_errno_t error = __wasi_sock_accept(socket, 0, &ret);
|
||||
|
||||
if (error != 0) {
|
||||
errno = error;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Clear sockaddr to indicate undefined address
|
||||
memset(addr, 0, *addrlen);
|
||||
// might be AF_UNIX or AF_INET
|
||||
addr->sa_family = AF_UNSPEC;
|
||||
*addrlen = sizeof(struct sockaddr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int accept4(int socket, struct sockaddr *restrict addr, socklen_t *restrict addrlen, int flags) {
|
||||
int ret = -1;
|
||||
|
||||
if (flags & ~(SOCK_NONBLOCK | SOCK_CLOEXEC)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
__wasi_errno_t error = __wasi_sock_accept(socket, (flags & SOCK_NONBLOCK) ? __WASI_FDFLAGS_NONBLOCK : 0, &ret);
|
||||
|
||||
if (error != 0) {
|
||||
errno = error;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Clear sockaddr to indicate undefined address
|
||||
memset(addr, 0, *addrlen);
|
||||
// might be AF_UNIX or AF_INET
|
||||
addr->sa_family = AF_UNSPEC;
|
||||
*addrlen = sizeof(struct sockaddr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -46,7 +46,7 @@ int chdir(const char *path)
|
||||
size_t len = strlen(abs) + 1;
|
||||
int copy_relative = strcmp(relative_buf, ".") != 0;
|
||||
int mid = copy_relative && abs[0] != 0;
|
||||
char *new_cwd = malloc(len + (copy_relative ? strlen(relative_buf) + mid: 0));
|
||||
char *new_cwd = malloc(len + (copy_relative ? strlen(relative_buf) + mid: 0)+1);
|
||||
if (new_cwd == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
@ -54,7 +54,7 @@ int chdir(const char *path)
|
||||
new_cwd[0] = '/';
|
||||
strcpy(new_cwd + 1, abs);
|
||||
if (mid)
|
||||
new_cwd[strlen(abs) + 1] = '/';
|
||||
new_cwd[len] = '/';
|
||||
if (copy_relative)
|
||||
strcpy(new_cwd + 1 + mid + strlen(abs), relative_buf);
|
||||
|
||||
@ -95,9 +95,10 @@ static const char *make_absolute(const char *path) {
|
||||
int need_slash = __wasilibc_cwd[cwd_len - 1] == '/' ? 0 : 1;
|
||||
size_t alloc_len = cwd_len + path_len + 1 + need_slash;
|
||||
if (alloc_len > make_absolute_len) {
|
||||
make_absolute_buf = realloc(make_absolute_buf, alloc_len);
|
||||
if (make_absolute_buf == NULL)
|
||||
char *tmp = realloc(make_absolute_buf, alloc_len);
|
||||
if (tmp == NULL)
|
||||
return NULL;
|
||||
make_absolute_buf = tmp;
|
||||
make_absolute_len = alloc_len;
|
||||
}
|
||||
strcpy(make_absolute_buf, __wasilibc_cwd);
|
||||
|
||||
@ -31,16 +31,20 @@ static int find_relpath2(
|
||||
static int find_relpath(const char *path, char **relative) {
|
||||
static __thread char *relative_buf = NULL;
|
||||
static __thread size_t relative_buf_len = 0;
|
||||
int fd = find_relpath2(path, &relative_buf, &relative_buf_len);
|
||||
// find_relpath2 can update relative_buf, so assign it after the call
|
||||
*relative = relative_buf;
|
||||
return find_relpath2(path, relative, &relative_buf_len);
|
||||
return fd;
|
||||
}
|
||||
|
||||
// same as `find_relpath`, but uses another set of static variables to cache
|
||||
static int find_relpath_alt(const char *path, char **relative) {
|
||||
static __thread char *relative_buf = NULL;
|
||||
static __thread size_t relative_buf_len = 0;
|
||||
int fd = find_relpath2(path, &relative_buf, &relative_buf_len);
|
||||
// find_relpath2 can update relative_buf, so assign it after the call
|
||||
*relative = relative_buf;
|
||||
return find_relpath2(path, relative, &relative_buf_len);
|
||||
return fd;
|
||||
}
|
||||
|
||||
int open(const char *path, int oflag, ...) {
|
||||
@ -139,6 +143,28 @@ int utime(const char *path, const struct utimbuf *times) {
|
||||
0);
|
||||
}
|
||||
|
||||
int utimes(const char *path, const struct timeval times[2]) {
|
||||
char *relative_path;
|
||||
int dirfd = find_relpath(path, &relative_path);
|
||||
|
||||
// If we can't find a preopen for it, indicate that we lack capabilities.
|
||||
if (dirfd == -1) {
|
||||
errno = ENOTCAPABLE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return __wasilibc_nocwd_utimensat(
|
||||
dirfd, relative_path,
|
||||
times ? ((struct timespec [2]) {
|
||||
{ .tv_sec = times[0].tv_sec,
|
||||
.tv_nsec = times[0].tv_usec * 1000 },
|
||||
{ .tv_sec = times[1].tv_sec,
|
||||
.tv_nsec = times[1].tv_usec * 1000 },
|
||||
})
|
||||
: NULL,
|
||||
0);
|
||||
}
|
||||
|
||||
int unlink(const char *path) {
|
||||
char *relative_path;
|
||||
int dirfd = find_relpath(path, &relative_path);
|
||||
|
||||
@ -64,7 +64,9 @@ int isascii(int);
|
||||
int toascii(int);
|
||||
#define _tolower(a) ((a)|0x20)
|
||||
#define _toupper(a) ((a)&0x5f)
|
||||
#ifndef __cplusplus
|
||||
#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -686,6 +686,8 @@ typedef struct {
|
||||
#define NT_ARM_PAC_MASK 0x406
|
||||
#define NT_ARM_PACA_KEYS 0x407
|
||||
#define NT_ARM_PACG_KEYS 0x408
|
||||
#define NT_ARM_TAGGED_ADDR_CTRL 0x409
|
||||
#define NT_ARM_PAC_ENABLED_KEYS 0x40a
|
||||
#define NT_METAG_CBUF 0x500
|
||||
#define NT_METAG_RPIPE 0x501
|
||||
#define NT_METAG_TLS 0x502
|
||||
|
||||
@ -8,7 +8,9 @@ extern "C" {
|
||||
#include <features.h>
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -66,6 +66,7 @@
|
||||
#define ETH_P_1588 0x88F7
|
||||
#define ETH_P_NCSI 0x88F8
|
||||
#define ETH_P_PRP 0x88FB
|
||||
#define ETH_P_CFM 0x8902
|
||||
#define ETH_P_FCOE 0x8906
|
||||
#define ETH_P_TDLS 0x890D
|
||||
#define ETH_P_FIP 0x8914
|
||||
|
||||
@ -60,6 +60,7 @@ struct ipv6_mreq {
|
||||
#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
|
||||
#define INADDR_NONE ((in_addr_t) 0xffffffff)
|
||||
#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001)
|
||||
#define INADDR_DUMMY ((in_addr_t) 0xc0000008)
|
||||
|
||||
#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000)
|
||||
#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001)
|
||||
|
||||
@ -80,6 +80,8 @@ enum {
|
||||
TCP_NLA_SRTT,
|
||||
TCP_NLA_TIMEOUT_REHASH,
|
||||
TCP_NLA_BYTES_NOTSENT,
|
||||
TCP_NLA_EDT,
|
||||
TCP_NLA_TTL,
|
||||
};
|
||||
|
||||
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
||||
@ -281,12 +283,21 @@ struct tcp_repair_window {
|
||||
uint32_t rcv_wup;
|
||||
};
|
||||
|
||||
#define TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT 0x1
|
||||
|
||||
struct tcp_zerocopy_receive {
|
||||
uint64_t address;
|
||||
uint32_t length;
|
||||
uint32_t recv_skip_hint;
|
||||
uint32_t inq;
|
||||
int32_t err;
|
||||
uint64_t copybuf_address;
|
||||
int32_t copybuf_len;
|
||||
uint32_t flags;
|
||||
uint64_t msg_control;
|
||||
uint64_t msg_controllen;
|
||||
uint32_t msg_flags;
|
||||
uint32_t reserved;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -227,6 +227,7 @@ int pthread_getaffinity_np(pthread_t, size_t, struct cpu_set_t *);
|
||||
int pthread_setaffinity_np(pthread_t, size_t, const struct cpu_set_t *);
|
||||
int pthread_getattr_np(pthread_t, pthread_attr_t *);
|
||||
int pthread_setname_np(pthread_t, const char *);
|
||||
int pthread_getname_np(pthread_t, char *, size_t);
|
||||
int pthread_getattr_default_np(pthread_attr_t *);
|
||||
int pthread_setattr_default_np(const pthread_attr_t *);
|
||||
int pthread_tryjoin_np(pthread_t, void **);
|
||||
|
||||
@ -16,21 +16,27 @@ typedef struct __jmp_buf_tag {
|
||||
unsigned long __ss[128/sizeof(long)];
|
||||
} jmp_buf[1];
|
||||
|
||||
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
|
||||
#define __setjmp_attr __attribute__((__returns_twice__))
|
||||
#else
|
||||
#define __setjmp_attr
|
||||
#endif
|
||||
|
||||
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|
||||
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
|
||||
|| defined(_BSD_SOURCE)
|
||||
typedef jmp_buf sigjmp_buf;
|
||||
int sigsetjmp (sigjmp_buf, int);
|
||||
int sigsetjmp (sigjmp_buf, int) __setjmp_attr;
|
||||
_Noreturn void siglongjmp (sigjmp_buf, int);
|
||||
#endif
|
||||
|
||||
#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
|
||||
|| defined(_BSD_SOURCE)
|
||||
int _setjmp (jmp_buf);
|
||||
int _setjmp (jmp_buf) __setjmp_attr;
|
||||
_Noreturn void _longjmp (jmp_buf, int);
|
||||
#endif
|
||||
|
||||
int setjmp (jmp_buf);
|
||||
int setjmp (jmp_buf) __setjmp_attr;
|
||||
_Noreturn void longjmp (jmp_buf, int);
|
||||
|
||||
#define setjmp setjmp
|
||||
@ -38,6 +44,8 @@ _Noreturn void longjmp (jmp_buf, int);
|
||||
#warning setjmp is not yet implemented for WASI
|
||||
#endif
|
||||
|
||||
#undef __setjmp_attr
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -82,6 +82,8 @@ typedef struct sigaltstack stack_t;
|
||||
#define SEGV_ACCERR 2
|
||||
#define SEGV_BNDERR 3
|
||||
#define SEGV_PKUERR 4
|
||||
#define SEGV_MTEAERR 8
|
||||
#define SEGV_MTESERR 9
|
||||
|
||||
#define BUS_ADRALN 1
|
||||
#define BUS_ADRERR 2
|
||||
@ -183,6 +185,9 @@ struct sigaction {
|
||||
#define sa_handler __sa_handler.sa_handler
|
||||
#define sa_sigaction __sa_handler.sa_sigaction
|
||||
|
||||
#define SA_UNSUPPORTED 0x00000400
|
||||
#define SA_EXPOSE_TAGBITS 0x00000800
|
||||
|
||||
struct sigevent {
|
||||
union sigval sigev_value;
|
||||
int sigev_signo;
|
||||
@ -277,6 +282,9 @@ void (*sigset(int, void (*)(int)))(int);
|
||||
#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
|
||||
#define NSIG _NSIG
|
||||
typedef void (*sig_t)(int);
|
||||
|
||||
#define SYS_SECCOMP 1
|
||||
#define SYS_USER_DISPATCH 2
|
||||
#endif
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
|
||||
@ -7,4 +7,7 @@
|
||||
#define __STDC_IEC_559__ 1
|
||||
#endif
|
||||
|
||||
#define __STDC_UTF_16__ 1
|
||||
#define __STDC_UTF_32__ 1
|
||||
|
||||
#endif
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
#ifndef _STDDEF_H
|
||||
#define _STDDEF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -28,7 +28,9 @@ extern "C" {
|
||||
#include <bits/alltypes.h>
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -13,7 +13,9 @@ extern "C" {
|
||||
#include <features.h>
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
@ -171,6 +173,7 @@ int clearenv(void);
|
||||
#define WCOREDUMP(s) ((s) & 0x80)
|
||||
#define WIFCONTINUED(s) ((s) == 0xffff)
|
||||
void *reallocarray (void *, size_t, size_t);
|
||||
void qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@ -12,7 +12,9 @@ extern "C" {
|
||||
#include <features.h>
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -9,9 +9,13 @@
|
||||
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED 16
|
||||
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE 32
|
||||
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE 64
|
||||
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ 128
|
||||
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ 256
|
||||
|
||||
#define MEMBARRIER_CMD_SHARED MEMBARRIER_CMD_GLOBAL
|
||||
|
||||
#define MEMBARRIER_CMD_FLAG_CPU 1
|
||||
|
||||
int membarrier(int, int);
|
||||
|
||||
#endif
|
||||
|
||||
@ -44,6 +44,7 @@ extern "C" {
|
||||
|
||||
#define MAP_HUGE_SHIFT 26
|
||||
#define MAP_HUGE_MASK 0x3f
|
||||
#define MAP_HUGE_16KB (14 << 26)
|
||||
#define MAP_HUGE_64KB (16 << 26)
|
||||
#define MAP_HUGE_512KB (19 << 26)
|
||||
#define MAP_HUGE_1MB (20 << 26)
|
||||
|
||||
@ -31,6 +31,7 @@ extern "C" {
|
||||
#define MS_REMOUNT 32
|
||||
#define MS_MANDLOCK 64
|
||||
#define MS_DIRSYNC 128
|
||||
#define MS_NOSYMFOLLOW 256
|
||||
#define MS_NOATIME 1024
|
||||
#define MS_NODIRATIME 2048
|
||||
#define MS_BIND 4096
|
||||
|
||||
@ -157,10 +157,26 @@ struct prctl_mm_map {
|
||||
#define PR_SET_TAGGED_ADDR_CTRL 55
|
||||
#define PR_GET_TAGGED_ADDR_CTRL 56
|
||||
#define PR_TAGGED_ADDR_ENABLE (1UL << 0)
|
||||
#define PR_MTE_TCF_SHIFT 1
|
||||
#define PR_MTE_TCF_NONE (0UL << 1)
|
||||
#define PR_MTE_TCF_SYNC (1UL << 1)
|
||||
#define PR_MTE_TCF_ASYNC (2UL << 1)
|
||||
#define PR_MTE_TCF_MASK (3UL << 1)
|
||||
#define PR_MTE_TAG_SHIFT 3
|
||||
#define PR_MTE_TAG_MASK (0xffffUL << 3)
|
||||
|
||||
#define PR_SET_IO_FLUSHER 57
|
||||
#define PR_GET_IO_FLUSHER 58
|
||||
|
||||
#define PR_SET_SYSCALL_USER_DISPATCH 59
|
||||
#define PR_SYS_DISPATCH_OFF 0
|
||||
#define PR_SYS_DISPATCH_ON 1
|
||||
#define SYSCALL_DISPATCH_FILTER_ALLOW 0
|
||||
#define SYSCALL_DISPATCH_FILTER_BLOCK 1
|
||||
|
||||
#define PR_PAC_SET_ENABLED_KEYS 60
|
||||
#define PR_PAC_GET_ENABLED_KEYS 61
|
||||
|
||||
int prctl (int, ...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -42,6 +42,7 @@ extern "C" {
|
||||
#define PTRACE_SECCOMP_GET_FILTER 0x420c
|
||||
#define PTRACE_SECCOMP_GET_METADATA 0x420d
|
||||
#define PTRACE_GET_SYSCALL_INFO 0x420e
|
||||
#define PTRACE_GET_RSEQ_CONFIGURATION 0x420f
|
||||
|
||||
#define PT_READ_I PTRACE_PEEKTEXT
|
||||
#define PT_READ_D PTRACE_PEEKDATA
|
||||
@ -130,6 +131,14 @@ struct __ptrace_syscall_info {
|
||||
};
|
||||
};
|
||||
|
||||
struct __ptrace_rseq_configuration {
|
||||
uint64_t rseq_abi_pointer;
|
||||
uint32_t rseq_abi_size;
|
||||
uint32_t signature;
|
||||
uint32_t flags;
|
||||
uint32_t pad;
|
||||
};
|
||||
|
||||
long ptrace(int, ...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -298,6 +298,8 @@ struct linger {
|
||||
#define SCM_TXTIME SO_TXTIME
|
||||
#define SO_BINDTOIFINDEX 62
|
||||
#define SO_DETACH_REUSEPORT_BPF 68
|
||||
#define SO_PREFER_BUSY_POLL 69
|
||||
#define SO_BUSY_POLL_BUDGET 70
|
||||
|
||||
#ifndef SOL_SOCKET
|
||||
#define SOL_SOCKET 1
|
||||
@ -404,9 +406,10 @@ int shutdown (int, int);
|
||||
int bind (int, const struct sockaddr *, socklen_t);
|
||||
int connect (int, const struct sockaddr *, socklen_t);
|
||||
int listen (int, int);
|
||||
#endif
|
||||
|
||||
int accept (int, struct sockaddr *__restrict, socklen_t *__restrict);
|
||||
int accept4(int, struct sockaddr *__restrict, socklen_t *__restrict, int);
|
||||
#endif
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* WASI has no getsockname/getpeername */
|
||||
int getsockname (int, struct sockaddr *__restrict, socklen_t *__restrict);
|
||||
|
||||
@ -23,9 +23,7 @@ struct itimerval {
|
||||
int getitimer (int, struct itimerval *);
|
||||
int setitimer (int, const struct itimerval *__restrict, struct itimerval *__restrict);
|
||||
#endif
|
||||
#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
|
||||
int utimes (const char *, const struct timeval [2]);
|
||||
#endif
|
||||
|
||||
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
||||
struct timezone {
|
||||
@ -34,7 +32,9 @@ struct timezone {
|
||||
};
|
||||
#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
|
||||
int futimes(int, const struct timeval [2]);
|
||||
#endif
|
||||
int futimesat(int, const char *, const struct timeval [2]);
|
||||
#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
|
||||
int lutimes(const char *, const struct timeval [2]);
|
||||
#endif
|
||||
#ifdef __wasilibc_unmodified_upstream /* WASI has no way to set the time */
|
||||
|
||||
@ -8,7 +8,9 @@ extern "C" {
|
||||
#include <features.h>
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -15,12 +15,16 @@ extern "C" {
|
||||
#define SEEK_SET 0
|
||||
#define SEEK_CUR 1
|
||||
#define SEEK_END 2
|
||||
#define SEEK_DATA 3
|
||||
#define SEEK_HOLE 4
|
||||
#else
|
||||
#include <__header_unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -41,7 +41,9 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus >= 201103L
|
||||
#define NULL nullptr
|
||||
#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
||||
@ -2,8 +2,10 @@
|
||||
|
||||
// FIXME
|
||||
|
||||
static const float float_pi_2 = M_PI_2;
|
||||
|
||||
float complex cacosf(float complex z)
|
||||
{
|
||||
z = casinf(z);
|
||||
return CMPLXF((float)M_PI_2 - crealf(z), -cimagf(z));
|
||||
return CMPLXF(float_pi_2 - crealf(z), -cimagf(z));
|
||||
}
|
||||
|
||||
@ -61,13 +61,15 @@ static const double DP1 = 3.140625;
|
||||
static const double DP2 = 9.67502593994140625E-4;
|
||||
static const double DP3 = 1.509957990978376432E-7;
|
||||
|
||||
static const float float_pi = M_PI;
|
||||
|
||||
static float _redupif(float xx)
|
||||
{
|
||||
float x, t;
|
||||
long i;
|
||||
|
||||
x = xx;
|
||||
t = x/(float)M_PI;
|
||||
t = x/float_pi;
|
||||
if (t >= 0.0f)
|
||||
t += 0.5f;
|
||||
else
|
||||
|
||||
@ -3,6 +3,6 @@
|
||||
double complex cproj(double complex z)
|
||||
{
|
||||
if (isinf(creal(z)) || isinf(cimag(z)))
|
||||
return CMPLX(INFINITY, copysign(0.0, creal(z)));
|
||||
return CMPLX(INFINITY, copysign(0.0, cimag(z)));
|
||||
return z;
|
||||
}
|
||||
|
||||
@ -3,6 +3,6 @@
|
||||
float complex cprojf(float complex z)
|
||||
{
|
||||
if (isinf(crealf(z)) || isinf(cimagf(z)))
|
||||
return CMPLXF(INFINITY, copysignf(0.0, crealf(z)));
|
||||
return CMPLXF(INFINITY, copysignf(0.0, cimagf(z)));
|
||||
return z;
|
||||
}
|
||||
|
||||
@ -9,7 +9,7 @@ long double complex cprojl(long double complex z)
|
||||
long double complex cprojl(long double complex z)
|
||||
{
|
||||
if (isinf(creall(z)) || isinf(cimagl(z)))
|
||||
return CMPLXL(INFINITY, copysignl(0.0, creall(z)));
|
||||
return CMPLXL(INFINITY, copysignl(0.0, cimagl(z)));
|
||||
return z;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1,23 +1,23 @@
|
||||
16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,16,16,32,16,16,16,33,34,35,
|
||||
36,37,38,39,16,16,40,16,16,16,16,16,16,16,16,16,16,16,41,42,16,16,43,16,16,16,
|
||||
16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,16,33,16,16,16,34,35,36,
|
||||
37,38,39,40,16,16,41,16,16,16,16,16,16,16,16,16,16,16,42,43,16,16,44,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,44,16,45,46,47,48,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,45,16,46,47,48,49,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,50,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,51,16,16,52,
|
||||
53,16,54,55,56,16,16,16,16,16,16,57,16,16,58,16,59,60,61,62,63,64,65,66,67,68,
|
||||
69,70,16,71,72,73,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,74,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,75,76,16,16,16,77,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,49,16,16,50,
|
||||
51,16,52,53,54,16,16,16,16,16,16,55,16,16,56,16,57,58,59,60,61,62,63,64,65,66,
|
||||
67,68,16,69,70,71,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,73,74,16,16,16,75,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,76,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,77,78,16,16,16,16,16,16,16,79,16,16,16,16,16,80,81,82,16,16,16,16,16,83,
|
||||
84,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,78,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,79,80,16,16,16,16,16,16,16,81,16,16,16,16,16,82,83,84,16,16,16,16,16,85,
|
||||
86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
@ -35,55 +35,57 @@
|
||||
242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,31,0,63,0,0,0,0,0,0,0,0,0,3,0,0,160,
|
||||
2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,
|
||||
0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,15,32,0,0,0,0,0,120,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,1,4,14,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,9,0,0,0,0,0,0,64,127,
|
||||
229,31,248,159,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,0,15,0,0,0,0,0,208,23,4,0,0,
|
||||
0,0,248,15,0,3,0,0,0,60,59,0,0,0,0,0,0,64,163,3,0,0,0,0,0,0,240,207,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,
|
||||
15,32,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,2,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,135,1,4,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
128,9,0,0,0,0,0,0,64,127,229,31,248,159,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,0,
|
||||
15,0,0,0,0,0,208,23,4,0,0,0,0,248,15,0,3,0,0,0,60,59,0,0,0,0,0,0,64,163,3,0,0,
|
||||
0,0,0,0,240,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,
|
||||
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,
|
||||
251,0,248,0,0,0,124,0,0,0,0,0,0,223,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
|
||||
255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,
|
||||
0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,128,247,63,0,0,0,192,0,0,0,0,0,0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,255,255,3,128,0,0,0,0,192,63,0,0,128,255,3,0,
|
||||
0,0,0,0,7,0,0,0,0,0,200,51,0,0,0,0,32,0,0,0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,
|
||||
0,16,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,64,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,255,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,110,240,0,0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,
|
||||
0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,192,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,
|
||||
127,0,0,0,0,0,0,128,3,0,0,0,0,0,120,38,0,32,0,0,0,0,0,0,7,0,0,0,128,239,31,0,
|
||||
0,0,0,0,0,0,8,0,3,0,0,0,0,0,192,127,0,30,0,0,0,0,0,0,0,0,0,0,0,128,211,64,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,248,7,0,0,3,0,0,0,0,0,0,24,1,0,0,0,192,
|
||||
31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,92,0,0,64,0,0,0,0,0,
|
||||
0,0,0,0,0,248,133,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,60,176,1,0,0,48,0,0,0,
|
||||
0,0,0,0,0,0,0,248,167,1,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,224,188,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
128,255,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,12,1,0,0,0,254,7,0,0,0,0,248,121,128,0,
|
||||
126,14,0,0,0,0,0,252,127,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,191,0,0,0,
|
||||
0,0,0,0,0,0,0,252,255,255,252,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,180,191,0,
|
||||
0,0,0,0,0,0,0,0,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,
|
||||
0,0,0,0,0,0,0,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,127,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,
|
||||
0,128,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,15,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,255,255,255,255,255,255,127,248,255,255,255,255,255,31,32,0,16,0,0,248,
|
||||
254,255,0,0,0,0,0,0,0,0,0,
|
||||
0,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,240,7,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,7,0,0,0,0,0,200,51,0,0,0,0,32,0,0,
|
||||
0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,16,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,0,0,0,
|
||||
64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,
|
||||
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,1,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,240,0,
|
||||
0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,240,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,1,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,128,
|
||||
3,0,0,0,0,0,120,38,0,32,0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,8,0,3,0,
|
||||
0,0,0,0,192,127,0,30,0,0,0,0,0,0,0,0,0,0,0,128,211,64,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,128,248,7,0,0,3,0,0,0,0,0,0,24,1,0,0,0,192,31,31,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,255,92,0,0,64,0,0,0,0,0,0,0,0,0,0,248,133,13,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,176,1,0,0,48,0,0,0,0,0,0,0,0,0,0,
|
||||
248,167,1,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0,0,0,224,188,15,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,6,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,240,12,1,0,0,0,254,7,0,0,0,0,248,121,128,0,126,14,0,0,0,0,0,252,
|
||||
127,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,191,0,0,0,0,0,0,0,0,0,0,252,255,
|
||||
255,252,109,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,126,180,191,0,0,0,0,0,0,0,0,0,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,255,
|
||||
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,7,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,15,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
||||
255,255,255,255,127,248,255,255,255,255,255,31,32,0,16,0,0,248,254,255,0,0,0,
|
||||
0,0,0,0,0,0,0,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,240,7,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
|
||||
@ -69,7 +69,8 @@ weak_alias(libc_start_init, __libc_start_init);
|
||||
typedef int lsm2_fn(int (*)(int,char **,char **), int, char **);
|
||||
static lsm2_fn libc_start_main_stage2;
|
||||
|
||||
int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
|
||||
int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv,
|
||||
void (*init_dummy)(), void(*fini_dummy)(), void(*ldso_dummy)())
|
||||
{
|
||||
char **envp = argv+argc+1;
|
||||
|
||||
|
||||
@ -9,6 +9,15 @@ void __init_ssp(void *entropy)
|
||||
if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
|
||||
else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
|
||||
|
||||
#if UINTPTR_MAX >= 0xffffffffffffffff
|
||||
/* Sacrifice 8 bits of entropy on 64bit to prevent leaking/
|
||||
* overwriting the canary via string-manipulation functions.
|
||||
* The NULL byte is on the second byte so that off-by-ones can
|
||||
* still be detected. Endianness is taken care of
|
||||
* automatically. */
|
||||
((char *)&__stack_chk_guard)[1] = 0;
|
||||
#endif
|
||||
|
||||
__pthread_self()->canary = __stack_chk_guard;
|
||||
}
|
||||
|
||||
|
||||
@ -124,6 +124,12 @@ E(ENOMEDIUM, "No medium found")
|
||||
E(EMEDIUMTYPE, "Wrong medium type")
|
||||
#endif
|
||||
E(EMULTIHOP, "Multihop attempted")
|
||||
#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
|
||||
E(ENOKEY, "Required key not available")
|
||||
E(EKEYEXPIRED, "Key has expired")
|
||||
E(EKEYREVOKED, "Key has been revoked")
|
||||
E(EKEYREJECTED, "Key was rejected by service")
|
||||
#endif
|
||||
#ifdef __wasilibc_unmodified_upstream // errno value in WASI and not musl
|
||||
#else
|
||||
// WASI adds this errno code.
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
#ifdef _SOFT_FLOAT
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
|
||||
#include "../fenv.c"
|
||||
#endif
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef _SOFT_FLOAT
|
||||
#if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__)
|
||||
.global feclearexcept
|
||||
.type feclearexcept,@function
|
||||
feclearexcept:
|
||||
|
||||
@ -8,6 +8,7 @@ hidden void __env_rm_add(char *, char *);
|
||||
hidden int __mkostemps(char *, int, int);
|
||||
hidden int __ptsname_r(int, char *, size_t);
|
||||
hidden char *__randname(char *);
|
||||
hidden void __qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *);
|
||||
|
||||
hidden void *__libc_malloc(size_t);
|
||||
hidden void *__libc_malloc_impl(size_t);
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
#include <elf.h>
|
||||
#include <link.h>
|
||||
#include "pthread_impl.h"
|
||||
#include "libc.h"
|
||||
|
||||
#define AUX_CNT 38
|
||||
@ -35,7 +36,7 @@ static int static_dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size
|
||||
info.dlpi_subs = 0;
|
||||
if (tls_phdr) {
|
||||
info.dlpi_tls_modid = 1;
|
||||
info.dlpi_tls_data = (void *)(base + tls_phdr->p_vaddr);
|
||||
info.dlpi_tls_data = __tls_get_addr((tls_mod_off_t[]){1,0});
|
||||
} else {
|
||||
info.dlpi_tls_modid = 0;
|
||||
info.dlpi_tls_data = 0;
|
||||
|
||||
@ -2,13 +2,21 @@
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
char *cuserid(char *buf)
|
||||
{
|
||||
static char usridbuf[L_cuserid];
|
||||
struct passwd pw, *ppw;
|
||||
long pwb[256];
|
||||
if (getpwuid_r(geteuid(), &pw, (void *)pwb, sizeof pwb, &ppw))
|
||||
return 0;
|
||||
snprintf(buf, L_cuserid, "%s", pw.pw_name);
|
||||
if (buf) *buf = 0;
|
||||
getpwuid_r(geteuid(), &pw, (void *)pwb, sizeof pwb, &ppw);
|
||||
if (!ppw)
|
||||
return buf;
|
||||
size_t len = strnlen(pw.pw_name, L_cuserid);
|
||||
if (len == L_cuserid)
|
||||
return buf;
|
||||
if (!buf) buf = usridbuf;
|
||||
memcpy(buf, pw.pw_name, len+1);
|
||||
return buf;
|
||||
}
|
||||
|
||||
@ -24,9 +24,9 @@ int epoll_ctl(int fd, int op, int fd2, struct epoll_event *ev)
|
||||
|
||||
int epoll_pwait(int fd, struct epoll_event *ev, int cnt, int to, const sigset_t *sigs)
|
||||
{
|
||||
int r = __syscall(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
|
||||
int r = __syscall_cp(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
|
||||
#ifdef SYS_epoll_wait
|
||||
if (r==-ENOSYS && !sigs) r = __syscall(SYS_epoll_wait, fd, ev, cnt, to);
|
||||
if (r==-ENOSYS && !sigs) r = __syscall_cp(SYS_epoll_wait, fd, ev, cnt, to);
|
||||
#endif
|
||||
return __syscall_ret(r);
|
||||
}
|
||||
|
||||
@ -132,6 +132,9 @@ char *dcngettext(const char *domainname, const char *msgid1, const char *msgid2,
|
||||
struct binding *q;
|
||||
int old_errno = errno;
|
||||
|
||||
/* match gnu gettext behaviour */
|
||||
if (!msgid1) goto notrans;
|
||||
|
||||
if ((unsigned)category >= LC_ALL) goto notrans;
|
||||
|
||||
if (!domainname) domainname = __gettextdomain();
|
||||
|
||||
@ -3,6 +3,11 @@
|
||||
#include "locale_impl.h"
|
||||
#include "libc.h"
|
||||
|
||||
#define malloc __libc_malloc
|
||||
#define calloc undef
|
||||
#define realloc undef
|
||||
#define free undef
|
||||
|
||||
locale_t __duplocale(locale_t old)
|
||||
{
|
||||
locale_t new = malloc(sizeof *new);
|
||||
|
||||
22
lib/libc/wasi/libc-top-half/musl/src/locale/strtod_l.c
Normal file
22
lib/libc/wasi/libc-top-half/musl/src/locale/strtod_l.c
Normal file
@ -0,0 +1,22 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <locale.h>
|
||||
|
||||
float strtof_l(const char *restrict s, char **restrict p, locale_t l)
|
||||
{
|
||||
return strtof(s, p);
|
||||
}
|
||||
|
||||
double strtod_l(const char *restrict s, char **restrict p, locale_t l)
|
||||
{
|
||||
return strtod(s, p);
|
||||
}
|
||||
|
||||
long double strtold_l(const char *restrict s, char **restrict p, locale_t l)
|
||||
{
|
||||
return strtold(s, p);
|
||||
}
|
||||
|
||||
weak_alias(strtof_l, __strtof_l);
|
||||
weak_alias(strtod_l, __strtod_l);
|
||||
weak_alias(strtold_l, __strtold_l);
|
||||
@ -2,5 +2,5 @@
|
||||
|
||||
void free(void *p)
|
||||
{
|
||||
return __libc_free(p);
|
||||
__libc_free(p);
|
||||
}
|
||||
|
||||
@ -22,6 +22,9 @@ void *aligned_alloc(size_t align, size_t len)
|
||||
if (align <= UNIT) align = UNIT;
|
||||
|
||||
unsigned char *p = malloc(len + align - UNIT);
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
struct meta *g = get_meta(p);
|
||||
int idx = get_slot_index(p);
|
||||
size_t stride = get_stride(g);
|
||||
|
||||
@ -119,7 +119,11 @@ void free(void *p)
|
||||
if (((uintptr_t)(start-1) ^ (uintptr_t)end) >= 2*PGSZ && g->last_idx) {
|
||||
unsigned char *base = start + (-(uintptr_t)start & (PGSZ-1));
|
||||
size_t len = (end-base) & -PGSZ;
|
||||
if (len) madvise(base, len, MADV_FREE);
|
||||
if (len) {
|
||||
int e = errno;
|
||||
madvise(base, len, MADV_FREE);
|
||||
errno = e;
|
||||
}
|
||||
}
|
||||
|
||||
// atomic free without locking if this is neither first or last slot
|
||||
@ -139,5 +143,9 @@ void free(void *p)
|
||||
wrlock();
|
||||
struct mapinfo mi = nontrivial_free(g, idx);
|
||||
unlock();
|
||||
if (mi.len) munmap(mi.base, mi.len);
|
||||
if (mi.len) {
|
||||
int e = errno;
|
||||
munmap(mi.base, mi.len);
|
||||
errno = e;
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
#include "malloc_impl.h"
|
||||
#include "fork_impl.h"
|
||||
|
||||
#define malloc __libc_malloc
|
||||
#define malloc __libc_malloc_impl
|
||||
#define realloc __libc_realloc
|
||||
#define free __libc_free
|
||||
|
||||
@ -481,12 +481,14 @@ void __bin_chunk(struct chunk *self)
|
||||
if (size > RECLAIM && (size^(size-osize)) > size-osize) {
|
||||
uintptr_t a = (uintptr_t)self + SIZE_ALIGN+PAGE_SIZE-1 & -PAGE_SIZE;
|
||||
uintptr_t b = (uintptr_t)next - SIZE_ALIGN & -PAGE_SIZE;
|
||||
int e = errno;
|
||||
#if 1
|
||||
__madvise((void *)a, b-a, MADV_DONTNEED);
|
||||
#else
|
||||
__mmap((void *)a, b-a, PROT_READ|PROT_WRITE,
|
||||
MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
|
||||
#endif
|
||||
errno = e;
|
||||
}
|
||||
|
||||
unlock_bin(i);
|
||||
@ -499,7 +501,9 @@ static void unmap_chunk(struct chunk *self)
|
||||
size_t len = CHUNK_SIZE(self) + extra;
|
||||
/* Crash on double free */
|
||||
if (extra & 1) a_crash();
|
||||
int e = errno;
|
||||
__munmap(base, len);
|
||||
errno = e;
|
||||
}
|
||||
|
||||
void free(void *p)
|
||||
|
||||
@ -15,12 +15,12 @@ float acoshf(float x)
|
||||
uint32_t a = u.i & 0x7fffffff;
|
||||
|
||||
if (a < 0x3f800000+(1<<23))
|
||||
/* |x| < 2, invalid if x < 1 or nan */
|
||||
/* |x| < 2, invalid if x < 1 */
|
||||
/* up to 2ulp error in [1,1.125] */
|
||||
return log1pf(x-1 + sqrtf((x-1)*(x-1)+2*(x-1)));
|
||||
if (a < 0x3f800000+(12<<23))
|
||||
/* |x| < 0x1p12 */
|
||||
if (u.i < 0x3f800000+(12<<23))
|
||||
/* 2 <= x < 0x1p12 */
|
||||
return logf(2*x - 1/(x+sqrtf(x*x-1)));
|
||||
/* x >= 0x1p12 */
|
||||
/* x >= 0x1p12 or x <= -2 or nan */
|
||||
return logf(x) + 0.693147180559945309417232121458176568f;
|
||||
}
|
||||
|
||||
@ -16,7 +16,6 @@
|
||||
#include "libm.h"
|
||||
|
||||
static const float
|
||||
o_threshold = 8.8721679688e+01, /* 0x42b17180 */
|
||||
ln2_hi = 6.9313812256e-01, /* 0x3f317180 */
|
||||
ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */
|
||||
invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */
|
||||
@ -41,7 +40,7 @@ float expm1f(float x)
|
||||
return x;
|
||||
if (sign)
|
||||
return -1;
|
||||
if (x > o_threshold) {
|
||||
if (hx > 0x42b17217) { /* x > log(FLT_MAX) */
|
||||
x *= 0x1p127f;
|
||||
return x;
|
||||
}
|
||||
|
||||
@ -77,21 +77,16 @@ float fmaf(float x, float y, float z)
|
||||
* If result is inexact, and exactly halfway between two float values,
|
||||
* we need to adjust the low-order bit in the direction of the error.
|
||||
*/
|
||||
#ifdef FE_TOWARDZERO
|
||||
fesetround(FE_TOWARDZERO);
|
||||
#endif
|
||||
#ifdef __wasilibc_unmodified_upstream // WASI doesn't need old GCC workarounds
|
||||
volatile double vxy = xy; /* XXX work around gcc CSE bug */
|
||||
#else
|
||||
double vxy = xy;
|
||||
#endif
|
||||
double adjusted_result = vxy + z;
|
||||
fesetround(FE_TONEAREST);
|
||||
if (result == adjusted_result) {
|
||||
u.f = adjusted_result;
|
||||
double err;
|
||||
int neg = u.i >> 63;
|
||||
if (neg == (z > xy))
|
||||
err = xy - result + z;
|
||||
else
|
||||
err = z - result + xy;
|
||||
if (neg == (err < 0))
|
||||
u.i++;
|
||||
adjusted_result = u.f;
|
||||
}
|
||||
z = adjusted_result;
|
||||
else
|
||||
u.i--;
|
||||
z = u.f;
|
||||
return z;
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include <math.h>
|
||||
|
||||
#if defined(_SOFT_FLOAT) || defined(BROKEN_PPC_D_ASM)
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) || defined(BROKEN_PPC_D_ASM)
|
||||
|
||||
#include "../fabs.c"
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include <math.h>
|
||||
|
||||
#ifdef _SOFT_FLOAT
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
|
||||
|
||||
#include "../fabsf.c"
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include <math.h>
|
||||
|
||||
#if defined(_SOFT_FLOAT) || defined(BROKEN_PPC_D_ASM)
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) || defined(BROKEN_PPC_D_ASM)
|
||||
|
||||
#include "../fma.c"
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include <math.h>
|
||||
|
||||
#ifdef _SOFT_FLOAT
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
|
||||
|
||||
#include "../fmaf.c"
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <endian.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#define alignof(t) offsetof(struct { char c; t x; }, x)
|
||||
@ -53,7 +54,7 @@ static const struct ioctl_compat_map compat_map[] = {
|
||||
{ _IOWR('A', 0x23, char[136]), _IOWR('A', 0x23, char[132]), 0, WR, 1, 0 },
|
||||
{ 0, 0, 4, WR, 1, 0 }, /* snd_pcm_sync_ptr (flags only) */
|
||||
{ 0, 0, 32, WR, 1, OFFS(8,12,16,24,28) }, /* snd_pcm_mmap_status */
|
||||
{ 0, 0, 8, WR, 1, OFFS(0,4) }, /* snd_pcm_mmap_control */
|
||||
{ 0, 0, 4, WR, 1, 0 }, /* snd_pcm_mmap_control (each member) */
|
||||
|
||||
/* VIDIOC_QUERYBUF, VIDIOC_QBUF, VIDIOC_DQBUF, VIDIOC_PREPARE_BUF */
|
||||
{ _IOWR('V', 9, new_misaligned(68)), _IOWR('V', 9, char[68]), 68, WR, 1, OFFS(20, 24) },
|
||||
@ -90,7 +91,11 @@ static void convert_ioctl_struct(const struct ioctl_compat_map *map, char *old,
|
||||
* if another exception appears this needs changing. */
|
||||
convert_ioctl_struct(map+1, old, new, dir);
|
||||
convert_ioctl_struct(map+2, old+4, new+8, dir);
|
||||
convert_ioctl_struct(map+3, old+68, new+72, dir);
|
||||
/* snd_pcm_mmap_control, special-cased due to kernel
|
||||
* type definition having been botched. */
|
||||
int adj = BYTE_ORDER==BIG_ENDIAN ? 4 : 0;
|
||||
convert_ioctl_struct(map+3, old+68, new+72+adj, dir);
|
||||
convert_ioctl_struct(map+3, old+72, new+76+3*adj, dir);
|
||||
return;
|
||||
}
|
||||
for (int i=0; i < map->noffs; i++) {
|
||||
|
||||
@ -40,7 +40,15 @@ retry:
|
||||
buf[0] = NSCDVERSION;
|
||||
|
||||
fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
|
||||
if (fd < 0) return NULL;
|
||||
if (fd < 0) {
|
||||
if (errno == EAFNOSUPPORT) {
|
||||
f = fopen("/dev/null", "re");
|
||||
if (f)
|
||||
errno = errno_save;
|
||||
return f;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!(f = fdopen(fd, "r"))) {
|
||||
close(fd);
|
||||
|
||||
@ -10,3 +10,8 @@ struct fdop {
|
||||
mode_t mode;
|
||||
char path[];
|
||||
};
|
||||
|
||||
#define malloc __libc_malloc
|
||||
#define calloc __libc_calloc
|
||||
#define realloc undef
|
||||
#define free __libc_free
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *fa, int fd)
|
||||
{
|
||||
if (fd < 0) return EBADF;
|
||||
struct fdop *op = malloc(sizeof *op);
|
||||
if (!op) return ENOMEM;
|
||||
op->cmd = FDOP_CLOSE;
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *fa, int srcfd, int fd)
|
||||
{
|
||||
if (srcfd < 0 || fd < 0) return EBADF;
|
||||
struct fdop *op = malloc(sizeof *op);
|
||||
if (!op) return ENOMEM;
|
||||
op->cmd = FDOP_DUP2;
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
|
||||
int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *fa, int fd)
|
||||
{
|
||||
if (fd < 0) return EBADF;
|
||||
struct fdop *op = malloc(sizeof *op);
|
||||
if (!op) return ENOMEM;
|
||||
op->cmd = FDOP_FCHDIR;
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
|
||||
int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *restrict fa, int fd, const char *restrict path, int flags, mode_t mode)
|
||||
{
|
||||
if (fd < 0) return EBADF;
|
||||
struct fdop *op = malloc(sizeof *op + strlen(path) + 1);
|
||||
if (!op) return ENOMEM;
|
||||
op->cmd = FDOP_OPEN;
|
||||
|
||||
@ -37,7 +37,37 @@ longjmp:
|
||||
lwz 29, 72(3)
|
||||
lwz 30, 76(3)
|
||||
lwz 31, 80(3)
|
||||
#ifndef _SOFT_FLOAT
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
|
||||
mflr 0
|
||||
bl 1f
|
||||
.hidden __hwcap
|
||||
.long __hwcap-.
|
||||
1: mflr 4
|
||||
lwz 5, 0(4)
|
||||
lwzx 4, 4, 5
|
||||
andis. 4, 4, 0x80
|
||||
beq 1f
|
||||
.long 0x11c35b01 /* evldd 14,88(3) */
|
||||
.long 0x11e36301 /* ... */
|
||||
.long 0x12036b01
|
||||
.long 0x12237301
|
||||
.long 0x12437b01
|
||||
.long 0x12638301
|
||||
.long 0x12838b01
|
||||
.long 0x12a39301
|
||||
.long 0x12c39b01
|
||||
.long 0x12e3a301
|
||||
.long 0x1303ab01
|
||||
.long 0x1323b301
|
||||
.long 0x1343bb01
|
||||
.long 0x1363c301
|
||||
.long 0x1383cb01
|
||||
.long 0x13a3d301
|
||||
.long 0x13c3db01
|
||||
.long 0x13e3e301 /* evldd 31,224(3) */
|
||||
.long 0x11a3eb01 /* evldd 13,232(3) */
|
||||
1: mtlr 0
|
||||
#else
|
||||
lfd 14,88(3)
|
||||
lfd 15,96(3)
|
||||
lfd 16,104(3)
|
||||
|
||||
@ -37,7 +37,37 @@ setjmp:
|
||||
stw 29, 72(3)
|
||||
stw 30, 76(3)
|
||||
stw 31, 80(3)
|
||||
#ifndef _SOFT_FLOAT
|
||||
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
|
||||
mflr 0
|
||||
bl 1f
|
||||
.hidden __hwcap
|
||||
.long __hwcap-.
|
||||
1: mflr 4
|
||||
lwz 5, 0(4)
|
||||
lwzx 4, 4, 5
|
||||
andis. 4, 4, 0x80
|
||||
beq 1f
|
||||
.long 0x11c35b21 /* evstdd 14,88(3) */
|
||||
.long 0x11e36321 /* ... */
|
||||
.long 0x12036b21
|
||||
.long 0x12237321
|
||||
.long 0x12437b21
|
||||
.long 0x12638321
|
||||
.long 0x12838b21
|
||||
.long 0x12a39321
|
||||
.long 0x12c39b21
|
||||
.long 0x12e3a321
|
||||
.long 0x1303ab21
|
||||
.long 0x1323b321
|
||||
.long 0x1343bb21
|
||||
.long 0x1363c321
|
||||
.long 0x1383cb21
|
||||
.long 0x13a3d321
|
||||
.long 0x13c3db21
|
||||
.long 0x13e3e321 /* evstdd 31,224(3) */
|
||||
.long 0x11a3eb21 /* evstdd 13,232(3) */
|
||||
1: mtlr 0
|
||||
#else
|
||||
stfd 14,88(3)
|
||||
stfd 15,96(3)
|
||||
stfd 16,104(3)
|
||||
|
||||
@ -3,9 +3,9 @@
|
||||
#include <signal.h>
|
||||
|
||||
static const unsigned long all_mask[] = {
|
||||
#if ULONG_MAX == 0xffffffff && _NSIG == 129
|
||||
#if ULONG_MAX == 0xffffffff && _NSIG > 65
|
||||
-1UL, -1UL, -1UL, -1UL
|
||||
#elif ULONG_MAX == 0xffffffff
|
||||
#elif ULONG_MAX == 0xffffffff || _NSIG > 65
|
||||
-1UL, -1UL
|
||||
#else
|
||||
-1UL
|
||||
|
||||
@ -2,7 +2,9 @@
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
|
||||
#include "syscall.h"
|
||||
#endif
|
||||
|
||||
int __futimesat(int dirfd, const char *pathname, const struct timeval times[2])
|
||||
{
|
||||
@ -10,8 +12,15 @@ int __futimesat(int dirfd, const char *pathname, const struct timeval times[2])
|
||||
if (times) {
|
||||
int i;
|
||||
for (i=0; i<2; i++) {
|
||||
#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
|
||||
if (times[i].tv_usec >= 1000000ULL)
|
||||
return __syscall_ret(-EINVAL);
|
||||
#else
|
||||
if (times[i].tv_usec >= 1000000ULL) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
ts[i].tv_sec = times[i].tv_sec;
|
||||
ts[i].tv_nsec = times[i].tv_usec * 1000;
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
#include "stdio_impl.h"
|
||||
#include <wchar.h>
|
||||
#include <errno.h>
|
||||
|
||||
wint_t __fgetwc_unlocked(FILE *);
|
||||
|
||||
@ -12,10 +11,6 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
|
||||
|
||||
FLOCK(f);
|
||||
|
||||
/* Setup a dummy errno so we can detect EILSEQ. This is
|
||||
* the only way to catch encoding errors in the form of a
|
||||
* partial character just before EOF. */
|
||||
errno = EAGAIN;
|
||||
for (; n; n--) {
|
||||
wint_t c = __fgetwc_unlocked(f);
|
||||
if (c == WEOF) break;
|
||||
@ -23,7 +18,7 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
|
||||
if (c == '\n') break;
|
||||
}
|
||||
*p = 0;
|
||||
if (ferror(f) || errno==EILSEQ) p = s;
|
||||
if (ferror(f)) p = s;
|
||||
|
||||
FUNLOCK(f);
|
||||
|
||||
|
||||
@ -1,7 +1,14 @@
|
||||
#include "stdio_impl.h"
|
||||
#include <errno.h>
|
||||
|
||||
int __fseeko_unlocked(FILE *f, off_t off, int whence)
|
||||
{
|
||||
/* Fail immediately for invalid whence argument. */
|
||||
if (whence != SEEK_CUR && whence != SEEK_SET && whence != SEEK_END) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Adjust relative offset for unread data in buffer, if any. */
|
||||
if (whence == SEEK_CUR && f->rend) off -= f->rend - f->rpos;
|
||||
|
||||
|
||||
@ -55,9 +55,11 @@ ssize_t getdelim(char **restrict s, size_t *restrict n, int delim, FILE *restric
|
||||
*s = tmp;
|
||||
*n = m;
|
||||
}
|
||||
memcpy(*s+i, f->rpos, k);
|
||||
f->rpos += k;
|
||||
i += k;
|
||||
if (k) {
|
||||
memcpy(*s+i, f->rpos, k);
|
||||
f->rpos += k;
|
||||
i += k;
|
||||
}
|
||||
if (z) break;
|
||||
if ((c = getc_unlocked(f)) == EOF) {
|
||||
if (!i || !feof(f)) {
|
||||
|
||||
@ -31,25 +31,12 @@ FILE *popen(const char *cmd, const char *mode)
|
||||
__syscall(SYS_close, p[1]);
|
||||
return NULL;
|
||||
}
|
||||
FLOCK(f);
|
||||
|
||||
/* If the child's end of the pipe happens to already be on the final
|
||||
* fd number to which it will be assigned (either 0 or 1), it must
|
||||
* be moved to a different fd. Otherwise, there is no safe way to
|
||||
* remove the close-on-exec flag in the child without also creating
|
||||
* a file descriptor leak race condition in the parent. */
|
||||
if (p[1-op] == 1-op) {
|
||||
int tmp = fcntl(1-op, F_DUPFD_CLOEXEC, 0);
|
||||
if (tmp < 0) {
|
||||
e = errno;
|
||||
goto fail;
|
||||
}
|
||||
__syscall(SYS_close, p[1-op]);
|
||||
p[1-op] = tmp;
|
||||
}
|
||||
|
||||
e = ENOMEM;
|
||||
if (!posix_spawn_file_actions_init(&fa)) {
|
||||
for (FILE *l = *__ofl_lock(); l; l=l->next)
|
||||
if (l->pipe_pid && posix_spawn_file_actions_addclose(&fa, l->fd))
|
||||
goto fail;
|
||||
if (!posix_spawn_file_actions_adddup2(&fa, p[1-op], 1-op)) {
|
||||
if (!(e = posix_spawn(&pid, "/bin/sh", &fa, 0,
|
||||
(char *[]){ "sh", "-c", (char *)cmd, 0 }, __environ))) {
|
||||
@ -58,13 +45,14 @@ FILE *popen(const char *cmd, const char *mode)
|
||||
if (!strchr(mode, 'e'))
|
||||
fcntl(p[op], F_SETFD, 0);
|
||||
__syscall(SYS_close, p[1-op]);
|
||||
FUNLOCK(f);
|
||||
__ofl_unlock();
|
||||
return f;
|
||||
}
|
||||
}
|
||||
fail:
|
||||
__ofl_unlock();
|
||||
posix_spawn_file_actions_destroy(&fa);
|
||||
}
|
||||
fail:
|
||||
fclose(f);
|
||||
__syscall(SYS_close, p[1-op]);
|
||||
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
/* Smoothsort, an adaptive variant of Heapsort. Memory usage: O(1).
|
||||
Run time: Worst case O(n log n), close to O(n) in the mostly-sorted case. */
|
||||
|
||||
#define _BSD_SOURCE
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -31,7 +32,7 @@
|
||||
#include "atomic.h"
|
||||
#define ntz(x) a_ctz_l((x))
|
||||
|
||||
typedef int (*cmpfun)(const void *, const void *);
|
||||
typedef int (*cmpfun)(const void *, const void *, void *);
|
||||
|
||||
static inline int pntz(size_t p[2]) {
|
||||
int r = ntz(p[0] - 1);
|
||||
@ -88,7 +89,7 @@ static inline void shr(size_t p[2], int n)
|
||||
p[1] >>= n;
|
||||
}
|
||||
|
||||
static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size_t lp[])
|
||||
static void sift(unsigned char *head, size_t width, cmpfun cmp, void *arg, int pshift, size_t lp[])
|
||||
{
|
||||
unsigned char *rt, *lf;
|
||||
unsigned char *ar[14 * sizeof(size_t) + 1];
|
||||
@ -99,10 +100,10 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size
|
||||
rt = head - width;
|
||||
lf = head - width - lp[pshift - 2];
|
||||
|
||||
if((*cmp)(ar[0], lf) >= 0 && (*cmp)(ar[0], rt) >= 0) {
|
||||
if(cmp(ar[0], lf, arg) >= 0 && cmp(ar[0], rt, arg) >= 0) {
|
||||
break;
|
||||
}
|
||||
if((*cmp)(lf, rt) >= 0) {
|
||||
if(cmp(lf, rt, arg) >= 0) {
|
||||
ar[i++] = lf;
|
||||
head = lf;
|
||||
pshift -= 1;
|
||||
@ -115,7 +116,7 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size
|
||||
cycle(width, ar, i);
|
||||
}
|
||||
|
||||
static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2], int pshift, int trusty, size_t lp[])
|
||||
static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, size_t pp[2], int pshift, int trusty, size_t lp[])
|
||||
{
|
||||
unsigned char *stepson,
|
||||
*rt, *lf;
|
||||
@ -130,13 +131,13 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2],
|
||||
ar[0] = head;
|
||||
while(p[0] != 1 || p[1] != 0) {
|
||||
stepson = head - lp[pshift];
|
||||
if((*cmp)(stepson, ar[0]) <= 0) {
|
||||
if(cmp(stepson, ar[0], arg) <= 0) {
|
||||
break;
|
||||
}
|
||||
if(!trusty && pshift > 1) {
|
||||
rt = head - width;
|
||||
lf = head - width - lp[pshift - 2];
|
||||
if((*cmp)(rt, stepson) >= 0 || (*cmp)(lf, stepson) >= 0) {
|
||||
if(cmp(rt, stepson, arg) >= 0 || cmp(lf, stepson, arg) >= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -150,11 +151,11 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2],
|
||||
}
|
||||
if(!trusty) {
|
||||
cycle(width, ar, i);
|
||||
sift(head, width, cmp, pshift, lp);
|
||||
sift(head, width, cmp, arg, pshift, lp);
|
||||
}
|
||||
}
|
||||
|
||||
void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
void __qsort_r(void *base, size_t nel, size_t width, cmpfun cmp, void *arg)
|
||||
{
|
||||
size_t lp[12*sizeof(size_t)];
|
||||
size_t i, size = width * nel;
|
||||
@ -173,16 +174,16 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
|
||||
while(head < high) {
|
||||
if((p[0] & 3) == 3) {
|
||||
sift(head, width, cmp, pshift, lp);
|
||||
sift(head, width, cmp, arg, pshift, lp);
|
||||
shr(p, 2);
|
||||
pshift += 2;
|
||||
} else {
|
||||
if(lp[pshift - 1] >= high - head) {
|
||||
trinkle(head, width, cmp, p, pshift, 0, lp);
|
||||
trinkle(head, width, cmp, arg, p, pshift, 0, lp);
|
||||
} else {
|
||||
sift(head, width, cmp, pshift, lp);
|
||||
sift(head, width, cmp, arg, pshift, lp);
|
||||
}
|
||||
|
||||
|
||||
if(pshift == 1) {
|
||||
shl(p, 1);
|
||||
pshift = 0;
|
||||
@ -191,12 +192,12 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
pshift = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
p[0] |= 1;
|
||||
head += width;
|
||||
}
|
||||
|
||||
trinkle(head, width, cmp, p, pshift, 0, lp);
|
||||
trinkle(head, width, cmp, arg, p, pshift, 0, lp);
|
||||
|
||||
while(pshift != 1 || p[0] != 1 || p[1] != 0) {
|
||||
if(pshift <= 1) {
|
||||
@ -208,11 +209,13 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
pshift -= 2;
|
||||
p[0] ^= 7;
|
||||
shr(p, 1);
|
||||
trinkle(head - lp[pshift] - width, width, cmp, p, pshift + 1, 1, lp);
|
||||
trinkle(head - lp[pshift] - width, width, cmp, arg, p, pshift + 1, 1, lp);
|
||||
shl(p, 1);
|
||||
p[0] |= 1;
|
||||
trinkle(head - width, width, cmp, p, pshift, 1, lp);
|
||||
trinkle(head - width, width, cmp, arg, p, pshift, 1, lp);
|
||||
}
|
||||
head -= width;
|
||||
}
|
||||
}
|
||||
|
||||
weak_alias(__qsort_r, qsort_r);
|
||||
|
||||
14
lib/libc/wasi/libc-top-half/musl/src/stdlib/qsort_nr.c
Normal file
14
lib/libc/wasi/libc-top-half/musl/src/stdlib/qsort_nr.c
Normal file
@ -0,0 +1,14 @@
|
||||
#define _BSD_SOURCE
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef int (*cmpfun)(const void *, const void *);
|
||||
|
||||
static int wrapper_cmp(const void *v1, const void *v2, void *cmp)
|
||||
{
|
||||
return ((cmpfun)cmp)(v1, v2);
|
||||
}
|
||||
|
||||
void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
{
|
||||
__qsort_r(base, nel, width, wrapper_cmp, cmp);
|
||||
}
|
||||
@ -46,24 +46,3 @@ long double strtold(const char *restrict s, char **restrict p)
|
||||
return strtox(s, p, 2);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __wasilibc_unmodified_upstream // WASI doesn't support signature-changing aliases
|
||||
weak_alias(strtof, strtof_l);
|
||||
weak_alias(strtod, strtod_l);
|
||||
weak_alias(strtold, strtold_l);
|
||||
weak_alias(strtof, __strtof_l);
|
||||
weak_alias(strtod, __strtod_l);
|
||||
weak_alias(strtold, __strtold_l);
|
||||
#else
|
||||
// WebAssembly doesn't permit signature-changing aliases, so use wrapper
|
||||
// functions instead.
|
||||
weak float strtof_l(const char *restrict s, char **restrict p, locale_t loc) {
|
||||
return strtof(s, p);
|
||||
}
|
||||
weak double strtod_l(const char *restrict s, char **restrict p, locale_t loc) {
|
||||
return strtod(s, p);
|
||||
}
|
||||
weak long double strtold_l(const char *restrict s, char **restrict p, locale_t loc) {
|
||||
return strtold(s, p);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
#include "pthread_impl.h"
|
||||
|
||||
int pthread_getname_np(pthread_t thread, char *name, size_t len)
|
||||
{
|
||||
int fd, cs, status = 0;
|
||||
char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)];
|
||||
|
||||
if (len < 16) return ERANGE;
|
||||
|
||||
if (thread == pthread_self())
|
||||
return prctl(PR_GET_NAME, (unsigned long)name, 0UL, 0UL, 0UL) ? errno : 0;
|
||||
|
||||
snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid);
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
||||
if ((fd = open(f, O_RDONLY|O_CLOEXEC)) < 0 || (len = read(fd, name, len)) == -1) status = errno;
|
||||
else name[len-1] = 0; /* remove trailing new line only if successful */
|
||||
if (fd >= 0) close(fd);
|
||||
pthread_setcancelstate(cs, 0);
|
||||
return status;
|
||||
}
|
||||
@ -19,7 +19,7 @@ int pthread_setname_np(pthread_t thread, const char *name)
|
||||
|
||||
snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid);
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
||||
if ((fd = open(f, O_WRONLY)) < 0 || write(fd, name, len) < 0) status = errno;
|
||||
if ((fd = open(f, O_WRONLY|O_CLOEXEC)) < 0 || write(fd, name, len) < 0) status = errno;
|
||||
if (fd >= 0) close(fd);
|
||||
pthread_setcancelstate(cs, 0);
|
||||
return status;
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#include <string.h>
|
||||
#ifdef __wasilibc_unmodified_upstream // timezone data
|
||||
#include <sys/mman.h>
|
||||
#include <ctype.h>
|
||||
#endif
|
||||
#include "libc.h"
|
||||
#include "lock.h"
|
||||
@ -159,10 +160,21 @@ static void do_tzset()
|
||||
}
|
||||
if (old_tz) memcpy(old_tz, s, i+1);
|
||||
|
||||
int posix_form = 0;
|
||||
if (*s != ':') {
|
||||
p = s;
|
||||
char dummy_name[TZNAME_MAX+1];
|
||||
getname(dummy_name, &p);
|
||||
if (p!=s && (*p == '+' || *p == '-' || isdigit(*p)
|
||||
|| !strcmp(dummy_name, "UTC")
|
||||
|| !strcmp(dummy_name, "GMT")))
|
||||
posix_form = 1;
|
||||
}
|
||||
|
||||
/* Non-suid can use an absolute tzfile pathname or a relative
|
||||
* pathame beginning with "."; in secure mode, only the
|
||||
* standard path will be searched. */
|
||||
if (*s == ':' || ((p=strchr(s, '/')) && !memchr(s, ',', p-s))) {
|
||||
if (!posix_form) {
|
||||
if (*s == ':') s++;
|
||||
if (*s == '/' || *s == '.') {
|
||||
if (!libc.secure || !strcmp(s, "/etc/localtime"))
|
||||
@ -286,22 +298,20 @@ static size_t scan_trans(long long t, int local, size_t *alt)
|
||||
n = (index-trans)>>scale;
|
||||
if (a == n-1) return -1;
|
||||
if (a == 0) {
|
||||
x = zi_read32(trans + (a<<scale));
|
||||
if (scale == 3) x = x<<32 | zi_read32(trans + (a<<scale) + 4);
|
||||
x = zi_read32(trans);
|
||||
if (scale == 3) x = x<<32 | zi_read32(trans + 4);
|
||||
else x = (int32_t)x;
|
||||
if (local) off = (int32_t)zi_read32(types + 6 * index[a-1]);
|
||||
/* Find the lowest non-DST type, or 0 if none. */
|
||||
size_t j = 0;
|
||||
for (size_t i=abbrevs-types; i; i-=6) {
|
||||
if (!types[i-6+4]) j = i-6;
|
||||
}
|
||||
if (local) off = (int32_t)zi_read32(types + j);
|
||||
/* If t is before first transition, use the above-found type
|
||||
* and the index-zero (after transition) type as the alt. */
|
||||
if (t - off < (int64_t)x) {
|
||||
for (a=0; a<(abbrevs-types)/6; a++) {
|
||||
if (types[6*a+4] != types[4]) break;
|
||||
}
|
||||
if (a == (abbrevs-types)/6) a = 0;
|
||||
if (types[6*a+4]) {
|
||||
*alt = a;
|
||||
return 0;
|
||||
} else {
|
||||
*alt = 0;
|
||||
return a;
|
||||
}
|
||||
if (alt) *alt = index[0];
|
||||
return j/6;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/resource.h>
|
||||
#include <limits.h>
|
||||
#include "syscall.h"
|
||||
@ -12,5 +13,11 @@ int nice(int inc)
|
||||
prio += getpriority(PRIO_PROCESS, 0);
|
||||
if (prio > NZERO-1) prio = NZERO-1;
|
||||
if (prio < -NZERO) prio = -NZERO;
|
||||
return setpriority(PRIO_PROCESS, 0, prio) ? -1 : prio;
|
||||
if (setpriority(PRIO_PROCESS, 0, prio)) {
|
||||
if (errno == EACCES)
|
||||
errno = EPERM;
|
||||
return -1;
|
||||
} else {
|
||||
return prio;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user