authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-30 19:52:20-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2019-04-30 19:52:20-04:00
log79a139ac633bc7f80f97d6be6f7f78a7aafa156b
tree0948047fb50ea3f63fc51f3568df80e043dfb42c
parent9dfd24a3345c83c9cd32d45bef3076bb94bc0eaa
parent0a693b70e4f31a4e4dc28e86f66a93acc09ed910
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #2390 from shritesh/wasi_env

wasi: add getEnvMap

2 files changed, 35 insertions(+), 2 deletions(-)

std/os.zig+32-1
...@@ -756,6 +756,37 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap {...@@ -756,6 +756,37 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap {
756756
757 try result.setMove(key, value);757 try result.setMove(key, value);
758 }758 }
759 } else if (builtin.os == Os.wasi) {
760 var environ_count: usize = undefined;
761 var environ_buf_size: usize = undefined;
762
763 const environ_sizes_get_ret = std.os.wasi.environ_sizes_get(&environ_count, &environ_buf_size);
764 if (environ_sizes_get_ret != os.wasi.ESUCCESS) {
765 return unexpectedErrorPosix(environ_sizes_get_ret);
766 }
767
768 // TODO: Verify that the documentation is incorrect
769 // https://github.com/WebAssembly/WASI/issues/27
770 var environ = try allocator.alloc(?[*]u8, environ_count + 1);
771 defer allocator.free(environ);
772 var environ_buf = try std.heap.wasm_allocator.alloc(u8, environ_buf_size);
773 defer allocator.free(environ_buf);
774
775 const environ_get_ret = std.os.wasi.environ_get(environ.ptr, environ_buf.ptr);
776 if (environ_get_ret != os.wasi.ESUCCESS) {
777 return unexpectedErrorPosix(environ_get_ret);
778 }
779
780 for (environ) |env| {
781 if (env) |ptr| {
782 const pair = mem.toSlice(u8, ptr);
783 var parts = mem.separate(pair, "=");
784 const key = parts.next().?;
785 const value = parts.next().?;
786 try result.set(key, value);
787 }
788 }
789 return result;
759 } else {790 } else {
760 for (posix_environ_raw) |ptr| {791 for (posix_environ_raw) |ptr| {
761 var line_i: usize = 0;792 var line_i: usize = 0;
...@@ -2190,7 +2221,7 @@ pub fn argsAlloc(allocator: *mem.Allocator) ![]const []u8 {...@@ -2190,7 +2221,7 @@ pub fn argsAlloc(allocator: *mem.Allocator) ![]const []u8 {
2190 }2221 }
21912222
2192 var result_slice = try allocator.alloc([]u8, count);2223 var result_slice = try allocator.alloc([]u8, count);
2193 2224
2194 var i: usize = 0;2225 var i: usize = 0;
2195 while (i < count) : (i += 1) {2226 while (i < count) : (i += 1) {
2196 result_slice[i] = mem.toSlice(u8, argv[i]);2227 result_slice[i] = mem.toSlice(u8, argv[i]);
std/os/wasi/core.zig+3-1
...@@ -13,8 +13,10 @@ pub const SIGABRT: signal_t = 6;...@@ -13,8 +13,10 @@ pub const SIGABRT: signal_t = 6;
13pub extern "wasi_unstable" fn args_get(argv: [*][*]u8, argv_buf: [*]u8) errno_t;13pub extern "wasi_unstable" fn args_get(argv: [*][*]u8, argv_buf: [*]u8) errno_t;
14pub extern "wasi_unstable" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t;14pub extern "wasi_unstable" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t;
1515
16pub extern "wasi_unstable" fn proc_raise(sig: signal_t) errno_t;16pub extern "wasi_unstable" fn environ_get(environ: [*]?[*]u8, environ_buf: [*]u8) errno_t;
17pub extern "wasi_unstable" fn environ_sizes_get(environ_count: *usize, environ_buf_size: *usize) errno_t;
1718
19pub extern "wasi_unstable" fn proc_raise(sig: signal_t) errno_t;
18pub extern "wasi_unstable" fn proc_exit(rval: exitcode_t) noreturn;20pub extern "wasi_unstable" fn proc_exit(rval: exitcode_t) noreturn;
1921
20pub extern "wasi_unstable" fn fd_write(fd: fd_t, iovs: *const ciovec_t, iovs_len: usize, nwritten: *usize) errno_t;22pub extern "wasi_unstable" fn fd_write(fd: fd_t, iovs: *const ciovec_t, iovs_len: usize, nwritten: *usize) errno_t;