diff --git a/CMakeLists.txt b/CMakeLists.txt index 538ff68..cac8b3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,11 @@ set(uvwasi_sources src/wasi_rights.c ) +option(UVWASI_DEBUG_LOG "Enable debug logging" OFF) +if(UVWASI_DEBUG_LOG) + list(APPEND uvwasi_cflags -DUVWASI_DEBUG_LOG) +endif() + # Code Coverage Configuration add_library(coverage_config INTERFACE) diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..16bc273 --- /dev/null +++ b/src/debug.h @@ -0,0 +1,13 @@ +#ifndef __UVWASI_DEBUG_H__ +#define __UVWASI_DEBUG_H__ + +#ifdef UVWASI_DEBUG_LOG +# define __STDC_FORMAT_MACROS +# include +# define DEBUG(fmt, ...) \ + do { fprintf(stderr, fmt, __VA_ARGS__); } while (0) +#else +# define DEBUG(fmt, ...) +#endif + +#endif /* __UVWASI_DEBUG_H__ */ diff --git a/src/uvwasi.c b/src/uvwasi.c index 0ee66be..0f81aed 100644 --- a/src/uvwasi.c +++ b/src/uvwasi.c @@ -21,6 +21,7 @@ #include "clocks.h" #include "path_resolver.h" #include "wasi_rights.h" +#include "debug.h" /* IBMi PASE does not support posix_fadvise() */ #ifdef __PASE__ @@ -327,6 +328,11 @@ uvwasi_errno_t uvwasi_embedder_remap_fd(uvwasi_t* uvwasi, uvwasi_errno_t uvwasi_args_get(uvwasi_t* uvwasi, char** argv, char* argv_buf) { size_t i; + DEBUG("uvwasi_args_get(uvwasi=%p, argv=%p, argv_buf=%p)\n", + uvwasi, + argv, + argv_buf); + if (uvwasi == NULL || argv == NULL || argv_buf == NULL) return UVWASI_EINVAL; @@ -342,6 +348,11 @@ uvwasi_errno_t uvwasi_args_get(uvwasi_t* uvwasi, char** argv, char* argv_buf) { uvwasi_errno_t uvwasi_args_sizes_get(uvwasi_t* uvwasi, size_t* argc, size_t* argv_buf_size) { + DEBUG("uvwasi_args_sizes_get(uvwasi=%p, argc=%p, argv_buf_size=%p)\n", + uvwasi, + argc, + argv_buf_size); + if (uvwasi == NULL || argc == NULL || argv_buf_size == NULL) return UVWASI_EINVAL; @@ -354,6 +365,11 @@ uvwasi_errno_t uvwasi_args_sizes_get(uvwasi_t* uvwasi, uvwasi_errno_t uvwasi_clock_res_get(uvwasi_t* uvwasi, uvwasi_clockid_t clock_id, uvwasi_timestamp_t* resolution) { + DEBUG("uvwasi_clock_res_get(uvwasi=%p, clock_id=%d, resolution=%p)\n", + uvwasi, + clock_id, + resolution); + if (uvwasi == NULL || resolution == NULL) return UVWASI_EINVAL; @@ -376,6 +392,13 @@ uvwasi_errno_t uvwasi_clock_time_get(uvwasi_t* uvwasi, uvwasi_clockid_t clock_id, uvwasi_timestamp_t precision, uvwasi_timestamp_t* time) { + DEBUG("uvwasi_clock_time_get(uvwasi=%p, clock_id=%d, " + "precision=%"PRIu64", time=%p)\n", + uvwasi, + clock_id, + precision, + time); + if (uvwasi == NULL || time == NULL) return UVWASI_EINVAL; @@ -400,6 +423,11 @@ uvwasi_errno_t uvwasi_environ_get(uvwasi_t* uvwasi, char* environ_buf) { size_t i; + DEBUG("uvwasi_environ_get(uvwasi=%p, environment=%p, environ_buf=%p)\n", + uvwasi, + environment, + environ_buf); + if (uvwasi == NULL || environment == NULL || environ_buf == NULL) return UVWASI_EINVAL; @@ -415,6 +443,12 @@ uvwasi_errno_t uvwasi_environ_get(uvwasi_t* uvwasi, uvwasi_errno_t uvwasi_environ_sizes_get(uvwasi_t* uvwasi, size_t* environ_count, size_t* environ_buf_size) { + DEBUG("uvwasi_environ_sizes_get(uvwasi=%p, environ_count=%p, " + "environ_buf_size=%p)\n", + uvwasi, + environ_count, + environ_buf_size); + if (uvwasi == NULL || environ_count == NULL || environ_buf_size == NULL) return UVWASI_EINVAL; @@ -436,6 +470,14 @@ uvwasi_errno_t uvwasi_fd_advise(uvwasi_t* uvwasi, int r; #endif /* POSIX_FADV_NORMAL */ + DEBUG("uvwasi_fd_advise(uvwasi=%p, fd=%d, offset=%"PRIu64", len=%"PRIu64", " + "advice=%d)\n", + uvwasi, + fd, + offset, + len, + advice); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -502,6 +544,13 @@ uvwasi_errno_t uvwasi_fd_allocate(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_fd_allocate(uvwasi=%p, fd=%d, offset=%"PRIu64", " + "len=%"PRIu64")\n", + uvwasi, + fd, + offset, + len); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -552,6 +601,8 @@ uvwasi_errno_t uvwasi_fd_close(uvwasi_t* uvwasi, uvwasi_fd_t fd) { uv_fs_t req; int r; + DEBUG("uvwasi_fd_close(uvwasi=%p, fd=%d)\n", uvwasi, fd); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -584,6 +635,8 @@ uvwasi_errno_t uvwasi_fd_datasync(uvwasi_t* uvwasi, uvwasi_fd_t fd) { uv_fs_t req; int r; + DEBUG("uvwasi_fd_datasync(uvwasi=%p, fd=%d)\n", uvwasi, fd); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -615,6 +668,8 @@ uvwasi_errno_t uvwasi_fd_fdstat_get(uvwasi_t* uvwasi, int r; #endif + DEBUG("uvwasi_fd_fdstat_get(uvwasi=%p, fd=%d, buf=%p)\n", uvwasi, fd, buf); + if (uvwasi == NULL || buf == NULL) return UVWASI_EINVAL; @@ -646,7 +701,12 @@ uvwasi_errno_t uvwasi_fd_fdstat_set_flags(uvwasi_t* uvwasi, uvwasi_fd_t fd, uvwasi_fdflags_t flags) { #ifdef _WIN32 - /* TODO(cjihrig): Missing Windows support. */ + DEBUG("uvwasi_fd_fdstat_set_flags(uvwasi=%p, fd=%d, flags=%d)\n", + uvwasi, + fd, + flags); + + /* TODO(cjihrig): Windows is not supported. */ return UVWASI_ENOSYS; #else struct uvwasi_fd_wrap_t* wrap; @@ -654,6 +714,11 @@ uvwasi_errno_t uvwasi_fd_fdstat_set_flags(uvwasi_t* uvwasi, int mapped_flags; int r; + DEBUG("uvwasi_fd_fdstat_set_flags(uvwasi=%p, fd=%d, flags=%d)\n", + uvwasi, + fd, + flags); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -710,6 +775,13 @@ uvwasi_errno_t uvwasi_fd_fdstat_set_rights(uvwasi_t* uvwasi, struct uvwasi_fd_wrap_t* wrap; uvwasi_errno_t err; + DEBUG("uvwasi_fd_fdstat_set_rights(uvwasi=%p, fd=%d, " + "fs_rights_base=%"PRIu64", fs_rights_inheriting=%"PRIu64")\n", + uvwasi, + fd, + fs_rights_base, + fs_rights_inheriting); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -746,6 +818,8 @@ uvwasi_errno_t uvwasi_fd_filestat_get(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_fd_filestat_get(uvwasi=%p, fd=%d, buf=%p)\n", uvwasi, fd, buf); + if (uvwasi == NULL || buf == NULL) return UVWASI_EINVAL; @@ -781,6 +855,11 @@ uvwasi_errno_t uvwasi_fd_filestat_set_size(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_fd_filestat_set_size(uvwasi=%p, fd=%d, st_size=%"PRIu64")\n", + uvwasi, + fd, + st_size); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -814,6 +893,14 @@ uvwasi_errno_t uvwasi_fd_filestat_set_times(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_fd_filestat_set_times(uvwasi=%p, fd=%d, st_atim=%"PRIu64", " + "st_mtim=%"PRIu64", fst_flags=%d)\n", + uvwasi, + fd, + st_atim, + st_mtim, + fst_flags); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -855,6 +942,15 @@ uvwasi_errno_t uvwasi_fd_pread(uvwasi_t* uvwasi, size_t uvread; int r; + DEBUG("uvwasi_fd_pread(uvwasi=%p, fd=%d, iovs=%p, iovs_len=%zu, " + "offset=%"PRIu64", nread=%p)\n", + uvwasi, + fd, + iovs, + iovs_len, + offset, + nread); + if (uvwasi == NULL || iovs == NULL || nread == NULL) return UVWASI_EINVAL; @@ -892,6 +988,11 @@ uvwasi_errno_t uvwasi_fd_prestat_get(uvwasi_t* uvwasi, struct uvwasi_fd_wrap_t* wrap; uvwasi_errno_t err; + DEBUG("uvwasi_fd_prestat_get(uvwasi=%p, fd=%d, buf=%p)\n", + uvwasi, + fd, + buf); + if (uvwasi == NULL || buf == NULL) return UVWASI_EINVAL; @@ -920,6 +1021,12 @@ uvwasi_errno_t uvwasi_fd_prestat_dir_name(uvwasi_t* uvwasi, uvwasi_errno_t err; size_t size; + DEBUG("uvwasi_fd_prestat_dir_name(uvwasi=%p, fd=%d, path=%p, path_len=%zu)\n", + uvwasi, + fd, + path, + path_len); + if (uvwasi == NULL || path == NULL) return UVWASI_EINVAL; @@ -958,6 +1065,15 @@ uvwasi_errno_t uvwasi_fd_pwrite(uvwasi_t* uvwasi, size_t uvwritten; int r; + DEBUG("uvwasi_fd_pwrite(uvwasi=%p, fd=%d, iovs=%p, iovs_len=%zu, " + "offset=%"PRIu64", nwritten=%p)\n", + uvwasi, + fd, + iovs, + iovs_len, + offset, + nwritten); + if (uvwasi == NULL || iovs == NULL || nwritten == NULL) return UVWASI_EINVAL; @@ -1001,6 +1117,13 @@ uvwasi_errno_t uvwasi_fd_read(uvwasi_t* uvwasi, size_t uvread; int r; + DEBUG("uvwasi_fd_read(uvwasi=%p, fd=%d, iovs=%p, iovs_len=%zu, nread=%p)\n", + uvwasi, + fd, + iovs, + iovs_len, + nread); + if (uvwasi == NULL || iovs == NULL || nread == NULL) return UVWASI_EINVAL; @@ -1049,6 +1172,15 @@ uvwasi_errno_t uvwasi_fd_readdir(uvwasi_t* uvwasi, int i; int r; + DEBUG("uvwasi_fd_readdir(uvwasi=%p, fd=%d, buf=%p, buf_len=%zu, " + "cookie=%"PRIu64", bufused=%p)\n", + uvwasi, + fd, + buf, + buf_len, + cookie, + bufused); + if (uvwasi == NULL || buf == NULL || bufused == NULL) return UVWASI_EINVAL; @@ -1171,6 +1303,8 @@ uvwasi_errno_t uvwasi_fd_readdir(uvwasi_t* uvwasi, uvwasi_errno_t uvwasi_fd_renumber(uvwasi_t* uvwasi, uvwasi_fd_t from, uvwasi_fd_t to) { + DEBUG("uvwasi_fd_renumber(uvwasi=%p, from=%d, to=%d)\n", uvwasi, from, to); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -1186,6 +1320,14 @@ uvwasi_errno_t uvwasi_fd_seek(uvwasi_t* uvwasi, struct uvwasi_fd_wrap_t* wrap; uvwasi_errno_t err; + DEBUG("uvwasi_fd_seek(uvwasi=%p, fd=%d, offset=%"PRId64", " + "whence=%d, newoffset=%p)\n", + uvwasi, + fd, + offset, + whence, + newoffset); + if (uvwasi == NULL || newoffset == NULL) return UVWASI_EINVAL; @@ -1205,6 +1347,8 @@ uvwasi_errno_t uvwasi_fd_sync(uvwasi_t* uvwasi, uvwasi_fd_t fd) { uvwasi_errno_t err; int r; + DEBUG("uvwasi_fd_sync(uvwasi=%p, fd=%d)\n", uvwasi, fd); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -1233,6 +1377,8 @@ uvwasi_errno_t uvwasi_fd_tell(uvwasi_t* uvwasi, struct uvwasi_fd_wrap_t* wrap; uvwasi_errno_t err; + DEBUG("uvwasi_fd_tell(uvwasi=%p, fd=%d, offset=%p)\n", uvwasi, fd, offset); + if (uvwasi == NULL || offset == NULL) return UVWASI_EINVAL; @@ -1258,6 +1404,14 @@ uvwasi_errno_t uvwasi_fd_write(uvwasi_t* uvwasi, size_t uvwritten; int r; + DEBUG("uvwasi_fd_write(uvwasi=%p, fd=%d, iovs=%p, iovs_len=%zu, " + "nwritten=%p)\n", + uvwasi, + fd, + iovs, + iovs_len, + nwritten); + if (uvwasi == NULL || iovs == NULL || nwritten == NULL) return UVWASI_EINVAL; @@ -1295,6 +1449,13 @@ uvwasi_errno_t uvwasi_path_create_directory(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_path_create_directory(uvwasi=%p, fd=%d, path='%s', " + "path_len=%zu)\n", + uvwasi, + fd, + path, + path_len); + if (uvwasi == NULL || path == NULL) return UVWASI_EINVAL; @@ -1337,6 +1498,15 @@ uvwasi_errno_t uvwasi_path_filestat_get(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_path_filestat_get(uvwasi=%p, fd=%d, flags=%d, path='%s', " + "path_len=%zu, buf=%p)\n", + uvwasi, + fd, + flags, + path, + path_len, + buf); + if (uvwasi == NULL || path == NULL || buf == NULL) return UVWASI_EINVAL; @@ -1388,6 +1558,17 @@ uvwasi_errno_t uvwasi_path_filestat_set_times(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_path_filestat_set_times(uvwasi=%p, fd=%d, flags=%d, path='%s', " + "path_len=%zu, st_atim=%"PRIu64", st_mtim=%"PRIu64", fst_flags=%d)\n", + uvwasi, + fd, + flags, + path, + path_len, + st_atim, + st_mtim, + fst_flags); + if (uvwasi == NULL || path == NULL) return UVWASI_EINVAL; @@ -1445,6 +1626,17 @@ uvwasi_errno_t uvwasi_path_link(uvwasi_t* uvwasi, uv_fs_t req; int r; + DEBUG("uvwasi_path_link(uvwasi=%p, old_fd=%d, old_flags=%d, old_path='%s', " + "old_path_len=%zu, new_fd=%d, new_path='%s', new_path_len=%zu)\n", + uvwasi, + old_fd, + old_flags, + old_path, + old_path_len, + new_fd, + new_path, + new_path_len); + if (uvwasi == NULL || old_path == NULL || new_path == NULL) return UVWASI_EINVAL; @@ -1542,6 +1734,20 @@ uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi, int write; int r; + DEBUG("uvwasi_path_open(uvwasi=%p, dirfd=%d, dirflags=%d, path='%s', " + "path_len=%zu, o_flags=%d, fs_rights_base=%"PRIu64", " + "fs_rights_inheriting=%"PRIu64", fs_flags=%d, fd=%p)\n", + uvwasi, + dirfd, + dirflags, + path, + path_len, + o_flags, + fs_rights_base, + fs_rights_inheriting, + fs_flags, + fd); + if (uvwasi == NULL || path == NULL || fd == NULL) return UVWASI_EINVAL; @@ -1671,6 +1877,16 @@ uvwasi_errno_t uvwasi_path_readlink(uvwasi_t* uvwasi, size_t len; int r; + DEBUG("uvwasi_path_readlink(uvwasi=%p, fd=%d, path='%s', path_len=%zu, " + "buf=%p, buf_len=%zu, bufused=%p)\n", + uvwasi, + fd, + path, + path_len, + buf, + buf_len, + bufused); + if (uvwasi == NULL || path == NULL || buf == NULL || bufused == NULL) return UVWASI_EINVAL; @@ -1719,6 +1935,13 @@ uvwasi_errno_t uvwasi_path_remove_directory(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_path_remove_directory(uvwasi=%p, fd=%d, path='%s', " + "path_len=%zu)\n", + uvwasi, + fd, + path, + path_len); + if (uvwasi == NULL || path == NULL) return UVWASI_EINVAL; @@ -1762,6 +1985,16 @@ uvwasi_errno_t uvwasi_path_rename(uvwasi_t* uvwasi, uv_fs_t req; int r; + DEBUG("uvwasi_path_rename(uvwasi=%p, old_fd=%d, old_path='%s', " + "old_path_len=%zu, new_fd=%d, new_path='%s', new_path_len=%zu)\n", + uvwasi, + old_fd, + old_path, + old_path_len, + new_fd, + new_path, + new_path_len); + if (uvwasi == NULL || old_path == NULL || new_path == NULL) return UVWASI_EINVAL; @@ -1847,6 +2080,15 @@ uvwasi_errno_t uvwasi_path_symlink(uvwasi_t* uvwasi, uv_fs_t req; int r; + DEBUG("uvwasi_path_symlink(uvwasi=%p, old_path='%s', old_path_len=%zu, " + "fd=%d, new_path='%s', new_path_len=%zu)\n", + uvwasi, + old_path, + old_path_len, + fd, + new_path, + new_path_len); + if (uvwasi == NULL || old_path == NULL || new_path == NULL) return UVWASI_EINVAL; @@ -1890,6 +2132,12 @@ uvwasi_errno_t uvwasi_path_unlink_file(uvwasi_t* uvwasi, uvwasi_errno_t err; int r; + DEBUG("uvwasi_path_unlink_file(uvwasi=%p, fd=%d, path='%s', path_len=%zu)\n", + uvwasi, + fd, + path, + path_len); + if (uvwasi == NULL || path == NULL) return UVWASI_EINVAL; @@ -1923,12 +2171,21 @@ uvwasi_errno_t uvwasi_poll_oneoff(uvwasi_t* uvwasi, uvwasi_event_t* out, size_t nsubscriptions, size_t* nevents) { + DEBUG("uvwasi_poll_oneoff(uvwasi=%p, in=%p, out=%p, nsubscriptions=%zu, " + "nevents=%p)\n", + uvwasi, + in, + out, + nsubscriptions, + nevents); + /* TODO(cjihrig): Implement this. */ return UVWASI_ENOTSUP; } uvwasi_errno_t uvwasi_proc_exit(uvwasi_t* uvwasi, uvwasi_exitcode_t rval) { + DEBUG("uvwasi_proc_exit(uvwasi=%p, rval=%d)\n", uvwasi, rval); exit(rval); return UVWASI_ESUCCESS; /* This doesn't happen. */ } @@ -1937,6 +2194,8 @@ uvwasi_errno_t uvwasi_proc_exit(uvwasi_t* uvwasi, uvwasi_exitcode_t rval) { uvwasi_errno_t uvwasi_proc_raise(uvwasi_t* uvwasi, uvwasi_signal_t sig) { int r; + DEBUG("uvwasi_proc_raise(uvwasi=%p, sig=%d)\n", uvwasi, sig); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -1955,6 +2214,11 @@ uvwasi_errno_t uvwasi_proc_raise(uvwasi_t* uvwasi, uvwasi_signal_t sig) { uvwasi_errno_t uvwasi_random_get(uvwasi_t* uvwasi, void* buf, size_t buf_len) { int r; + DEBUG("uvwasi_random_get(uvwasi=%p, buf=%p, buf_len=%zu)\n", + uvwasi, + buf, + buf_len); + if (uvwasi == NULL || buf == NULL) return UVWASI_EINVAL; @@ -1967,6 +2231,8 @@ uvwasi_errno_t uvwasi_random_get(uvwasi_t* uvwasi, void* buf, size_t buf_len) { uvwasi_errno_t uvwasi_sched_yield(uvwasi_t* uvwasi) { + DEBUG("uvwasi_sched_yield(uvwasi=%p)\n", uvwasi); + if (uvwasi == NULL) return UVWASI_EINVAL; @@ -1990,6 +2256,7 @@ uvwasi_errno_t uvwasi_sock_recv(uvwasi_t* uvwasi, uvwasi_roflags_t* ro_flags) { /* TODO(cjihrig): Waiting to implement, pending https://github.com/WebAssembly/WASI/issues/4 */ + DEBUG("uvwasi_sock_recv(uvwasi=%p, unimplemented)\n", uvwasi); return UVWASI_ENOTSUP; } @@ -2002,6 +2269,7 @@ uvwasi_errno_t uvwasi_sock_send(uvwasi_t* uvwasi, size_t* so_datalen) { /* TODO(cjihrig): Waiting to implement, pending https://github.com/WebAssembly/WASI/issues/4 */ + DEBUG("uvwasi_sock_send(uvwasi=%p, unimplemented)\n", uvwasi); return UVWASI_ENOTSUP; } @@ -2011,6 +2279,7 @@ uvwasi_errno_t uvwasi_sock_shutdown(uvwasi_t* uvwasi, uvwasi_sdflags_t how) { /* TODO(cjihrig): Waiting to implement, pending https://github.com/WebAssembly/WASI/issues/4 */ + DEBUG("uvwasi_sock_shutdown(uvwasi=%p, unimplemented)\n", uvwasi); return UVWASI_ENOTSUP; }