forked from OSchip/llvm-project
parent
4d10587ff3
commit
213c4cb18c
|
@ -73,22 +73,6 @@ private:
|
|||
int v_;
|
||||
};
|
||||
|
||||
/// copy_option - An "enum class" enumeration of copy semantics for copy
|
||||
/// operations.
|
||||
struct copy_option {
|
||||
enum _ {
|
||||
fail_if_exists,
|
||||
overwrite_if_exists
|
||||
};
|
||||
|
||||
copy_option(_ v) : v_(v) {}
|
||||
explicit copy_option(int v) : v_(_(v)) {}
|
||||
operator int() const {return v_;}
|
||||
|
||||
private:
|
||||
int v_;
|
||||
};
|
||||
|
||||
/// space_info - Self explanatory.
|
||||
struct space_info {
|
||||
uint64_t capacity;
|
||||
|
@ -269,18 +253,6 @@ private:
|
|||
/// platform specific error_code.
|
||||
error_code make_absolute(SmallVectorImpl<char> &path);
|
||||
|
||||
/// @brief Copy the file at \a from to the path \a to.
|
||||
///
|
||||
/// @param from The path to copy the file from.
|
||||
/// @param to The path to copy the file to.
|
||||
/// @param copt Behavior if \a to already exists.
|
||||
/// @returns errc::success if the file has been successfully copied.
|
||||
/// errc::file_exists if \a to already exists and \a copt ==
|
||||
/// copy_option::fail_if_exists. Otherwise a platform specific
|
||||
/// error_code.
|
||||
error_code copy_file(const Twine &from, const Twine &to,
|
||||
copy_option copt = copy_option::fail_if_exists);
|
||||
|
||||
/// @brief Create all the non-existent directories in path.
|
||||
///
|
||||
/// @param path Directories to create.
|
||||
|
|
|
@ -320,65 +320,6 @@ error_code current_path(SmallVectorImpl<char> &result) {
|
|||
return error_code::success();
|
||||
}
|
||||
|
||||
error_code copy_file(const Twine &from, const Twine &to, copy_option copt) {
|
||||
// Get arguments.
|
||||
SmallString<128> from_storage;
|
||||
SmallString<128> to_storage;
|
||||
StringRef f = from.toNullTerminatedStringRef(from_storage);
|
||||
StringRef t = to.toNullTerminatedStringRef(to_storage);
|
||||
|
||||
const size_t buf_sz = 32768;
|
||||
char buffer[buf_sz];
|
||||
int from_file = -1, to_file = -1;
|
||||
|
||||
// Open from.
|
||||
if ((from_file = ::open(f.begin(), O_RDONLY)) < 0)
|
||||
return error_code(errno, system_category());
|
||||
AutoFD from_fd(from_file);
|
||||
|
||||
// Stat from.
|
||||
struct stat from_stat;
|
||||
if (::stat(f.begin(), &from_stat) != 0)
|
||||
return error_code(errno, system_category());
|
||||
|
||||
// Setup to flags.
|
||||
int to_flags = O_CREAT | O_WRONLY;
|
||||
if (copt == copy_option::fail_if_exists)
|
||||
to_flags |= O_EXCL;
|
||||
|
||||
// Open to.
|
||||
if ((to_file = ::open(t.begin(), to_flags, from_stat.st_mode)) < 0)
|
||||
return error_code(errno, system_category());
|
||||
AutoFD to_fd(to_file);
|
||||
|
||||
// Copy!
|
||||
ssize_t sz, sz_read = 1, sz_write;
|
||||
while (sz_read > 0 &&
|
||||
(sz_read = ::read(from_fd, buffer, buf_sz)) > 0) {
|
||||
// Allow for partial writes - see Advanced Unix Programming (2nd Ed.),
|
||||
// Marc Rochkind, Addison-Wesley, 2004, page 94
|
||||
sz_write = 0;
|
||||
do {
|
||||
if ((sz = ::write(to_fd, buffer + sz_write, sz_read - sz_write)) < 0) {
|
||||
sz_read = sz; // cause read loop termination.
|
||||
break; // error.
|
||||
}
|
||||
sz_write += sz;
|
||||
} while (sz_write < sz_read);
|
||||
}
|
||||
|
||||
// After all the file operations above the return value of close actually
|
||||
// matters.
|
||||
if (::close(from_fd.take()) < 0) sz_read = -1;
|
||||
if (::close(to_fd.take()) < 0) sz_read = -1;
|
||||
|
||||
// Check for errors.
|
||||
if (sz_read < 0)
|
||||
return error_code(errno, system_category());
|
||||
|
||||
return error_code::success();
|
||||
}
|
||||
|
||||
error_code create_directory(const Twine &path, bool &existed) {
|
||||
SmallString<128> path_storage;
|
||||
StringRef p = path.toNullTerminatedStringRef(path_storage);
|
||||
|
|
|
@ -324,29 +324,6 @@ retry_cur_dir:
|
|||
return error_code::success();
|
||||
}
|
||||
|
||||
error_code copy_file(const Twine &from, const Twine &to, copy_option copt) {
|
||||
// Get arguments.
|
||||
SmallString<128> from_storage;
|
||||
SmallString<128> to_storage;
|
||||
StringRef f = from.toStringRef(from_storage);
|
||||
StringRef t = to.toStringRef(to_storage);
|
||||
|
||||
// Convert to utf-16.
|
||||
SmallVector<wchar_t, 128> wide_from;
|
||||
SmallVector<wchar_t, 128> wide_to;
|
||||
if (error_code ec = UTF8ToUTF16(f, wide_from)) return ec;
|
||||
if (error_code ec = UTF8ToUTF16(t, wide_to)) return ec;
|
||||
|
||||
// Copy the file.
|
||||
BOOL res = ::CopyFileW(wide_from.begin(), wide_to.begin(),
|
||||
copt != copy_option::overwrite_if_exists);
|
||||
|
||||
if (res == 0)
|
||||
return windows_error(::GetLastError());
|
||||
|
||||
return error_code::success();
|
||||
}
|
||||
|
||||
error_code create_directory(const Twine &path, bool &existed) {
|
||||
SmallString<128> path_storage;
|
||||
SmallVector<wchar_t, 128> path_utf16;
|
||||
|
|
|
@ -219,14 +219,8 @@ TEST_F(FileSystemTest, TempFiles) {
|
|||
ASSERT_NO_ERROR(fs::status(Twine(TempPath2), B));
|
||||
EXPECT_FALSE(fs::equivalent(A, B));
|
||||
|
||||
// Try to copy the first to the second.
|
||||
EXPECT_EQ(
|
||||
fs::copy_file(Twine(TempPath), Twine(TempPath2)), errc::file_exists);
|
||||
|
||||
::close(FD2);
|
||||
// Try again with the proper options.
|
||||
ASSERT_NO_ERROR(fs::copy_file(Twine(TempPath), Twine(TempPath2),
|
||||
fs::copy_option::overwrite_if_exists));
|
||||
|
||||
// Remove Temp2.
|
||||
ASSERT_NO_ERROR(fs::remove(Twine(TempPath2), TempFileExists));
|
||||
EXPECT_TRUE(TempFileExists);
|
||||
|
|
Loading…
Reference in New Issue