Skip to content

Commit

Permalink
nim-lang#12389: Check working directory for getAppFilename() (nim-lan…
Browse files Browse the repository at this point in the history
…g#12390)

* Check working directory for exe
* Expand symlinks
* Use expandFilename() to expand symlinks
* Move OpenBSD code to getApplOpenBsd()
  • Loading branch information
euantorano authored and alehander92 committed Dec 2, 2019
1 parent 1943f4f commit fbc5f2d
Showing 1 changed file with 48 additions and 4 deletions.
52 changes: 48 additions & 4 deletions lib/pure/os.nim
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,18 @@
## import os
##
## let myFile = "/path/to/my/file.nim"
##
##
## let pathSplit = splitPath(myFile)
## assert pathSplit.head == "/path/to/my"
## assert pathSplit.tail == "file.nim"
##
##
## assert parentDir(myFile) == "/path/to/my"
##
##
## let fileSplit = splitFile(myFile)
## assert fileSplit.dir == "/path/to/my"
## assert fileSplit.name == "file"
## assert fileSplit.ext == ".nim"
##
##
## assert myFile.changeFileExt("c") == "/path/to/my/file.c"

##
Expand Down Expand Up @@ -2726,6 +2726,47 @@ when not weirdTarget and (defined(linux) or defined(solaris) or defined(bsd) or
len = readlink(procPath, result, len)
setLen(result, len)

when defined(openbsd):
proc isExecutable(path: string): bool =
let p = getFilePermissions(path)
result = fpUserExec in p and fpGroupExec in p and fpOthersExec in p

proc getApplOpenBsd(): string =
# similar to getApplHeuristic, but checks current working directory
when declared(paramStr):
result = ""

# POSIX guaranties that this contains the executable
# as it has been executed by the calling process
let exePath = string(paramStr(0))

if len(exePath) == 0:
return ""

if exePath[0] == DirSep:
# path is absolute
result = exePath
else:
# not an absolute path, check if it's relative to the current working directory
for i in 1..<len(exePath):
if exePath[i] == DirSep:
result = joinPath(getCurrentDir(), exePath)
break

if len(result) > 0:
if isExecutable(result):
return expandFilename(result)

return ""

# search in path
for p in split(string(getEnv("PATH")), {PathSep}):
var x = joinPath(p, exePath)
if existsFile(x) and isExecutable(x):
return expandFilename(x)
else:
result = ""

when not (defined(windows) or defined(macosx) or weirdTarget):
proc getApplHeuristic(): string =
when declared(paramStr):
Expand Down Expand Up @@ -2829,6 +2870,9 @@ proc getAppFilename*(): string {.rtl, extern: "nos$1", tags: [ReadIOEffect], noN
result = getApplFreebsd()
elif defined(haiku):
result = getApplHaiku()
elif defined(openbsd):
result = getApplOpenBsd()

# little heuristic that may work on other POSIX-like systems:
if result.len == 0:
result = getApplHeuristic()
Expand Down

0 comments on commit fbc5f2d

Please sign in to comment.