ade1a8ec25ea40a0c5a9a96ee622fbfcc7583ff2
[dss.git] / error.h
1 /*
2 * Copyright (C) 2006-2010 Andre Noll <maan@systemlinux.org>
3 *
4 * Licensed under the GPL v2. For licencing details see COPYING.
5 */
6 extern char *dss_errlist[];
7 extern char *dss_error_txt;
8
9 __printf_2_3 void dss_log(int ll, const char* fmt,...);
10
11 /**
12 * This bit indicates whether a number is considered a system error number
13 * If yes, the system errno is just the result of clearing this bit from
14 * the given number.
15 */
16 #define SYSTEM_ERROR_BIT 30
17
18 /** Check whether the system error bit is set. */
19 #define IS_SYSTEM_ERROR(num) (!!((num) & (1 << SYSTEM_ERROR_BIT)))
20
21 /** Set the system error bit for the given number. */
22 #define ERRNO_TO_DSS_ERROR(num) ((num) | (1 << SYSTEM_ERROR_BIT))
23
24 /**
25 * dss' version of strerror(3).
26 *
27 * \param num The error number.
28 *
29 * \return The error text of \a num.
30 */
31 static inline char *dss_strerror(int num)
32 {
33 assert(num > 0);
34 if (IS_SYSTEM_ERROR(num))
35 return strerror((num) & ((1 << SYSTEM_ERROR_BIT) - 1));
36 else
37 return dss_errlist[num];
38 }
39
40 #define DSS_ERRORS \
41 DSS_ERROR(SUCCESS, "success") \
42 DSS_ERROR(SYNTAX, "syntax error") \
43 DSS_ERROR(ATOI_OVERFLOW, "value too large") \
44 DSS_ERROR(STRTOLL, "unknown strtoll error") \
45 DSS_ERROR(ATOI_NO_DIGITS, "no digits found in string") \
46 DSS_ERROR(ATOI_JUNK_AT_END, "further characters after number") \
47 DSS_ERROR(INVALID_NUMBER, "invalid number") \
48 DSS_ERROR(STRFTIME, "strftime() failed") \
49 DSS_ERROR(LOCALTIME, "localtime() failed") \
50 DSS_ERROR(NULL_OPEN, "can not open /dev/null") \
51 DSS_ERROR(DUP_PIPE, "exec error: can not create pipe") \
52 DSS_ERROR(INVOLUNTARY_EXIT, "unexpected termination cause") \
53 DSS_ERROR(BAD_EXIT_CODE, "unexpected exit code") \
54 DSS_ERROR(SIGNAL_SIG_ERR, "signal() returned SIG_ERR") \
55 DSS_ERROR(SIGNAL, "caught terminating signal") \
56 DSS_ERROR(BUG, "values of beta might cause dom!") \
57
58
59 /**
60 * This is temporarily defined to expand to its first argument (prefixed by
61 * 'E_') and gets later redefined to expand to the error text only
62 */
63 #define DSS_ERROR(err, msg) E_ ## err,
64
65 enum dss_error_codes {
66 DSS_ERRORS
67 };
68 #undef DSS_ERROR
69 #define DSS_ERROR(err, msg) msg,
70 #define DEFINE_DSS_ERRLIST char *dss_errlist[] = {DSS_ERRORS}