X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Ferr.c;h=875a3f447c3cb52be5b8846b98af2852fdf9b21f;hb=e6b234bb547479f8862badeee58d1b1415a2439d;hp=51e442189d79fea20254a95c32577221b76cabc4;hpb=ff55882798b6c482faec920d30a4ffdc10b306f7;p=radsecproxy.git diff --git a/lib/err.c b/lib/err.c index 51e4421..875a3f4 100644 --- a/lib/err.c +++ b/lib/err.c @@ -1,4 +1,9 @@ -/* See the file COPYING for licensing information. */ +/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. + See the file COPYING for licensing information. */ + +#if defined HAVE_CONFIG_H +#include +#endif #include #include @@ -6,29 +11,30 @@ #include #include -const char *_errtxt[] = { +static 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 */ - "connection type mismatch" /* 5 RSE_CONN_TYPE_MISMATCH */ - "FreeRadius error" /* 6 RSE_FR */ - "bad hostname or port" /* 7 RSE_BADADDR */ - "no peer configured" /* 8 RSE_NOPEER */ - "libevent error" /* 9 RSE_EVENT */ - "connection error" /* 10 RSE_CONNERR */ - "invalid configuration file" /* 11 RSE_CONFIG */ - "authentication failed" /* RSE_BADAUTH */ - "ERR 13" /* RSE_ */ - "ERR 14" /* RSE_ */ - "ERR 15" /* RSE_ */ - "ERR 16" /* RSE_ */ - "ERR 17" /* RSE_ */ - "ERR 18" /* RSE_ */ - "ERR 19" /* RSE_ */ - "ERR 20" /* RSE_ */ - "some error" /* 21 RSE_SOME_ERROR */ + "out of memory", /* 1 RSE_NOMEM */ + "not yet implemented", /* 2 RSE_NOSYS */ + "invalid handle", /* 3 RSE_INVALID_CTX */ + "invalid connection", /* 4 RSE_INVALID_CONN */ + "connection type mismatch", /* 5 RSE_CONN_TYPE_MISMATCH */ + "FreeRadius error", /* 6 RSE_FR */ + "bad hostname or port", /* 7 RSE_BADADDR */ + "no peer configured", /* 8 RSE_NOPEER */ + "libevent error", /* 9 RSE_EVENT */ + "socket error", /* 10 RSE_SOCKERR */ + "invalid configuration file", /* 11 RSE_CONFIG */ + "authentication failed", /* 12 RSE_BADAUTH */ + "internal error", /* 13 RSE_INTERNAL */ + "SSL error", /* 14 RSE_SSLERR */ + "invalid packet", /* 15 RSE_INVALID_PKT */ + "connect timeout", /* 16 RSE_TIMEOUT_CONN */ + "invalid argument", /* 17 RSE_INVAL */ + "I/O timeout", /* 18 RSE_TIMEOUT_IO */ + "timeout", /* 19 RSE_TIMEOUT */ + "peer disconnected", /* 20 RSE_DISCO */ + "invalid credentials", /* 21 RSE_CRED */ + "certificate validation error", /* 22 RSE_CERT */ }; #define ERRTXT_SIZE (sizeof(_errtxt) / sizeof(*_errtxt)) @@ -36,7 +42,7 @@ static struct rs_error * _err_vcreate (unsigned int code, const char *file, int line, const char *fmt, va_list args) { - struct rs_error *err; + struct rs_error *err = NULL; err = malloc (sizeof(struct rs_error)); if (err) @@ -58,7 +64,7 @@ _err_vcreate (unsigned int code, const char *file, int line, const char *fmt, char *sep = strrchr (file, '/'); if (sep) file = sep + 1; - snprintf (err->buf + n, sizeof(err->buf) - n, " (%s: %d)", file, + snprintf (err->buf + n, sizeof(err->buf) - n, " (%s:%d)", file, line); } } @@ -66,15 +72,19 @@ _err_vcreate (unsigned int code, const char *file, int line, const char *fmt, } struct rs_error * -_rs_err_create (unsigned int code, const char *file, int line, const char *fmt, - ...) +err_create (unsigned int code, + const char *file, + int line, + const char *fmt, + ...) { - struct rs_error *err; + struct rs_error *err = NULL; va_list args; va_start (args, fmt); err = _err_vcreate (code, file, line, fmt, args); va_end (args); + return err; } @@ -84,36 +94,52 @@ _ctx_err_vpush_fl (struct rs_context *ctx, int code, const char *file, { struct rs_error *err = _err_vcreate (code, file, line, fmt, args); - if (err) - ctx->err = err; - return code; + if (!err) + return RSE_NOMEM; + + /* TODO: Implement a stack. */ + if (ctx->err) + rs_err_free (ctx->err); + ctx->err = err; + + return err->code; } int rs_err_ctx_push (struct rs_context *ctx, int code, const char *fmt, ...) { + int r = 0; va_list args; + va_start (args, fmt); - _ctx_err_vpush_fl (ctx, code, NULL, 0, fmt, args); + r = _ctx_err_vpush_fl (ctx, code, NULL, 0, fmt, args); va_end (args); - return code; + + return r; } int rs_err_ctx_push_fl (struct rs_context *ctx, int code, const char *file, int line, const char *fmt, ...) { + int r = 0; va_list args; + va_start (args, fmt); - _ctx_err_vpush_fl (ctx, code, file, line, fmt, args); + r = _ctx_err_vpush_fl (ctx, code, file, line, fmt, args); va_end (args); - return code; + + return r; } int -_rs_err_conn_push_err (struct rs_connection *conn, struct rs_error *err) +err_conn_push_err (struct rs_connection *conn, struct rs_error *err) { + + if (conn->err) + rs_err_free (conn->err); conn->err = err; /* FIXME: use a stack */ + return err->code; } @@ -123,30 +149,37 @@ _conn_err_vpush_fl (struct rs_connection *conn, int code, const char *file, { struct rs_error *err = _err_vcreate (code, file, line, fmt, args); - if (err) - _rs_err_conn_push_err (conn, err); - return code; + if (!err) + return RSE_NOMEM; + + return err_conn_push_err (conn, err); } int rs_err_conn_push (struct rs_connection *conn, int code, const char *fmt, ...) { + int r = 0; + va_list args; va_start (args, fmt); - _conn_err_vpush_fl (conn, code, NULL, 0, fmt, args); + r = _conn_err_vpush_fl (conn, code, NULL, 0, fmt, args); va_end (args); - return code; + + return r; } int rs_err_conn_push_fl (struct rs_connection *conn, int code, const char *file, int line, const char *fmt, ...) { + int r = 0; + va_list args; va_start (args, fmt); - _conn_err_vpush_fl (conn, code, file, line, fmt, args); + r = _conn_err_vpush_fl (conn, code, file, line, fmt, args); va_end (args); - return code; + + return r; } struct rs_error * @@ -158,6 +191,7 @@ rs_err_ctx_pop (struct rs_context *ctx) return NULL; /* FIXME: RSE_INVALID_CTX. */ err = ctx->err; ctx->err = NULL; + return err; } @@ -170,33 +204,35 @@ rs_err_conn_pop (struct rs_connection *conn) return NULL; /* FIXME: RSE_INVALID_CONN */ err = conn->err; conn->err = NULL; + return err; } +int +rs_err_conn_peek_code (struct rs_connection *conn) +{ + if (!conn) + return -1; /* FIXME: RSE_INVALID_CONN */ + if (conn->err) + return conn->err->code; + + return RSE_OK; +} + 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, int dofree_flag) +rs_err_msg (struct rs_error *err) { - char *msg; - if (!err) return NULL; - if (err->msg) - msg = err->msg; - else - msg = strdup (err->buf); - if (dofree_flag) - rs_err_free (err); - return msg; + return err->buf; } int @@ -209,6 +245,7 @@ rs_err_code (struct rs_error *err, int dofree_flag) code = err->code; if (dofree_flag) - rs_err_free(err); + rs_err_free (err); + return code; }