Add an error code.
[radsecproxy.git] / lib / err.c
index 55fc5de..875a3f4 100644 (file)
--- a/lib/err.c
+++ b/lib/err.c
@@ -31,6 +31,10 @@ static const char *_errtxt[] = {
   "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))
 
@@ -38,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)
@@ -68,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;
 }
 
@@ -86,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;
 }
 
@@ -125,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 *
@@ -160,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;
 }
 
@@ -172,42 +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 && conn->err)
+  if (!conn)
+    return -1;                 /* FIXME: RSE_INVALID_CONN */
+  if (conn->err)
     return conn->err->code;
-  else
-    return RSE_OK;
+
+  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
@@ -220,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;
 }