authorgravatar for shritesh@shritesh.comShritesh Bhattarai <shritesh@shritesh.com> 2019-04-30 18:18:20-05:00
committergravatar for shritesh@shritesh.comShritesh Bhattarai <shritesh@shritesh.com> 2019-04-30 18:18:20-05:00
log20458f56d84cd588afd924564177293a7fea46c0
tree91c7c747c0098b5ff84a117f578af5629c6e6968
parent8e700bf92ac1ecdd1529b98b07d84154913bfb87

wasi: add getEnvMap


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

std/os.zig+39-1
......@@ -756,6 +756,44 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap {
756756
757757 try result.setMove(key, value);
758758 }
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 var line_i: usize = 0;
783 while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}
784 if (ptr[line_i] != '=') {
785 return error.Unexpected;
786 }
787 const key = ptr[0..line_i];
788
789 var end_i: usize = line_i;
790 while (ptr[end_i] != 0) : (end_i += 1) {}
791 const value = ptr[line_i + 1 .. end_i];
792
793 try result.set(key, value);
794 }
795 }
796 return result;
759797 } else {
760798 for (posix_environ_raw) |ptr| {
761799 var line_i: usize = 0;
......@@ -2190,7 +2228,7 @@ pub fn argsAlloc(allocator: *mem.Allocator) ![]const []u8 {
21902228 }
21912229
21922230 var result_slice = try allocator.alloc([]u8, count);
2193
2231
21942232 var i: usize = 0;
21952233 while (i < count) : (i += 1) {
21962234 result_slice[i] = mem.toSlice(u8, argv[i]);
std/os/wasi/core.zig+1-1
......@@ -13,7 +13,7 @@ pub const SIGABRT: signal_t = 6;
1313pub extern "wasi_unstable" fn args_get(argv: [*][*]u8, argv_buf: [*]u8) errno_t;
1414pub extern "wasi_unstable" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t;
1515
16pub extern "wasi_unstable" fn environ_get(environ: [*][*]u8, environ_buf: [*]u8) errno_t;
16pub extern "wasi_unstable" fn environ_get(environ: [*]?[*]u8, environ_buf: [*]u8) errno_t;
1717pub extern "wasi_unstable" fn environ_sizes_get(environ_count: *usize, environ_buf_size: *usize) errno_t;
1818
1919pub extern "wasi_unstable" fn proc_raise(sig: signal_t) errno_t;