From 9195f37c5f16ad59f3b4acb27ac3731715dd42c6 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Tue, 9 Nov 2004 20:26:31 +0000 Subject: * Implement getStatusInfo for getting stat(2) like information * Implement createTemporaryFile for mkstemp(3) functionality * Fix isBytecodeFile to accept llvc magic # (compressed) as bytecode. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17654 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/System/Unix/Path.cpp | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'lib/System/Unix/Path.cpp') diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp index 4f4d347f09..c3c6775968 100644 --- a/lib/System/Unix/Path.cpp +++ b/lib/System/Unix/Path.cpp @@ -164,10 +164,13 @@ bool Path::hasMagicNumber(const std::string &Magic) const { bool Path::isBytecodeFile() const { - if (readable()) { - return hasMagicNumber("llvm"); - } - return false; + char buffer[ 4]; + buffer[0] = 0; + std::ifstream f(path.c_str()); + f.read(buffer, 4); + if (f.bad()) + ThrowErrno("can't read file signature"); + return 0 == memcmp(buffer,"llvc",4) || 0 == memcmp(buffer,"llvm",4); } bool @@ -220,6 +223,19 @@ Path::getLast() const { return path.substr(pos+1); } +void +Path::getStatusInfo(StatusInfo& info) const { + struct stat buf; + if (0 != stat(path.c_str(), &buf)) { + ThrowErrno(std::string("Can't get status: ")+path); + } + info.fileSize = buf.st_size; + info.modTime.fromPosixTime(buf.st_mtime); + info.mode = buf.st_mode; + info.user = buf.st_uid; + info.group = buf.st_gid; +} + bool Path::setDirectory(const std::string& a_path) { if (a_path.size() == 0) @@ -379,12 +395,30 @@ Path::createFile() { // Create the file int fd = ::creat(path.c_str(), S_IRUSR | S_IWUSR); if (fd < 0) - ThrowErrno(std::string(path.c_str()) + ": Can't create file"); + ThrowErrno(path + ": Can't create file"); ::close(fd); return true; } +bool +Path::createTemporaryFile() { + // Make sure we're dealing with a file + if (!isFile()) return false; + + // Append the filename filler + char pathname[MAXPATHLEN]; + path.copy(pathname,MAXPATHLEN); + strcat(pathname,"XXXXXX"); + int fd = ::mkstemp(pathname); + if (fd < 0) { + ThrowErrno(path + ": Can't create temporary file"); + } + path = pathname; + ::close(fd); + return true; +} + bool Path::destroyDirectory(bool remove_contents) { // Make sure we're dealing with a directory -- cgit v1.2.3-70-g09d2