Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

365 lines
20 KiB
C

/*H********************************************************************************/
/*!
\File dirtyerrunix.c
\Description
Dirtysock debug error routines.
\Copyright
Copyright (c) 2005 Electronic Arts Inc.
\Version 10/04/2005 (jbrookes) First Version
*/
/********************************************************************************H*/
/*** Include files ****************************************************************/
#include <errno.h> // included so we know where to find network headers
#include "DirtySDK/dirtysock.h"
#include "DirtySDK/dirtysock/dirtyerr.h"
#if defined(DIRTYCODE_APPLEIOS) || defined(DIRTYCODE_APPLEOSX)
#include <Security/SecBase.h>
#include <Security/SecureTransport.h>
#endif
/*** Defines **********************************************************************/
/*** Type Definitions *************************************************************/
/*** Variables ********************************************************************/
#if DIRTYSOCK_ERRORNAMES
static DirtyErrT _DirtyErr_List[] =
{
DIRTYSOCK_ErrorName(EPERM), // 1 Operation not permitted
DIRTYSOCK_ErrorName(ENOENT), // 2 No such file or directory
DIRTYSOCK_ErrorName(ESRCH), // 3 No such process
DIRTYSOCK_ErrorName(EINTR), // 4 Interrupted system call
DIRTYSOCK_ErrorName(EIO), // 5 I/O error
DIRTYSOCK_ErrorName(ENXIO), // 6 No such device or address
DIRTYSOCK_ErrorName(E2BIG), // 7 Arg list too long
DIRTYSOCK_ErrorName(ENOEXEC), // 8 Exec format error
DIRTYSOCK_ErrorName(EBADF), // 9 Bad file number
DIRTYSOCK_ErrorName(ECHILD), // 10 No child processes
//DIRTYSOCK_ErrorName(EAGAIN), // 11 Try again
DIRTYSOCK_ErrorName(EWOULDBLOCK), // 11 Operation would block
DIRTYSOCK_ErrorName(ENOMEM), // 12 Out of memory
DIRTYSOCK_ErrorName(EACCES), // 13 Permission denied
DIRTYSOCK_ErrorName(EFAULT), // 14 Bad address
DIRTYSOCK_ErrorName(ENOTBLK), // 15 Block device required
DIRTYSOCK_ErrorName(EBUSY), // 16 Device or resource busy
DIRTYSOCK_ErrorName(EEXIST), // 17 File exists
DIRTYSOCK_ErrorName(EXDEV), // 18 Cross-device link
DIRTYSOCK_ErrorName(ENODEV), // 19 No such device
DIRTYSOCK_ErrorName(ENOTDIR), // 20 Not a directory
DIRTYSOCK_ErrorName(EISDIR), // 21 Is a directory
DIRTYSOCK_ErrorName(EINVAL), // 22 Invalid argument
DIRTYSOCK_ErrorName(ENFILE), // 23 File table overflow
DIRTYSOCK_ErrorName(EMFILE), // 24 Too many open files
DIRTYSOCK_ErrorName(ENOTTY), // 25 Not a typewriter
DIRTYSOCK_ErrorName(ETXTBSY), // 26 Text file busy
DIRTYSOCK_ErrorName(EFBIG), // 27 File too large
DIRTYSOCK_ErrorName(ENOSPC), // 28 No space left on device
DIRTYSOCK_ErrorName(ESPIPE), // 29 Illegal seek
DIRTYSOCK_ErrorName(EROFS), // 30 Read-only file system
DIRTYSOCK_ErrorName(EMLINK), // 31 Too many links
DIRTYSOCK_ErrorName(EPIPE), // 32 Broken pipe
DIRTYSOCK_ErrorName(EDOM), // 33 Math argument out of domain of func
DIRTYSOCK_ErrorName(ERANGE), // 34 Math result not representable
DIRTYSOCK_ErrorName(EDEADLK), // 35 Resource deadlock would occur
DIRTYSOCK_ErrorName(ENAMETOOLONG), // 36 File name too long
DIRTYSOCK_ErrorName(ENOLCK), // 37 No record locks available
DIRTYSOCK_ErrorName(ENOSYS), // 38 Function not implemented
DIRTYSOCK_ErrorName(ENOTEMPTY), // 39 Directory not empty
DIRTYSOCK_ErrorName(ELOOP), // 40 Too many symbolic links encountered
DIRTYSOCK_ErrorName(ENOMSG), // 42 No message of desired type
DIRTYSOCK_ErrorName(EIDRM), // 43 Identifier removed
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(ECHRNG), // 44 Channel number out of range
DIRTYSOCK_ErrorName(EL2NSYNC), // 45 Level 2 not synchronized
DIRTYSOCK_ErrorName(EL3HLT), // 46 Level 3 halted
DIRTYSOCK_ErrorName(EL3RST), // 47 Level 3 reset
DIRTYSOCK_ErrorName(ELNRNG), // 48 Link number out of range
DIRTYSOCK_ErrorName(EUNATCH), // 49 Protocol driver not attached
DIRTYSOCK_ErrorName(ENOCSI), // 50 No CSI structure available
DIRTYSOCK_ErrorName(EL2HLT), // 51 Level 2 halted
DIRTYSOCK_ErrorName(EBADE), // 52 Invalid exchange
DIRTYSOCK_ErrorName(EBADR), // 53 Invalid request descriptor
DIRTYSOCK_ErrorName(EXFULL), // 54 Exchange full
DIRTYSOCK_ErrorName(ENOANO), // 55 No anode
DIRTYSOCK_ErrorName(EBADRQC), // 56 Invalid request code
DIRTYSOCK_ErrorName(EBADSLT), // 57 Invalid slot
DIRTYSOCK_ErrorName(EDEADLOCK), // 58 File locking deadlock error
DIRTYSOCK_ErrorName(EBFONT), // 59 Bad font file format
#endif
DIRTYSOCK_ErrorName(ENOSTR), // 60 Device not a stream
DIRTYSOCK_ErrorName(ENODATA), // 61 No data available
DIRTYSOCK_ErrorName(ETIME), // 62 Timer expired
DIRTYSOCK_ErrorName(ENOSR), // 63 Out of streams resources
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(ENONET), // 64 Machine is not on the network
DIRTYSOCK_ErrorName(ENOPKG), // 65 Package not installed
#endif
DIRTYSOCK_ErrorName(EREMOTE), // 66 Object is remote
DIRTYSOCK_ErrorName(ENOLINK), // 67 Link has been severed
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(EADV), // 68 Advertise error
DIRTYSOCK_ErrorName(ESRMNT), // 69 Srmount error
DIRTYSOCK_ErrorName(ECOMM), // 70 Communication error on send
#endif
DIRTYSOCK_ErrorName(EPROTO), // 71 Protocol error
DIRTYSOCK_ErrorName(EMULTIHOP), // 72 Multihop attempted
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(EDOTDOT), // 73 RFS specific error
#endif
DIRTYSOCK_ErrorName(EBADMSG), // 74 Not a data message
DIRTYSOCK_ErrorName(EOVERFLOW), // 75 Value too large for defined data type
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(ENOTUNIQ), // 76 Name not unique on network
DIRTYSOCK_ErrorName(EBADFD), // 77 File descriptor in bad state
DIRTYSOCK_ErrorName(EREMCHG), // 78 Remote address changed
DIRTYSOCK_ErrorName(ELIBACC), // 79 Can not access a needed shared library
DIRTYSOCK_ErrorName(ELIBBAD), // 80 Accessing a corrupted shared library
DIRTYSOCK_ErrorName(ELIBSCN), // 81 .lib section in a.out corrupted
DIRTYSOCK_ErrorName(ELIBMAX), // 82 Attempting to link in too many shared libraries
DIRTYSOCK_ErrorName(ELIBEXEC), // 83 Cannot exec a shared library directly
#endif
DIRTYSOCK_ErrorName(EILSEQ), // 84 Illegal byte sequence
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(ERESTART), // 85 Interrupted system call should be restarted
DIRTYSOCK_ErrorName(ESTRPIPE), // 86 Streams pipe error
#endif
DIRTYSOCK_ErrorName(EUSERS), // 87 Too many users
DIRTYSOCK_ErrorName(ENOTSOCK), // 88 Socket operation on non-socket
DIRTYSOCK_ErrorName(EDESTADDRREQ), // 89 Destination address required
DIRTYSOCK_ErrorName(EMSGSIZE), // 90 Message too long
DIRTYSOCK_ErrorName(EPROTOTYPE), // 91 Protocol wrong type for socket
DIRTYSOCK_ErrorName(ENOPROTOOPT), // 92 Protocol not available
DIRTYSOCK_ErrorName(EPROTONOSUPPORT), // 93 Protocol not supported
DIRTYSOCK_ErrorName(ESOCKTNOSUPPORT), // 94 Socket type not supported
DIRTYSOCK_ErrorName(EOPNOTSUPP), // 95 Operation not supported on transport endpoint
DIRTYSOCK_ErrorName(EPFNOSUPPORT), // 96 Protocol family not supported
DIRTYSOCK_ErrorName(EAFNOSUPPORT), // 97 Address family not supported by protocol
DIRTYSOCK_ErrorName(EADDRINUSE), // 98 Address already in use
DIRTYSOCK_ErrorName(EADDRNOTAVAIL), // 99 Cannot assign requested address
DIRTYSOCK_ErrorName(ENETDOWN), // 100 Network is down
DIRTYSOCK_ErrorName(ENETUNREACH), // 101 Network is unreachable
DIRTYSOCK_ErrorName(ENETRESET), // 102 Network dropped connection because of reset
DIRTYSOCK_ErrorName(ECONNABORTED), // 103 Software caused connection abort
DIRTYSOCK_ErrorName(ECONNRESET), // 104 Connection reset by peer
DIRTYSOCK_ErrorName(ENOBUFS), // 105 No buffer space available
DIRTYSOCK_ErrorName(EISCONN), // 106 Transport endpoint is already connected
DIRTYSOCK_ErrorName(ENOTCONN), // 107 Transport endpoint is not connected
DIRTYSOCK_ErrorName(ESHUTDOWN), // 108 Cannot send after transport endpoint shutdown
DIRTYSOCK_ErrorName(ETOOMANYREFS), // 109 Too many references: cannot splice
DIRTYSOCK_ErrorName(ETIMEDOUT), // 110 Connection timed out
DIRTYSOCK_ErrorName(ECONNREFUSED), // 111 Connection refused
DIRTYSOCK_ErrorName(EHOSTDOWN), // 112 Host is down
DIRTYSOCK_ErrorName(EHOSTUNREACH), // 113 No route to host
DIRTYSOCK_ErrorName(EALREADY), // 114 Operation already in progress
DIRTYSOCK_ErrorName(EINPROGRESS), // 115 Operation now in progress
DIRTYSOCK_ErrorName(ESTALE), // 116 Stale NFS file handle
#if defined(DIRTYCODE_LINUX)
DIRTYSOCK_ErrorName(EUCLEAN), // 117 Structure needs cleaning
DIRTYSOCK_ErrorName(ENOTNAM), // 118 Not a XENIX named type file
DIRTYSOCK_ErrorName(ENAVAIL), // 119 No XENIX semaphores available
DIRTYSOCK_ErrorName(EISNAM), // 120 Is a named type file
DIRTYSOCK_ErrorName(EREMOTEIO), // 121 Remote I/O error
#endif
DIRTYSOCK_ErrorName(EDQUOT), // 122 Quota exceeded
#if defined(DIRTYCODE_APPLEIOS) || defined(DIRTYCODE_APPLEOSX)
DIRTYSOCK_ErrorName(errSecUnimplemented), // -4 Function or operation not implemented.
DIRTYSOCK_ErrorName(errSecIO), // -35 I/O error (bummers)
DIRTYSOCK_ErrorName(errSecParam), // -50 One or more parameters passed to a function were not valid.
DIRTYSOCK_ErrorName(errSecAllocate), // -108 Failed to allocate memory.
DIRTYSOCK_ErrorName(errSecUserCanceled), // -128 User canceled the operation.
DIRTYSOCK_ErrorName(errSecBadReq), // -909 Bad parameter or invalid state for operation.
DIRTYSOCK_ErrorName(errSSLProtocol), // -9800 SSL protocol error
DIRTYSOCK_ErrorName(errSSLNegotiation), // -9801 Cipher Suite negotiation failure
DIRTYSOCK_ErrorName(errSSLFatalAlert), // -9802 Fatal alert
DIRTYSOCK_ErrorName(errSSLWouldBlock), // -9803 I/O would block (not fatal)
DIRTYSOCK_ErrorName(errSSLSessionNotFound), // -9804 attempt to restore an unknown session
DIRTYSOCK_ErrorName(errSSLClosedGraceful), // -9805 connection closed gracefully
DIRTYSOCK_ErrorName(errSSLClosedAbort), // -9806 connection closed via error
DIRTYSOCK_ErrorName(errSSLXCertChainInvalid), // -9806 invalid certificate chain
DIRTYSOCK_ErrorName(errSSLBadCert), // -9808 bad certificate format
DIRTYSOCK_ErrorName(errSSLCrypto), // -9809 underlying cryptographic error
DIRTYSOCK_ErrorName(errSSLInternal), // -9810 Internal error
DIRTYSOCK_ErrorName(errSSLModuleAttach), // -9811 module attach failure
DIRTYSOCK_ErrorName(errSSLUnknownRootCert), // -9812 valid cert chain, untrusted root
DIRTYSOCK_ErrorName(errSSLNoRootCert), // -9813 cert chain not verified by root
DIRTYSOCK_ErrorName(errSSLCertExpired), // -9814 chain had an expired cert
DIRTYSOCK_ErrorName(errSSLCertNotYetValid), // -9815 chain had a cert not yet valid
DIRTYSOCK_ErrorName(errSSLClosedNoNotify), // -9816 server closed session with no notification
DIRTYSOCK_ErrorName(errSSLBufferOverflow), // -9817 insufficient buffer provided
DIRTYSOCK_ErrorName(errSSLBadCipherSuite), // -9818 bad SSLCipherSuite
DIRTYSOCK_ErrorName(errSSLPeerUnexpectedMsg), // -9819 unexpected message received
DIRTYSOCK_ErrorName(errSSLPeerBadRecordMac), // -9820 bad MAC
DIRTYSOCK_ErrorName(errSSLPeerDecryptionFail), // -9821 decryption failed
DIRTYSOCK_ErrorName(errSSLPeerRecordOverflow), // -9822 record overflow
DIRTYSOCK_ErrorName(errSSLPeerDecompressFail), // -9823 decompression failure
DIRTYSOCK_ErrorName(errSSLPeerHandshakeFail), // -9824 handshake failure
DIRTYSOCK_ErrorName(errSSLPeerBadCert), // -9825 misc. bad certificate
DIRTYSOCK_ErrorName(errSSLPeerUnsupportedCert), // -9826 bad unsupported cert format
DIRTYSOCK_ErrorName(errSSLPeerCertRevoked), // -9827 certificate revoked
DIRTYSOCK_ErrorName(errSSLPeerCertExpired), // -9828 certificate expired
DIRTYSOCK_ErrorName(errSSLPeerCertUnknown), // -9829 unknown certificate
DIRTYSOCK_ErrorName(errSSLIllegalParam), // -9830 illegal parameter
DIRTYSOCK_ErrorName(errSSLPeerUnknownCA), // -9831 unknown Cert Authority
DIRTYSOCK_ErrorName(errSSLPeerAccessDenied), // -9832 access denied
DIRTYSOCK_ErrorName(errSSLPeerDecodeError), // -9833 decoding error
DIRTYSOCK_ErrorName(errSSLPeerDecryptError), // -9834 decryption error
DIRTYSOCK_ErrorName(errSSLPeerExportRestriction), // -9835 export restriction
DIRTYSOCK_ErrorName(errSSLPeerProtocolVersion), // -9836 bad protocol version
DIRTYSOCK_ErrorName(errSSLPeerInsufficientSecurity),// -9837 insufficient security
DIRTYSOCK_ErrorName(errSSLPeerInternalError), // -9838 internal error
DIRTYSOCK_ErrorName(errSSLPeerUserCancelled), // -9839 user canceled
DIRTYSOCK_ErrorName(errSSLPeerNoRenegotiation), // -9840 no renegotiation allowed
DIRTYSOCK_ErrorName(errSSLPeerAuthCompleted), // -9841 peer cert is valid, or was ignored if verification disabled
DIRTYSOCK_ErrorName(errSSLClientCertRequested), // -9842 server has requested a client cert
DIRTYSOCK_ErrorName(errSSLHostNameMismatch), // -9843 peer host name mismatch
DIRTYSOCK_ErrorName(errSSLConnectionRefused), // -9844 peer dropped connection before responding
DIRTYSOCK_ErrorName(errSSLDecryptionFail), // -9845 decryption failure
DIRTYSOCK_ErrorName(errSSLBadRecordMac), // -9846 bad MAC
DIRTYSOCK_ErrorName(errSSLRecordOverflow), // -9847 record overflow
DIRTYSOCK_ErrorName(errSSLBadConfiguration), // -9848 configuration error
DIRTYSOCK_ErrorName(errSSLUnexpectedRecord), // -9849 unexpected (skipped) record in DTLS
DIRTYSOCK_ErrorName(errSSLWeakPeerEphemeralDHKey), // -9850 weak ephemeral dh key
DIRTYSOCK_ErrorName(errSSLClientHelloReceived), // -9851 SNI
DIRTYSOCK_ErrorName(errSecNotAvailable), // -25291 No keychain is available. You may need to restart your computer.
DIRTYSOCK_ErrorName(errSecAuthFailed), // -25293 The user name or passphrase you entered is not correct.
DIRTYSOCK_ErrorName(errSecDuplicateItem), // -25299 The specified item already exists in the keychain.
DIRTYSOCK_ErrorName(errSecItemNotFound), // -25300 The specified item could not be found in the keychain.
DIRTYSOCK_ErrorName(errSecInteractionNotAllowed), // -25308 User interaction is not allowed.
DIRTYSOCK_ErrorName(errSecDecode), // -26275 Unable to decode the provided data.
DIRTYSOCK_ErrorName(errSecVerifyFailed), // -67808 A cryptographic verification failure has occured.
#endif
// NULL terminate
DIRTYSOCK_ListEnd()
};
#endif
/*** Private Functions ************************************************************/
/*** Public functions *************************************************************/
/*F********************************************************************************/
/*!
\Function DirtyErrNameList
\Description
This function takes as input a system-specific error code, and either
resolves it to its define name if it is recognized or formats it as a hex
number if not.
\Input *pBuffer - [out] pointer to output buffer to store result
\Input iBufSize - size of output buffer
\Input uError - error code to format
\Input *pList - error list to use
\Version 10/04/2005 (jbrookes)
*/
/********************************************************************************F*/
void DirtyErrNameList(char *pBuffer, int32_t iBufSize, uint32_t uError, const DirtyErrT *pList)
{
#if DIRTYSOCK_ERRORNAMES
int32_t iErr;
for (iErr = 0; pList[iErr].uError != DIRTYSOCK_LISTTERM; iErr++)
{
if (pList[iErr].uError == uError)
{
ds_strnzcpy(pBuffer, pList[iErr].pErrorName, iBufSize);
return;
}
}
#endif
ds_snzprintf(pBuffer, iBufSize, "0x%08x", uError);
}
/*F********************************************************************************/
/*!
\Function DirtyErrName
\Description
This function takes as input a system-specific error code, and either
resolves it to its define name if it is recognized or formats it as a hex
number if not.
\Input *pBuffer - [out] pointer to output buffer to store result
\Input iBufSize - size of output buffer
\Input uError - error code to format
\Version 10/04/2005 (jbrookes)
*/
/********************************************************************************F*/
void DirtyErrName(char *pBuffer, int32_t iBufSize, uint32_t uError)
{
#if DIRTYSOCK_ERRORNAMES
DirtyErrNameList(pBuffer, iBufSize, uError, _DirtyErr_List);
#endif
}
/*F********************************************************************************/
/*!
\Function DirtyErrGetNameList
\Description
This function takes as input a system-specific error code, and either
resolves it to its define name if it is recognized or formats it as a hex
number if not.
\Input uError - error code to format
\Input *pList - error list to use
\Output
const char *- pointer to error name or error formatted in hex
\Version 10/04/2005 (jbrookes)
*/
/********************************************************************************F*/
const char *DirtyErrGetNameList(uint32_t uError, const DirtyErrT *pList)
{
static char strName[8][64];
static uint8_t uLast = 0;
char *pName = strName[uLast++];
if (uLast > 7) uLast = 0;
DirtyErrNameList(pName, sizeof(strName[0]), uError, pList);
return(pName);
}
/*F********************************************************************************/
/*!
\Function DirtyErrGetName
\Description
This function takes as input a system-specific error code, and either
resolves it to its define name if it is recognized or formats it as a hex
number if not.
\Input uError - error code to format
\Output
const char *- pointer to error name or error formatted in hex
\Version 10/04/2005 (jbrookes)
*/
/********************************************************************************F*/
const char *DirtyErrGetName(uint32_t uError)
{
static char strName[64];
DirtyErrName(strName, sizeof(strName), uError);
return(strName);
}