/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- * Copyright (c) 2023, gperftools Contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "safe_strerror.h" #include #include #include namespace tcmalloc { namespace { const char* TryMapErrno(int errnum) { #define C(v) if (errnum == v) return #v #ifdef E2BIG C(E2BIG); #endif #ifdef EACCES C(EACCES); #endif #ifdef EADDRINUSE C(EADDRINUSE); #endif #ifdef EADDRNOTAVAIL C(EADDRNOTAVAIL); #endif #ifdef EAFNOSUPPORT C(EAFNOSUPPORT); #endif #ifdef EAGAIN C(EAGAIN); #endif #ifdef EALREADY C(EALREADY); #endif #ifdef EBADF C(EBADF); #endif #ifdef EBADMSG C(EBADMSG); #endif #ifdef EBUSY C(EBUSY); #endif #ifdef ECANCELED C(ECANCELED); #endif #ifdef ECHILD C(ECHILD); #endif #ifdef ECONNABORTED C(ECONNABORTED); #endif #ifdef ECONNREFUSED C(ECONNREFUSED); #endif #ifdef ECONNRESET C(ECONNRESET); #endif #ifdef EDEADLK C(EDEADLK); #endif #ifdef EDESTADDRREQ C(EDESTADDRREQ); #endif #ifdef EDOM C(EDOM); #endif #ifdef EDQUOT C(EDQUOT); #endif #ifdef EEXIST C(EEXIST); #endif #ifdef EFAULT C(EFAULT); #endif #ifdef EFBIG C(EFBIG); #endif #ifdef EHOSTUNREACH C(EHOSTUNREACH); #endif #ifdef EIDRM C(EIDRM); #endif #ifdef EILSEQ C(EILSEQ); #endif #ifdef EINPROGRESS C(EINPROGRESS); #endif #ifdef EINTR C(EINTR); #endif #ifdef EINVAL C(EINVAL); #endif #ifdef EIO C(EIO); #endif #ifdef EISCONN C(EISCONN); #endif #ifdef EISDIR C(EISDIR); #endif #ifdef ELOOP C(ELOOP); #endif #ifdef EMFILE C(EMFILE); #endif #ifdef EMLINK C(EMLINK); #endif #ifdef EMSGSIZE C(EMSGSIZE); #endif #ifdef EMULTIHOP C(EMULTIHOP); #endif #ifdef ENAMETOOLONG C(ENAMETOOLONG); #endif #ifdef ENETDOWN C(ENETDOWN); #endif #ifdef ENETRESET C(ENETRESET); #endif #ifdef ENETUNREACH C(ENETUNREACH); #endif #ifdef ENFILE C(ENFILE); #endif #ifdef ENOBUFS C(ENOBUFS); #endif #ifdef ENODATA C(ENODATA); #endif #ifdef ENODEV C(ENODEV); #endif #ifdef ENOENT C(ENOENT); #endif #ifdef ENOEXEC C(ENOEXEC); #endif #ifdef ENOLCK C(ENOLCK); #endif #ifdef ENOLINK C(ENOLINK); #endif #ifdef ENOMEM C(ENOMEM); #endif #ifdef ENOMSG C(ENOMSG); #endif #ifdef ENOPROTOOPT C(ENOPROTOOPT); #endif #ifdef ENOSPC C(ENOSPC); #endif #ifdef ENOSR C(ENOSR); #endif #ifdef ENOSTR C(ENOSTR); #endif #ifdef ENOSYS C(ENOSYS); #endif #ifdef ENOTCONN C(ENOTCONN); #endif #ifdef ENOTDIR C(ENOTDIR); #endif #ifdef ENOTEMPTY C(ENOTEMPTY); #endif #ifdef ENOTRECOVERABLE C(ENOTRECOVERABLE); #endif #ifdef ENOTSOCK C(ENOTSOCK); #endif #ifdef ENOTSUP C(ENOTSUP); #endif #ifdef ENOTTY C(ENOTTY); #endif #ifdef ENXIO C(ENXIO); #endif #ifdef EOPNOTSUPP C(EOPNOTSUPP); #endif #ifdef EOVERFLOW C(EOVERFLOW); #endif #ifdef EOWNERDEAD C(EOWNERDEAD); #endif #ifdef EPERM C(EPERM); #endif #ifdef EPIPE C(EPIPE); #endif #ifdef EPROTO C(EPROTO); #endif #ifdef EPROTONOSUPPORT C(EPROTONOSUPPORT); #endif #ifdef EPROTOTYPE C(EPROTOTYPE); #endif #ifdef ERANGE C(ERANGE); #endif #ifdef EROFS C(EROFS); #endif #ifdef ESPIPE C(ESPIPE); #endif #ifdef ESRCH C(ESRCH); #endif #ifdef ESTALE C(ESTALE); #endif #ifdef ETIME C(ETIME); #endif #ifdef ETIMEDOUT C(ETIMEDOUT); #endif #ifdef ETXTBSY C(ETXTBSY); #endif #ifdef EWOULDBLOCK C(EWOULDBLOCK); #endif #ifdef EXDEV C(EXDEV); #endif #undef C return nullptr; } } // namespace SafeStrError::SafeStrError(int errnum) { result_ = TryMapErrno(errnum); if (result_ == nullptr) { snprintf(buf_, sizeof(buf_), "errno %d", errnum); result_ = buf_; } } } // namespace tcmalloc