1 #ifndef __UVWASI_H__ 2 #define __UVWASI_H__ 3 4 #ifdef __cplusplus 5 extern "C" { 6 #endif 7 8 #include "uv.h" 9 #include "wasi_serdes.h" 10 #include "wasi_types.h" 11 12 #define UVWASI_VERSION_MAJOR 0 13 #define UVWASI_VERSION_MINOR 0 14 #define UVWASI_VERSION_PATCH 19 15 #define UVWASI_VERSION_HEX ((UVWASI_VERSION_MAJOR << 16) | \ 16 (UVWASI_VERSION_MINOR << 8) | \ 17 (UVWASI_VERSION_PATCH)) 18 #define UVWASI_STRINGIFY(v) UVWASI_STRINGIFY_HELPER(v) 19 #define UVWASI_STRINGIFY_HELPER(v) #v 20 #define UVWASI_VERSION_STRING UVWASI_STRINGIFY(UVWASI_VERSION_MAJOR) "." \ 21 UVWASI_STRINGIFY(UVWASI_VERSION_MINOR) "." \ 22 UVWASI_STRINGIFY(UVWASI_VERSION_PATCH) 23 #define UVWASI_VERSION_WASI "snapshot_1" 24 25 typedef void* (*uvwasi_malloc)(size_t size, void* mem_user_data); 26 typedef void (*uvwasi_free)(void* ptr, void* mem_user_data); 27 typedef void* (*uvwasi_calloc)(size_t nmemb, size_t size, void* mem_user_data); 28 typedef void* (*uvwasi_realloc)(void* ptr, size_t size, void* mem_user_data); 29 30 typedef struct uvwasi_mem_s { 31 void* mem_user_data; 32 uvwasi_malloc malloc; 33 uvwasi_free free; 34 uvwasi_calloc calloc; 35 uvwasi_realloc realloc; 36 } uvwasi_mem_t; 37 38 struct uvwasi_fd_table_t; 39 40 typedef struct uvwasi_s { 41 struct uvwasi_fd_table_t* fds; 42 uvwasi_size_t argc; 43 char** argv; 44 char* argv_buf; 45 uvwasi_size_t argv_buf_size; 46 uvwasi_size_t envc; 47 char** env; 48 char* env_buf; 49 uvwasi_size_t env_buf_size; 50 const uvwasi_mem_t* allocator; 51 uv_loop_t* loop; 52 } uvwasi_t; 53 54 typedef struct uvwasi_preopen_s { 55 const char* mapped_path; 56 const char* real_path; 57 } uvwasi_preopen_t; 58 59 typedef struct uvwasi_preopen_socket_s { 60 const char* address; 61 int port; 62 } uvwasi_preopen_socket_t; 63 64 typedef struct uvwasi_options_s { 65 uvwasi_size_t fd_table_size; 66 uvwasi_size_t preopenc; 67 uvwasi_preopen_t* preopens; 68 uvwasi_size_t preopen_socketc; 69 uvwasi_preopen_socket_t* preopen_sockets; 70 uvwasi_size_t argc; 71 const char** argv; 72 const char** envp; 73 uvwasi_fd_t in; 74 uvwasi_fd_t out; 75 uvwasi_fd_t err; 76 const uvwasi_mem_t* allocator; 77 } uvwasi_options_t; 78 79 /* Embedder API. */ 80 uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, const uvwasi_options_t* options); 81 void uvwasi_destroy(uvwasi_t* uvwasi); 82 void uvwasi_options_init(uvwasi_options_t* options); 83 /* Use int instead of uv_file to avoid needing uv.h */ 84 uvwasi_errno_t uvwasi_embedder_remap_fd(uvwasi_t* uvwasi, 85 const uvwasi_fd_t fd, 86 int new_host_fd); 87 const char* uvwasi_embedder_err_code_to_string(uvwasi_errno_t code); 88 89 90 /* WASI system call API. */ 91 uvwasi_errno_t uvwasi_args_get(uvwasi_t* uvwasi, char** argv, char* argv_buf); 92 uvwasi_errno_t uvwasi_args_sizes_get(uvwasi_t* uvwasi, 93 uvwasi_size_t* argc, 94 uvwasi_size_t* argv_buf_size); 95 uvwasi_errno_t uvwasi_clock_res_get(uvwasi_t* uvwasi, 96 uvwasi_clockid_t clock_id, 97 uvwasi_timestamp_t* resolution); 98 uvwasi_errno_t uvwasi_clock_time_get(uvwasi_t* uvwasi, 99 uvwasi_clockid_t clock_id, 100 uvwasi_timestamp_t precision, 101 uvwasi_timestamp_t* time); 102 uvwasi_errno_t uvwasi_environ_get(uvwasi_t* uvwasi, 103 char** environment, 104 char* environ_buf); 105 uvwasi_errno_t uvwasi_environ_sizes_get(uvwasi_t* uvwasi, 106 uvwasi_size_t* environ_count, 107 uvwasi_size_t* environ_buf_size); 108 uvwasi_errno_t uvwasi_fd_advise(uvwasi_t* uvwasi, 109 uvwasi_fd_t fd, 110 uvwasi_filesize_t offset, 111 uvwasi_filesize_t len, 112 uvwasi_advice_t advice); 113 uvwasi_errno_t uvwasi_fd_allocate(uvwasi_t* uvwasi, 114 uvwasi_fd_t fd, 115 uvwasi_filesize_t offset, 116 uvwasi_filesize_t len); 117 uvwasi_errno_t uvwasi_fd_close(uvwasi_t* uvwasi, uvwasi_fd_t fd); 118 uvwasi_errno_t uvwasi_fd_datasync(uvwasi_t* uvwasi, uvwasi_fd_t fd); 119 uvwasi_errno_t uvwasi_fd_fdstat_get(uvwasi_t* uvwasi, 120 uvwasi_fd_t fd, 121 uvwasi_fdstat_t* buf); 122 uvwasi_errno_t uvwasi_fd_fdstat_set_flags(uvwasi_t* uvwasi, 123 uvwasi_fd_t fd, 124 uvwasi_fdflags_t flags); 125 uvwasi_errno_t uvwasi_fd_fdstat_set_rights(uvwasi_t* uvwasi, 126 uvwasi_fd_t fd, 127 uvwasi_rights_t fs_rights_base, 128 uvwasi_rights_t fs_rights_inheriting 129 ); 130 uvwasi_errno_t uvwasi_fd_filestat_get(uvwasi_t* uvwasi, 131 uvwasi_fd_t fd, 132 uvwasi_filestat_t* buf); 133 uvwasi_errno_t uvwasi_fd_filestat_set_size(uvwasi_t* uvwasi, 134 uvwasi_fd_t fd, 135 uvwasi_filesize_t st_size); 136 uvwasi_errno_t uvwasi_fd_filestat_set_times(uvwasi_t* uvwasi, 137 uvwasi_fd_t fd, 138 uvwasi_timestamp_t st_atim, 139 uvwasi_timestamp_t st_mtim, 140 uvwasi_fstflags_t fst_flags); 141 uvwasi_errno_t uvwasi_fd_pread(uvwasi_t* uvwasi, 142 uvwasi_fd_t fd, 143 const uvwasi_iovec_t* iovs, 144 uvwasi_size_t iovs_len, 145 uvwasi_filesize_t offset, 146 uvwasi_size_t* nread); 147 uvwasi_errno_t uvwasi_fd_prestat_get(uvwasi_t* uvwasi, 148 uvwasi_fd_t fd, 149 uvwasi_prestat_t* buf); 150 uvwasi_errno_t uvwasi_fd_prestat_dir_name(uvwasi_t* uvwasi, 151 uvwasi_fd_t fd, 152 char* path, 153 uvwasi_size_t path_len); 154 uvwasi_errno_t uvwasi_fd_pwrite(uvwasi_t* uvwasi, 155 uvwasi_fd_t fd, 156 const uvwasi_ciovec_t* iovs, 157 uvwasi_size_t iovs_len, 158 uvwasi_filesize_t offset, 159 uvwasi_size_t* nwritten); 160 uvwasi_errno_t uvwasi_fd_read(uvwasi_t* uvwasi, 161 uvwasi_fd_t fd, 162 const uvwasi_iovec_t* iovs, 163 uvwasi_size_t iovs_len, 164 uvwasi_size_t* nread); 165 uvwasi_errno_t uvwasi_fd_readdir(uvwasi_t* uvwasi, 166 uvwasi_fd_t fd, 167 void* buf, 168 uvwasi_size_t buf_len, 169 uvwasi_dircookie_t cookie, 170 uvwasi_size_t* bufused); 171 uvwasi_errno_t uvwasi_fd_renumber(uvwasi_t* uvwasi, 172 uvwasi_fd_t from, 173 uvwasi_fd_t to); 174 uvwasi_errno_t uvwasi_fd_seek(uvwasi_t* uvwasi, 175 uvwasi_fd_t fd, 176 uvwasi_filedelta_t offset, 177 uvwasi_whence_t whence, 178 uvwasi_filesize_t* newoffset); 179 uvwasi_errno_t uvwasi_fd_sync(uvwasi_t* uvwasi, uvwasi_fd_t fd); 180 uvwasi_errno_t uvwasi_fd_tell(uvwasi_t* uvwasi, 181 uvwasi_fd_t fd, 182 uvwasi_filesize_t* offset); 183 uvwasi_errno_t uvwasi_fd_write(uvwasi_t* uvwasi, 184 uvwasi_fd_t fd, 185 const uvwasi_ciovec_t* iovs, 186 uvwasi_size_t iovs_len, 187 uvwasi_size_t* nwritten); 188 uvwasi_errno_t uvwasi_path_create_directory(uvwasi_t* uvwasi, 189 uvwasi_fd_t fd, 190 const char* path, 191 uvwasi_size_t path_len); 192 uvwasi_errno_t uvwasi_path_filestat_get(uvwasi_t* uvwasi, 193 uvwasi_fd_t fd, 194 uvwasi_lookupflags_t flags, 195 const char* path, 196 uvwasi_size_t path_len, 197 uvwasi_filestat_t* buf); 198 uvwasi_errno_t uvwasi_path_filestat_set_times(uvwasi_t* uvwasi, 199 uvwasi_fd_t fd, 200 uvwasi_lookupflags_t flags, 201 const char* path, 202 uvwasi_size_t path_len, 203 uvwasi_timestamp_t st_atim, 204 uvwasi_timestamp_t st_mtim, 205 uvwasi_fstflags_t fst_flags); 206 uvwasi_errno_t uvwasi_path_link(uvwasi_t* uvwasi, 207 uvwasi_fd_t old_fd, 208 uvwasi_lookupflags_t old_flags, 209 const char* old_path, 210 uvwasi_size_t old_path_len, 211 uvwasi_fd_t new_fd, 212 const char* new_path, 213 uvwasi_size_t new_path_len); 214 uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi, 215 uvwasi_fd_t dirfd, 216 uvwasi_lookupflags_t dirflags, 217 const char* path, 218 uvwasi_size_t path_len, 219 uvwasi_oflags_t o_flags, 220 uvwasi_rights_t fs_rights_base, 221 uvwasi_rights_t fs_rights_inheriting, 222 uvwasi_fdflags_t fs_flags, 223 uvwasi_fd_t* fd); 224 uvwasi_errno_t uvwasi_path_readlink(uvwasi_t* uvwasi, 225 uvwasi_fd_t fd, 226 const char* path, 227 uvwasi_size_t path_len, 228 char* buf, 229 uvwasi_size_t buf_len, 230 uvwasi_size_t* bufused); 231 uvwasi_errno_t uvwasi_path_remove_directory(uvwasi_t* uvwasi, 232 uvwasi_fd_t fd, 233 const char* path, 234 uvwasi_size_t path_len); 235 uvwasi_errno_t uvwasi_path_rename(uvwasi_t* uvwasi, 236 uvwasi_fd_t old_fd, 237 const char* old_path, 238 uvwasi_size_t old_path_len, 239 uvwasi_fd_t new_fd, 240 const char* new_path, 241 uvwasi_size_t new_path_len); 242 uvwasi_errno_t uvwasi_path_symlink(uvwasi_t* uvwasi, 243 const char* old_path, 244 uvwasi_size_t old_path_len, 245 uvwasi_fd_t fd, 246 const char* new_path, 247 uvwasi_size_t new_path_len); 248 uvwasi_errno_t uvwasi_path_unlink_file(uvwasi_t* uvwasi, 249 uvwasi_fd_t fd, 250 const char* path, 251 uvwasi_size_t path_len); 252 uvwasi_errno_t uvwasi_poll_oneoff(uvwasi_t* uvwasi, 253 const uvwasi_subscription_t* in, 254 uvwasi_event_t* out, 255 uvwasi_size_t nsubscriptions, 256 uvwasi_size_t* nevents); 257 uvwasi_errno_t uvwasi_proc_exit(uvwasi_t* uvwasi, uvwasi_exitcode_t rval); 258 uvwasi_errno_t uvwasi_proc_raise(uvwasi_t* uvwasi, uvwasi_signal_t sig); 259 uvwasi_errno_t uvwasi_random_get(uvwasi_t* uvwasi, 260 void* buf, 261 uvwasi_size_t buf_len); 262 uvwasi_errno_t uvwasi_sched_yield(uvwasi_t* uvwasi); 263 uvwasi_errno_t uvwasi_sock_accept(uvwasi_t* uvwasi, 264 uvwasi_fd_t sock, 265 uvwasi_fdflags_t flags, 266 uvwasi_fd_t* fd); 267 uvwasi_errno_t uvwasi_sock_recv(uvwasi_t* uvwasi, 268 uvwasi_fd_t sock, 269 const uvwasi_iovec_t* ri_data, 270 uvwasi_size_t ri_data_len, 271 uvwasi_riflags_t ri_flags, 272 uvwasi_size_t* ro_datalen, 273 uvwasi_roflags_t* ro_flags); 274 uvwasi_errno_t uvwasi_sock_send(uvwasi_t* uvwasi, 275 uvwasi_fd_t sock, 276 const uvwasi_ciovec_t* si_data, 277 uvwasi_size_t si_data_len, 278 uvwasi_siflags_t si_flags, 279 uvwasi_size_t* so_datalen); 280 uvwasi_errno_t uvwasi_sock_shutdown(uvwasi_t* uvwasi, 281 uvwasi_fd_t sock, 282 uvwasi_sdflags_t how); 283 284 #ifdef __cplusplus 285 } 286 #endif 287 288 #endif /* __UVWASI_H__ */ 289