1 2 3 #define BUILDING_HAIKU_ERROR_MAPPER 1 4 #include <BeOSBuildCompatibility.h> 5 6 #include <errno.h> 7 #include <string.h> 8 9 #include <map> 10 11 using namespace std; 12 13 static map<int, int> sToHaikuErrorMap; 14 static map<int, int> sToHostErrorMap; 15 static bool sErrorMapsInitialized = false; 16 17 // init_error_map 18 static void 19 init_error_map() 20 { 21 if (sErrorMapsInitialized) 22 return; 23 24 #define ADD_ERROR(error) \ 25 sToHaikuErrorMap[error] = HAIKU_##error; \ 26 sToHostErrorMap[HAIKU_##error] = error; 27 28 ADD_ERROR(E2BIG); 29 ADD_ERROR(ECHILD); 30 ADD_ERROR(EDEADLK); 31 ADD_ERROR(EFBIG); 32 ADD_ERROR(EMLINK); 33 ADD_ERROR(ENFILE); 34 ADD_ERROR(ENODEV); 35 ADD_ERROR(ENOLCK); 36 ADD_ERROR(ENOSYS); 37 ADD_ERROR(ENOTTY); 38 ADD_ERROR(ENXIO); 39 ADD_ERROR(ESPIPE); 40 ADD_ERROR(ESRCH); 41 #ifdef EFPOS 42 ADD_ERROR(EFPOS); 43 #endif 44 #ifdef ESIGPARM 45 ADD_ERROR(ESIGPARM); 46 #endif 47 ADD_ERROR(EDOM); 48 ADD_ERROR(ERANGE); 49 ADD_ERROR(EPROTOTYPE); 50 ADD_ERROR(EPROTONOSUPPORT); 51 ADD_ERROR(EPFNOSUPPORT); 52 ADD_ERROR(EAFNOSUPPORT); 53 ADD_ERROR(EADDRINUSE); 54 ADD_ERROR(EADDRNOTAVAIL); 55 ADD_ERROR(ENETDOWN); 56 ADD_ERROR(ENETUNREACH); 57 ADD_ERROR(ENETRESET); 58 ADD_ERROR(ECONNABORTED); 59 ADD_ERROR(ECONNRESET); 60 ADD_ERROR(EISCONN); 61 ADD_ERROR(ENOTCONN); 62 ADD_ERROR(ESHUTDOWN); 63 ADD_ERROR(ECONNREFUSED); 64 ADD_ERROR(EHOSTUNREACH); 65 ADD_ERROR(ENOPROTOOPT); 66 ADD_ERROR(ENOBUFS); 67 ADD_ERROR(EINPROGRESS); 68 ADD_ERROR(EALREADY); 69 ADD_ERROR(EILSEQ); 70 ADD_ERROR(ENOMSG); 71 ADD_ERROR(ESTALE); 72 ADD_ERROR(EOVERFLOW); 73 ADD_ERROR(EMSGSIZE); 74 ADD_ERROR(EOPNOTSUPP); 75 ADD_ERROR(ENOTSOCK); 76 ADD_ERROR(EHOSTDOWN); 77 ADD_ERROR(EBADMSG); 78 ADD_ERROR(ECANCELED); 79 ADD_ERROR(EDESTADDRREQ); 80 ADD_ERROR(EDQUOT); 81 ADD_ERROR(EIDRM); 82 ADD_ERROR(EMULTIHOP); 83 ADD_ERROR(ENODATA); 84 ADD_ERROR(ENOLINK); 85 ADD_ERROR(ENOSR); 86 ADD_ERROR(ENOSTR); 87 ADD_ERROR(ENOTSUP); 88 ADD_ERROR(EPROTO); 89 ADD_ERROR(ETIME); 90 ADD_ERROR(ETXTBSY); 91 ADD_ERROR(ENOMEM); 92 ADD_ERROR(EACCES); 93 ADD_ERROR(EINTR); 94 ADD_ERROR(EIO); 95 ADD_ERROR(EBUSY); 96 ADD_ERROR(EFAULT); 97 ADD_ERROR(ETIMEDOUT); 98 ADD_ERROR(EAGAIN); 99 ADD_ERROR(EWOULDBLOCK); 100 ADD_ERROR(EBADF); 101 ADD_ERROR(EEXIST); 102 ADD_ERROR(EINVAL); 103 ADD_ERROR(ENAMETOOLONG); 104 ADD_ERROR(ENOENT); 105 ADD_ERROR(EPERM); 106 ADD_ERROR(ENOTDIR); 107 ADD_ERROR(EISDIR); 108 ADD_ERROR(ENOTEMPTY); 109 ADD_ERROR(ENOSPC); 110 ADD_ERROR(EROFS); 111 ADD_ERROR(EMFILE); 112 ADD_ERROR(EXDEV); 113 ADD_ERROR(ELOOP); 114 ADD_ERROR(ENOEXEC); 115 ADD_ERROR(EPIPE); 116 117 sErrorMapsInitialized = true; 118 } 119 120 // to_host_error 121 static int 122 to_host_error(int error) 123 { 124 init_error_map(); 125 126 map<int, int>::iterator it = sToHostErrorMap.find(error); 127 return (it != sToHostErrorMap.end() ? it->second : error); 128 } 129 130 // to_haiku_error 131 static int 132 to_haiku_error(int error) 133 { 134 init_error_map(); 135 136 map<int, int>::iterator it = sToHaikuErrorMap.find(error); 137 if (it != sToHaikuErrorMap.end()) 138 return it->second; 139 140 return (error > 0 ? -error : error); 141 } 142 143 // _haiku_build_strerror 144 char * 145 _haiku_build_strerror(int errnum) 146 { 147 return strerror(to_host_error(errnum)); 148 } 149 150 // _haiku_build_errno 151 int * 152 _haiku_build_errno() 153 { 154 static int localErrno = 0; 155 localErrno = to_haiku_error(errno); 156 return &localErrno; 157 } 158 159