Improve protocol robustness and invoke user callbacks.
[radsecproxy.git] / lib / err.c
index 00de47f..a7ddeb9 100644 (file)
--- a/lib/err.c
+++ b/lib/err.c
@@ -1,39 +1,44 @@
 /* See the file COPYING for licensing information.  */
 
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 #include <radsec/radsec.h>
 #include <radsec/radsec-impl.h>
 
-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 */
-  "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 */
+  "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 */
+  "ERR 16",                    /*  RSE_ */
+  "ERR 17",                    /*  RSE_ */
+  "ERR 18",                    /*  RSE_ */
+  "ERR 19",                    /*  RSE_ */
+  "ERR 20",                    /*  RSE_ */
+  "some error",                        /* 21 RSE_SOME_ERROR */
 };
 #define ERRTXT_SIZE (sizeof(_errtxt) / sizeof(*_errtxt))
 
 static struct rs_error *
-_err_new (unsigned int code, const char *file, int line, const char *fmt, va_list args)
+_err_vcreate (unsigned int code, const char *file, int line, const char *fmt,
+             va_list args)
 {
   struct rs_error *err;
 
@@ -57,17 +62,31 @@ _err_new (unsigned int code, const char *file, int line, const char *fmt, va_lis
          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);
        }
     }
   return err;
 }
 
+struct rs_error *
+_rs_err_create (unsigned int code, const char *file, int line, const char *fmt,
+               ...)
+{
+  struct rs_error *err;
+
+  va_list args;
+  va_start (args, fmt);
+  err = _err_vcreate (code, file, line, fmt, args);
+  va_end (args);
+  return err;
+}
+
 static int
-_ctx_err_vpush_fl (struct rs_handle *ctx, int code, const char *file, int line, const char *fmt, va_list args)
+_ctx_err_vpush_fl (struct rs_context *ctx, int code, const char *file,
+                  int line, const char *fmt, va_list args)
 {
-  struct rs_error *err = _err_new (code, file, line, fmt, args);
+  struct rs_error *err = _err_vcreate (code, file, line, fmt, args);
 
   if (err)
     ctx->err = err;
@@ -75,7 +94,7 @@ _ctx_err_vpush_fl (struct rs_handle *ctx, int code, const char *file, int line,
 }
 
 int
-rs_err_ctx_push (struct rs_handle *ctx, int code, const char *fmt, ...)
+rs_err_ctx_push (struct rs_context *ctx, int code, const char *fmt, ...)
 {
   va_list args;
   va_start (args, fmt);
@@ -85,7 +104,8 @@ rs_err_ctx_push (struct rs_handle *ctx, int code, const char *fmt, ...)
 }
 
 int
-rs_err_ctx_push_fl (struct rs_handle *ctx, int code, const char *file, int line, const char *fmt, ...)
+rs_err_ctx_push_fl (struct rs_context *ctx, int code, const char *file,
+                   int line, const char *fmt, ...)
 {
   va_list args;
   va_start (args, fmt);
@@ -94,13 +114,21 @@ rs_err_ctx_push_fl (struct rs_handle *ctx, int code, const char *file, int line,
   return code;
 }
 
+int
+_rs_err_conn_push_err (struct rs_connection *conn, struct rs_error *err)
+{
+  conn->err = err;             /* FIXME: use a stack */
+  return err->code;
+}
+
 static int
-_conn_err_vpush_fl (struct rs_connection *conn, int code, const char *file, int line, const char *fmt, va_list args)
+_conn_err_vpush_fl (struct rs_connection *conn, int code, const char *file,
+                   int line, const char *fmt, va_list args)
 {
-  struct rs_error *err = _err_new (code, file, line, fmt, args);
+  struct rs_error *err = _err_vcreate (code, file, line, fmt, args);
 
   if (err)
-    conn->err = err;
+    _rs_err_conn_push_err (conn, err);
   return code;
 }
 
@@ -115,7 +143,8 @@ rs_err_conn_push (struct rs_connection *conn, int code, const char *fmt, ...)
 }
 
 int
-rs_err_conn_push_fl (struct rs_connection *conn, int code, const char *file, int line, const char *fmt, ...)
+rs_err_conn_push_fl (struct rs_connection *conn, int code, const char *file,
+                    int line, const char *fmt, ...)
 {
   va_list args;
   va_start (args, fmt);
@@ -125,7 +154,7 @@ rs_err_conn_push_fl (struct rs_connection *conn, int code, const char *file, int
 }
 
 struct rs_error *
-rs_err_ctx_pop (struct rs_handle *ctx)
+rs_err_ctx_pop (struct rs_context *ctx)
 {
   struct rs_error *err;