123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- #include "il2cpp-config.h"
-
- #if IL2CPP_TARGET_POSIX || IL2CPP_SUPPORT_SOCKETS_POSIX_API
-
- #include "Error.h"
- #include "utils/PathUtils.h"
-
- #include <cassert>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/stat.h>
-
- namespace il2cpp
- {
- namespace os
- {
- ErrorCode SocketErrnoToErrorCode(int32_t code)
- {
- ErrorCode result = (ErrorCode) - 1;
-
- switch (code)
- {
- case 0: result = kErrorCodeSuccess; break;
- case EACCES: result = kWSAeacces; break;
- #ifdef EADDRINUSE
- case EADDRINUSE: result = kWSAeaddrinuse; break;
- #endif
- #ifdef EAFNOSUPPORT
- case EAFNOSUPPORT: result = kWSAeafnosupport; break;
- #endif
- #if EAGAIN != EWOULDBLOCK
- case EAGAIN: result = kWSAewouldblock; break;
- #endif
- #ifdef EALREADY
- case EALREADY: result = kWSAealready; break;
- #endif
- case EBADF: result = kWSAenotsock; break;
- #ifdef ECONNABORTED
- case ECONNABORTED: result = kWSAenetdown; break;
- #endif
- #ifdef ECONNREFUSED
- case ECONNREFUSED: result = kWSAeconnrefused; break;
- #endif
- #ifdef ECONNRESET
- case ECONNRESET: result = kWSAeconnreset; break;
- #endif
- case EFAULT: result = kWSAefault; break;
- #ifdef EHOSTUNREACH
- case EHOSTUNREACH: result = kWSAehostunreach; break;
- #endif
- #ifdef EINPROGRESS
- case EINPROGRESS: result = kWSAeinprogress; break;
- #endif
- case EINTR: result = kWSAeintr; break;
- case EINVAL: result = kWSAeinval; break;
- // FIXME: case EIO: result = WSAE????; break;
- #ifdef EISCONN
- case EISCONN: result = kWSAeisconn; break;
- #endif
- // FIXME: case ELOOP: result = WSA????; break;
- case EMFILE: result = kWSAemfile; break;
- #ifdef EMSGSIZE
- case EMSGSIZE: result = kWSAemsgsize; break;
- #endif
- // FIXME: case ENAMETOOLONG: result = kWSAeacces; break;
- #ifdef ENETUNREACH
- case ENETUNREACH: result = kWSAenetunreach; break;
- #endif
- #ifdef ENOBUFS
- case ENOBUFS: result = kWSAenobufs; break;
- #endif
- // case ENOENT: result = WSAE????; break;
- case ENOMEM: result = kWSAenobufs; break;
- #ifdef ENOPROTOOPT
- case ENOPROTOOPT: result = kWSAenoprotoopt; break;
- #endif
- #ifdef ENOSR
- case ENOSR: result = kWSAenetdown; break;
- #endif
- #ifdef ENOTCONN
- case ENOTCONN: result = kWSAenotconn; break;
- #endif
- // FIXME: case ENOTDIR: result = WSAE????; break;
- #ifdef ENOTSOCK
- case ENOTSOCK: result = kWSAenotsock; break;
- #endif
- case ENOTTY: result = kWSAenotsock; break;
- #ifdef EOPNOTSUPP
- case EOPNOTSUPP: result = kWSAeopnotsupp; break;
- #endif
- case EPERM: result = kWSAeacces; break;
- case EPIPE: result = kWSAeshutdown; break;
- #ifdef EPROTONOSUPPORT
- case EPROTONOSUPPORT: result = kWSAeprotonosupport; break;
- #endif
- #if ERESTARTSYS
- case ERESTARTSYS: result = kWSAenetdown; break;
- #endif
- // FIXME: case EROFS: result = WSAE????; break;
- #ifdef ESOCKTNOSUPPORT
- case ESOCKTNOSUPPORT: result = kWSAesocktnosupport; break;
- #endif
- #ifdef ETIMEDOUT
- case ETIMEDOUT: result = kWSAetimedout; break;
- #endif
- #ifdef EWOULDBLOCK
- case EWOULDBLOCK: result = kWSAewouldblock; break;
- #endif
- #ifdef EADDRNOTAVAIL
- case EADDRNOTAVAIL: result = kWSAeaddrnotavail; break;
- #endif
- case ENOENT: result = kWSAeconnrefused; break;
- #ifdef EDESTADDRREQ
- case EDESTADDRREQ: result = kWSAedestaddrreq; break;
- #endif
- case ENODEV: result = kWSAenetdown; break;
- #ifdef EHOSTDOWN
- case EHOSTDOWN: result = kWSAehostdown; break;
- #endif
- #ifdef ENXIO
- case ENXIO: result = kWSAhostNotFound; break;
- #endif
- default:
- result = kWSAsyscallfailure;
- break;
- }
-
- return result;
- }
-
- ErrorCode FileErrnoToErrorCode(int32_t code)
- {
- ErrorCode ret;
- /* mapping ideas borrowed from wine. they may need some work */
-
- switch (code)
- {
- case EACCES: case EPERM: case EROFS:
- ret = kErrorCodeAccessDenied;
- break;
-
- case EAGAIN:
- ret = kErrorCodeSharingViolation;
- break;
-
- case EBUSY:
- ret = kErrorCodeLockViolation;
- break;
-
- case EEXIST:
- ret = kErrorCodeFileExists;
- break;
-
- case EINVAL: case ESPIPE:
- ret = kErrorSeek;
- break;
-
- case EISDIR:
- ret = kErrorCodeCannotMake;
- break;
-
- case ENFILE: case EMFILE:
- ret = kErrorCodeTooManyOpenFiles;
- break;
-
- case ENOENT: case ENOTDIR:
- ret = kErrorCodeFileNotFound;
- break;
-
- case ENOSPC:
- ret = kErrorCodeHandleDiskFull;
- break;
-
- case ENOTEMPTY:
- ret = kErrorCodeDirNotEmpty;
- break;
-
- case ENOEXEC:
- ret = kErrorBadFormat;
- break;
-
- case ENAMETOOLONG:
- ret = kErrorCodeFileNameExcedRange;
- break;
-
- #ifdef EINPROGRESS
- case EINPROGRESS:
- ret = kErrorIoPending;
- break;
- #endif
-
- case ENOSYS:
- ret = kErrorNotSupported;
- break;
-
- case EBADF:
- ret = kErrorCodeInvalidHandle;
- break;
-
- case EIO:
- ret = kErrorCodeInvalidHandle;
- break;
-
- case EINTR:
- ret = kErrorIoPending;
- break;
-
- case EPIPE:
- ret = kErrorCodeWriteFault;
- break;
-
- default:
- ret = kErrorCodeGenFailure;
- break;
- }
-
- return ret;
- }
-
- ErrorCode PathErrnoToErrorCode(const std::string& path, int32_t code)
- {
- if (code == ENOENT)
- {
- const std::string dirname(il2cpp::utils::PathUtils::DirectoryName(path));
- #if !IL2CPP_HAS_NOACCESS
- if (access(dirname.c_str(), F_OK) == 0)
- return kErrorCodeFileNotFound;
- #else
- struct stat statInfo;
- if (stat(dirname.c_str(), &statInfo) == 0 && S_ISDIR(statInfo.st_mode))
- return kErrorCodeFileNotFound;
- #endif
- else
- return kErrorCodePathNotFound;
- }
- else
- {
- return FileErrnoToErrorCode(code);
- }
- }
- }
- }
-
- #endif
|