Update the WASI libc

Update our copy of wasi-libc up to the commit
30094b6ed05f19cee102115215863d185f2db4f0 from the upstream repository.
This commit is contained in:
Frank Denis 2022-06-14 14:03:27 +02:00
parent 47c4d44502
commit 8c63037695
81 changed files with 583 additions and 227 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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")

View 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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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 **);

View File

@ -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

View File

@ -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

View File

@ -7,4 +7,7 @@
#define __STDC_IEC_559__ 1
#endif
#define __STDC_UTF_16__ 1
#define __STDC_UTF_32__ 1
#endif

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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 */

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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));
}

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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,

View File

@ -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;

View File

@ -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;
}

View File

@ -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.

View File

@ -1,3 +1,3 @@
#ifdef _SOFT_FLOAT
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
#include "../fenv.c"
#endif

View File

@ -1,4 +1,4 @@
#ifndef _SOFT_FLOAT
#if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__)
.global feclearexcept
.type feclearexcept,@function
feclearexcept:

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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();

View File

@ -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);

View 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);

View File

@ -2,5 +2,5 @@
void free(void *p)
{
return __libc_free(p);
__libc_free(p);
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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"

View File

@ -1,6 +1,6 @@
#include <math.h>
#ifdef _SOFT_FLOAT
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
#include "../fabsf.c"

View File

@ -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"

View File

@ -1,6 +1,6 @@
#include <math.h>
#ifdef _SOFT_FLOAT
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
#include "../fmaf.c"

View File

@ -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++) {

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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)) {

View File

@ -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]);

View File

@ -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);

View 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);
}

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;
}
}