Signed-off-by: Kohei Tokunaga <ktokunaga.m...@gmail.com> --- block/file-posix.c | 18 ++++++++++++++++++ include/qemu/cacheflush.h | 3 ++- os-posix.c | 5 +++++ util/cacheflush.c | 3 ++- 4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c index 56d1972d15..69f54505bd 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -110,6 +110,10 @@ #include <sys/diskslice.h> #endif +#ifdef EMSCRIPTEN +#include <sys/ioctl.h> +#endif + /* OS X does not have O_DSYNC */ #ifndef O_DSYNC #ifdef O_SYNC @@ -2011,6 +2015,19 @@ static int handle_aiocb_write_zeroes_unmap(void *opaque) } #ifndef HAVE_COPY_FILE_RANGE +#ifdef EMSCRIPTEN +/* + * emscripten exposes copy_file_range declaration but doesn't provide the + * implementation in the final link. Define the stub here but avoid type + * conflict with the emscripten's header. + */ +ssize_t copy_file_range(int in_fd, off_t *in_off, int out_fd, + off_t *out_off, size_t len, unsigned int flags) +{ + errno = ENOSYS; + return -1; +} +#else static off_t copy_file_range(int in_fd, off_t *in_off, int out_fd, off_t *out_off, size_t len, unsigned int flags) { @@ -2023,6 +2040,7 @@ static off_t copy_file_range(int in_fd, off_t *in_off, int out_fd, #endif } #endif +#endif /* * parse_zone - Fill a zone descriptor diff --git a/include/qemu/cacheflush.h b/include/qemu/cacheflush.h index ae20bcda73..84969801e3 100644 --- a/include/qemu/cacheflush.h +++ b/include/qemu/cacheflush.h @@ -19,7 +19,8 @@ * mappings of the same physical page(s). */ -#if defined(__i386__) || defined(__x86_64__) || defined(__s390__) +#if defined(__i386__) || defined(__x86_64__) || defined(__s390__) \ + || defined(EMSCRIPTEN) static inline void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len) { diff --git a/os-posix.c b/os-posix.c index 52925c23d3..9a7099e279 100644 --- a/os-posix.c +++ b/os-posix.c @@ -148,11 +148,16 @@ static void change_process_uid(void) exit(1); } if (user_pwd) { +#ifdef EMSCRIPTEN + error_report("initgroups unsupported"); + exit(1); +#else if (initgroups(user_pwd->pw_name, user_pwd->pw_gid) < 0) { error_report("Failed to initgroups(\"%s\", %d)", user_pwd->pw_name, user_pwd->pw_gid); exit(1); } +#endif } else { if (setgroups(1, &user_gid) < 0) { error_report("Failed to setgroups(1, [%d])", diff --git a/util/cacheflush.c b/util/cacheflush.c index 1d12899a39..e5aa256cd8 100644 --- a/util/cacheflush.c +++ b/util/cacheflush.c @@ -225,7 +225,8 @@ static void __attribute__((constructor)) init_cache_info(void) * Architecture (+ OS) specific cache flushing mechanisms. */ -#if defined(__i386__) || defined(__x86_64__) || defined(__s390__) +#if defined(__i386__) || defined(__x86_64__) || defined(__s390__) || \ + defined(EMSCRIPTEN) /* Caches are coherent and do not require flushing; symbol inline. */ -- 2.25.1