| 1 | //===----------------------------------------------------------------------===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | // UNSUPPORTED: c++03, c++11, c++14 |
| 10 | // REQUIRES: linux |
| 11 | // UNSUPPORTED: no-filesystem |
| 12 | // XFAIL: no-localization |
| 13 | // UNSUPPORTED: availability-filesystem-missing |
| 14 | |
| 15 | // <filesystem> |
| 16 | |
| 17 | // bool copy_file(const path& from, const path& to); |
| 18 | // bool copy_file(const path& from, const path& to, error_code& ec) noexcept; |
| 19 | // bool copy_file(const path& from, const path& to, copy_options options); |
| 20 | // bool copy_file(const path& from, const path& to, copy_options options, |
| 21 | // error_code& ec) noexcept; |
| 22 | |
| 23 | #include <cassert> |
| 24 | #include <filesystem> |
| 25 | #include <system_error> |
| 26 | |
| 27 | #include "test_macros.h" |
| 28 | #include "filesystem_test_helper.h" |
| 29 | |
| 30 | namespace fs = std::filesystem; |
| 31 | |
| 32 | // Linux has various virtual filesystems such as /proc and /sys |
| 33 | // where files may have no length (st_size == 0), but still contain data. |
| 34 | // This is because the to-be-read data is usually generated ad-hoc by the reading syscall |
| 35 | // These files can not be copied with kernel-side copies like copy_file_range or sendfile, |
| 36 | // and must instead be copied via a traditional userspace read + write loop. |
| 37 | int main(int, char** argv) { |
| 38 | const fs::path procfile{"/proc/self/comm" }; |
| 39 | assert(file_size(procfile) == 0); |
| 40 | |
| 41 | scoped_test_env env; |
| 42 | std::error_code ec = GetTestEC(); |
| 43 | |
| 44 | const fs::path dest = env.make_env_path("dest" ); |
| 45 | |
| 46 | assert(copy_file(procfile, dest, ec)); |
| 47 | assert(!ec); |
| 48 | |
| 49 | // /proc/self/comm contains the filename of the executable, plus a null terminator |
| 50 | assert(file_size(dest) == fs::path(argv[0]).filename().string().size() + 1); |
| 51 | |
| 52 | return 0; |
| 53 | } |
| 54 | |