1// Filesystem declarations -*- C++ -*- 
2 
3// Copyright (C) 2014-2019 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 
39namespace std _GLIBCXX_VISIBILITY(default) 
40{ 
41_GLIBCXX_BEGIN_NAMESPACE_VERSION 
42 
43namespace filesystem 
44{ 
45#if _GLIBCXX_USE_CXX11_ABI 
46inline 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 struct __file_clock 
298 { 
299 using duration = chrono::nanoseconds; 
300 using rep = duration::rep; 
301 using period = duration::period; 
302 using time_point = chrono::time_point<__file_clock>; 
303 static constexpr bool is_steady = false; 
304 
305 static time_point 
306 now() noexcept 
307 { return _S_from_sys(chrono::system_clock::now()); } 
308 
309 private: 
310 using __sys_clock = chrono::system_clock; 
311 
312 // This clock's (unspecified) epoch is 2174-01-01 00:00:00 UTC. 
313 // A signed 64-bit duration with nanosecond resolution gives roughly 
314 // +/- 292 years, which covers the 1901-2446 date range for ext4. 
315 static constexpr chrono::seconds _S_epoch_diff{6437664000}; 
316 
317 protected: 
318 // For internal use only 
319 template<typename _Dur> 
320 static 
321 chrono::time_point<__file_clock, _Dur> 
322 _S_from_sys(const chrono::time_point<__sys_clock, _Dur>& __t) noexcept 
323 { 
324 using __file_time = chrono::time_point<__file_clock, _Dur>; 
325 return __file_time{__t.time_since_epoch()} - _S_epoch_diff; 
326 } 
327 
328 // For internal use only 
329 template<typename _Dur> 
330 static 
331 chrono::time_point<__sys_clock, _Dur> 
332 _S_to_sys(const chrono::time_point<__file_clock, _Dur>& __t) noexcept 
333 { 
334 using __sys_time = chrono::time_point<__sys_clock, _Dur>; 
335 return __sys_time{__t.time_since_epoch()} + _S_epoch_diff; 
336 } 
337 }; 
338 
339 using file_time_type = __file_clock::time_point; 
340 
341 // operational functions 
342 
343 void copy(const path& __from, const path& __to, copy_options __options); 
344 void copy(const path& __from, const path& __to, copy_options __options, 
345 error_code&); 
346 
347 bool copy_file(const path& __from, const path& __to, copy_options __option); 
348 bool copy_file(const path& __from, const path& __to, copy_options __option, 
349 error_code&); 
350 
351 path current_path(); 
352 
353 bool exists(file_status) noexcept; 
354 
355 bool is_other(file_status) noexcept; 
356 
357 uintmax_t file_size(const path&); 
358 uintmax_t file_size(const path&, error_code&) noexcept; 
359 uintmax_t hard_link_count(const path&); 
360 uintmax_t hard_link_count(const path&, error_code&) noexcept; 
361 file_time_type last_write_time(const path&); 
362 file_time_type last_write_time(const path&, error_code&) noexcept; 
363 
364 void permissions(const path&, perms, perm_options, error_code&) noexcept; 
365 
366 path proximate(const path& __p, const path& __base, error_code& __ec); 
367 path proximate(const path& __p, const path& __base, error_code& __ec); 
368 
369 path relative(const path& __p, const path& __base, error_code& __ec); 
370 
371 file_status status(const path&); 
372 file_status status(const path&, error_code&) noexcept; 
373 
374 bool status_known(file_status) noexcept; 
375 
376 file_status symlink_status(const path&); 
377 file_status symlink_status(const path&, error_code&) noexcept; 
378 
379 bool is_regular_file(file_status) noexcept; 
380 bool is_symlink(file_status) noexcept; 
381 
382 // @} group filesystem 
383} // namespace filesystem 
384 
385_GLIBCXX_END_NAMESPACE_VERSION 
386} // namespace std 
387 
388#endif // C++17 
389 
390#endif // _GLIBCXX_FS_FWD_H 
391