diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-11-09 20:26:31 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-11-09 20:26:31 +0000 |
commit | 9195f37c5f16ad59f3b4acb27ac3731715dd42c6 (patch) | |
tree | 66ee4bf725fffd6579cfeada0c8722c1213246ea /lib/System/Unix/Path.cpp | |
parent | 31391b6792e6c129b7dcb3ce290a21890699287e (diff) |
* 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
Diffstat (limited to 'lib/System/Unix/Path.cpp')
-rw-r--r-- | lib/System/Unix/Path.cpp | 44 |
1 files changed, 39 insertions, 5 deletions
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,13 +395,31 @@ 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 if (!isDirectory()) return false; |