summaryrefslogtreecommitdiff
path: root/err.h
blob: 7e93c9d41a1b321fdb958af40da5a923ded9fc20 (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
/* SPDX-License-Identifier: GPL-2.0 */

extern char *dss_errlist[];
extern char *dss_error_txt;

__printf_2_3 void dss_log(int ll, const char* fmt,...);

/*
 * This bit indicates whether a number is considered a system error number
 * If yes, the system errno is just the result of clearing this bit from
 * the given number.
 */
#define SYSTEM_ERROR_BIT 30

/* Check whether the system error bit is set. */
#define IS_SYSTEM_ERROR(num) (!!((num) & (1 << SYSTEM_ERROR_BIT)))

/* Set the system error bit for the given number. */
#define ERRNO_TO_DSS_ERROR(num) ((num) | (1 << SYSTEM_ERROR_BIT))

static inline char *dss_strerror(int num)
{
	assert(num > 0);
	if (IS_SYSTEM_ERROR(num))
		return strerror((num) & ((1 << SYSTEM_ERROR_BIT) - 1));
	else
		return dss_errlist[num];
}

#define DSS_ERRORS \
	DSS_ERROR(SUCCESS, "success"), \
	DSS_ERROR(SYNTAX, "syntax error"), \
	DSS_ERROR(ATOI_OVERFLOW, "value too large"), \
	DSS_ERROR(STRTOLL, "unknown strtoll error"), \
	DSS_ERROR(ATOI_NO_DIGITS, "no digits found in string"), \
	DSS_ERROR(ATOI_JUNK_AT_END, "further characters after number"), \
	DSS_ERROR(INVALID_NUMBER, "invalid number"), \
	DSS_ERROR(STRFTIME, "strftime() failed"), \
	DSS_ERROR(LOCALTIME, "localtime() failed"), \
	DSS_ERROR(HOOK_FAILED, "hook failure"), \
	DSS_ERROR(MOUNTPOINT, "destination directory is no mountpoint"), \
	DSS_ERROR(NULL_OPEN, "can not open /dev/null"), \
	DSS_ERROR(DUP_PIPE, "exec error: can not create pipe"), \
	DSS_ERROR(INVOLUNTARY_EXIT, "unexpected termination cause"), \
	DSS_ERROR(BAD_EXIT_CODE, "unexpected exit code"), \
	DSS_ERROR(SIGNAL_SIG_ERR, "signal() returned SIG_ERR"), \
	DSS_ERROR(SIGNAL, "caught terminating signal"), \
	DSS_ERROR(KILL_TIMEOUT, "signal timeout expired"), \
	DSS_ERROR(BUG, "values of beta might cause dom!"), \
	DSS_ERROR(NOT_RUNNING, "dss not running"), \
	DSS_ERROR(ALREADY_RUNNING, "dss already running"), \
	DSS_ERROR(TOO_MANY_RSYNC_ERRORS, "too many consecutive rsync errors"), \
	DSS_ERROR(LOPSUB, "lopsub error")

/*
 * This is temporarily defined to expand to its first argument (prefixed by
 * 'E_') and gets later redefined to expand to the error text only.
 */
#define DSS_ERROR(err, msg) E_ ## err

enum dss_error_codes {
	DSS_ERRORS
};
#undef DSS_ERROR
#define DSS_ERROR(err, msg) msg
#define DEFINE_DSS_ERRLIST char *dss_errlist[] = {DSS_ERRORS}