Panda3D
|
00001 // Filename: error_utils.cxx 00002 // Created by: mike (07Nov00) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 00016 #include "error_utils.h" 00017 #include "config_express.h" 00018 00019 #include <errno.h> 00020 #include <stdio.h> 00021 00022 #if defined(WIN32_VC) || defined(WIN64_VC) 00023 #include <winsock2.h> 00024 #endif 00025 00026 //////////////////////////////////////////////////////////////////// 00027 // Function: error_to_text 00028 // Description: 00029 //////////////////////////////////////////////////////////////////// 00030 string error_to_text(ErrorUtilCode err) { 00031 const char *errmsg = "Unknown error"; 00032 00033 switch (err) { 00034 case EU_http_redirect: 00035 errmsg = "EU_http_redirect"; 00036 break; 00037 case EU_eof: 00038 errmsg = "EU_eof"; 00039 break; 00040 case EU_network_no_data: 00041 errmsg = "EU_network_no_data"; 00042 break; 00043 case EU_ok: 00044 errmsg = "EU_ok"; 00045 break; 00046 case EU_write: 00047 errmsg = "EU_write"; 00048 break; 00049 case EU_success: 00050 errmsg = "EU_success"; 00051 break; 00052 case EU_error_abort: 00053 errmsg = "EU_error_abort"; 00054 break; 00055 case EU_error_file_empty: 00056 errmsg = "EU_error_file_empty"; 00057 break; 00058 case EU_error_file_invalid: 00059 errmsg = "EU_error_file_invalid"; 00060 break; 00061 case EU_error_invalid_checksum: 00062 errmsg = "EU_error_invalid_checksum"; 00063 break; 00064 case EU_error_network_dead: 00065 errmsg = "EU_error_network_dead"; 00066 break; 00067 case EU_error_network_unreachable: 00068 errmsg = "EU_error_network_unreachable"; 00069 break; 00070 case EU_error_network_disconnected: 00071 errmsg = "EU_error_network_disconnected"; 00072 break; 00073 case EU_error_network_timeout: 00074 errmsg = "EU_error_network_timeout"; 00075 break; 00076 case EU_error_network_no_data: 00077 errmsg = "EU_error_network_no_data"; 00078 break; 00079 case EU_error_network_disconnected_locally: 00080 errmsg = "EU_error_network_disconnected_locally"; 00081 break; 00082 case EU_error_network_buffer_overflow: 00083 errmsg = "EU_error_network_buffer_overflow"; 00084 break; 00085 case EU_error_network_disk_quota_exceeded: 00086 errmsg = "EU_error_network_disk_quota_exceeded"; 00087 break; 00088 case EU_error_network_remote_host_disconnected: 00089 errmsg = "EU_error_network_remote_host_disconnected"; 00090 break; 00091 case EU_error_network_remote_host_down: 00092 errmsg = "EU_error_network_remote_host_down"; 00093 break; 00094 case EU_error_network_remote_host_unreachable: 00095 errmsg = "EU_error_network_remote_host_unreachable"; 00096 break; 00097 case EU_error_network_remote_host_not_found: 00098 errmsg = "EU_error_network_remote_host_not_found"; 00099 break; 00100 case EU_error_network_remote_host_no_response: 00101 errmsg = "EU_error_network_remote_host_no_response"; 00102 break; 00103 case EU_error_write_out_of_files: 00104 errmsg = "EU_error_write_out_of_files"; 00105 break; 00106 case EU_error_write_out_of_memory: 00107 errmsg = "EU_error_write_out_of_memory"; 00108 break; 00109 case EU_error_write_sharing_violation: 00110 errmsg = "EU_error_write_sharing_violation"; 00111 break; 00112 case EU_error_write_disk_full: 00113 errmsg = "EU_error_write_disk_full"; 00114 break; 00115 case EU_error_write_disk_not_found: 00116 errmsg = "EU_error_write_disk_not_found"; 00117 break; 00118 case EU_error_write_disk_sector_not_found: 00119 errmsg = "EU_error_write_disk_sector_not_found"; 00120 break; 00121 case EU_error_write_disk_fault: 00122 errmsg = "EU_error_write_disk_fault"; 00123 break; 00124 case EU_error_write_file_rename: 00125 errmsg = "EU_error_write_file_rename"; 00126 break; 00127 case EU_error_http_server_timeout: 00128 errmsg = "EU_error_http_server_timeout"; 00129 break; 00130 case EU_error_http_gateway_timeout: 00131 errmsg = "EU_error_http_gateway_timeout"; 00132 break; 00133 case EU_error_http_service_unavailable: 00134 errmsg = "EU_error_http_service_unavailable"; 00135 break; 00136 case EU_error_http_proxy_authentication: 00137 errmsg = "EU_error_http_proxy_authentication"; 00138 break; 00139 case EU_error_zlib: 00140 errmsg = "EU_error_zlib"; 00141 break; 00142 case EU_write_ram: 00143 errmsg = "EU_write_ram"; 00144 break; 00145 } 00146 00147 char msgbuf[1024]; 00148 sprintf(msgbuf,"%d: %s",err,errmsg); 00149 return string(msgbuf); 00150 } 00151 00152 //////////////////////////////////////////////////////////////////// 00153 // Function: get_write_error 00154 // Description: 00155 //////////////////////////////////////////////////////////////////// 00156 int 00157 get_write_error() { 00158 #if !defined(WIN32) && !defined(WIN64) 00159 return EU_error_abort; 00160 #else 00161 switch (errno) { 00162 case 4: 00163 case 18: 00164 return EU_error_write_out_of_files; 00165 case 8: 00166 case 14: 00167 return EU_error_write_out_of_memory; 00168 case 20: 00169 return EU_error_write_disk_not_found; 00170 case 25: 00171 case 27: 00172 return EU_error_write_disk_sector_not_found; 00173 case 29: 00174 case 30: 00175 case 31: 00176 return EU_error_write_disk_fault; 00177 case 32: 00178 case 33: 00179 case 36: 00180 return EU_error_write_sharing_violation; 00181 case 39: 00182 return EU_error_write_disk_full; 00183 default: 00184 return EU_error_abort; 00185 } 00186 #endif 00187 } 00188 00189 #ifdef HAVE_NET 00190 //////////////////////////////////////////////////////////////////// 00191 // Function: handle_socket_error 00192 // Description: 00193 //////////////////////////////////////////////////////////////////// 00194 string handle_socket_error() { 00195 #if !defined(WIN32) && !defined(WIN64) 00196 return string(strerror(errno)); 00197 #else 00198 int err = WSAGetLastError(); 00199 char *errmsg; 00200 switch (err) { 00201 case 10022: 00202 errmsg = "An invalid argument was supplied"; 00203 case 10036: 00204 errmsg = "A blocking operation is currently executing"; 00205 case 10040: 00206 errmsg = "Message was larger than internal buffer or network limit"; 00207 case 10050: 00208 errmsg = "Network dead"; 00209 case 10051: 00210 errmsg = "Network unreachable"; 00211 case 10052: 00212 errmsg = "Connection broken because keep-alive detected a failure"; 00213 case 10053: 00214 errmsg = "Connection aborted by local host software"; 00215 case 10054: 00216 errmsg = "Connection closed by remote host"; 00217 case 10055: 00218 errmsg = "Out of buffer space or queue overflowed"; 00219 case 10057: 00220 errmsg = "Socket was not connected"; 00221 case 10058: 00222 errmsg = "Socket was previously shut down"; 00223 case 10060: 00224 errmsg = "Connection timed out"; 00225 case 10061: 00226 errmsg = "Connection refused by remote host"; 00227 case 10064: 00228 errmsg = "Remote host is down"; 00229 case 10065: 00230 errmsg = "Remote host is unreachable"; 00231 case 10093: 00232 errmsg = "WSAStartup() was not called"; 00233 case 0: 00234 errmsg = strerror(errno); 00235 default: 00236 if (express_cat.is_debug()) 00237 express_cat.debug() << "handle_socket_error - unknown error: " << err << endl; 00238 errmsg = "Unknown WSA error"; 00239 } 00240 00241 char msgbuf[1024]; 00242 sprintf(msgbuf,"WSA errno %d, errno %d: %s",err,errno,errmsg); 00243 return string(msgbuf); 00244 #endif 00245 } 00246 #endif 00247 00248 #ifdef HAVE_NET 00249 //////////////////////////////////////////////////////////////////// 00250 // Function: get_network_error 00251 // Description: 00252 //////////////////////////////////////////////////////////////////// 00253 int 00254 get_network_error() { 00255 #if !defined(WIN32) && !defined(WIN64) 00256 return EU_error_abort; 00257 #else 00258 int err = WSAGetLastError(); 00259 switch (err) { 00260 case 10050: 00261 return EU_error_network_dead; 00262 case 10051: 00263 return EU_error_network_unreachable; 00264 case 10052: 00265 case 10057: 00266 case 10058: 00267 return EU_error_network_disconnected; 00268 case 10053: 00269 return EU_error_network_disconnected_locally; 00270 case 10054: 00271 case 10061: 00272 return EU_error_network_remote_host_disconnected; 00273 case 10055: 00274 return EU_error_network_buffer_overflow; 00275 case 10060: 00276 return EU_error_network_timeout; 00277 case 10064: 00278 return EU_error_network_remote_host_down; 00279 case 10065: 00280 return EU_error_network_remote_host_unreachable; 00281 case 10069: 00282 return EU_error_network_disk_quota_exceeded; 00283 case 11001: 00284 return EU_error_network_remote_host_not_found; 00285 case 11002: 00286 return EU_error_network_remote_host_no_response; 00287 case 0: 00288 if (express_cat.is_debug()) 00289 express_cat.debug() 00290 << "get_network_error() - WSA error = 0 - error : " 00291 << strerror(errno) << endl; 00292 return EU_error_abort; 00293 default: 00294 if (express_cat.is_debug()) 00295 express_cat.debug() 00296 << "get_network_error() - unknown error: " << err << endl; 00297 return EU_error_abort; 00298 } 00299 #endif 00300 } 00301 #endif