mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
Fixed an issue where errorCode was always 0 when startProcess did… (#23992)
…n't use the `poEvalCommand` flag https://forum.nim-lang.org/t/12310 Added a test case, tested on my fedora system.
This commit is contained in:
@@ -1123,14 +1123,13 @@ elif not defined(useNimRtl):
|
||||
var error: cint
|
||||
let sizeRead = read(data.pErrorPipe[readIdx], addr error, sizeof(error))
|
||||
if sizeRead == sizeof(error):
|
||||
raiseOSError(osLastError(),
|
||||
raiseOSError(OSErrorCode(error),
|
||||
"Could not find command: '" & $data.sysCommand & "'. OS error: " & $strerror(error))
|
||||
|
||||
return pid
|
||||
|
||||
{.push stacktrace: off, profiler: off.}
|
||||
proc startProcessFail(data: ptr StartProcessData) =
|
||||
var error: cint = errno
|
||||
proc startProcessFail(data: ptr StartProcessData, error: cint = errno) =
|
||||
discard write(data.pErrorPipe[writeIdx], addr error, sizeof(error))
|
||||
exitnow(1)
|
||||
|
||||
@@ -1167,7 +1166,11 @@ elif not defined(useNimRtl):
|
||||
if (poUsePath in data.options):
|
||||
when defined(uClibc) or defined(linux) or defined(haiku):
|
||||
# uClibc environment (OpenWrt included) doesn't have the full execvpe
|
||||
let exe = findExe(data.sysCommand)
|
||||
var exe: string
|
||||
try:
|
||||
exe = findExe(data.sysCommand)
|
||||
except OSError as e:
|
||||
startProcessFail(data, e.errorCode)
|
||||
discard execve(exe.cstring, data.sysArgs, data.sysEnv)
|
||||
else:
|
||||
# MacOSX doesn't have execvpe, so we need workaround.
|
||||
|
||||
18
tests/osproc/tnoexe.nim
Normal file
18
tests/osproc/tnoexe.nim
Normal file
@@ -0,0 +1,18 @@
|
||||
discard """
|
||||
output: '''true
|
||||
true'''
|
||||
"""
|
||||
|
||||
import std/osproc
|
||||
|
||||
const command = "lsaaa -lah"
|
||||
|
||||
try:
|
||||
let process = startProcess(command, options = {poUsePath})
|
||||
discard process.waitForExit()
|
||||
except OSError as e:
|
||||
echo e.errorCode != 0
|
||||
|
||||
let process = startProcess(command, options = {poUsePath, poEvalCommand})
|
||||
let exitCode = process.waitForExit()
|
||||
echo exitCode != 0
|
||||
Reference in New Issue
Block a user