1 // Filesystem declarations -*- C++ -*- 2 3 // Copyright (C) 2014-2018 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** @file include/bits/fs_fwd.h 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. @headername{filesystem} 28 */ 29 30 #ifndef _GLIBCXX_FS_FWD_H 31 #define _GLIBCXX_FS_FWD_H 1 32 33 #if __cplusplus >= 201703L 34 35 #include <system_error> 36 #include <cstdint> 37 #include <chrono> 38 39 namespace std _GLIBCXX_VISIBILITY(default) 40 { 41 _GLIBCXX_BEGIN_NAMESPACE_VERSION 42 43 namespace filesystem 44 { 45 #if _GLIBCXX_USE_CXX11_ABI 46 inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } 47 #endif 48 49 /** 50 * @defgroup filesystem Filesystem 51 * 52 * Utilities for performing operations on file systems and their components, 53 * such as paths, regular files, and directories. 54 * 55 * @{ 56 */ 57 58 class file_status; 59 _GLIBCXX_BEGIN_NAMESPACE_CXX11 60 class path; 61 class filesystem_error; 62 class directory_entry; 63 class directory_iterator; 64 class recursive_directory_iterator; 65 _GLIBCXX_END_NAMESPACE_CXX11 66 67 struct space_info 68 { 69 uintmax_t capacity; 70 uintmax_t free; 71 uintmax_t available; 72 }; 73 74 enum class file_type : signed char { 75 none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3, 76 block = 4, character = 5, fifo = 6, socket = 7, unknown = 8 77 }; 78 79 /// Bitmask type 80 enum class copy_options : unsigned short { 81 none = 0, 82 skip_existing = 1, overwrite_existing = 2, update_existing = 4, 83 recursive = 8, 84 copy_symlinks = 16, skip_symlinks = 32, 85 directories_only = 64, create_symlinks = 128, create_hard_links = 256 86 }; 87 88 constexpr copy_options 89 operator&(copy_options __x, copy_options __y) noexcept 90 { 91 using __utype = typename std::underlying_type<copy_options>::type; 92 return static_cast<copy_options>( 93 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 94 } 95 96 constexpr copy_options 97 operator|(copy_options __x, copy_options __y) noexcept 98 { 99 using __utype = typename std::underlying_type<copy_options>::type; 100 return static_cast<copy_options>( 101 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 102 } 103 104 constexpr copy_options 105 operator^(copy_options __x, copy_options __y) noexcept 106 { 107 using __utype = typename std::underlying_type<copy_options>::type; 108 return static_cast<copy_options>( 109 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 110 } 111 112 constexpr copy_options 113 operator~(copy_options __x) noexcept 114 { 115 using __utype = typename std::underlying_type<copy_options>::type; 116 return static_cast<copy_options>(~static_cast<__utype>(__x)); 117 } 118 119 inline copy_options& 120 operator&=(copy_options& __x, copy_options __y) noexcept 121 { return __x = __x & __y; } 122 123 inline copy_options& 124 operator|=(copy_options& __x, copy_options __y) noexcept 125 { return __x = __x | __y; } 126 127 inline copy_options& 128 operator^=(copy_options& __x, copy_options __y) noexcept 129 { return __x = __x ^ __y; } 130 131 132 /// Bitmask type 133 enum class perms : unsigned { 134 none = 0, 135 owner_read = 0400, 136 owner_write = 0200, 137 owner_exec = 0100, 138 owner_all = 0700, 139 group_read = 040, 140 group_write = 020, 141 group_exec = 010, 142 group_all = 070, 143 others_read = 04, 144 others_write = 02, 145 others_exec = 01, 146 others_all = 07, 147 all = 0777, 148 set_uid = 04000, 149 set_gid = 02000, 150 sticky_bit = 01000, 151 mask = 07777, 152 unknown = 0xFFFF, 153 }; 154 155 constexpr perms 156 operator&(perms __x, perms __y) noexcept 157 { 158 using __utype = typename std::underlying_type<perms>::type; 159 return static_cast<perms>( 160 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 161 } 162 163 constexpr perms 164 operator|(perms __x, perms __y) noexcept 165 { 166 using __utype = typename std::underlying_type<perms>::type; 167 return static_cast<perms>( 168 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 169 } 170 171 constexpr perms 172 operator^(perms __x, perms __y) noexcept 173 { 174 using __utype = typename std::underlying_type<perms>::type; 175 return static_cast<perms>( 176 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 177 } 178 179 constexpr perms 180 operator~(perms __x) noexcept 181 { 182 using __utype = typename std::underlying_type<perms>::type; 183 return static_cast<perms>(~static_cast<__utype>(__x)); 184 } 185 186 inline perms& 187 operator&=(perms& __x, perms __y) noexcept 188 { return __x = __x & __y; } 189 190 inline perms& 191 operator|=(perms& __x, perms __y) noexcept 192 { return __x = __x | __y; } 193 194 inline perms& 195 operator^=(perms& __x, perms __y) noexcept 196 { return __x = __x ^ __y; } 197 198 /// Bitmask type 199 enum class perm_options : unsigned { 200 replace = 0x1, 201 add = 0x2, 202 remove = 0x4, 203 nofollow = 0x8 204 }; 205 206 constexpr perm_options 207 operator&(perm_options __x, perm_options __y) noexcept 208 { 209 using __utype = typename std::underlying_type<perm_options>::type; 210 return static_cast<perm_options>( 211 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 212 } 213 214 constexpr perm_options 215 operator|(perm_options __x, perm_options __y) noexcept 216 { 217 using __utype = typename std::underlying_type<perm_options>::type; 218 return static_cast<perm_options>( 219 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 220 } 221 222 constexpr perm_options 223 operator^(perm_options __x, perm_options __y) noexcept 224 { 225 using __utype = typename std::underlying_type<perm_options>::type; 226 return static_cast<perm_options>( 227 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 228 } 229 230 constexpr perm_options 231 operator~(perm_options __x) noexcept 232 { 233 using __utype = typename std::underlying_type<perm_options>::type; 234 return static_cast<perm_options>(~static_cast<__utype>(__x)); 235 } 236 237 inline perm_options& 238 operator&=(perm_options& __x, perm_options __y) noexcept 239 { return __x = __x & __y; } 240 241 inline perm_options& 242 operator|=(perm_options& __x, perm_options __y) noexcept 243 { return __x = __x | __y; } 244 245 inline perm_options& 246 operator^=(perm_options& __x, perm_options __y) noexcept 247 { return __x = __x ^ __y; } 248 249 // Bitmask type 250 enum class directory_options : unsigned char { 251 none = 0, follow_directory_symlink = 1, skip_permission_denied = 2 252 }; 253 254 constexpr directory_options 255 operator&(directory_options __x, directory_options __y) noexcept 256 { 257 using __utype = typename std::underlying_type<directory_options>::type; 258 return static_cast<directory_options>( 259 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 260 } 261 262 constexpr directory_options 263 operator|(directory_options __x, directory_options __y) noexcept 264 { 265 using __utype = typename std::underlying_type<directory_options>::type; 266 return static_cast<directory_options>( 267 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 268 } 269 270 constexpr directory_options 271 operator^(directory_options __x, directory_options __y) noexcept 272 { 273 using __utype = typename std::underlying_type<directory_options>::type; 274 return static_cast<directory_options>( 275 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 276 } 277 278 constexpr directory_options 279 operator~(directory_options __x) noexcept 280 { 281 using __utype = typename std::underlying_type<directory_options>::type; 282 return static_cast<directory_options>(~static_cast<__utype>(__x)); 283 } 284 285 inline directory_options& 286 operator&=(directory_options& __x, directory_options __y) noexcept 287 { return __x = __x & __y; } 288 289 inline directory_options& 290 operator|=(directory_options& __x, directory_options __y) noexcept 291 { return __x = __x | __y; } 292 293 inline directory_options& 294 operator^=(directory_options& __x, directory_options __y) noexcept 295 { return __x = __x ^ __y; } 296 297 using file_time_type = std::chrono::system_clock::time_point; 298 299 // operational functions 300 301 void copy(const path& __from, const path& __to, copy_options __options); 302 void copy(const path& __from, const path& __to, copy_options __options, 303 error_code&); 304 305 bool copy_file(const path& __from, const path& __to, copy_options __option); 306 bool copy_file(const path& __from, const path& __to, copy_options __option, 307 error_code&); 308 309 path current_path(); 310 311 bool exists(file_status) noexcept; 312 313 bool is_other(file_status) noexcept; 314 315 uintmax_t file_size(const path&); 316 uintmax_t file_size(const path&, error_code&) noexcept; 317 uintmax_t hard_link_count(const path&); 318 uintmax_t hard_link_count(const path&, error_code&) noexcept; 319 file_time_type last_write_time(const path&); 320 file_time_type last_write_time(const path&, error_code&) noexcept; 321 322 void permissions(const path&, perms, perm_options, error_code&) noexcept; 323 324 path proximate(const path& __p, const path& __base, error_code& __ec); 325 path proximate(const path& __p, const path& __base, error_code& __ec); 326 327 path relative(const path& __p, const path& __base, error_code& __ec); 328 329 file_status status(const path&); 330 file_status status(const path&, error_code&) noexcept; 331 332 bool status_known(file_status) noexcept; 333 334 file_status symlink_status(const path&); 335 file_status symlink_status(const path&, error_code&) noexcept; 336 337 bool is_regular_file(file_status) noexcept; 338 bool is_symlink(file_status) noexcept; 339 340 // @} group filesystem 341 } // namespace filesystem 342 343 _GLIBCXX_END_NAMESPACE_VERSION 344 } // namespace std 345 346 #endif // C++17 347 348 #endif // _GLIBCXX_FS_FWD_H 349