diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2011-01-15 18:52:33 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2011-01-15 18:52:33 +0000 |
commit | d6cdf1d3cb0263c413684aa20cb8aa91f9e128de (patch) | |
tree | 4290d11cb57b0225d12eb808779d7ec766261c1d /lib/Support/Unix/PathV2.inc | |
parent | cd7f0a1a7f216418856812f6417faf4fe5e72046 (diff) |
Support/PathV2: Implement get_magic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123544 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/Unix/PathV2.inc')
-rw-r--r-- | lib/Support/Unix/PathV2.inc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/Support/Unix/PathV2.inc b/lib/Support/Unix/PathV2.inc index 80e75ecbf5..056708a7b0 100644 --- a/lib/Support/Unix/PathV2.inc +++ b/lib/Support/Unix/PathV2.inc @@ -462,6 +462,37 @@ error_code directory_iterator_increment(directory_iterator& it) { return success; } +error_code get_magic(const Twine &path, uint32_t len, + SmallVectorImpl<char> &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 |