* #13806 - first call sysctl with a null buffer to get the length, then alloc buffer and call again * Use csize_t rather than csize * Suggestions from @Clyybber Co-authored-by: Euan Torano <euan.torano@bluesky-wireless.co.uk>
This commit is contained in:
parent
5621ff6d09
commit
7abeba6aeb
1 changed files with 16 additions and 16 deletions
|
|
@ -2791,23 +2791,23 @@ when not weirdTarget and (defined(freebsd) or defined(dragonfly)):
|
||||||
const KERN_PROC_PATHNAME = 9
|
const KERN_PROC_PATHNAME = 9
|
||||||
|
|
||||||
proc getApplFreebsd(): string =
|
proc getApplFreebsd(): string =
|
||||||
var pathLength = csize_t(MAX_PATH)
|
var pathLength = csize_t(0)
|
||||||
result = newString(pathLength)
|
|
||||||
var req = [CTL_KERN.cint, KERN_PROC.cint, KERN_PROC_PATHNAME.cint, -1.cint]
|
var req = [CTL_KERN.cint, KERN_PROC.cint, KERN_PROC_PATHNAME.cint, -1.cint]
|
||||||
while true:
|
|
||||||
let res = sysctl(addr req[0], 4, cast[pointer](addr result[0]),
|
# first call to get the required length
|
||||||
addr pathLength, nil, 0)
|
var res = sysctl(addr req[0], 4, nil, addr pathLength, nil, 0)
|
||||||
if res < 0:
|
|
||||||
let err = osLastError()
|
if res < 0:
|
||||||
if err.int32 == ENOMEM:
|
return ""
|
||||||
result = newString(pathLength)
|
|
||||||
else:
|
result.setLen(pathLength)
|
||||||
result.setLen(0) # error!
|
res = sysctl(addr req[0], 4, addr result[0], addr pathLength, nil, 0)
|
||||||
break
|
|
||||||
else:
|
if res < 0:
|
||||||
# trim the trailing null byte, as the result is a string not a cstring
|
return ""
|
||||||
result.setLen(pathLength-1)
|
|
||||||
break
|
let realLen = len(cstring(result))
|
||||||
|
setLen(result, realLen)
|
||||||
|
|
||||||
when not weirdTarget and (defined(linux) or defined(solaris) or defined(bsd) or defined(aix)):
|
when not weirdTarget and (defined(linux) or defined(solaris) or defined(bsd) or defined(aix)):
|
||||||
proc getApplAux(procPath: string): string =
|
proc getApplAux(procPath: string): string =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue