1 // <system_error> implementation file 2 3 // Copyright (C) 2007-2018 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 26 #define _GLIBCXX_USE_CXX11_ABI 1 27 #define __sso_string __sso_stringxxx 28 #include <cstring> 29 #include <system_error> 30 #include <bits/functexcept.h> 31 #include <limits> 32 #include <errno.h> 33 #undef __sso_string 34 35 namespace 36 { 37 using std::string; 38 39 struct generic_error_category : public std::error_category 40 { 41 virtual const char* 42 name() const noexcept 43 { return "generic"; } 44 45 _GLIBCXX_DEFAULT_ABI_TAG 46 virtual string 47 message(int i) const 48 { 49 // XXX locale issues: how does one get or set loc. 50 // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc) 51 return string(strerror(i)); 52 } 53 }; 54 55 struct system_error_category : public std::error_category 56 { 57 virtual const char* 58 name() const noexcept 59 { return "system"; } 60 61 _GLIBCXX_DEFAULT_ABI_TAG 62 virtual string 63 message(int i) const 64 { 65 // XXX locale issues: how does one get or set loc. 66 // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc) 67 return string(strerror(i)); 68 } 69 70 virtual std::error_condition 71 default_error_condition(int ev) const noexcept 72 { 73 switch (ev) 74 { 75 // List of errno macros from [cerrno.syn]. 76 // C11 only defines EDOM, EILSEQ and ERANGE, the rest are from POSIX. 77 // They expand to integer constant expressions with type int, 78 // and distinct positive values, suitable for use in #if directives. 79 // POSIX adds more macros (but they're not defined on all targets, 80 // see config/os/*/error_constants.h), and POSIX allows 81 // EAGAIN == EWOULDBLOCK and ENOTSUP == EOPNOTSUPP. 82 83 #ifdef E2BIG 84 case E2BIG: 85 #endif 86 #ifdef EACCES 87 case EACCES: 88 #endif 89 #ifdef EADDRINUSE 90 case EADDRINUSE: 91 #endif 92 #ifdef EADDRNOTAVAIL 93 case EADDRNOTAVAIL: 94 #endif 95 #ifdef EAFNOSUPPORT 96 case EAFNOSUPPORT: 97 #endif 98 #ifdef EAGAIN 99 case EAGAIN: 100 #endif 101 #ifdef EALREADY 102 case EALREADY: 103 #endif 104 #ifdef EBADF 105 case EBADF: 106 #endif 107 #ifdef EBADMSG 108 case EBADMSG: 109 #endif 110 #ifdef EBUSY 111 case EBUSY: 112 #endif 113 #ifdef ECANCELED 114 case ECANCELED: 115 #endif 116 #ifdef ECHILD 117 case ECHILD: 118 #endif 119 #ifdef ECONNABORTED 120 case ECONNABORTED: 121 #endif 122 #ifdef ECONNREFUSED 123 case ECONNREFUSED: 124 #endif 125 #ifdef ECONNRESET 126 case ECONNRESET: 127 #endif 128 #ifdef EDEADLK 129 case EDEADLK: 130 #endif 131 #ifdef EDESTADDRREQ 132 case EDESTADDRREQ: 133 #endif 134 case EDOM: 135 #ifdef EEXIST 136 case EEXIST: 137 #endif 138 #ifdef EFAULT 139 case EFAULT: 140 #endif 141 #ifdef EFBIG 142 case EFBIG: 143 #endif 144 #ifdef EHOSTUNREACH 145 case EHOSTUNREACH: 146 #endif 147 #ifdef EIDRM 148 case EIDRM: 149 #endif 150 case EILSEQ: 151 #ifdef EINPROGRESS 152 case EINPROGRESS: 153 #endif 154 #ifdef EINTR 155 case EINTR: 156 #endif 157 #ifdef EINVAL 158 case EINVAL: 159 #endif 160 #ifdef EIO 161 case EIO: 162 #endif 163 #ifdef EISCONN 164 case EISCONN: 165 #endif 166 #ifdef EISDIR 167 case EISDIR: 168 #endif 169 #ifdef ELOOP 170 case ELOOP: 171 #endif 172 #ifdef EMFILE 173 case EMFILE: 174 #endif 175 #ifdef EMLINK 176 case EMLINK: 177 #endif 178 #ifdef EMSGSIZE 179 case EMSGSIZE: 180 #endif 181 #ifdef ENAMETOOLONG 182 case ENAMETOOLONG: 183 #endif 184 #ifdef ENETDOWN 185 case ENETDOWN: 186 #endif 187 #ifdef ENETRESET 188 case ENETRESET: 189 #endif 190 #ifdef ENETUNREACH 191 case ENETUNREACH: 192 #endif 193 #ifdef ENFILE 194 case ENFILE: 195 #endif 196 #ifdef ENOBUFS 197 case ENOBUFS: 198 #endif 199 #ifdef ENODATA 200 case ENODATA: 201 #endif 202 #ifdef ENODEV 203 case ENODEV: 204 #endif 205 #ifdef ENOENT 206 case ENOENT: 207 #endif 208 #ifdef ENOEXEC 209 case ENOEXEC: 210 #endif 211 #ifdef ENOLCK 212 case ENOLCK: 213 #endif 214 #ifdef ENOLINK 215 case ENOLINK: 216 #endif 217 #ifdef ENOMEM 218 case ENOMEM: 219 #endif 220 #ifdef ENOMSG 221 case ENOMSG: 222 #endif 223 #ifdef ENOPROTOOPT 224 case ENOPROTOOPT: 225 #endif 226 #ifdef ENOSPC 227 case ENOSPC: 228 #endif 229 #ifdef ENOSR 230 case ENOSR: 231 #endif 232 #ifdef ENOSTR 233 case ENOSTR: 234 #endif 235 #ifdef ENOSYS 236 case ENOSYS: 237 #endif 238 #ifdef ENOTCONN 239 case ENOTCONN: 240 #endif 241 #ifdef ENOTDIR 242 case ENOTDIR: 243 #endif 244 #if defined ENOTEMPTY && (!defined EEXIST || ENOTEMPTY != EEXIST) 245 // AIX sometimes uses the same value for EEXIST and ENOTEMPTY 246 case ENOTEMPTY: 247 #endif 248 #ifdef ENOTRECOVERABLE 249 case ENOTRECOVERABLE: 250 #endif 251 #ifdef ENOTSOCK 252 case ENOTSOCK: 253 #endif 254 #ifdef ENOTSUP 255 case ENOTSUP: 256 #endif 257 #ifdef ENOTTY 258 case ENOTTY: 259 #endif 260 #ifdef ENXIO 261 case ENXIO: 262 #endif 263 #if defined EOPNOTSUPP && (!defined ENOTSUP || EOPNOTSUPP != ENOTSUP) 264 case EOPNOTSUPP: 265 #endif 266 #ifdef EOVERFLOW 267 case EOVERFLOW: 268 #endif 269 #ifdef EOWNERDEAD 270 case EOWNERDEAD: 271 #endif 272 #ifdef EPERM 273 case EPERM: 274 #endif 275 #ifdef EPIPE 276 case EPIPE: 277 #endif 278 #ifdef EPROTO 279 case EPROTO: 280 #endif 281 #ifdef EPROTONOSUPPORT 282 case EPROTONOSUPPORT: 283 #endif 284 #ifdef EPROTOTYPE 285 case EPROTOTYPE: 286 #endif 287 case ERANGE: 288 #ifdef EROFS 289 case EROFS: 290 #endif 291 #ifdef ESPIPE 292 case ESPIPE: 293 #endif 294 #ifdef ESRCH 295 case ESRCH: 296 #endif 297 #ifdef ETIME 298 case ETIME: 299 #endif 300 #ifdef ETIMEDOUT 301 case ETIMEDOUT: 302 #endif 303 #ifdef ETXTBSY 304 case ETXTBSY: 305 #endif 306 #if defined EWOULDBLOCK && (!defined EAGAIN || EWOULDBLOCK != EAGAIN) 307 case EWOULDBLOCK: 308 #endif 309 #ifdef EXDEV 310 case EXDEV: 311 #endif 312 return std::error_condition(ev, std::generic_category()); 313 314 /* Additional system-dependent mappings from non-standard error codes 315 * to one of the POSIX values above would go here, e.g. 316 case EBLAH: 317 return std::error_condition(EINVAL, std::generic_category()); 318 */ 319 320 default: 321 return std::error_condition(ev, std::system_category()); 322 } 323 } 324 }; 325 326 const generic_error_category generic_category_instance{}; 327 const system_error_category system_category_instance{}; 328 } 329 330 namespace std _GLIBCXX_VISIBILITY(default) 331 { 332 _GLIBCXX_BEGIN_NAMESPACE_VERSION 333 334 void 335 __throw_system_error(int __i __attribute__((unused))) 336 { 337 _GLIBCXX_THROW_OR_ABORT(system_error(error_code(__i, generic_category()))); 338 } 339 340 error_category::~error_category() noexcept = default; 341 342 const error_category& 343 _V2::system_category() noexcept { return system_category_instance; } 344 345 const error_category& 346 _V2::generic_category() noexcept { return generic_category_instance; } 347 348 system_error::~system_error() noexcept = default; 349 350 error_condition 351 error_category::default_error_condition(int __i) const noexcept 352 { return error_condition(__i, *this); } 353 354 bool 355 error_category::equivalent(int __i, 356 const error_condition& __cond) const noexcept 357 { return default_error_condition(__i) == __cond; } 358 359 bool 360 error_category::equivalent(const error_code& __code, int __i) const noexcept 361 { return *this == __code.category() && __code.value() == __i; } 362 363 error_condition 364 error_code::default_error_condition() const noexcept 365 { return category().default_error_condition(value()); } 366 367 #if _GLIBCXX_USE_CXX11_ABI 368 // Return error_category::message() as a COW string 369 __cow_string 370 error_category::_M_message(int i) const 371 { 372 string msg = this->message(i); 373 return {msg.c_str(), msg.length()}; 374 } 375 #endif 376 377 _GLIBCXX_END_NAMESPACE_VERSION 378 } // namespace 379