1// 2// error.hpp 3// ~~~~~~~~~ 4// 5// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6// 7// Distributed under the Boost Software License, Version 1.0. (See accompanying 8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9// 10 11#ifndef ASIO_ERROR_HPP 12#define ASIO_ERROR_HPP 13 14 15#include "asio/detail/config.hpp" 16#include "asio/error_code.hpp" 17#include "asio/system_error.hpp" 18# include <cerrno> 19# include <netdb.h> 20 21# define ASIO_NATIVE_ERROR(e) e 22# define ASIO_SOCKET_ERROR(e) e 23# define ASIO_NETDB_ERROR(e) e 24# define ASIO_GETADDRINFO_ERROR(e) e 25# define ASIO_WIN_OR_POSIX(e_win, e_posix) e_posix 26 27#include "asio/detail/push_options.hpp" 28 29namespace asio { 30namespace error { 31 32enum basic_errors 33{ 34 /// Permission denied. 35 access_denied = ASIO_SOCKET_ERROR(EACCES), 36 37 /// Address family not supported by protocol. 38 address_family_not_supported = ASIO_SOCKET_ERROR(EAFNOSUPPORT), 39 40 /// Address already in use. 41 address_in_use = ASIO_SOCKET_ERROR(EADDRINUSE), 42 43 /// Transport endpoint is already connected. 44 already_connected = ASIO_SOCKET_ERROR(EISCONN), 45 46 /// Operation already in progress. 47 already_started = ASIO_SOCKET_ERROR(EALREADY), 48 49 /// Broken pipe. 50 broken_pipe = ASIO_WIN_OR_POSIX( 51 ASIO_NATIVE_ERROR(ERROR_BROKEN_PIPE), 52 ASIO_NATIVE_ERROR(EPIPE)), 53 54 /// A connection has been aborted. 55 connection_aborted = ASIO_SOCKET_ERROR(ECONNABORTED), 56 57 /// Connection refused. 58 connection_refused = ASIO_SOCKET_ERROR(ECONNREFUSED), 59 60 /// Connection reset by peer. 61 connection_reset = ASIO_SOCKET_ERROR(ECONNRESET), 62 63 /// Bad file descriptor. 64 bad_descriptor = ASIO_SOCKET_ERROR(EBADF), 65 66 /// Bad address. 67 fault = ASIO_SOCKET_ERROR(EFAULT), 68 69 /// No route to host. 70 host_unreachable = ASIO_SOCKET_ERROR(EHOSTUNREACH), 71 72 /// Operation now in progress. 73 in_progress = ASIO_SOCKET_ERROR(EINPROGRESS), 74 75 /// Interrupted system call. 76 interrupted = ASIO_SOCKET_ERROR(EINTR), 77 78 /// Invalid argument. 79 invalid_argument = ASIO_SOCKET_ERROR(EINVAL), 80 81 /// Message too long. 82 message_size = ASIO_SOCKET_ERROR(EMSGSIZE), 83 84 /// The name was too long. 85 name_too_long = ASIO_SOCKET_ERROR(ENAMETOOLONG), 86 87 /// Network is down. 88 network_down = ASIO_SOCKET_ERROR(ENETDOWN), 89 90 /// Network dropped connection on reset. 91 network_reset = ASIO_SOCKET_ERROR(ENETRESET), 92 93 /// Network is unreachable. 94 network_unreachable = ASIO_SOCKET_ERROR(ENETUNREACH), 95 96 /// Too many open files. 97 no_descriptors = ASIO_SOCKET_ERROR(EMFILE), 98 99 /// No buffer space available. 100 no_buffer_space = ASIO_SOCKET_ERROR(ENOBUFS), 101 102 /// Cannot allocate memory. 103 no_memory = ASIO_WIN_OR_POSIX( 104 ASIO_NATIVE_ERROR(ERROR_OUTOFMEMORY), 105 ASIO_NATIVE_ERROR(ENOMEM)), 106 107 /// Operation not permitted. 108 no_permission = ASIO_WIN_OR_POSIX( 109 ASIO_NATIVE_ERROR(ERROR_ACCESS_DENIED), 110 ASIO_NATIVE_ERROR(EPERM)), 111 112 /// Protocol not available. 113 no_protocol_option = ASIO_SOCKET_ERROR(ENOPROTOOPT), 114 115 /// No such device. 116 no_such_device = ASIO_WIN_OR_POSIX( 117 ASIO_NATIVE_ERROR(ERROR_BAD_UNIT), 118 ASIO_NATIVE_ERROR(ENODEV)), 119 120 /// Transport endpoint is not connected. 121 not_connected = ASIO_SOCKET_ERROR(ENOTCONN), 122 123 /// Socket operation on non-socket. 124 not_socket = ASIO_SOCKET_ERROR(ENOTSOCK), 125 126 /// Operation cancelled. 127 operation_aborted = ASIO_WIN_OR_POSIX( 128 ASIO_NATIVE_ERROR(ERROR_OPERATION_ABORTED), 129 ASIO_NATIVE_ERROR(ECANCELED)), 130 131 /// Operation not supported. 132 operation_not_supported = ASIO_SOCKET_ERROR(EOPNOTSUPP), 133 134 /// Cannot send after transport endpoint shutdown. 135 shut_down = ASIO_SOCKET_ERROR(ESHUTDOWN), 136 137 /// Connection timed out. 138 timed_out = ASIO_SOCKET_ERROR(ETIMEDOUT), 139 140 /// Resource temporarily unavailable. 141 try_again = ASIO_WIN_OR_POSIX( 142 ASIO_NATIVE_ERROR(ERROR_RETRY), 143 ASIO_NATIVE_ERROR(EAGAIN)), 144 145 /// The socket is marked non-blocking and the requested operation would block. 146 would_block = ASIO_SOCKET_ERROR(EWOULDBLOCK) 147}; 148 149enum netdb_errors 150{ 151 /// Host not found (authoritative). 152 host_not_found = ASIO_NETDB_ERROR(HOST_NOT_FOUND), 153 154 /// Host not found (non-authoritative). 155 host_not_found_try_again = ASIO_NETDB_ERROR(TRY_AGAIN), 156 157 /// The query is valid but does not have associated address data. 158 no_data = ASIO_NETDB_ERROR(NO_DATA), 159 160 /// A non-recoverable error occurred. 161 no_recovery = ASIO_NETDB_ERROR(NO_RECOVERY) 162}; 163 164enum addrinfo_errors 165{ 166 /// The service is not supported for the given socket type. 167 service_not_found = ASIO_WIN_OR_POSIX( 168 ASIO_NATIVE_ERROR(WSATYPE_NOT_FOUND), 169 ASIO_GETADDRINFO_ERROR(EAI_SERVICE)), 170 171 /// The socket type is not supported. 172 socket_type_not_supported = ASIO_WIN_OR_POSIX( 173 ASIO_NATIVE_ERROR(WSAESOCKTNOSUPPORT), 174 ASIO_GETADDRINFO_ERROR(EAI_SOCKTYPE)) 175}; 176 177enum misc_errors 178{ 179 /// Already open. 180 already_open = 1, 181 182 /// End of file or stream. 183 eof, 184 185 /// Element not found. 186 not_found, 187 188 /// The descriptor cannot fit into the select system call's fd_set. 189 fd_set_failure 190}; 191 192inline const asio::error_category& get_system_category() 193{ 194 return asio::system_category(); 195} 196 197 198extern ASIO_DECL 199const asio::error_category& get_netdb_category(); 200 201extern ASIO_DECL 202const asio::error_category& get_addrinfo_category(); 203 204 205extern ASIO_DECL 206const asio::error_category& get_misc_category(); 207 208static const asio::error_category& system_category 209 = asio::error::get_system_category(); 210static const asio::error_category& netdb_category 211 = asio::error::get_netdb_category(); 212static const asio::error_category& addrinfo_category 213 = asio::error::get_addrinfo_category(); 214static const asio::error_category& misc_category 215 = asio::error::get_misc_category(); 216 217} // namespace error 218} // namespace asio 219 220namespace std { 221 222template<> struct is_error_code_enum<asio::error::basic_errors> 223{ 224 static const bool value = true; 225}; 226 227template<> struct is_error_code_enum<asio::error::netdb_errors> 228{ 229 static const bool value = true; 230}; 231 232template<> struct is_error_code_enum<asio::error::addrinfo_errors> 233{ 234 static const bool value = true; 235}; 236 237template<> struct is_error_code_enum<asio::error::misc_errors> 238{ 239 static const bool value = true; 240}; 241 242} // namespace std 243 244namespace asio { 245namespace error { 246 247inline asio::error_code make_error_code(basic_errors e) 248{ 249 return asio::error_code( 250 static_cast<int>(e), get_system_category()); 251} 252 253inline asio::error_code make_error_code(netdb_errors e) 254{ 255 return asio::error_code( 256 static_cast<int>(e), get_netdb_category()); 257} 258 259inline asio::error_code make_error_code(addrinfo_errors e) 260{ 261 return asio::error_code( 262 static_cast<int>(e), get_addrinfo_category()); 263} 264 265inline asio::error_code make_error_code(misc_errors e) 266{ 267 return asio::error_code( 268 static_cast<int>(e), get_misc_category()); 269} 270 271} // namespace error 272} // namespace asio 273 274#include "asio/detail/pop_options.hpp" 275 276#undef ASIO_NATIVE_ERROR 277#undef ASIO_SOCKET_ERROR 278#undef ASIO_NETDB_ERROR 279#undef ASIO_GETADDRINFO_ERROR 280#undef ASIO_WIN_OR_POSIX 281 282# include "asio/impl/error.ipp" 283 284#endif // ASIO_ERROR_HPP 285