Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards


//  posix_tools.hpp  -------------------------------------------------------------------//

//  Copyright 2021 Andrey Semashev

//  Distributed under the Boost Software License, Version 1.0.
//  See

//  See library home page at



#include "platform_config.hpp"
#include <cerrno>
#include <boost/filesystem/config.hpp>
#include <unistd.h>

#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
    //! File descriptor of the base directory relative to which to interpret relative paths
    int basedir_fd;
    //! File descriptor of the directory over which the iterator iterates
    int iterator_fd;

 * 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
 * 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)


    return res;
    return ::close(fd);

} // namespace detail
} // namespace filesystem
} // namespace boost

#include <boost/filesystem/detail/footer.hpp>