Lets keep our version of opftpd in the CVS
[oftpd.git] / src / error.c
1 /*
2  * $Id$
3  *
4  * This data type allows modules to cleanly return error information in a 
5  * relatively clean fashion.  It only includes an error number and a
6  * description string right now.  It could be modified to include a large
7  * number of other data, e.g. module, file/line, timestamp.  I don't
8  * need that for my program right now, so I'm going to keep it simple. 
9  *
10  * -Shane
11  */
12
13 #include <config.h>
14 #include <string.h>
15 #include <stdio.h>
16 #include <stdarg.h>
17 #include "daemon_assert.h"
18 #include "error.h"
19
20 static int invariant(const error_t *err);
21
22 void error_init(error_t *err, int error_code, const char *desc_fmt, ...)
23 {
24     va_list args;
25
26     daemon_assert(err != NULL);
27     daemon_assert(error_code >= 0);
28     daemon_assert(desc_fmt != NULL);
29
30     err->error_code = error_code;
31     va_start(args, desc_fmt);
32     vsnprintf(err->desc, sizeof(err->desc), desc_fmt, args);
33     va_end(args);
34
35     daemon_assert(invariant(err));
36 }
37
38 int error_get_error_code(const error_t *err)
39 {
40     daemon_assert(invariant(err));
41     return err->error_code;
42 }
43
44 const char *error_get_desc(const error_t *err)
45 {
46     daemon_assert(invariant(err));
47     return err->desc;
48 }
49
50 #ifndef NDEBUG
51 static int invariant(const error_t *err)
52 {
53     if (err == NULL) {
54         return 0;
55     }
56     if (err->error_code < 0) {
57         return 0;
58     }
59     if (strlen(err->desc) >= sizeof(err->desc)) {
60         return 0;
61     }
62     return 1;
63 }
64 #endif /* NDEBUG */
65