aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/Unix/Path.inc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Support/Unix/Path.inc')
-rw-r--r--lib/Support/Unix/Path.inc51
1 files changed, 48 insertions, 3 deletions
diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc
index ddc1e0f9ce..9857674a0b 100644
--- a/lib/Support/Unix/Path.inc
+++ b/lib/Support/Unix/Path.inc
@@ -133,7 +133,9 @@ Path::GetRootDirectory() {
Path
Path::GetTemporaryDirectory(std::string *ErrMsg) {
-#if defined(HAVE_MKDTEMP)
+#if defined(__native_client__)
+ return Path("");
+#elif defined(HAVE_MKDTEMP)
// The best way is with mkdtemp but that's not available on many systems,
// Linux and FreeBSD have it. Others probably won't.
char pathname[] = "/tmp/llvm_XXXXXX";
@@ -251,6 +253,7 @@ Path::GetUserHomeDirectory() {
Path
Path::GetCurrentDirectory() {
+#if !defined(__native_client__)
char pathname[MAXPATHLEN];
if (!getcwd(pathname, MAXPATHLEN)) {
assert(false && "Could not query current working directory.");
@@ -258,6 +261,9 @@ Path::GetCurrentDirectory() {
}
return Path(pathname);
+#else // (__native_client__)
+ return Path("./");
+#endif // (__native_client__)
}
#if defined(__FreeBSD__) || defined (__NetBSD__) || \
@@ -318,7 +324,9 @@ getprogpath(char ret[PATH_MAX], const char *bin)
/// GetMainExecutable - Return the path to the main executable, given the
/// value of argv[0] from program startup.
Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
-#if defined(__APPLE__)
+#if defined(__native_client__)
+ return Path(std::string("./") + std::string(argv0));
+#elif defined(__APPLE__)
// On OS X the executable path is saved to the stack by dyld. Reading it
// from there is much faster than calling dladdr, especially for large
// binaries with symbols.
@@ -411,7 +419,11 @@ bool Path::getMagicNumber(std::string &Magic, unsigned len) const {
bool
Path::exists() const {
+#if !defined(__native_client__)
return 0 == access(path.c_str(), F_OK );
+#else // (__native_client__)
+ return true;
+#endif // (__native_client__)
}
bool
@@ -424,21 +436,33 @@ Path::isDirectory() const {
bool
Path::isSymLink() const {
+#if defined(__native_client__)
+ return false;
+#else
struct stat buf;
if (0 != lstat(path.c_str(), &buf))
return false;
return S_ISLNK(buf.st_mode);
+#endif
}
bool
Path::canRead() const {
+#if !defined(__native_client__)
return 0 == access(path.c_str(), R_OK);
+#else // (__native_client__)
+ return true;
+#endif // (__native_client__)
}
bool
Path::canWrite() const {
+#if !defined(__native_client__)
return 0 == access(path.c_str(), W_OK);
+#else // (__native_client__)
+ return true;
+#endif // (__native_client__)
}
bool
@@ -457,6 +481,7 @@ Path::isRegularFile() const {
bool
Path::canExecute() const {
+#if !defined(__native_client__)
if (0 != access(path.c_str(), R_OK | X_OK ))
return false;
struct stat buf;
@@ -464,6 +489,7 @@ Path::canExecute() const {
return false;
if (!S_ISREG(buf.st_mode))
return false;
+#endif // (__native_client__)
return true;
}
@@ -511,6 +537,7 @@ PathWithStatus::getFileStatus(bool update, std::string *ErrStr) const {
}
static bool AddPermissionBits(const Path &File, int bits) {
+#if !defined(__native_client__)
// Get the umask value from the operating system. We want to use it
// when changing the file's permissions. Since calling umask() sets
// the umask and returns its old value, we must call it a second
@@ -526,6 +553,7 @@ static bool AddPermissionBits(const Path &File, int bits) {
// that the umask would not disable.
if ((chmod(File.c_str(), (buf.st_mode | (bits & ~mask)))) == -1)
return false;
+#endif // (__native_client__)
return true;
}
@@ -549,6 +577,7 @@ bool Path::makeExecutableOnDisk(std::string* ErrMsg) {
bool
Path::getDirectoryContents(std::set<Path>& result, std::string* ErrMsg) const {
+#if !defined(__native_client__)
DIR* direntries = ::opendir(path.c_str());
if (direntries == 0)
return MakeErrMsg(ErrMsg, path + ": can't open directory");
@@ -574,6 +603,7 @@ Path::getDirectoryContents(std::set<Path>& result, std::string* ErrMsg) const {
}
closedir(direntries);
+#endif
return false;
}
@@ -626,7 +656,7 @@ Path::eraseSuffix() {
}
static bool createDirectoryHelper(char* beg, char* end, bool create_parents) {
-
+#if !defined(__native_client__)
if (access(beg, R_OK | W_OK) == 0)
return false;
@@ -651,6 +681,9 @@ static bool createDirectoryHelper(char* beg, char* end, bool create_parents) {
}
return mkdir(beg, S_IRWXU | S_IRWXG) != 0;
+#else // (__native_client__)
+ return false;
+#endif // (__native_client__)
}
bool
@@ -674,11 +707,13 @@ Path::createDirectoryOnDisk( bool create_parents, std::string* ErrMsg ) {
bool
Path::createFileOnDisk(std::string* ErrMsg) {
+#if !defined(__native_client__)
// Create the file
int fd = ::creat(path.c_str(), S_IRUSR | S_IWUSR);
if (fd < 0)
return MakeErrMsg(ErrMsg, path + ": can't create file");
::close(fd);
+#endif // (__native_client__)
return false;
}
@@ -698,6 +733,7 @@ Path::createTemporaryFileOnDisk(bool reuse_current, std::string* ErrMsg) {
bool
Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const {
+#if !defined(__native_client__)
// Get the status so we can determine if it's a file or directory.
struct stat buf;
if (0 != stat(path.c_str(), &buf)) {
@@ -742,18 +778,26 @@ Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const {
if (rmdir(pathname.c_str()) != 0)
return MakeErrMsg(ErrStr, pathname + ": can't erase directory");
return false;
+#else // (__native_client__)
+ MakeErrMsg(ErrStr, ": PNACL does not know how to erase directories!");
+ return false;
+#endif // (__native_client__)
+
}
bool
Path::renamePathOnDisk(const Path& newName, std::string* ErrMsg) {
+#if !defined(__native_client__)
if (0 != ::rename(path.c_str(), newName.c_str()))
return MakeErrMsg(ErrMsg, std::string("can't rename '") + path + "' as '" +
newName.str() + "'");
+#endif
return false;
}
bool
Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const {
+#if !defined(__native_client__)
struct utimbuf utb;
utb.actime = si.modTime.toPosixTime();
utb.modtime = utb.actime;
@@ -761,6 +805,7 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const {
return MakeErrMsg(ErrStr, path + ": can't set file modification time");
if (0 != ::chmod(path.c_str(),si.mode))
return MakeErrMsg(ErrStr, path + ": can't set mode");
+#endif // (__native_client__)
return false;
}