os: fix os.execute for command output that contains 0 bytes
parent
4b42dcad8e
commit
20d63de136
|
@ -343,16 +343,19 @@ pub fn execute(cmd string) Result {
|
||||||
output: 'exec("$cmd") failed'
|
output: 'exec("$cmd") failed'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fd := fileno(f)
|
||||||
buf := unsafe { malloc_noscan(4096) }
|
buf := unsafe { malloc_noscan(4096) }
|
||||||
mut res := strings.new_builder(1024)
|
mut res := strings.new_builder(1024)
|
||||||
defer {
|
defer {
|
||||||
unsafe { res.free() }
|
unsafe { res.free() }
|
||||||
}
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
bufbp := buf
|
for {
|
||||||
for C.fgets(&char(bufbp), 4096, f) != 0 {
|
len := C.read(fd, buf, 4096)
|
||||||
buflen := vstrlen(bufbp)
|
if len == 0 {
|
||||||
res.write_ptr(bufbp, buflen)
|
break
|
||||||
|
}
|
||||||
|
res.write_ptr(buf, len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
soutput := res.str()
|
soutput := res.str()
|
||||||
|
|
|
@ -841,3 +841,20 @@ fn test_expand_tilde_to_home() {
|
||||||
assert home_test == home_expansion_test
|
assert home_test == home_expansion_test
|
||||||
assert os.expand_tilde_to_home('~') == os.home_dir()
|
assert os.expand_tilde_to_home('~') == os.home_dir()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_execute() {
|
||||||
|
$if !linux {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// The output of the next command contains a 0 byte in the middle.
|
||||||
|
// Nevertheless, the execute function *should* return a string that
|
||||||
|
// contains it:
|
||||||
|
result := os.execute('printenv --null LANGUAGE LANG')
|
||||||
|
hexresult := result.output.bytes().hex()
|
||||||
|
println(result.exit_code)
|
||||||
|
println(result.output.len)
|
||||||
|
println(hexresult)
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert result.output.len > 0
|
||||||
|
assert hexresult.contains('00')
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue