diff options
author | Linus Nordberg <linus@nordu.net> | 2010-09-27 18:47:07 +0200 |
---|---|---|
committer | Linus Nordberg <linus@nordu.net> | 2010-09-27 18:57:06 +0200 |
commit | aa354bb116fb38c9b049070dea4752afe9a3ea34 (patch) | |
tree | 51001c4157aef25682eeb5c460438dc5c47ed323 /lib/err.c | |
parent | 94e3f46ef6c976f6bbd670555262ec6466314d8a (diff) |
WIP on libradsec: 94e3f46 Example client crafting simple packet using freeradius-libradius.
Diffstat (limited to 'lib/err.c')
-rw-r--r-- | lib/err.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/err.c b/lib/err.c new file mode 100644 index 0000000..66c5d94 --- /dev/null +++ b/lib/err.c @@ -0,0 +1,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; +} |