5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2007 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
24 SilcResult silc_get_errno(void)
26 SilcTls tls = silc_thread_get_tls();
36 void silc_set_errno(SilcResult error)
38 SilcTls tls = silc_thread_get_tls();
41 /* Try to create Tls */
42 tls = silc_thread_tls_init();
47 SILC_LOG_DEBUG(("Error: %s (%d)", silc_errno_string(error), error));
49 tls->error_reason[0] = '\0';
53 /* Set error, cannot fail. */
55 void silc_set_errno_nofail(SilcResult error)
57 SilcTls tls = silc_thread_get_tls();
62 SILC_LOG_DEBUG(("Error: %s (%d)", silc_errno_string(error), error));
64 tls->error_reason[0] = '\0';
68 /* Set errno and reason for error. */
70 void silc_set_errno_reason(SilcResult error, const char *format, ...)
72 SilcTls tls = silc_thread_get_tls();
76 /* Try to create Tls */
77 tls = silc_thread_tls_init();
83 silc_vsnprintf(tls->error_reason, sizeof(tls->error_reason), format, va);
86 SILC_LOG_DEBUG(("Error: %s (%d): %s", silc_errno_string(error), error,
92 /* Set errno and reason for error, cannot fail. */
94 void silc_set_errno_reason_nofail(SilcResult error, const char *format, ...)
96 SilcTls tls = silc_thread_get_tls();
102 va_start(va, format);
103 silc_vsnprintf(tls->error_reason, sizeof(tls->error_reason), format, va);
106 SILC_LOG_DEBUG(("Error: %s (%d): %s", silc_errno_string(error), error,
112 /* Set error from POSIX errno. */
114 void silc_set_errno_posix(int error)
123 silc_set_errno(SILC_ERR_INTERRUPTED);
126 silc_set_errno(SILC_ERR_BAD_FD);
129 silc_set_errno(SILC_ERR_PERMISSION_DENIED);
132 silc_set_errno(SILC_ERR_BAD_ADDRESS);
134 case WSA_INVALID_HANDLE:
136 silc_set_errno(SILC_ERR_BAD_SOCKET);
138 case WSA_INVALID_PARAMETER:
140 silc_set_errno(SILC_ERR_INVALID_ARGUMENT);
142 case WSA_NOT_ENOUGH_MEMORY:
143 silc_set_errno(SILC_ERR_OUT_OF_MEMORY);
146 silc_set_errno(SILC_ERR_WOULD_BLOCK);
148 case WSAEOPNOTSUPPORT:
149 silc_set_errno(SILC_ERR_NOT_SUPPORTED);
152 silc_set_errno(SILC_ERR_ADDR_IN_USE);
155 silc_set_errno(SILC_ERR_NET_DOWN);
158 case WSAEHOSTUNREACH:
159 silc_set_errno(SILC_ERR_UNREACHABLE);
162 silc_set_errno(SILC_ERR_RESET);
164 case WSAECONNABORTED:
165 silc_set_errno(SILC_ERR_ABORTED);
168 silc_set_errno(SILC_ERR_TIMEOUT);
170 case WSAECONNREFUSED:
171 silc_set_errno(SILC_ERR_REFUSED);
174 silc_set_errno(SILC_ERR_HOST_DOWN);
177 silc_set_errno(SILC_ERR);
182 #endif /* SILC_WIN32 */
184 /* POSIX, etc. errors */
188 silc_set_errno(SILC_ERR_OUT_OF_MEMORY);
193 silc_set_errno(SILC_ERR_WOULD_BLOCK);
198 silc_set_errno(SILC_ERR_INVALID_ARGUMENT);
203 silc_set_errno(SILC_ERR_INTERRUPTED);
208 silc_set_errno(SILC_ERR_IO);
213 silc_set_errno(SILC_ERR_BROKEN_PIPE);
218 silc_set_errno(SILC_ERR_NO_SUCH_FILE);
223 silc_set_errno(SILC_ERR_ALREADY_EXISTS);
228 silc_set_errno(SILC_ERR_NOT_DIRECTORY);
233 silc_set_errno(SILC_ERR_IS_DIRECTORY);
238 silc_set_errno(SILC_ERR_BUSY);
243 silc_set_errno(SILC_ERR_NO_SUCH_DEVICE);
248 silc_set_errno(SILC_ERR_NO_SPACE_LEFT);
253 silc_set_errno(SILC_ERR_READ_ONLY);
258 silc_set_errno(SILC_ERR_BAD_FD);
261 #if defined(EADDRINUSE)
263 silc_set_errno(SILC_ERR_ADDR_IN_USE);
266 #if defined(ECONNREFUSED)
268 silc_set_errno(SILC_ERR_REFUSED);
271 #if defined(ECONNABORTED)
273 silc_set_errno(SILC_ERR_ABORTED);
276 #if defined(ECONNRESET)
278 silc_set_errno(SILC_ERR_RESET);
281 #if defined(ENETUNREACH)
283 silc_set_errno(SILC_ERR_UNREACHABLE);
286 #if defined(EHOSTUNREACH)
288 silc_set_errno(SILC_ERR_UNREACHABLE);
291 #if defined(ENETDOWN)
293 silc_set_errno(SILC_ERR_NET_DOWN);
296 #if defined(ETIMEDOUT)
298 silc_set_errno(SILC_ERR_TIMEOUT);
301 #if defined(EHOSTDOWN)
303 silc_set_errno(SILC_ERR_HOST_DOWN);
307 silc_set_errno(SILC_ERR);
312 /* Get last reason for error */
314 const char *silc_errno_reason(void)
316 SilcTls tls = silc_thread_get_tls();
318 if (!tls || tls->error_reason[0] == '\0')
319 return (const char *)"";
321 return tls->error_reason;
324 const char *silc_errno_strings[] =
330 "Allocation by zero",
331 "Too large allocation",
334 "Feature not supported",
335 "Operation not permitted",
344 "Prohibited character",
345 "Bad character encoding",
346 "Unsupported character encoding",
348 "Bad memory address",
349 "Bad buffer encoding",
354 "No such file or directory",
358 "Directory not empty",
359 "Device or resource busy",
361 "No space left on device",
365 "Bad file descriptor",
369 "Unknown IP address",
371 "Destination unreachable",
372 "Connection refused",
373 "Connection aborted",
374 "Connection reset by peer",
379 "Address already in use",
386 /* Map error to string */
388 const char *silc_errno_string(SilcResult error)
390 if (error < 0 || error >= SILC_ERR_MAX)
391 return (const char *)"";
393 return silc_errno_strings[error];