summaryrefslogtreecommitdiff
path: root/lib/err.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/err.c')
-rw-r--r--lib/err.c97
1 files changed, 61 insertions, 36 deletions
diff --git a/lib/err.c b/lib/err.c
index 1e1dfaf..4a90019 100644
--- a/lib/err.c
+++ b/lib/err.c
@@ -1,4 +1,5 @@
-/* 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 <config.h>
@@ -30,6 +31,8 @@ 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 */
};
#define ERRTXT_SIZE (sizeof(_errtxt) / sizeof(*_errtxt))
@@ -37,7 +40,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)
@@ -67,15 +70,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;
}
@@ -85,36 +92,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;
}
@@ -124,30 +147,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 *
@@ -159,6 +189,7 @@ rs_err_ctx_pop (struct rs_context *ctx)
return NULL; /* FIXME: RSE_INVALID_CTX. */
err = ctx->err;
ctx->err = NULL;
+
return err;
}
@@ -171,42 +202,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
@@ -219,6 +243,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;
}