From 8e700bf92ac1ecdd1529b98b07d84154913bfb87 Mon Sep 17 00:00:00 2001 From: Shritesh Bhattarai Date: Tue, 30 Apr 2019 16:35:27 -0500 Subject: [PATCH 1/3] wasi: import environ_get and environ_sizes_get --- std/os/wasi/core.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/std/os/wasi/core.zig b/std/os/wasi/core.zig index dc24218dfc5e..2bdd96fcdb91 100644 --- a/std/os/wasi/core.zig +++ b/std/os/wasi/core.zig @@ -13,8 +13,10 @@ pub const SIGABRT: signal_t = 6; pub extern "wasi_unstable" fn args_get(argv: [*][*]u8, argv_buf: [*]u8) errno_t; pub extern "wasi_unstable" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t; -pub extern "wasi_unstable" fn proc_raise(sig: signal_t) errno_t; +pub extern "wasi_unstable" fn environ_get(environ: [*][*]u8, environ_buf: [*]u8) errno_t; +pub extern "wasi_unstable" fn environ_sizes_get(environ_count: *usize, environ_buf_size: *usize) errno_t; +pub extern "wasi_unstable" fn proc_raise(sig: signal_t) errno_t; pub extern "wasi_unstable" fn proc_exit(rval: exitcode_t) noreturn; pub extern "wasi_unstable" fn fd_write(fd: fd_t, iovs: *const ciovec_t, iovs_len: usize, nwritten: *usize) errno_t; From 20458f56d84cd588afd924564177293a7fea46c0 Mon Sep 17 00:00:00 2001 From: Shritesh Bhattarai Date: Tue, 30 Apr 2019 18:18:20 -0500 Subject: [PATCH 2/3] wasi: add getEnvMap --- std/os.zig | 40 +++++++++++++++++++++++++++++++++++++++- std/os/wasi/core.zig | 2 +- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/std/os.zig b/std/os.zig index 139bc5b09d64..b7e8e0e96c30 100644 --- a/std/os.zig +++ b/std/os.zig @@ -756,6 +756,44 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap { try result.setMove(key, value); } + } else if (builtin.os == Os.wasi) { + var environ_count: usize = undefined; + var environ_buf_size: usize = undefined; + + const environ_sizes_get_ret = std.os.wasi.environ_sizes_get(&environ_count, &environ_buf_size); + if (environ_sizes_get_ret != os.wasi.ESUCCESS) { + return unexpectedErrorPosix(environ_sizes_get_ret); + } + + // TODO: Verify that the documentation is incorrect + // https://github.com/WebAssembly/WASI/issues/27 + var environ = try allocator.alloc(?[*]u8, environ_count + 1); + defer allocator.free(environ); + var environ_buf = try std.heap.wasm_allocator.alloc(u8, environ_buf_size); + defer allocator.free(environ_buf); + + const environ_get_ret = std.os.wasi.environ_get(environ.ptr, environ_buf.ptr); + if (environ_get_ret != os.wasi.ESUCCESS) { + return unexpectedErrorPosix(environ_get_ret); + } + + for (environ) |env| { + if (env) |ptr| { + var line_i: usize = 0; + while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {} + if (ptr[line_i] != '=') { + return error.Unexpected; + } + const key = ptr[0..line_i]; + + var end_i: usize = line_i; + while (ptr[end_i] != 0) : (end_i += 1) {} + const value = ptr[line_i + 1 .. end_i]; + + try result.set(key, value); + } + } + return result; } else { for (posix_environ_raw) |ptr| { var line_i: usize = 0; @@ -2190,7 +2228,7 @@ pub fn argsAlloc(allocator: *mem.Allocator) ![]const []u8 { } var result_slice = try allocator.alloc([]u8, count); - + var i: usize = 0; while (i < count) : (i += 1) { result_slice[i] = mem.toSlice(u8, argv[i]); diff --git a/std/os/wasi/core.zig b/std/os/wasi/core.zig index 2bdd96fcdb91..534fcc17efc7 100644 --- a/std/os/wasi/core.zig +++ b/std/os/wasi/core.zig @@ -13,7 +13,7 @@ pub const SIGABRT: signal_t = 6; pub extern "wasi_unstable" fn args_get(argv: [*][*]u8, argv_buf: [*]u8) errno_t; pub extern "wasi_unstable" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t; -pub extern "wasi_unstable" fn environ_get(environ: [*][*]u8, environ_buf: [*]u8) errno_t; +pub extern "wasi_unstable" fn environ_get(environ: [*]?[*]u8, environ_buf: [*]u8) errno_t; pub extern "wasi_unstable" fn environ_sizes_get(environ_count: *usize, environ_buf_size: *usize) errno_t; pub extern "wasi_unstable" fn proc_raise(sig: signal_t) errno_t; From 0a693b70e4f31a4e4dc28e86f66a93acc09ed910 Mon Sep 17 00:00:00 2001 From: Shritesh Bhattarai Date: Tue, 30 Apr 2019 18:43:43 -0500 Subject: [PATCH 3/3] wasi: use mem.separate instead --- std/os.zig | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/std/os.zig b/std/os.zig index b7e8e0e96c30..c55597f13552 100644 --- a/std/os.zig +++ b/std/os.zig @@ -779,17 +779,10 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap { for (environ) |env| { if (env) |ptr| { - var line_i: usize = 0; - while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {} - if (ptr[line_i] != '=') { - return error.Unexpected; - } - const key = ptr[0..line_i]; - - var end_i: usize = line_i; - while (ptr[end_i] != 0) : (end_i += 1) {} - const value = ptr[line_i + 1 .. end_i]; - + const pair = mem.toSlice(u8, ptr); + var parts = mem.separate(pair, "="); + const key = parts.next().?; + const value = parts.next().?; try result.set(key, value); } }