aboutsummaryrefslogtreecommitdiff
path: root/std/os.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-04-30 19:52:20 -0400
committerGitHub <noreply@github.com>2019-04-30 19:52:20 -0400
commit79a139ac633bc7f80f97d6be6f7f78a7aafa156b (patch)
tree0948047fb50ea3f63fc51f3568df80e043dfb42c /std/os.zig
parent9dfd24a3345c83c9cd32d45bef3076bb94bc0eaa (diff)
parent0a693b70e4f31a4e4dc28e86f66a93acc09ed910 (diff)
downloadzig-79a139ac633bc7f80f97d6be6f7f78a7aafa156b.tar.gz
zig-79a139ac633bc7f80f97d6be6f7f78a7aafa156b.zip
Merge pull request #2390 from shritesh/wasi_env
wasi: add getEnvMap
Diffstat (limited to 'std/os.zig')
-rw-r--r--std/os.zig33
1 files changed, 32 insertions, 1 deletions
diff --git a/std/os.zig b/std/os.zig
index 139bc5b09d..c55597f135 100644
--- a/std/os.zig
+++ b/std/os.zig
@@ -756,6 +756,37 @@ 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| {
+ const pair = mem.toSlice(u8, ptr);
+ var parts = mem.separate(pair, "=");
+ const key = parts.next().?;
+ const value = parts.next().?;
+ try result.set(key, value);
+ }
+ }
+ return result;
} else {
for (posix_environ_raw) |ptr| {
var line_i: usize = 0;
@@ -2190,7 +2221,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]);