summaryrefslogtreecommitdiff
path: root/lib/err.c
blob: 66c5d94fb13153d8aec65b9b2d0e3af83b84d25f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <assert.h>
#include "libradsec.h"
#include "libradsec-impl.h"

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 */
  "ERR 5"			/*  RSE_ */
  "ERR 6"			/*  RSE_ */
  "ERR 7"			/*  RSE_ */
  "ERR 8"			/*  RSE_ */
  "ERR 9"			/*  RSE_ */
  "ERR 10"			/*  RSE_ */
  "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 */
};

static struct rs_error *
_err_new (unsigned int code, const char *msg)
{
  struct rs_error *err;

  err = malloc (sizeof (struct rs_error));
  if (err)
    {
      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);
    }
  return err;
}

int
rs_ctx_err_push (struct rs_handle *ctx, int code, const char *msg)
{
  struct rs_error *err = _err_new (code, msg);

  if (err)
    ctx->err = err;
  return code;
}

int
rs_conn_err_push (struct rs_connection *conn, int code, const char *msg)
{
  struct rs_error *err = _err_new (code, msg);

  if (err)
    conn->err = err;
  return code;
}

struct rs_error *
rs_ctx_err_pop (struct rs_handle *ctx)
{
  struct rs_error *err;

  if (!ctx)
    return NULL;		/* FIXME: RSE_INVALID_CTX.  */
  err = ctx->err;
  ctx->err = NULL;
  return err;
}

struct rs_error *
rs_conn_err_pop (struct rs_connection *conn)
{
  struct rs_error *err;

  if (!conn)
    return NULL;		/* FIXME: RSE_INVALID_CONN */
  err = conn->err;
  conn->err = NULL;
  return err;
}

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)
{
  char *msg;

  if (err->msg)
    msg = err->msg;
  else
    msg = strdup (err->buf);

  rs_err_free (err);
  return msg;
}

int
rs_err_code (struct rs_error *err)
{
  int code = err->code;
  rs_err_free(err);
  return code;
}