14 |
14 |
15 /* |
15 /* |
16 * List of defined error codes, organized mostly by function name |
16 * List of defined error codes, organized mostly by function name |
17 */ |
17 */ |
18 enum error_code { |
18 enum error_code { |
|
19 /* Core functions */ |
19 ERR_CALLOC = 0x000100, |
20 ERR_CALLOC = 0x000100, |
20 |
21 |
21 // network resolver errors |
22 /* Network resolver errors */ |
22 ERR_GETADDRINFO = 0x000200, |
23 ERR_GETADDRINFO = 0x000200, |
23 ERR_GETADDRINFO_EMPTY = 0x000201, /* No valid results */ |
24 ERR_GETADDRINFO_EMPTY = 0x000201, /* No valid results */ |
24 |
25 |
25 // low-level network errors |
26 /* Low-level network errors */ |
26 ERR_SOCKET = 0x000301, |
27 ERR_SOCKET = 0x000301, |
27 ERR_CONNECT = 0x000302, |
28 ERR_CONNECT = 0x000302, |
28 |
29 |
29 // low-level IO errors |
30 /* Low-level IO errors */ |
30 ERR_READ = 0x000401, |
31 ERR_READ = 0x000401, |
31 ERR_WRITE = 0x000402, |
32 ERR_WRITE = 0x000402, |
|
33 |
|
34 /* GnuTLS errors */ |
|
35 ERR_GNUTLS_CERT_ALLOC_CRED = 0x010101, |
|
36 ERR_GNUTLS_GLOBAL_INIT = 0x010102, |
32 }; |
37 }; |
33 |
38 |
34 /* |
39 /* |
35 * An error code and associated extra infos |
40 * An error code and associated extra infos |
36 */ |
41 */ |
44 |
49 |
45 /** No error, evaulates as logical false */ |
50 /** No error, evaulates as logical false */ |
46 #define SUCCESS (0) |
51 #define SUCCESS (0) |
47 |
52 |
48 /* Evaulates to error_info.code as lvalue */ |
53 /* Evaulates to error_info.code as lvalue */ |
49 #define ERROR_CODE(err_info) ((err_info).code) |
54 #define ERROR_CODE(err_info_ptr) ((err_info_ptr)->code) |
50 |
55 |
51 /* Evaulates to error_info.extra as lvalue */ |
56 /* Evaulates to error_info.extra as lvalue */ |
52 #define ERROR_EXTRA(err_info) ((err_info).extra) |
57 #define ERROR_EXTRA(err_info_ptr) ((err_info_ptr)->extra) |
53 |
58 |
54 /* Set error_info.code to SUCCESS, evaulates as zero */ |
59 /* Set error_info.code to SUCCESS, evaulates as zero */ |
55 #define RESET_ERROR(err_info) ((err_info).code = SUCCESS) |
60 #define RESET_ERROR(err_info_ptr) ((err_info_ptr)->code = SUCCESS) |
56 |
61 |
57 /* Compare error_info.code != 0 */ |
62 /* Compare error_info.code != 0 */ |
58 #define IS_ERROR(err_info) (!!(err_info).code) |
63 #define IS_ERROR(err_info_ptr) (!!(err_info_ptr)->code) |
59 |
64 |
60 /* Set error_info.code, but leave err_extra as-is. Evaluates to err_code */ |
65 /* Set error_info.code, but leave err_extra as-is. Evaluates to err_code */ |
61 #define SET_ERROR(err_info, err_code) ((err_info).code = (err_code)) |
66 #define SET_ERROR(err_info_ptr, err_code) ((err_info_ptr)->code = (err_code)) |
62 |
67 |
63 /* Set error_info.code/extra. XXX: should evaluate to err_code */ |
68 /* Set error_info.code/extra. XXX: should evaluate to err_code */ |
64 #define _SET_ERROR_EXTRA(err_info, err_code, err_extra) (err_info).code = (err_code); err_info.extra = (err_extra) |
69 #define _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) (err_info_ptr)->code = (err_code); (err_info_ptr)->extra = (err_extra) |
65 #define SET_ERROR_EXTRA(err_info, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info, err_code, err_extra); } while (0) |
70 #define SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra); } while (0) |
66 |
71 |
67 /* Set error.info.code to err_code, and .extra to errno. XXX: should evaulate to err_code */ |
72 /* Set error.info.code to err_code, and .extra to errno. XXX: should evaulate to err_code */ |
68 #define _SET_ERROR_ERRNO(err_info, err_code) _SET_ERROR_EXTRA(err_info, err_code, errno); |
73 #define _SET_ERROR_ERRNO(err_info_ptr, err_code) _SET_ERROR_EXTRA(err_info_ptr, err_code, errno); |
69 #define SET_ERROR_ERRNO(err_info, err_code) SET_ERROR_EXTRA(err_info, err_code, errno); |
74 #define SET_ERROR_ERRNO(err_info_ptr, err_code) SET_ERROR_EXTRA(err_info_ptr, err_code, errno); |
70 |
75 |
71 /* Ss above, but also return err_code from func. XXX: use 'return SET_ERROR...' instead */ |
76 /* Ss above, but also return err_code from func. XXX: use 'return SET_ERROR...' instead */ |
72 #define RETURN_SET_ERROR(err_info, err_code) do { _SET_ERROR(err_info, err_code); return (err_code); } while (0) |
77 #define RETURN_SET_ERROR(err_info_ptr, err_code) do { _SET_ERROR(err_info_ptr, err_code); return (err_code); } while (0) |
73 #define RETURN_SET_ERROR_EXTRA(err_info, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info, err_code, err_extra); return (err_code); } while (0) |
78 #define RETURN_SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra); return (err_code); } while (0) |
74 #define RETURN_SET_ERROR_ERRNO(err_info, err_code) do { _SET_ERROR_ERRNO(err_info, err_code); return (err_code); } while (0) |
79 #define RETURN_SET_ERROR_ERRNO(err_info_ptr, err_code) do { _SET_ERROR_ERRNO(err_info_ptr, err_code); return (err_code); } while (0) |
75 |
80 |
76 #endif |
81 #endif |