Rename the error functions.
[radsecproxy.git] / lib / err.c
index 66c5d94..00de47f 100644 (file)
--- a/lib/err.c
+++ b/lib/err.c
@@ -1,6 +1,10 @@
+/* See the file COPYING for licensing information.  */
+
+#include <stdio.h>
+#include <string.h>
 #include <assert.h>
-#include "libradsec.h"
-#include "libradsec-impl.h"
+#include <radsec/radsec.h>
+#include <radsec/radsec-impl.h>
 
 const char *_errtxt[] = {
   "SUCCESS",                   /* 0 RSE_OK */
@@ -8,12 +12,12 @@ const char *_errtxt[] = {
   "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_ */
+  "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_ */
@@ -26,29 +30,44 @@ const char *_errtxt[] = {
   "ERR "                       /*  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 *msg)
+_err_new (unsigned int code, const char *file, int line, const char *fmt, va_list args)
 {
   struct rs_error *err;
 
-  err = malloc (sizeof (struct rs_error));
+  err = malloc (sizeof(struct rs_error));
   if (err)
     {
-      memset (err, 0, sizeof (struct rs_error));
+      int n;
+      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);
+      if (fmt)
+       n = vsnprintf (err->buf, sizeof(err->buf), fmt, args);
+      else
+       {
+         strncpy (err->buf,
+                  err->code < ERRTXT_SIZE ? _errtxt[err->code] : "",
+                  sizeof(err->buf));
+         n = strlen (err->buf);
+       }
+      if (n >= 0 && file)
+       {
+         char *sep = strrchr (file, '/');
+         if (sep)
+           file = sep + 1;
+         snprintf (err->buf + n, sizeof(err->buf) - n, " (%s: %d)", file,
+                   line);
+       }
     }
   return err;
 }
 
-int
-rs_ctx_err_push (struct rs_handle *ctx, int code, const char *msg)
+static int
+_ctx_err_vpush_fl (struct rs_handle *ctx, int code, const char *file, int line, const char *fmt, va_list args)
 {
-  struct rs_error *err = _err_new (code, msg);
+  struct rs_error *err = _err_new (code, file, line, fmt, args);
 
   if (err)
     ctx->err = err;
@@ -56,17 +75,57 @@ rs_ctx_err_push (struct rs_handle *ctx, int code, const char *msg)
 }
 
 int
-rs_conn_err_push (struct rs_connection *conn, int code, const char *msg)
+rs_err_ctx_push (struct rs_handle *ctx, int code, const char *fmt, ...)
+{
+  va_list args;
+  va_start (args, fmt);
+  _ctx_err_vpush_fl (ctx, code, NULL, 0, fmt, args);
+  va_end (args);
+  return code;
+}
+
+int
+rs_err_ctx_push_fl (struct rs_handle *ctx, int code, const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  va_start (args, fmt);
+  _ctx_err_vpush_fl (ctx, code, file, line, fmt, args);
+  va_end (args);
+  return code;
+}
+
+static int
+_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, msg);
+  struct rs_error *err = _err_new (code, file, line, fmt, args);
 
   if (err)
     conn->err = err;
   return code;
 }
 
+int
+rs_err_conn_push (struct rs_connection *conn, int code, const char *fmt, ...)
+{
+  va_list args;
+  va_start (args, fmt);
+  _conn_err_vpush_fl (conn, code, NULL, 0, fmt, args);
+  va_end (args);
+  return code;
+}
+
+int
+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);
+  _conn_err_vpush_fl (conn, code, file, line, fmt, args);
+  va_end (args);
+  return code;
+}
+
 struct rs_error *
-rs_ctx_err_pop (struct rs_handle *ctx)
+rs_err_ctx_pop (struct rs_handle *ctx)
 {
   struct rs_error *err;
 
@@ -78,7 +137,7 @@ rs_ctx_err_pop (struct rs_handle *ctx)
 }
 
 struct rs_error *
-rs_conn_err_pop (struct rs_connection *conn)
+rs_err_conn_pop (struct rs_connection *conn)
 {
   struct rs_error *err;
 
@@ -99,23 +158,32 @@ rs_err_free (struct rs_error *err)
 }
 
 char *
-rs_err_msg (struct rs_error *err)
+rs_err_msg (struct rs_error *err, int dofree_flag)
 {
   char *msg;
 
+  if (!err)
+    return NULL;
   if (err->msg)
     msg = err->msg;
   else
     msg = strdup (err->buf);
 
-  rs_err_free (err);
+  if (dofree_flag)
+    rs_err_free (err);
   return msg;
 }
 
 int
-rs_err_code (struct rs_error *err)
+rs_err_code (struct rs_error *err, int dofree_flag)
 {
-  int code = err->code;
-  rs_err_free(err);
+  int code;
+
+  if (!err)
+    return -1;
+  code = err->code;
+
+  if (dofree_flag)
+    rs_err_free(err);
   return code;
 }