typedef int errno_t;
#endif
+#ifdef _MSC_VER
+# pragma comment(lib, "advapi32.lib") // This provides CryptAcquireContextW.
+#endif
+
using namespace llvm;
namespace {
return ret != MAX_PATH ? pathname : "";
}
+UniqueID file_status::getUniqueID() const {
+ // The file is uniquely identified by the volume serial number along
+ // with the 64-bit file identifier.
+ uint64_t FileID = (static_cast<uint64_t>(FileIndexHigh) << 32ULL) |
+ static_cast<uint64_t>(FileIndexLow);
+
+ return UniqueID(VolumeSerialNumber, FileID);
+}
TimeValue file_status::getLastModificationTime() const {
ULARGE_INTEGER UI;
}
cur_path.set_size(len);
- // cur_path now holds the current directory in utf-16. Convert to utf-8.
-
- // Find out how much space we need. Sadly, this function doesn't return the
- // size needed unless you tell it the result size is 0, which means you
- // _always_ have to call it twice.
- len = ::WideCharToMultiByte(CP_UTF8, 0,
- cur_path.data(), cur_path.size(),
- result.data(), 0,
- NULL, NULL);
-
- if (len == 0)
- return make_error_code(windows_error(::GetLastError()));
-
- result.reserve(len);
- result.set_size(len);
- // Now do the actual conversion.
- len = ::WideCharToMultiByte(CP_UTF8, 0,
- cur_path.data(), cur_path.size(),
- result.data(), result.size(),
- NULL, NULL);
- if (len == 0)
- return windows_error(::GetLastError());
-
- return error_code::success();
+ return UTF16ToUTF8(cur_path.begin(), cur_path.size(), result);
}
error_code create_directory(const Twine &path, bool &existed) {
SmallVector<wchar_t, 128> path_utf16;
file_status st;
- if (error_code ec = status(path, st))
- return ec;
+ error_code EC = status(path, st);
+ if (EC) {
+ if (EC == windows_error::file_not_found ||
+ EC == windows_error::path_not_found) {
+ existed = false;
+ return error_code::success();
+ }
+ return EC;
+ }
if (error_code ec = UTF8ToUTF16(path.toStringRef(path_storage),
path_utf16))
return error_code::success();
}
-error_code getUniqueID(const Twine Path, uint64_t &Result) {
- file_status Status;
- if (error_code E = status(Path, Status))
- return E;
-
- // The file is uniquely identified by the volume serial number along
- // with the 64-bit file identifier.
- Result = (static_cast<uint64_t>(Status.FileIndexHigh) << 32ULL) |
- static_cast<uint64_t>(Status.FileIndexLow);
-
- // Because the serial number is 32-bits, but we've already used up all 64
- // bits for the file index, XOR the serial number into the high 32 bits of
- // the resulting value. We could potentially get collisons from this, but
- // the likelihood is low.
- Result ^= (static_cast<uint64_t>(Status.VolumeSerialNumber) << 32ULL);
-
- return error_code::success();
-}
-
static bool isReservedName(StringRef path) {
// This list of reserved names comes from MSDN, at:
// http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx
if (!::GetFileInformationByHandle(FileHandle, &Info))
goto handle_status_error;
- Result = file_status(
- file_type::regular_file, Info.ftLastWriteTime.dwHighDateTime,
- Info.ftLastWriteTime.dwLowDateTime, Info.dwVolumeSerialNumber,
- Info.nFileSizeHigh, Info.nFileSizeLow, Info.nFileIndexHigh,
- Info.nFileIndexLow);
- return error_code::success();
+ {
+ file_type Type = (Info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ ? file_type::directory_file
+ : file_type::regular_file;
+ Result =
+ file_status(Type, Info.ftLastWriteTime.dwHighDateTime,
+ Info.ftLastWriteTime.dwLowDateTime,
+ Info.dwVolumeSerialNumber, Info.nFileSizeHigh,
+ Info.nFileSizeLow, Info.nFileIndexHigh, Info.nFileIndexLow);
+ return error_code::success();
+ }
handle_status_error:
error_code EC = windows_error(::GetLastError());
Result = file_status(file_type::file_not_found);
else if (EC == windows_error::sharing_violation)
Result = file_status(file_type::type_unknown);
- else {
+ else
Result = file_status(file_type::status_error);
- return EC;
- }
- return error_code::success();
+ return EC;
}
error_code status(const Twine &path, file_status &result) {
return getStatus(INVALID_HANDLE_VALUE, result);
}
- if (attr & FILE_ATTRIBUTE_DIRECTORY)
- result = file_status(file_type::directory_file);
- else {
- ScopedFileHandle h(
- ::CreateFileW(path_utf16.begin(),
- 0, // Attributes only.
+ ScopedFileHandle h(
+ ::CreateFileW(path_utf16.begin(), 0, // Attributes only.
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS,
- 0));
+ NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0));
if (!h)
return getStatus(INVALID_HANDLE_VALUE, result);
- BY_HANDLE_FILE_INFORMATION Info;
- if (!::GetFileInformationByHandle(h, &Info))
- return getStatus(INVALID_HANDLE_VALUE, result);
return getStatus(h, result);
- }
- return error_code::success();
}
error_code status(int FD, file_status &Result) {
mapmode mode,
uint64_t length,
uint64_t offset,
- error_code &ec)
+ error_code &ec)
: Mode(mode)
, Size(length)
, Mapping()
return error_code::success();
}
-error_code map_file_pages(const Twine &path, off_t file_offset, size_t size,
+error_code map_file_pages(const Twine &path, off_t file_offset, size_t size,
bool map_writable, void *&result) {
assert(0 && "NOT IMPLEMENTED");
return windows_error::invalid_function;
DWORD CreationDisposition;
if (Flags & F_Excl)
CreationDisposition = CREATE_NEW;
- else if (Flags & F_Append)
+ else if (Flags & F_Append)
CreationDisposition = OPEN_ALWAYS;
else
CreationDisposition = CREATE_ALWAYS;