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