X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FUnix%2FPathV2.inc;h=03ff28367e44c5e653f6080e5e89e43aaec714f5;hb=0eeca440469e23f2db2bea3d7b136f0f95f6ff1d;hp=80e75ecbf5a033a3b0065802bdbaf2829fffafe4;hpb=da7c1cab8c083e3370cc94a23bc396cd75b7f2a7;p=oota-llvm.git diff --git a/lib/Support/Unix/PathV2.inc b/lib/Support/Unix/PathV2.inc index 80e75ecbf5a..03ff28367e4 100644 --- a/lib/Support/Unix/PathV2.inc +++ b/lib/Support/Unix/PathV2.inc @@ -230,8 +230,17 @@ error_code rename(const Twine &from, const Twine &to) { StringRef f = from.toNullTerminatedStringRef(from_storage); StringRef t = to.toNullTerminatedStringRef(to_storage); - if (::rename(f.begin(), t.begin()) == -1) - return error_code(errno, system_category()); + if (::rename(f.begin(), t.begin()) == -1) { + // If it's a cross device link, copy then delete, otherwise return the error + if (errno == EXDEV) { + if (error_code ec = copy_file(from, to, copy_option::overwrite_if_exists)) + return ec; + bool Existed; + if (error_code ec = remove(from, Existed)) + return ec; + } else + return error_code(errno, system_category()); + } return success; } @@ -462,6 +471,37 @@ error_code directory_iterator_increment(directory_iterator& it) { return success; } +error_code get_magic(const Twine &path, uint32_t len, + SmallVectorImpl &result) { + SmallString<128> PathStorage; + StringRef Path = path.toNullTerminatedStringRef(PathStorage); + result.set_size(0); + + // Open path. + std::FILE *file = std::fopen(Path.data(), "rb"); + if (file == 0) + return error_code(errno, system_category()); + + // Reserve storage. + result.reserve(len); + + // Read magic! + size_t size = std::fread(result.data(), 1, len, file); + if (std::ferror(file) != 0) { + std::fclose(file); + return error_code(errno, system_category()); + } else if (size != result.size()) { + if (std::feof(file) != 0) { + std::fclose(file); + result.set_size(size); + return make_error_code(errc::value_too_large); + } + } + std::fclose(file); + result.set_size(len); + return success; +} + } // end namespace fs } // end namespace sys } // end namespace llvm