* Use low-level unix I/O interface since we're on Unix.
authorReid Spencer <rspencer@reidspencer.com>
Tue, 16 Nov 2004 17:14:08 +0000 (17:14 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Tue, 16 Nov 2004 17:14:08 +0000 (17:14 +0000)
* 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

lib/System/Unix/Path.cpp
lib/System/Unix/Path.inc

index 55ef6669ee35075b47766bc375433d3624e12ea2..70cc4f01032f2253e502ecc98a7120718f87c7c9 100644 (file)
@@ -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;
index 55ef6669ee35075b47766bc375433d3624e12ea2..70cc4f01032f2253e502ecc98a7120718f87c7c9 100644 (file)
@@ -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;