📄 error_code.cpp
字号:
// error_code support implementation file ----------------------------------//// Copyright Beman Dawes 2002, 2006// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)// See library home page at http://www.boost.org/libs/system//----------------------------------------------------------------------------//#include <boost/config/warning_disable.hpp>// define BOOST_SYSTEM_SOURCE so that <boost/system/config.hpp> knows// the library is being built (possibly exporting rather than importing code)#define BOOST_SYSTEM_SOURCE #include <boost/system/config.hpp>#include <boost/system/error_code.hpp>#include <boost/cerrno.hpp>#include <vector>#include <cstdlib>#include <cassert>using namespace boost::system;using namespace boost::system::posix_error;#include <cstring> // for strerror/strerror_r# if defined( BOOST_WINDOWS_API )# include <windows.h># ifndef ERROR_INCORRECT_SIZE# define ERROR_INCORRECT_SIZE ERROR_BAD_ARGUMENTS# endif# endif//----------------------------------------------------------------------------//namespace{ // standard error categories ---------------------------------------------// class generic_error_category : public error_category { public: generic_error_category(){} const char * name() const; std::string message( int ev ) const; }; class system_error_category : public error_category { public: system_error_category(){} const char * name() const; std::string message( int ev ) const; error_condition default_error_condition( int ev ) const; }; // generic_error_category implementation ---------------------------------// const char * generic_error_category::name() const { return "generic"; } std::string generic_error_category::message( int ev ) const { static std::string unknown_err( "Unknown error" ); // strerror_r is preferred because it is always thread safe, // however, we fallback to strerror in certain cases because: // -- Windows doesn't provide strerror_r. // -- HP and Sundo provide strerror_r on newer systems, but there is // no way to tell if is available at runtime and in any case their // versions of strerror are thread safe anyhow. // -- Linux only sometimes provides strerror_r. // -- Tru64 provides strerror_r only when compiled -pthread. // -- VMS doesn't provide strerror_r, but on this platform, strerror is // thread safe. # if defined(BOOST_WINDOWS_API) || defined(__hpux) || defined(__sun)\ || (defined(__linux) && (!defined(__USE_XOPEN2K) || defined(BOOST_SYSTEM_USE_STRERROR)))\ || (defined(__osf__) && !defined(_REENTRANT))\ || (defined(__vms)) const char * c_str = std::strerror( ev ); return c_str ? std::string( c_str ) : unknown_err; # else // use strerror_r char buf[64]; char * bp = buf; std::size_t sz = sizeof(buf); # if defined(__CYGWIN__) || defined(__USE_GNU) // Oddball version of strerror_r const char * c_str = strerror_r( ev, bp, sz ); return c_str ? std::string( c_str ) : unknown_err; # else // POSIX version of strerror_r int result; for (;;) { // strerror_r returns 0 on success, otherwise ERANGE if buffer too small, // invalid_argument if ev not a valid error number # if defined (__sgi) const char * c_str = strerror( ev ); result = 0; return c_str ? std::string( c_str ) : unknown_err; # else result = strerror_r( ev, bp, sz ); # endif if (result == 0 ) break; else { # if defined(__linux) // Linux strerror_r returns -1 on error, with error number in errno result = errno; # endif if ( result != ERANGE ) break; if ( sz > sizeof(buf) ) std::free( bp ); sz *= 2; if ( (bp = static_cast<char*>(std::malloc( sz ))) == 0 ) return std::string( "ENOMEM" ); } } std::string msg; try { msg = ( ( result == invalid_argument ) ? "Unknown error" : bp ); }# ifndef BOOST_NO_EXCEPTIONS // See ticket #2098 catch(...) { // just eat the exception }# endif if ( sz > sizeof(buf) ) std::free( bp ); sz = 0; return msg; # endif // else POSIX version of strerror_r # endif // else use strerror_r } // system_error_category implementation --------------------------------// const char * system_error_category::name() const { return "system"; } error_condition system_error_category::default_error_condition( int ev ) const { switch ( ev ) { case 0: return make_error_condition( success ); # if defined(BOOST_POSIX_API) // POSIX-like O/S -> posix_errno decode table ---------------------------// case E2BIG: return make_error_condition( argument_list_too_long ); case EACCES: return make_error_condition( permission_denied ); case EADDRINUSE: return make_error_condition( address_in_use ); case EADDRNOTAVAIL: return make_error_condition( address_not_available ); case EAFNOSUPPORT: return make_error_condition( address_family_not_supported ); case EAGAIN: return make_error_condition( resource_unavailable_try_again );# if EALREADY != EBUSY // EALREADY and EBUSY are the same on QNX Neutrino case EALREADY: return make_error_condition( connection_already_in_progress );# endif case EBADF: return make_error_condition( bad_file_descriptor ); case EBADMSG: return make_error_condition( bad_message ); case EBUSY: return make_error_condition( device_or_resource_busy ); case ECANCELED: return make_error_condition( operation_canceled ); case ECHILD: return make_error_condition( no_child_process ); case ECONNABORTED: return make_error_condition( connection_aborted ); case ECONNREFUSED: return make_error_condition( connection_refused ); case ECONNRESET: return make_error_condition( connection_reset ); case EDEADLK: return make_error_condition( resource_deadlock_would_occur ); case EDESTADDRREQ: return make_error_condition( destination_address_required ); case EDOM: return make_error_condition( argument_out_of_domain ); case EEXIST: return make_error_condition( file_exists ); case EFAULT: return make_error_condition( bad_address ); case EFBIG: return make_error_condition( file_too_large ); case EHOSTUNREACH: return make_error_condition( host_unreachable ); case EIDRM: return make_error_condition( identifier_removed ); case EILSEQ: return make_error_condition( illegal_byte_sequence ); case EINPROGRESS: return make_error_condition( operation_in_progress ); case EINTR: return make_error_condition( interrupted ); case EINVAL: return make_error_condition( invalid_argument ); case EIO: return make_error_condition( io_error ); case EISCONN: return make_error_condition( already_connected ); case EISDIR: return make_error_condition( is_a_directory ); case ELOOP: return make_error_condition( too_many_synbolic_link_levels ); case EMFILE: return make_error_condition( too_many_files_open ); case EMLINK: return make_error_condition( too_many_links ); case EMSGSIZE: return make_error_condition( message_size ); case ENAMETOOLONG: return make_error_condition( filename_too_long ); case ENETDOWN: return make_error_condition( network_down ); case ENETRESET: return make_error_condition( network_reset ); case ENETUNREACH: return make_error_condition( network_unreachable ); case ENFILE: return make_error_condition( too_many_files_open_in_system ); case ENOBUFS: return make_error_condition( no_buffer_space ); case ENODATA: return make_error_condition( no_message_available ); case ENODEV: return make_error_condition( no_such_device ); case ENOENT: return make_error_condition( no_such_file_or_directory ); case ENOEXEC: return make_error_condition( executable_format_error ); case ENOLCK: return make_error_condition( no_lock_available ); case ENOLINK: return make_error_condition( no_link ); case ENOMEM: return make_error_condition( not_enough_memory ); case ENOMSG: return make_error_condition( no_message ); case ENOPROTOOPT: return make_error_condition( no_protocol_option ); case ENOSPC: return make_error_condition( no_space_on_device ); case ENOSR: return make_error_condition( no_stream_resources ); case ENOSTR: return make_error_condition( not_a_stream ); case ENOSYS: return make_error_condition( function_not_supported );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -