src/error.h
author Tero Marttila <terom@fixme.fi>
Sun, 08 Mar 2009 17:17:37 +0200
changeset 23 542c73d07d3c
parent 17 5001564ac5fc
child 27 e6639132bead
permissions -rw-r--r--
add a simple irc_log module (with evsql code) that joins a channel and log_info's PRIVMSGs
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef ERROR_H
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define ERROR_H
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/*
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * Error-handling functions
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include <errno.h>
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
/*
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
 * Type used for error codes is an explicitly *unsigned* int, meaning that error codes themselves are positive.
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
 * Negative error codes also exist in some places, and they are just a negative err_t.
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
typedef unsigned int err_t;
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
/*
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    16
 * Bitmask of error_info.extra meanings
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    17
 */
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    18
enum error_extra_types {
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    19
    // bit offset of ERR_EXTRA_* mask in error_code
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    20
    _ERR_EXTRA_OFFSET   = 3 * 8,
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    21
    
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    22
    // mask of bits used for the error_extra_types value
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    23
    _ERR_EXTRA_MASK     = 0xff << _ERR_EXTRA_OFFSET,
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    24
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    25
    ERR_EXTRA_NONE      = 0x00 << _ERR_EXTRA_OFFSET,
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    26
    ERR_EXTRA_ERRNO     = 0x01 << _ERR_EXTRA_OFFSET,
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    27
    ERR_EXTRA_GAI       = 0x02 << _ERR_EXTRA_OFFSET,
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    28
    ERR_EXTRA_GNUTLS    = 0x03 << _ERR_EXTRA_OFFSET,
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    29
    
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    30
};
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    31
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    32
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    33
#define _ERROR_CODE(name, code, extra) name = (code | ERR_EXTRA_ ## extra)
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    34
/*
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
 * List of defined error codes, organized mostly by function name
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
enum error_code {
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    38
    /* Core functions */
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    39
    _ERROR_CODE( ERR_CALLOC,                        0x000100,   NONE    ),
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    41
    /* Network resolver errors */
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    42
    _ERROR_CODE( ERR_GETADDRINFO,                   0x000200,   GAI     ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    43
    _ERROR_CODE( ERR_GETADDRINFO_EMPTY,             0x000201,   GAI     ),
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    45
    /* Low-level network errors */
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    46
    _ERROR_CODE( ERR_SOCKET,                        0x000301,   ERRNO   ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    47
    _ERROR_CODE( ERR_CONNECT,                       0x000302,   ERRNO   ),
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    49
    /* Low-level IO errors */
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    50
    _ERROR_CODE( ERR_READ,                          0x000401,   ERRNO   ),
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
    51
    _ERROR_CODE( ERR_READ_EOF,                      0x000402,   NONE    ),
be88e543c8ff split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    52
    _ERROR_CODE( ERR_WRITE,                         0x000403,   ERRNO   ),
12
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    53
    _ERROR_CODE( ERR_WRITE_EOF,                     0x000404,   NONE    ),
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    54
    _ERROR_CODE( ERR_FCNTL,                         0x000405,   ERRNO   ),
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    55
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    56
    /* GnuTLS errors */
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    57
    _ERROR_CODE( ERR_GNUTLS_CERT_ALLOC_CRED,        0x010101,   GNUTLS  ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    58
    _ERROR_CODE( ERR_GNUTLS_GLOBAL_INIT,            0x010102,   GNUTLS  ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    59
    _ERROR_CODE( ERR_GNUTLS_INIT,                   0x010103,   GNUTLS  ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    60
    _ERROR_CODE( ERR_GNUTLS_SET_DEFAULT_PRIORITY,   0x010104,   GNUTLS  ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    61
    _ERROR_CODE( ERR_GNUTLS_CRED_SET,               0x010105,   GNUTLS  ),
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    62
    _ERROR_CODE( ERR_GNUTLS_HANDSHAKE,              0x010106,   GNUTLS  ),
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
    63
    _ERROR_CODE( ERR_GNUTLS_RECORD_SEND,            0x010107,   GNUTLS  ),
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
    64
    _ERROR_CODE( ERR_GNUTLS_RECORD_RECV,            0x010108,   GNUTLS  ),
12
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    65
    _ERROR_CODE( ERR_GNUTLS_RECORD_GET_DIRECTION,   0x010109,   GNUTLS  ),
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
    66
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
    67
    /* Libevent errors */
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
    68
    _ERROR_CODE( ERR_EVENT_NEW,                     0x010201,   NONE    ),
11
14e79683c48c working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    69
    _ERROR_CODE( ERR_EVENT_ADD,                     0x010202,   NONE    ),
17
5001564ac5fc irc_line implementation
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    70
23
542c73d07d3c add a simple irc_log module (with evsql code) that joins a channel and log_info's PRIVMSGs
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    71
    /* Evsql errors */
542c73d07d3c add a simple irc_log module (with evsql code) that joins a channel and log_info's PRIVMSGs
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    72
    _ERROR_CODE( ERR_EVSQL_NEW_PQ,                  0x010301,   NONE    ),
542c73d07d3c add a simple irc_log module (with evsql code) that joins a channel and log_info's PRIVMSGs
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
    73
17
5001564ac5fc irc_line implementation
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    74
    /* irc_line errors */
5001564ac5fc irc_line implementation
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    75
    _ERROR_CODE( ERR_LINE_TOO_LONG,                 0x100101,   NONE    ),
5001564ac5fc irc_line implementation
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    76
    _ERROR_CODE( ERR_LINE_INVALID_TOKEN,            0x100102,   NONE    ),
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    77
    
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    78
    // mask of bits used for the error_code value
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    79
    _ERROR_CODE_MASK    = 0xffffff,
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
};
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
/*
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
 * An error code and associated extra infos
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
struct error_info {
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    /* The base error code */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    err_t code;
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    /* Additional detail info, usually some third-part error code */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    unsigned int extra;
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
};
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
6
240ae8482d64 add error_name function
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    93
/*
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    94
 * Translate an err_t into a function name.
6
240ae8482d64 add error_name function
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    95
 */
240ae8482d64 add error_name function
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    96
const char *error_name (err_t code);
240ae8482d64 add error_name function
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    97
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    98
/*
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    99
 * Maximum length of error messages returned by error_msg (including NUL byte)
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   100
 */
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   101
#define ERROR_MSG_MAXLEN 1024
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   102
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   103
/*
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   104
 * Translate an error_info into a message.
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   105
 *
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   106
 * This is returned as a pointer into a statically allocated buffer. It is not re-entrant.
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   107
 */
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
   108
const char *error_msg (const struct error_info *err);
7
844f014409ff and then error_msg
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   109
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
/** No error, evaulates as logical false */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
#define SUCCESS (0)
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
/* Evaulates to error_info.code as lvalue */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   114
#define ERROR_CODE(err_info_ptr) ((err_info_ptr)->code)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
/* Evaulates to error_info.extra as lvalue */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   117
#define ERROR_EXTRA(err_info_ptr) ((err_info_ptr)->extra)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
/* Set error_info.code to SUCCESS, evaulates as zero */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   120
#define RESET_ERROR(err_info_ptr) ((err_info_ptr)->code = SUCCESS)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
/* Compare error_info.code != 0 */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   123
#define IS_ERROR(err_info_ptr) (!!(err_info_ptr)->code)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
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
   125
/* Compare the err_code/err_extra for an err_info */
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
   126
#define MATCH_ERROR(err_info_ptr, err_code, err_extra) ((err_info_ptr)->code == (err_code) && (err_info_ptr)->extra == (err_extra))
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
   127
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
/* Set error_info.code, but leave err_extra as-is. Evaluates to err_code */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   129
#define SET_ERROR(err_info_ptr, err_code) ((err_info_ptr)->code = (err_code))
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
/* Set error_info.code/extra. XXX: should evaluate to err_code */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   132
#define _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) (err_info_ptr)->code = (err_code); (err_info_ptr)->extra = (err_extra)
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   133
#define SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra); } while (0)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
5
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   135
/* Set error_info.code to err_code, and .extra to errno. XXX: should evaulate to err_code */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   136
#define _SET_ERROR_ERRNO(err_info_ptr, err_code) _SET_ERROR_EXTRA(err_info_ptr, err_code, errno);
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   137
#define SET_ERROR_ERRNO(err_info_ptr, err_code) SET_ERROR_EXTRA(err_info_ptr, err_code, errno);
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
5
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   139
/* Set error_info from another error_info. Evaluates to the new error_info */
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   140
#define SET_ERROR_INFO(err_info_ptr, from_ptr) (*err_info_ptr = *from_ptr)
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   141
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   142
/* Same as above, but also return err_code from func. XXX: use 'return SET_ERROR...' instead */
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   143
#define RETURN_SET_ERROR(err_info_ptr, err_code) do { SET_ERROR(err_info_ptr, err_code); return (err_code); } while (0)
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   144
#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)
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   145
#define RETURN_SET_ERROR_ERRNO(err_info_ptr, err_code) do { _SET_ERROR_ERRNO(err_info_ptr, err_code); return (err_code); } while (0)
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
   146
#define RETURN_SET_ERROR_INFO(err_info_ptr, from_ptr) do { SET_ERROR_INFO(err_info_ptr, from_ptr); return (from_ptr->code); } while (0)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
5
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   148
/* Same as above, but also do a 'goto error' */
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   149
#define JUMP_SET_ERROR(err_info_ptr, err_code) do { SET_ERROR(err_info_ptr, err_code); goto error; } while (0)
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   150
#define JUMP_SET_ERROR_INFO(err_info_ptr, from_ptr) do { SET_ERROR_INFO(err_info_ptr, from_ptr); goto error; } while (0)
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   151
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
#endif