blob: 52cd87b0a020247c9c5d699d486849f80705ac6e (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
// posix_tools.hpp -------------------------------------------------------------------//
// Copyright 2021 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
// See library home page at http://www.boost.org/libs/filesystem
//--------------------------------------------------------------------------------------//
#ifndef BOOST_FILESYSTEM_SRC_POSIX_TOOLS_HPP_
#define BOOST_FILESYSTEM_SRC_POSIX_TOOLS_HPP_
#include "platform_config.hpp"
#include <cerrno>
#include <boost/filesystem/config.hpp>
#ifdef BOOST_HAS_UNISTD_H
#include <unistd.h>
#endif
#include <boost/filesystem/detail/header.hpp> // must be the last #include
namespace boost {
namespace filesystem {
namespace detail {
//! Platform-specific parameters for directory iterator construction
struct directory_iterator_params
{
#if defined(BOOST_FILESYSTEM_HAS_POSIX_AT_APIS)
//! File descriptor of the base directory relative to which to interpret relative paths
int basedir_fd;
#endif
#if defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW)
//! File descriptor of the directory over which the iterator iterates
int iterator_fd;
#endif
};
/*!
* Closes a file descriptor and returns the result, similar to close(2). Unlike close(2), guarantees that the file descriptor is closed even if EINTR error happens.
*
* Some systems don't close the file descriptor in case if the thread is interrupted by a signal and close(2) returns EINTR.
* Other (most) systems do close the file descriptor even when when close(2) returns EINTR, and attempting to close it
* again could close a different file descriptor that was opened by a different thread. This function hides this difference in behavior.
*
* Future POSIX standards will likely fix this by introducing posix_close (see https://www.austingroupbugs.net/view.php?id=529)
* and prohibiting returning EINTR from close(2), but we still have to support older systems where this new behavior is not available and close(2)
* behaves differently between systems.
*/
inline int close_fd(int fd)
{
#if defined(hpux) || defined(_hpux) || defined(__hpux)
int res;
while (true)
{
res = ::close(fd);
if (BOOST_UNLIKELY(res < 0))
{
int err = errno;
if (err == EINTR)
continue;
}
break;
}
return res;
#else
return ::close(fd);
#endif
}
} // namespace detail
} // namespace filesystem
} // namespace boost
#include <boost/filesystem/detail/footer.hpp>
#endif // BOOST_FILESYSTEM_SRC_POSIX_TOOLS_HPP_
|