diff --git a/README.md b/README.md index b6d1546..bb53afa 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,9 @@ int main(void) { uvwasi_errno_t err; /* Setup the initialization options. */ + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 3; init_options.argv = calloc(3, sizeof(char*)); @@ -38,6 +41,7 @@ int main(void) { init_options.preopens = calloc(1, sizeof(uvwasi_preopen_t)); init_options.preopens[0].mapped_path = "/var"; init_options.preopens[0].real_path = "."; + init_options.allocator = NULL; /* Initialize the sandbox. */ err = uvwasi_init(&uvwasi, &init_options); @@ -146,6 +150,10 @@ typedef struct uvwasi_options_s { size_t argc; char** argv; char** envp; + uvwasi_fd_t in; + uvwasi_fd_t out; + uvwasi_fd_t err; + const uvwasi_mem_t* allocator; } uvwasi_options_t; ``` diff --git a/include/fd_table.h b/include/fd_table.h index fa8a44e..f29b1ad 100644 --- a/include/fd_table.h +++ b/include/fd_table.h @@ -6,6 +6,7 @@ #include "wasi_types.h" struct uvwasi_s; +struct uvwasi_options_s; struct uvwasi_fd_wrap_t { uvwasi_fd_t id; @@ -27,8 +28,7 @@ struct uvwasi_fd_table_t { }; uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_s* uvwasi, - struct uvwasi_fd_table_t* table, - uint32_t init_size); + struct uvwasi_options_s* options); void uvwasi_fd_table_free(struct uvwasi_s* uvwasi, struct uvwasi_fd_table_t* table); uvwasi_errno_t uvwasi_fd_table_insert(struct uvwasi_s* uvwasi, diff --git a/include/uvwasi.h b/include/uvwasi.h index 9ca3045..4aa15e7 100644 --- a/include/uvwasi.h +++ b/include/uvwasi.h @@ -60,6 +60,9 @@ typedef struct uvwasi_options_s { size_t argc; char** argv; char** envp; + uvwasi_fd_t in; + uvwasi_fd_t out; + uvwasi_fd_t err; const uvwasi_mem_t* allocator; } uvwasi_options_t; diff --git a/src/fd_table.c b/src/fd_table.c index f77858a..f6e530d 100644 --- a/src/fd_table.c +++ b/src/fd_table.c @@ -14,6 +14,46 @@ #include "uvwasi_alloc.h" +static uvwasi_errno_t uvwasi__insert_stdio(uvwasi_t* uvwasi, + struct uvwasi_fd_table_t* table, + const uvwasi_fd_t fd, + const uvwasi_fd_t expected, + const char* name) { + struct uvwasi_fd_wrap_t* wrap; + uvwasi_filetype_t type; + uvwasi_rights_t base; + uvwasi_rights_t inheriting; + uvwasi_errno_t err; + + err = uvwasi__get_filetype_by_fd(fd, &type); + if (err != UVWASI_ESUCCESS) + return err; + + err = uvwasi__get_rights(fd, UV_FS_O_RDWR, type, &base, &inheriting); + if (err != UVWASI_ESUCCESS) + return err; + + err = uvwasi_fd_table_insert(uvwasi, + table, + fd, + name, + name, + type, + base, + inheriting, + 0, + &wrap); + if (err != UVWASI_ESUCCESS) + return err; + + if (wrap->id != expected) + err = UVWASI_EBADF; + + uv_mutex_unlock(&wrap->mutex); + return err; +} + + uvwasi_errno_t uvwasi_fd_table_insert(uvwasi_t* uvwasi, struct uvwasi_fd_table_t* table, uv_file fd, @@ -117,25 +157,21 @@ uvwasi_errno_t uvwasi_fd_table_insert(uvwasi_t* uvwasi, uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi, - struct uvwasi_fd_table_t* table, - uint32_t init_size) { - struct uvwasi_fd_wrap_t* wrap; - uvwasi_filetype_t type; - uvwasi_rights_t base; - uvwasi_rights_t inheriting; + uvwasi_options_t* options) { + struct uvwasi_fd_table_t* table; uvwasi_errno_t err; - int i; int r; /* Require an initial size of at least three to store the stdio FDs. */ - if (table == NULL || init_size < 3) + if (uvwasi == NULL || options == NULL || options->fd_table_size < 3) return UVWASI_EINVAL; + table = &uvwasi->fds; table->fds = NULL; table->used = 0; - table->size = init_size; + table->size = options->fd_table_size; table->fds = uvwasi__calloc(uvwasi, - init_size, + options->fd_table_size, sizeof(struct uvwasi_fd_wrap_t*)); if (table->fds == NULL) @@ -154,35 +190,17 @@ uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi, } /* Create the stdio FDs. */ - for (i = 0; i < 3; ++i) { - err = uvwasi__get_filetype_by_fd(i, &type); - if (err != UVWASI_ESUCCESS) - goto error_exit; - - err = uvwasi__get_rights(i, UV_FS_O_RDWR, type, &base, &inheriting); - if (err != UVWASI_ESUCCESS) - goto error_exit; - - err = uvwasi_fd_table_insert(uvwasi, - table, - i, - "", - "", - type, - base, - inheriting, - 0, - &wrap); - if (err != UVWASI_ESUCCESS) - goto error_exit; - - r = (int) wrap->id != i || wrap->id != (uvwasi_fd_t) wrap->fd; - uv_mutex_unlock(&wrap->mutex); - if (r) { - err = UVWASI_EBADF; - goto error_exit; - } - } + err = uvwasi__insert_stdio(uvwasi, table, options->in, 0, ""); + if (err != UVWASI_ESUCCESS) + goto error_exit; + + err = uvwasi__insert_stdio(uvwasi, table, options->out, 1, ""); + if (err != UVWASI_ESUCCESS) + goto error_exit; + + err = uvwasi__insert_stdio(uvwasi, table, options->err, 2, ""); + if (err != UVWASI_ESUCCESS) + goto error_exit; return UVWASI_ESUCCESS; error_exit: diff --git a/src/uvwasi.c b/src/uvwasi.c index d0f24a0..c80fc77 100644 --- a/src/uvwasi.c +++ b/src/uvwasi.c @@ -574,7 +574,7 @@ uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options) { } } - err = uvwasi_fd_table_init(uvwasi, &uvwasi->fds, options->fd_table_size); + err = uvwasi_fd_table_init(uvwasi, options); if (err != UVWASI_ESUCCESS) goto exit; diff --git a/test/test-args-get.c b/test/test-args-get.c index 79ec30b..6973975 100644 --- a/test/test-args-get.c +++ b/test/test-args-get.c @@ -12,6 +12,9 @@ int main(void) { char** args_get_argv; char* buf; + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 3; init_options.argv = calloc(3, sizeof(char*)); diff --git a/test/test-basic-file-io.c b/test/test-basic-file-io.c index 45c3b17..492408c 100644 --- a/test/test-basic-file-io.c +++ b/test/test-basic-file-io.c @@ -29,6 +29,9 @@ int main(void) { uv_fs_req_cleanup(&req); assert(r == 0 || r == UV_EEXIST); + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL; diff --git a/test/test-ebadf-input-validation.c b/test/test-ebadf-input-validation.c index 46f7d0a..31662da 100644 --- a/test/test-ebadf-input-validation.c +++ b/test/test-ebadf-input-validation.c @@ -22,6 +22,9 @@ int main(void) { test_void = (void*) &test_fdstat; + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL; diff --git a/test/test-environ-get.c b/test/test-environ-get.c index b235226..aa7cc23 100644 --- a/test/test-environ-get.c +++ b/test/test-environ-get.c @@ -20,6 +20,9 @@ int main(void) { char* buf; size_t i; + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL; diff --git a/test/test-fd-prestat-dir-name.c b/test/test-fd-prestat-dir-name.c index 783484d..800f4a8 100644 --- a/test/test-fd-prestat-dir-name.c +++ b/test/test-fd-prestat-dir-name.c @@ -19,6 +19,9 @@ int main(void) { uv_fs_req_cleanup(&req); assert(r == 0 || r == UV_EEXIST); + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL; diff --git a/test/test-multiple-wasi-destroys.c b/test/test-multiple-wasi-destroys.c index b762f90..b1ad17b 100644 --- a/test/test-multiple-wasi-destroys.c +++ b/test/test-multiple-wasi-destroys.c @@ -8,6 +8,9 @@ int main(void) { uvwasi_options_t init_options; uvwasi_errno_t err; + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL; diff --git a/test/test-path-create-remove-directory.c b/test/test-path-create-remove-directory.c index 83a731d..b59114a 100644 --- a/test/test-path-create-remove-directory.c +++ b/test/test-path-create-remove-directory.c @@ -21,6 +21,9 @@ int main(void) { uv_fs_req_cleanup(&req); assert(r == 0 || r == UV_ENOENT); + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL; diff --git a/test/test-random-get.c b/test/test-random-get.c index 13cc6e8..5bfd14f 100644 --- a/test/test-random-get.c +++ b/test/test-random-get.c @@ -13,6 +13,9 @@ int main(void) { int success; int i; + init_options.in = 0; + init_options.out = 1; + init_options.err = 2; init_options.fd_table_size = 3; init_options.argc = 0; init_options.argv = NULL;