std.posix.getenv
github
revision
std.posix.getenv()
with bug
for (std.os.environ) |ptr| {
var line_i: usize = 0;
while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}
const this_key = ptr[0..line_i];
if (!mem.eql(u8, key, this_key)) continue;
return mem.sliceTo(ptr + line_i + 1, 0);
}
return null;
std.posix.getenv()
with fix
for (std.os.environ) |ptr| {
var line_i: usize = 0;
while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}
const this_key = ptr[0..line_i];
if (!mem.eql(u8, key, this_key)) continue;
// key = "THE_KEY";
// std.os.environ = "THE_KEY\0deadbeef\0"
// return mem.sliceTo(ptr + if( ptr[line_i]=='=') 1 else 0, 0);
return if( ptr[line_i] == '=' )
mem.sliceTo(ptr + line_i + 1, 0)
else
ptr[line_i..line_i]
;
}
return null;
test
test.zig
const zero_slice = [1]u8 { 0 };
// thought '\0' was an escape sequence.. hmm
var trigger = ( "THE_KEY" ++ zero_slice ++ "deadbeef" ).*;
test "env key empty" {
var trigger_environ = [_][*:0]u8 { &trigger };
// override and set back
const tmp = std.os.environ;
std.os.environ = &trigger_environ;
defer { std.os.environ = tmp; }
const val = std.posix.getenv( "THE_KEY" ) orelse return error.fail;
try std.testing.expectEqualSlices( u8, "", val );
}