From 14bbfa360cb5e956761ad2ac415c68b421ac28a7 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 11 Mar 2016 17:02:56 +0100 Subject: [PATCH] Don't open directories as files --- lib/system/sysio.nim | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index 78c7b1ca1f..df69b0913b 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -270,12 +270,30 @@ const # we always use binary here as for Nim the OS line ending # should not be translated. +when defined(posix): + type + Mode {.importc: "mode_t", header: "".} = cint + + Stat {.importc: "struct stat", + header: "", final, pure.} = object ## struct stat + st_mode: Mode ## Mode of file + + proc S_ISDIR(m: Mode): bool {.importc, header: "".} + ## Test for a directory. + + proc fstat(a1: cint, a2: var Stat): cint {.importc, header: "".} proc open(f: var File, filename: string, mode: FileMode = fmRead, bufSize: int = -1): bool = var p: pointer = fopen(filename, FormatOpen[mode]) if p != nil: + when defined(posix): + var f2 = cast[File](p) + var res: Stat + if fstat(getFileHandle(f2), res) >= 0'i32 and S_ISDIR(res.st_mode): + close(f2) + return result = true f = cast[File](p) if bufSize > 0 and bufSize <= high(cint).int: