Panda3D
 All Classes Functions Variables Enumerations
error_utils.cxx
1 // Filename: error_utils.cxx
2 // Created by: mike (07Nov00)
3 //
4 ////////////////////////////////////////////////////////////////////
5 //
6 // PANDA 3D SOFTWARE
7 // Copyright (c) Carnegie Mellon University. All rights reserved.
8 //
9 // All use of this software is subject to the terms of the revised BSD
10 // license. You should have received a copy of this license along
11 // with this source code in a file named "LICENSE."
12 //
13 ////////////////////////////////////////////////////////////////////
14 
15 
16 #include "error_utils.h"
17 #include "config_express.h"
18 
19 #include <errno.h>
20 #include <stdio.h>
21 
22 #if defined(WIN32_VC) || defined(WIN64_VC)
23  #include <winsock2.h>
24 #endif
25 
26 ////////////////////////////////////////////////////////////////////
27 // Function: error_to_text
28 // Description:
29 ////////////////////////////////////////////////////////////////////
30 string error_to_text(ErrorUtilCode err) {
31  const char *errmsg = "Unknown error";
32 
33  switch (err) {
34  case EU_http_redirect:
35  errmsg = "EU_http_redirect";
36  break;
37  case EU_eof:
38  errmsg = "EU_eof";
39  break;
40  case EU_network_no_data:
41  errmsg = "EU_network_no_data";
42  break;
43  case EU_ok:
44  errmsg = "EU_ok";
45  break;
46  case EU_write:
47  errmsg = "EU_write";
48  break;
49  case EU_success:
50  errmsg = "EU_success";
51  break;
52  case EU_error_abort:
53  errmsg = "EU_error_abort";
54  break;
55  case EU_error_file_empty:
56  errmsg = "EU_error_file_empty";
57  break;
58  case EU_error_file_invalid:
59  errmsg = "EU_error_file_invalid";
60  break;
61  case EU_error_invalid_checksum:
62  errmsg = "EU_error_invalid_checksum";
63  break;
64  case EU_error_network_dead:
65  errmsg = "EU_error_network_dead";
66  break;
67  case EU_error_network_unreachable:
68  errmsg = "EU_error_network_unreachable";
69  break;
70  case EU_error_network_disconnected:
71  errmsg = "EU_error_network_disconnected";
72  break;
73  case EU_error_network_timeout:
74  errmsg = "EU_error_network_timeout";
75  break;
76  case EU_error_network_no_data:
77  errmsg = "EU_error_network_no_data";
78  break;
79  case EU_error_network_disconnected_locally:
80  errmsg = "EU_error_network_disconnected_locally";
81  break;
82  case EU_error_network_buffer_overflow:
83  errmsg = "EU_error_network_buffer_overflow";
84  break;
85  case EU_error_network_disk_quota_exceeded:
86  errmsg = "EU_error_network_disk_quota_exceeded";
87  break;
88  case EU_error_network_remote_host_disconnected:
89  errmsg = "EU_error_network_remote_host_disconnected";
90  break;
91  case EU_error_network_remote_host_down:
92  errmsg = "EU_error_network_remote_host_down";
93  break;
94  case EU_error_network_remote_host_unreachable:
95  errmsg = "EU_error_network_remote_host_unreachable";
96  break;
97  case EU_error_network_remote_host_not_found:
98  errmsg = "EU_error_network_remote_host_not_found";
99  break;
100  case EU_error_network_remote_host_no_response:
101  errmsg = "EU_error_network_remote_host_no_response";
102  break;
103  case EU_error_write_out_of_files:
104  errmsg = "EU_error_write_out_of_files";
105  break;
106  case EU_error_write_out_of_memory:
107  errmsg = "EU_error_write_out_of_memory";
108  break;
109  case EU_error_write_sharing_violation:
110  errmsg = "EU_error_write_sharing_violation";
111  break;
112  case EU_error_write_disk_full:
113  errmsg = "EU_error_write_disk_full";
114  break;
115  case EU_error_write_disk_not_found:
116  errmsg = "EU_error_write_disk_not_found";
117  break;
118  case EU_error_write_disk_sector_not_found:
119  errmsg = "EU_error_write_disk_sector_not_found";
120  break;
121  case EU_error_write_disk_fault:
122  errmsg = "EU_error_write_disk_fault";
123  break;
124  case EU_error_write_file_rename:
125  errmsg = "EU_error_write_file_rename";
126  break;
127  case EU_error_http_server_timeout:
128  errmsg = "EU_error_http_server_timeout";
129  break;
130  case EU_error_http_gateway_timeout:
131  errmsg = "EU_error_http_gateway_timeout";
132  break;
133  case EU_error_http_service_unavailable:
134  errmsg = "EU_error_http_service_unavailable";
135  break;
136  case EU_error_http_proxy_authentication:
137  errmsg = "EU_error_http_proxy_authentication";
138  break;
139  case EU_error_zlib:
140  errmsg = "EU_error_zlib";
141  break;
142  case EU_write_ram:
143  errmsg = "EU_write_ram";
144  break;
145  }
146 
147  char msgbuf[1024];
148  sprintf(msgbuf,"%d: %s",err,errmsg);
149  return string(msgbuf);
150 }
151 
152 ////////////////////////////////////////////////////////////////////
153 // Function: get_write_error
154 // Description:
155 ////////////////////////////////////////////////////////////////////
156 int
157 get_write_error() {
158 #if !defined(WIN32) && !defined(WIN64)
159  return EU_error_abort;
160 #else
161  switch (errno) {
162  case 4:
163  case 18:
164  return EU_error_write_out_of_files;
165  case 8:
166  case 14:
167  return EU_error_write_out_of_memory;
168  case 20:
169  return EU_error_write_disk_not_found;
170  case 25:
171  case 27:
172  return EU_error_write_disk_sector_not_found;
173  case 29:
174  case 30:
175  case 31:
176  return EU_error_write_disk_fault;
177  case 32:
178  case 33:
179  case 36:
180  return EU_error_write_sharing_violation;
181  case 39:
182  return EU_error_write_disk_full;
183  default:
184  return EU_error_abort;
185  }
186 #endif
187 }
188 
189 #ifdef HAVE_NET
190 ////////////////////////////////////////////////////////////////////
191 // Function: handle_socket_error
192 // Description:
193 ////////////////////////////////////////////////////////////////////
194 string handle_socket_error() {
195 #if !defined(WIN32) && !defined(WIN64)
196  return string(strerror(errno));
197 #else
198  int err = WSAGetLastError();
199  char *errmsg;
200  switch (err) {
201  case 10022:
202  errmsg = "An invalid argument was supplied";
203  case 10036:
204  errmsg = "A blocking operation is currently executing";
205  case 10040:
206  errmsg = "Message was larger than internal buffer or network limit";
207  case 10050:
208  errmsg = "Network dead";
209  case 10051:
210  errmsg = "Network unreachable";
211  case 10052:
212  errmsg = "Connection broken because keep-alive detected a failure";
213  case 10053:
214  errmsg = "Connection aborted by local host software";
215  case 10054:
216  errmsg = "Connection closed by remote host";
217  case 10055:
218  errmsg = "Out of buffer space or queue overflowed";
219  case 10057:
220  errmsg = "Socket was not connected";
221  case 10058:
222  errmsg = "Socket was previously shut down";
223  case 10060:
224  errmsg = "Connection timed out";
225  case 10061:
226  errmsg = "Connection refused by remote host";
227  case 10064:
228  errmsg = "Remote host is down";
229  case 10065:
230  errmsg = "Remote host is unreachable";
231  case 10093:
232  errmsg = "WSAStartup() was not called";
233  case 0:
234  errmsg = strerror(errno);
235  default:
236  if (express_cat.is_debug())
237  express_cat.debug() << "handle_socket_error - unknown error: " << err << endl;
238  errmsg = "Unknown WSA error";
239  }
240 
241  char msgbuf[1024];
242  sprintf(msgbuf,"WSA errno %d, errno %d: %s",err,errno,errmsg);
243  return string(msgbuf);
244 #endif
245 }
246 #endif
247 
248 #ifdef HAVE_NET
249 ////////////////////////////////////////////////////////////////////
250 // Function: get_network_error
251 // Description:
252 ////////////////////////////////////////////////////////////////////
253 int
254 get_network_error() {
255 #if !defined(WIN32) && !defined(WIN64)
256  return EU_error_abort;
257 #else
258  int err = WSAGetLastError();
259  switch (err) {
260  case 10050:
261  return EU_error_network_dead;
262  case 10051:
263  return EU_error_network_unreachable;
264  case 10052:
265  case 10057:
266  case 10058:
267  return EU_error_network_disconnected;
268  case 10053:
269  return EU_error_network_disconnected_locally;
270  case 10054:
271  case 10061:
272  return EU_error_network_remote_host_disconnected;
273  case 10055:
274  return EU_error_network_buffer_overflow;
275  case 10060:
276  return EU_error_network_timeout;
277  case 10064:
278  return EU_error_network_remote_host_down;
279  case 10065:
280  return EU_error_network_remote_host_unreachable;
281  case 10069:
282  return EU_error_network_disk_quota_exceeded;
283  case 11001:
284  return EU_error_network_remote_host_not_found;
285  case 11002:
286  return EU_error_network_remote_host_no_response;
287  case 0:
288  if (express_cat.is_debug())
289  express_cat.debug()
290  << "get_network_error() - WSA error = 0 - error : "
291  << strerror(errno) << endl;
292  return EU_error_abort;
293  default:
294  if (express_cat.is_debug())
295  express_cat.debug()
296  << "get_network_error() - unknown error: " << err << endl;
297  return EU_error_abort;
298  }
299 #endif
300 }
301 #endif