summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/nxt_application.h2
-rw-r--r--src/nxt_conf_validation.c16
-rw-r--r--src/nxt_main_process.c5
-rw-r--r--src/wasm/nxt_rt_wasmtime.c5
-rw-r--r--src/wasm/nxt_wasm.c40
-rw-r--r--src/wasm/nxt_wasm.h2
6 files changed, 69 insertions, 1 deletions
diff --git a/src/nxt_application.h b/src/nxt_application.h
index ff3ec562..64866db6 100644
--- a/src/nxt_application.h
+++ b/src/nxt_application.h
@@ -99,6 +99,8 @@ typedef struct {
const char *request_init_handler;
const char *request_end_handler;
const char *response_end_handler;
+
+ nxt_conf_value_t *access;
} nxt_wasm_app_conf_t;
diff --git a/src/nxt_conf_validation.c b/src/nxt_conf_validation.c
index 0603c98d..f00b28b8 100644
--- a/src/nxt_conf_validation.c
+++ b/src/nxt_conf_validation.c
@@ -252,6 +252,7 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_python_target_members[];
static nxt_conf_vldt_object_t nxt_conf_vldt_php_common_members[];
static nxt_conf_vldt_object_t nxt_conf_vldt_php_options_members[];
static nxt_conf_vldt_object_t nxt_conf_vldt_php_target_members[];
+static nxt_conf_vldt_object_t nxt_conf_vldt_wasm_access_members[];
static nxt_conf_vldt_object_t nxt_conf_vldt_common_members[];
static nxt_conf_vldt_object_t nxt_conf_vldt_app_limits_members[];
static nxt_conf_vldt_object_t nxt_conf_vldt_app_processes_members[];
@@ -1081,12 +1082,27 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_wasm_members[] = {
}, {
.name = nxt_string("response_end_handler"),
.type = NXT_CONF_VLDT_STRING,
+ }, {
+ .name = nxt_string("access"),
+ .type = NXT_CONF_VLDT_OBJECT,
+ .validator = nxt_conf_vldt_object,
+ .u.members = nxt_conf_vldt_wasm_access_members,
},
NXT_CONF_VLDT_NEXT(nxt_conf_vldt_common_members)
};
+static nxt_conf_vldt_object_t nxt_conf_vldt_wasm_access_members[] = {
+ {
+ .name = nxt_string("filesystem"),
+ .type = NXT_CONF_VLDT_ARRAY,
+ },
+
+ NXT_CONF_VLDT_END
+};
+
+
static nxt_conf_vldt_object_t nxt_conf_vldt_common_members[] = {
{
.name = nxt_string("type"),
diff --git a/src/nxt_main_process.c b/src/nxt_main_process.c
index b7a93341..6622f67e 100644
--- a/src/nxt_main_process.c
+++ b/src/nxt_main_process.c
@@ -369,6 +369,11 @@ static nxt_conf_map_t nxt_wasm_app_conf[] = {
NXT_CONF_MAP_CSTRZ,
offsetof(nxt_common_app_conf_t, u.wasm.response_end_handler),
},
+ {
+ nxt_string("access"),
+ NXT_CONF_MAP_PTR,
+ offsetof(nxt_common_app_conf_t, u.wasm.access),
+ },
};
diff --git a/src/wasm/nxt_rt_wasmtime.c b/src/wasm/nxt_rt_wasmtime.c
index 07a6165a..99786b89 100644
--- a/src/wasm/nxt_rt_wasmtime.c
+++ b/src/wasm/nxt_rt_wasmtime.c
@@ -247,6 +247,7 @@ nxt_wasmtime_get_function_exports(nxt_wasm_ctx_t *ctx)
static int
nxt_wasmtime_wasi_init(const nxt_wasm_ctx_t *ctx)
{
+ char **dir;
wasi_config_t *wasi_config;
wasmtime_error_t *error;
nxt_wasmtime_ctx_t *rt_ctx = &nxt_wasmtime_ctx;
@@ -258,6 +259,10 @@ nxt_wasmtime_wasi_init(const nxt_wasm_ctx_t *ctx)
wasi_config_inherit_stdout(wasi_config);
wasi_config_inherit_stderr(wasi_config);
+ for (dir = ctx->dirs; dir != NULL && *dir != NULL; dir++) {
+ wasi_config_preopen_dir(wasi_config, *dir, *dir);
+ }
+
error = wasmtime_context_set_wasi(rt_ctx->ctx, wasi_config);
if (error != NULL) {
nxt_wasmtime_err_msg(error, NULL, "failed to instantiate WASI");
diff --git a/src/wasm/nxt_wasm.c b/src/wasm/nxt_wasm.c
index d96668ad..45a40b4b 100644
--- a/src/wasm/nxt_wasm.c
+++ b/src/wasm/nxt_wasm.c
@@ -204,6 +204,15 @@ nxt_wasm_start(nxt_task_t *task, nxt_process_data_t *data)
nxt_unit_done(unit_ctx);
NXT_WASM_DO_HOOK(NXT_WASM_FH_MODULE_END);
+ if (nxt_wasm_ctx.dirs != NULL) {
+ char **p;
+
+ for (p = nxt_wasm_ctx.dirs; *p != NULL; p++) {
+ nxt_free(*p);
+ }
+ nxt_free(nxt_wasm_ctx.dirs);
+ }
+
nxt_wops->destroy(&nxt_wasm_ctx);
exit(EXIT_SUCCESS);
@@ -214,9 +223,11 @@ static nxt_int_t
nxt_wasm_setup(nxt_task_t *task, nxt_process_t *process,
nxt_common_app_conf_t *conf)
{
- int err;
+ int n, i, err;
+ nxt_conf_value_t *dirs = NULL;
nxt_wasm_app_conf_t *c;
nxt_wasm_func_handler_t *fh;
+ static nxt_str_t filesystem_str = nxt_string("filesystem");
c = &conf->u.wasm;
@@ -237,6 +248,33 @@ nxt_wasm_setup(nxt_task_t *task, nxt_process_t *process,
fh[NXT_WASM_FH_REQUEST_END].func_name = c->request_end_handler;
fh[NXT_WASM_FH_RESPONSE_END].func_name = c->response_end_handler;
+ /* Get any directories to pass through to the WASM module */
+ if (c->access != NULL) {
+ dirs = nxt_conf_get_object_member(c->access, &filesystem_str, NULL);
+ }
+
+ n = (dirs != NULL) ? nxt_conf_object_members_count(dirs) : 0;
+ if (n == 0) {
+ goto out_init;
+ }
+
+ nxt_wasm_ctx.dirs = nxt_zalloc((n + 1) * sizeof(char *));
+ if (nxt_slow_path(nxt_wasm_ctx.dirs == NULL)) {
+ return NXT_ERROR;
+ }
+
+ for (i = 0; i < n; i++) {
+ nxt_str_t str;
+ nxt_conf_value_t *value;
+
+ value = nxt_conf_get_array_element(dirs, i);
+ nxt_conf_get_string(value, &str);
+
+ nxt_wasm_ctx.dirs[i] = nxt_zalloc(str.length + 1);
+ memcpy(nxt_wasm_ctx.dirs[i], str.start, str.length);
+ }
+
+out_init:
err = nxt_wops->init(&nxt_wasm_ctx);
if (err) {
exit(EXIT_FAILURE);
diff --git a/src/wasm/nxt_wasm.h b/src/wasm/nxt_wasm.h
index 9e18f931..cb9dbdfe 100644
--- a/src/wasm/nxt_wasm.h
+++ b/src/wasm/nxt_wasm.h
@@ -110,6 +110,8 @@ struct nxt_wasm_ctx_s {
nxt_wasm_func_handler_t fh[NXT_WASM_FH_NR];
+ char **dirs;
+
nxt_unit_request_info_t *req;
uint8_t *baddr;