Merge remote-tracking branch 'origin/master' into swift-4.0-branch
diff --git a/include/llbuild/Basic/PlatformUtility.h b/include/llbuild/Basic/PlatformUtility.h index 2415007..c2453d1 100644 --- a/include/llbuild/Basic/PlatformUtility.h +++ b/include/llbuild/Basic/PlatformUtility.h
@@ -19,27 +19,19 @@ #define LLBUILD_BASIC_PLATFORMUTILITY_H #include <cstdio> -#include <sys/stat.h> namespace llbuild { namespace basic { namespace sys { -#if defined(_WIN32) -using StatStruct = struct ::_stat; -#else -using StatStruct = struct ::stat; -#endif bool chdir(const char *fileName); int close(int fileHandle); -int lstat(const char *fileName, StatStruct *buf); bool mkdir(const char *fileName); int pclose(FILE *stream); int pipe(int ptHandles[2]); FILE *popen(const char *command, const char *mode); int read(int fileHandle, void *destinationBuffer, unsigned int maxCharCount); int rmdir(const char *path); -int stat(const char *fileName, StatStruct *buf); int symlink(const char *source, const char *target); int unlink(const char *fileName); int write(int fileHandle, void *destinationBuffer, unsigned int maxCharCount);
diff --git a/include/llbuild/Basic/Stat.h b/include/llbuild/Basic/Stat.h new file mode 100644 index 0000000..7d79e38 --- /dev/null +++ b/include/llbuild/Basic/Stat.h
@@ -0,0 +1,77 @@ +//===- Stat.h -------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See http://swift.org/LICENSE.txt for license information +// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +#ifndef LLBUILD_BASIC_STAT_H +#define LLBUILD_BASIC_STAT_H + +#include <sys/stat.h> + +#include "llvm/Support/FileSystem.h" + +namespace llbuild { +namespace basic { +namespace sys { + +#if !defined(S_IFBLK) +#define S_IFBLK 0060000 +#endif +#if !defined(S_IFIFO) +#define S_IFIFO 0010000 +#endif +#if !defined(S_IFSOCK) +#define S_IFSOCK 00140000 +#endif +#if !defined(S_IFLNK) +#define S_IFLNK 0120000 +#endif + +#if !defined(S_ISREG) +#define S_ISREG(mode) ((mode) & _S_IFMT) == S_IFREG +#endif + +#if !defined(S_ISDIR) +#define S_ISDIR(mode) ((mode) & _S_IFMT) == S_IFDIR +#endif + +#if !defined(S_ISBLK) +#define S_ISBLK(mode) ((mode) & _S_IFMT) == S_IFBLK +#endif + +#if !defined(S_ISCHR) +#define S_ISCHR(mode) ((mode) & _S_IFMT) == S_IFCHR +#endif + +#if !defined(S_ISFIFO) +#define S_ISFIFO(mode) ((mode) & _S_IFMT) == S_IFIFO +#endif + +#if !defined(S_ISSOCK) +#define S_ISSOCK(mode) ((mode) & _S_IFMT) == S_IFSOCK +#endif + +#if !defined(S_ISLNK) +#define S_ISLNK(mode) ((mode) & _S_IFMT) == S_IFLNK +#endif + +#if defined(_WIN32) +using StatStruct = struct ::_stat; +#else +using StatStruct = struct ::stat; +#endif + +int lstat(const char *fileName, StatStruct *buf); +int stat(const char *fileName, StatStruct *buf); +} +} +} + +#endif // LLBUILD_BASIC_STAT_H
diff --git a/lib/Basic/FileInfo.cpp b/lib/Basic/FileInfo.cpp index 7e7d7dd..ec76640 100644 --- a/lib/Basic/FileInfo.cpp +++ b/lib/Basic/FileInfo.cpp
@@ -12,7 +12,7 @@ #include "llbuild/Basic/FileInfo.h" -#include "llbuild/Basic/PlatformUtility.h" +#include "llbuild/Basic/Stat.h" #include <cassert> #include <cstring>
diff --git a/lib/Basic/FileSystem.cpp b/lib/Basic/FileSystem.cpp index 42db497..010348f 100644 --- a/lib/Basic/FileSystem.cpp +++ b/lib/Basic/FileSystem.cpp
@@ -12,6 +12,7 @@ #include "llbuild/Basic/FileSystem.h" #include "llbuild/Basic/PlatformUtility.h" +#include "llbuild/Basic/Stat.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/FileSystem.h" @@ -27,7 +28,7 @@ using namespace llvm; using namespace llvm::sys::fs; - static std::error_code fillStatus(int StatRet, const struct stat &Status, + static std::error_code fillStatus(int StatRet, const llbuild::basic::sys::StatStruct &Status, file_status &Result) { if (StatRet != 0) { std::error_code ec(errno, std::generic_category()); @@ -55,10 +56,14 @@ else if (S_ISLNK(Status.st_mode)) Type = file_type::symlink_file; +#if defined(_WIN32) + Result = file_status(Type); +#else perms Perms = static_cast<perms>(Status.st_mode); Result = file_status(Type, Perms, Status.st_dev, Status.st_ino, Status.st_mtime, Status.st_uid, Status.st_gid, Status.st_size); +#endif return std::error_code(); } @@ -67,8 +72,8 @@ SmallString<128> PathStorage; StringRef P = Path.toNullTerminatedStringRef(PathStorage); - struct stat Status; - int StatRet = ::lstat(P.begin(), &Status); + llbuild::basic::sys::StatStruct Status; + int StatRet = llbuild::basic::sys::lstat(P.begin(), &Status); return fillStatus(StatRet, Status, Result); } @@ -167,7 +172,7 @@ } // Check if `path` is a directory. - struct stat statbuf; + llbuild::basic::sys::StatStruct statbuf; if (llbuild::basic::sys::lstat(path.c_str(), &statbuf) != 0) { return false; }
diff --git a/lib/Basic/PlatformUtility.cpp b/lib/Basic/PlatformUtility.cpp index 2498e96..0ef78b9 100644 --- a/lib/Basic/PlatformUtility.cpp +++ b/lib/Basic/PlatformUtility.cpp
@@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llbuild/Basic/PlatformUtility.h" +#include "llbuild/Basic/Stat.h" #if defined(_WIN32) #include "LeanWindows.h"
diff --git a/unittests/Basic/FileSystemTest.cpp b/unittests/Basic/FileSystemTest.cpp index 65182b6..31c94aa 100644 --- a/unittests/Basic/FileSystemTest.cpp +++ b/unittests/Basic/FileSystemTest.cpp
@@ -15,6 +15,7 @@ #include "llbuild/Basic/FileSystem.h" #include "llbuild/Basic/LLVM.h" #include "llbuild/Basic/PlatformUtility.h" +#include "llbuild/Basic/Stat.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" @@ -94,7 +95,7 @@ bool result = fs->remove(tempDir.c_str()); EXPECT_TRUE(result); - struct stat statbuf; + sys::StatStruct statbuf; EXPECT_EQ(-1, sys::stat(tempDir.c_str(), &statbuf)); EXPECT_EQ(ENOENT, errno); } @@ -144,7 +145,7 @@ bool result = fs->remove(tempDir.c_str()); EXPECT_TRUE(result); - struct stat statbuf; + sys::StatStruct statbuf; EXPECT_EQ(-1, sys::stat(tempDir.c_str(), &statbuf)); EXPECT_EQ(ENOENT, errno); // Verify that the symlink target still exists.