summaryrefslogtreecommitdiff
path: root/wasm
diff options
context:
space:
mode:
authorYuta Saito <kateinoigakukun@gmail.com>2022-01-16 01:18:49 +0900
committerYuta Saito <kateinoigakukun@gmail.com>2022-01-19 11:19:06 +0900
commit7ee786388ae0d6f8c8cea7bf012cc11fdb5b534a (patch)
tree5730c7c4890c284f3c8c9a19fab846a02acd6aa4 /wasm
parent65f95f26ff0e7b4be4704fedc52344a26d22a4e2 (diff)
[wasm] wasm/missing.{c,h}: add missing libc stubs for wasi-libc
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5407
Diffstat (limited to 'wasm')
-rw-r--r--wasm/GNUmakefile.in1
-rw-r--r--wasm/missing.c199
2 files changed, 200 insertions, 0 deletions
diff --git a/wasm/GNUmakefile.in b/wasm/GNUmakefile.in
index b3b427e023..4328dec9c6 100644
--- a/wasm/GNUmakefile.in
+++ b/wasm/GNUmakefile.in
@@ -8,6 +8,7 @@ wasmoptflags = @wasmoptflags@
WASM_OBJS = $(wasmdir)/machine_core.o $(wasmdir)/machine.o $(wasmdir)/setjmp.o $(wasmdir)/setjmp_core.o $(wasmdir)/fiber.o $(wasmdir)/runtime.o
+wasm/missing.$(OBJEXT): $(wasmdir)/missing.c $(PLATFORM_D)
wasm/fiber.$(OBJEXT): $(wasmdir)/fiber.c $(wasmdir)/fiber.h $(wasmdir)/asyncify.h $(PLATFORM_D)
wasm/machine.$(OBJEXT): $(wasmdir)/machine.c $(srcdir)/wasm/machine.h $(wasmdir)/asyncify.h $(PLATFORM_D)
wasm/setjmp.$(OBJEXT): $(wasmdir)/setjmp.c $(wasmdir)/setjmp.h $(wasmdir)/machine.h $(wasmdir)/asyncify.h $(PLATFORM_D)
diff --git a/wasm/missing.c b/wasm/missing.c
new file mode 100644
index 0000000000..5bbf988642
--- /dev/null
+++ b/wasm/missing.c
@@ -0,0 +1,199 @@
+#include <errno.h>
+#include <sys/types.h>
+#include "ruby/missing.h"
+
+// Produce weak symbols for missing functions to replace them with actual ones if exists.
+#define WASM_MISSING_LIBC_FUNC __attribute__((weak))
+
+WASM_MISSING_LIBC_FUNC
+int
+chmod(const char *pathname, rb_mode_t mode)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+chown(const char *pathname, rb_uid_t owner, rb_gid_t group)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+dup(int oldfd)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+dup2(int oldfd, int newfd)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+execl(const char *path, const char *arg, ...)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+execle(const char *path, const char *arg, ...)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+execv(const char *path, char *const argv[])
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+execve(const char *filename, char *const argv[], char *const envp[])
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+rb_uid_t
+geteuid(void)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+rb_uid_t
+getuid(void)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+rb_pid_t
+getppid(void)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+rb_gid_t
+getegid(void)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+rb_gid_t
+getgid(void)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+char *
+getlogin(void)
+{
+ errno = ENOTSUP;
+ return NULL;
+}
+
+WASM_MISSING_LIBC_FUNC
+rb_mode_t
+umask(rb_mode_t mask)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+mprotect(const void *addr, size_t len, int prot)
+{
+ return 0;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+pclose(FILE *stream)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+FILE *
+popen(const char *command, const char *type)
+{
+ errno = ENOTSUP;
+ return NULL;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+pipe(int pipefd[2])
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+posix_madvise(void *addr, size_t len, int advice)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+kill(rb_pid_t pid, int sig)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+
+WASM_MISSING_LIBC_FUNC
+void
+tzset(void)
+{
+ return;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+shutdown(int s, int how)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+int
+system(const char *command)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+WASM_MISSING_LIBC_FUNC
+pid_t
+waitpid(pid_t pid, int *wstatus, int options)
+{
+ errno = ENOTSUP;
+ return -1;
+}