blob: f5f341f300e7eb4eaa1b2632da9c0872b77957c8 [file] [log] [blame] [edit]
/* -*- 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 <errno.h>
#include <stdio.h>
#include <stdlib.h>
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