github.com/searKing/golang/go@v1.2.117/os/signal/cgo/include/boost/stacktrace/detail/safe_dump_posix.ipp (about) 1 // Copyright Antony Polukhin, 2016-2023. 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See 4 // accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef BOOST_STACKTRACE_DETAIL_SAFE_DUMP_POSIX_IPP 8 #define BOOST_STACKTRACE_DETAIL_SAFE_DUMP_POSIX_IPP 9 10 #include <boost/config.hpp> 11 #ifdef BOOST_HAS_PRAGMA_ONCE 12 # pragma once 13 #endif 14 15 #include <boost/stacktrace/safe_dump_to.hpp> 16 17 #include <unistd.h> // ::write 18 #include <fcntl.h> // ::open 19 #include <sys/stat.h> // S_IWUSR and friends 20 21 22 namespace boost { namespace stacktrace { namespace detail { 23 24 std::size_t dump(int fd, const native_frame_ptr_t* frames, std::size_t frames_count) noexcept { 25 // We do not retry, because this function must be typically called from signal handler so it's: 26 // * to scary to continue in case of EINTR 27 // * EAGAIN or EWOULDBLOCK may occur only in case of O_NONBLOCK is set for fd, 28 // so it seems that user does not want to block 29 if (::write(fd, frames, sizeof(native_frame_ptr_t) * frames_count) == -1) { 30 return 0; 31 } 32 33 return frames_count; 34 } 35 36 std::size_t dump(const char* file, const native_frame_ptr_t* frames, std::size_t frames_count) noexcept { 37 const int fd = ::open( 38 file, 39 O_CREAT | O_WRONLY | O_TRUNC, 40 #if defined(S_IWUSR) && defined(S_IRUSR) // Workarounds for some Android OSes 41 S_IWUSR | S_IRUSR 42 #elif defined(S_IWRITE) && defined(S_IREAD) 43 S_IWRITE | S_IREAD 44 #else 45 0 46 #endif 47 ); 48 if (fd == -1) { 49 return 0; 50 } 51 52 const std::size_t size = boost::stacktrace::detail::dump(fd, frames, frames_count); 53 ::close(fd); 54 return size; 55 } 56 57 }}} // namespace boost::stacktrace::detail 58 59 #endif // BOOST_STACKTRACE_DETAIL_SAFE_DUMP_POSIX_IPP