src/error.h
author Tero Marttila <terom@fixme.fi>
Sun, 22 Feb 2009 06:52:55 +0200
changeset 4 a3ca0f97a075
parent 3 cc94ae754e2a
child 5 a09a0797f6f0
permissions -rw-r--r--
change ERROR_* to use pointers again, and implement error_info for sock_init
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
/*
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
 * List of defined error codes, organized mostly by function name
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
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
    19
    /* Core functions */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    ERR_CALLOC                  = 0x000100,
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    22
    /* Network resolver errors */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    ERR_GETADDRINFO             = 0x000200,
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    ERR_GETADDRINFO_EMPTY       = 0x000201,     /* No valid results */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    26
    /* Low-level network errors */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    ERR_SOCKET                  = 0x000301,
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    ERR_CONNECT                 = 0x000302,
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    30
    /* Low-level IO errors */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    ERR_READ                    = 0x000401,
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    ERR_WRITE                   = 0x000402,
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    33
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    34
    /* GnuTLS errors */
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    35
    ERR_GNUTLS_CERT_ALLOC_CRED  = 0x010101,
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    36
    ERR_GNUTLS_GLOBAL_INIT      = 0x010102,
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
};
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
/*
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
 * An error code and associated extra infos
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
struct error_info {
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    /* The base error code */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    err_t code;
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    /* Additional detail info, usually some third-part error code */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    unsigned int extra;
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
};
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
/** No error, evaulates as logical false */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
#define SUCCESS (0)
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
/* 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
    54
#define ERROR_CODE(err_info_ptr) ((err_info_ptr)->code)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
/* 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
    57
#define ERROR_EXTRA(err_info_ptr) ((err_info_ptr)->extra)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
/* 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
    60
#define RESET_ERROR(err_info_ptr) ((err_info_ptr)->code = SUCCESS)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
/* 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
    63
#define IS_ERROR(err_info_ptr) (!!(err_info_ptr)->code)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
/* 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
    66
#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
    67
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
/* 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
    69
#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
    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)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
/* 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
    73
#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
    74
#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
    75
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
/* Ss above, but also return err_code from func. XXX: use 'return SET_ERROR...' instead */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    77
#define RETURN_SET_ERROR(err_info_ptr, err_code) do { _SET_ERROR(err_info_ptr, err_code); 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
    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)
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    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)
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
#endif