author | Tero Marttila <terom@fixme.fi> |
Tue, 10 Mar 2009 01:46:09 +0200 | |
changeset 27 | e6639132bead |
parent 10 | 9fe218576d13 |
child 30 | 7f8dd120933f |
permissions | -rw-r--r-- |
6 | 1 |
|
2 |
#include "error.h" |
|
3 |
||
7 | 4 |
#include <string.h> |
5 |
#include <stdio.h> |
|
6 |
||
7 |
#include <netdb.h> |
|
8 |
#include <gnutls/gnutls.h> |
|
9 |
||
6 | 10 |
/* |
11 |
* Helper macros |
|
12 |
*/ |
|
13 |
#define ERROR_NAME(code, name) case code: return name |
|
14 |
||
15 |
const char *error_name (err_t code) |
|
16 |
{ |
|
17 |
switch (code) { |
|
18 |
ERROR_NAME( ERR_CALLOC, "calloc" ); |
|
19 |
ERROR_NAME( ERR_GETADDRINFO, "getaddrinfo" ); |
|
8
be88e543c8ff
split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
20 |
ERROR_NAME( ERR_GETADDRINFO_EMPTY, "getaddrinfo: no results" ); |
6 | 21 |
ERROR_NAME( ERR_SOCKET, "socket" ); |
22 |
ERROR_NAME( ERR_CONNECT, "connect" ); |
|
23 |
ERROR_NAME( ERR_READ, "read" ); |
|
8
be88e543c8ff
split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
24 |
ERROR_NAME( ERR_READ_EOF, "read: EOF" ); |
6 | 25 |
ERROR_NAME( ERR_WRITE, "write" ); |
10
9fe218576d13
fix sock_stream read/write return value, move line buffer inside of line_proto, add some initial code for event-based non-blocking operation
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
26 |
ERROR_NAME( ERR_FCNTL, "fcntl" ); |
6 | 27 |
ERROR_NAME( ERR_GNUTLS_CERT_ALLOC_CRED, "gnutls_certificate_allocate_credentials" ); |
28 |
ERROR_NAME( ERR_GNUTLS_GLOBAL_INIT, "gnutls_global_init" ); |
|
29 |
ERROR_NAME( ERR_GNUTLS_INIT, "gnutls_init" ); |
|
30 |
ERROR_NAME( ERR_GNUTLS_SET_DEFAULT_PRIORITY, "gnutls_set_default_priority" ); |
|
31 |
ERROR_NAME( ERR_GNUTLS_CRED_SET, "gnutls_credentials_set" ); |
|
32 |
ERROR_NAME( ERR_GNUTLS_HANDSHAKE, "gnutls_handshake" ); |
|
33 |
default: return "[unknown]"; |
|
34 |
} |
|
35 |
} |
|
36 |
||
8
be88e543c8ff
split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
37 |
const char *error_msg (const struct error_info *err) |
7 | 38 |
{ |
39 |
static char msg[ERROR_MSG_MAXLEN]; |
|
40 |
||
41 |
// intrepret .extra |
|
42 |
switch (err->code & _ERR_EXTRA_MASK) { |
|
43 |
case ERR_EXTRA_NONE: |
|
44 |
// no additional info |
|
45 |
snprintf(msg, ERROR_MSG_MAXLEN, "%s", error_name(err->code)); |
|
46 |
break; |
|
47 |
||
48 |
case ERR_EXTRA_ERRNO: |
|
49 |
// strerror |
|
50 |
snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", error_name(err->code), strerror(err->extra)); |
|
51 |
break; |
|
52 |
||
53 |
case ERR_EXTRA_GAI: |
|
54 |
// gai_strerror |
|
55 |
snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", error_name(err->code), gai_strerror(err->extra)); |
|
56 |
break; |
|
57 |
||
58 |
case ERR_EXTRA_GNUTLS: |
|
59 |
// gnutls_strerror |
|
60 |
snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", error_name(err->code), gnutls_strerror(err->extra)); |
|
61 |
break; |
|
62 |
||
63 |
default: |
|
64 |
// ??? |
|
65 |
snprintf(msg, ERROR_MSG_MAXLEN, "%s(%#.8x): %#.8x", error_name(err->code), err->code, err->extra); |
|
66 |
break; |
|
67 |
} |
|
68 |
||
69 |
// return static pointer |
|
70 |
return msg; |
|
71 |
} |
|
72 |