@ -13,9 +13,12 @@
// limitations under the License.
# include "absl/status/status.h"
# include <errno.h>
# include <cassert>
# include "absl/base/internal/raw_logging.h"
# include "absl/base/internal/strerror.h"
# include "absl/debugging/stacktrace.h"
# include "absl/debugging/symbolize.h"
# include "absl/status/status_payload_printer.h"
@ -443,5 +446,158 @@ bool IsUnknown(const Status& status) {
return status . code ( ) = = absl : : StatusCode : : kUnknown ;
}
StatusCode ErrnoToStatusCode ( int error_number ) {
switch ( error_number ) {
case 0 :
return StatusCode : : kOk ;
case EINVAL : // Invalid argument
case ENAMETOOLONG : // Filename too long
case E2BIG : // Argument list too long
case EDESTADDRREQ : // Destination address required
case EDOM : // Mathematics argument out of domain of function
case EFAULT : // Bad address
case EILSEQ : // Illegal byte sequence
case ENOPROTOOPT : // Protocol not available
case ENOSTR : // Not a STREAM
case ENOTSOCK : // Not a socket
case ENOTTY : // Inappropriate I/O control operation
case EPROTOTYPE : // Protocol wrong type for socket
case ESPIPE : // Invalid seek
return StatusCode : : kInvalidArgument ;
case ETIMEDOUT : // Connection timed out
case ETIME : // Timer expired
return StatusCode : : kDeadlineExceeded ;
case ENODEV : // No such device
case ENOENT : // No such file or directory
# ifdef ENOMEDIUM
case ENOMEDIUM : // No medium found
# endif
case ENXIO : // No such device or address
case ESRCH : // No such process
return StatusCode : : kNotFound ;
case EEXIST : // File exists
case EADDRNOTAVAIL : // Address not available
case EALREADY : // Connection already in progress
# ifdef ENOTUNIQ
case ENOTUNIQ : // Name not unique on network
# endif
return StatusCode : : kAlreadyExists ;
case EPERM : // Operation not permitted
case EACCES : // Permission denied
# ifdef ENOKEY
case ENOKEY : // Required key not available
# endif
case EROFS : // Read only file system
return StatusCode : : kPermissionDenied ;
case ENOTEMPTY : // Directory not empty
case EISDIR : // Is a directory
case ENOTDIR : // Not a directory
case EADDRINUSE : // Address already in use
case EBADF : // Invalid file descriptor
# ifdef EBADFD
case EBADFD : // File descriptor in bad state
# endif
case EBUSY : // Device or resource busy
case ECHILD : // No child processes
case EISCONN : // Socket is connected
# ifdef EISNAM
case EISNAM : // Is a named type file
# endif
# ifdef ENOTBLK
case ENOTBLK : // Block device required
# endif
case ENOTCONN : // The socket is not connected
case EPIPE : // Broken pipe
# ifdef ESHUTDOWN
case ESHUTDOWN : // Cannot send after transport endpoint shutdown
# endif
case ETXTBSY : // Text file busy
# ifdef EUNATCH
case EUNATCH : // Protocol driver not attached
# endif
return StatusCode : : kFailedPrecondition ;
case ENOSPC : // No space left on device
# ifdef EDQUOT
case EDQUOT : // Disk quota exceeded
# endif
case EMFILE : // Too many open files
case EMLINK : // Too many links
case ENFILE : // Too many open files in system
case ENOBUFS : // No buffer space available
case ENODATA : // No message is available on the STREAM read queue
case ENOMEM : // Not enough space
case ENOSR : // No STREAM resources
# ifdef EUSERS
case EUSERS : // Too many users
# endif
return StatusCode : : kResourceExhausted ;
# ifdef ECHRNG
case ECHRNG : // Channel number out of range
# endif
case EFBIG : // File too large
case EOVERFLOW : // Value too large to be stored in data type
case ERANGE : // Result too large
return StatusCode : : kOutOfRange ;
# ifdef ENOPKG
case ENOPKG : // Package not installed
# endif
case ENOSYS : // Function not implemented
case ENOTSUP : // Operation not supported
case EAFNOSUPPORT : // Address family not supported
# ifdef EPFNOSUPPORT
case EPFNOSUPPORT : // Protocol family not supported
# endif
case EPROTONOSUPPORT : // Protocol not supported
# ifdef ESOCKTNOSUPPORT
case ESOCKTNOSUPPORT : // Socket type not supported
# endif
case EXDEV : // Improper link
return StatusCode : : kUnimplemented ;
case EAGAIN : // Resource temporarily unavailable
# ifdef ECOMM
case ECOMM : // Communication error on send
# endif
case ECONNREFUSED : // Connection refused
case ECONNABORTED : // Connection aborted
case ECONNRESET : // Connection reset
case EINTR : // Interrupted function call
# ifdef EHOSTDOWN
case EHOSTDOWN : // Host is down
# endif
case EHOSTUNREACH : // Host is unreachable
case ENETDOWN : // Network is down
case ENETRESET : // Connection aborted by network
case ENETUNREACH : // Network unreachable
case ENOLCK : // No locks available
case ENOLINK : // Link has been severed
# ifdef ENONET
case ENONET : // Machine is not on the network
# endif
return StatusCode : : kUnavailable ;
case EDEADLK : // Resource deadlock avoided
# ifdef ESTALE
case ESTALE : // Stale file handle
# endif
return StatusCode : : kAborted ;
case ECANCELED : // Operation cancelled
return StatusCode : : kCancelled ;
default :
return StatusCode : : kUnknown ;
}
}
namespace {
std : : string MessageForErrnoToStatus ( int error_number ,
absl : : string_view message ) {
return absl : : StrCat ( message , " : " ,
absl : : base_internal : : StrError ( error_number ) ) ;
}
} // namespace
Status ErrnoToStatus ( int error_number , absl : : string_view message ) {
return Status ( ErrnoToStatusCode ( error_number ) ,
MessageForErrnoToStatus ( error_number , message ) ) ;
}
ABSL_NAMESPACE_END
} // namespace absl