diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-11-16 17:14:08 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-11-16 17:14:08 +0000 |
commit | be31d2ad781efa4e1d134ef18ef1ec5d9848572f (patch) | |
tree | 0fb595150307a59bb6eede7abdec41049b5b4e1a /lib/System/Unix/Path.cpp | |
parent | 0033baf94e049e075f3ba4700c109779e2d7c131 (diff) |
* Use low-level unix I/O interface since we're on Unix.
* Don't use variable length arrays (replaced with alloca)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17901 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix/Path.cpp')
-rw-r--r-- | lib/System/Unix/Path.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp index 55ef6669ee..70cc4f0103 100644 --- a/lib/System/Unix/Path.cpp +++ b/lib/System/Unix/Path.cpp @@ -17,6 +17,7 @@ //===----------------------------------------------------------------------===// #include <llvm/Config/config.h> +#include <llvm/Config/alloca.h> #include "Unix.h" #include <sys/stat.h> #include <fcntl.h> @@ -157,20 +158,29 @@ Path::getBasename() const { bool Path::hasMagicNumber(const std::string &Magic) const { size_t len = Magic.size(); - char buf[ 1 + len]; - std::ifstream f(path.c_str()); - f.read(buf, len); + assert(len < 1024 && "Request for magic string too long"); + char* buf = (char*) alloca(1 + len); + int fd = ::open(path.c_str(),O_RDONLY); + if (fd < 0) + return false; + if (0 != ::read(fd, buf, len)) + return false; + close(fd); buf[len] = '\0'; - f.close(); return Magic == buf; } bool Path::getMagicNumber(std::string& Magic, unsigned len) const { if (!isFile()) return false; - char buf[1 + len]; - std::ifstream f(path.c_str()); - f.read(buf,len); + assert(len < 1024 && "Request for magic string too long"); + char* buf = (char*) alloca(1 + len); + int fd = ::open(path.c_str(),O_RDONLY); + if (fd < 0) + return false; + if (0 != ::read(fd, buf, len)) + return false; + close(fd); buf[len] = '\0'; Magic = buf; return true; |