1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#include <assert.h>
#include "libradsec.h"
#include "libradsec-impl.h"
const char *_errtxt[] = {
"SUCCESS", /* 0 RSE_OK */
"NOMEM", /* 1 RSE_NOMEM */
"NYI -- not yet implemented", /* 2 RSE_NOSYS */
"invalid handle" /* 3 RSE_INVALID_CTX */
"invalid connection" /* 4 RSE_INVALID_CONN */
"ERR 5" /* RSE_ */
"ERR 6" /* RSE_ */
"ERR 7" /* RSE_ */
"ERR 8" /* RSE_ */
"ERR 9" /* RSE_ */
"ERR 10" /* RSE_ */
"ERR 11" /* RSE_ */
"ERR 12" /* RSE_ */
"ERR 13" /* RSE_ */
"ERR " /* RSE_ */
"ERR " /* RSE_ */
"ERR " /* RSE_ */
"ERR " /* RSE_ */
"ERR " /* RSE_ */
"ERR " /* RSE_ */
"ERR " /* RSE_ */
"some error" /* 21 RSE_SOME_ERROR */
};
static struct rs_error *
_err_new (unsigned int code, const char *msg)
{
struct rs_error *err;
err = malloc (sizeof (struct rs_error));
if (err)
{
memset (err, 0, sizeof (struct rs_error));
err->code = code;
snprintf (err->buf, sizeof (err->buf), "%s: %s",
code < sizeof (_errtxt) / sizeof (*_errtxt) ?
_errtxt[code] : "invalid error index",
msg);
}
return err;
}
int
rs_ctx_err_push (struct rs_handle *ctx, int code, const char *msg)
{
struct rs_error *err = _err_new (code, msg);
if (err)
ctx->err = err;
return code;
}
int
rs_conn_err_push (struct rs_connection *conn, int code, const char *msg)
{
struct rs_error *err = _err_new (code, msg);
if (err)
conn->err = err;
return code;
}
struct rs_error *
rs_ctx_err_pop (struct rs_handle *ctx)
{
struct rs_error *err;
if (!ctx)
return NULL; /* FIXME: RSE_INVALID_CTX. */
err = ctx->err;
ctx->err = NULL;
return err;
}
struct rs_error *
rs_conn_err_pop (struct rs_connection *conn)
{
struct rs_error *err;
if (!conn)
return NULL; /* FIXME: RSE_INVALID_CONN */
err = conn->err;
conn->err = NULL;
return err;
}
void
rs_err_free (struct rs_error *err)
{
assert (err);
if (err->msg)
free (err->msg);
free (err);
}
char *
rs_err_msg (struct rs_error *err)
{
char *msg;
if (err->msg)
msg = err->msg;
else
msg = strdup (err->buf);
rs_err_free (err);
return msg;
}
int
rs_err_code (struct rs_error *err)
{
int code = err->code;
rs_err_free(err);
return code;
}
|