aboutsummaryrefslogtreecommitdiffstats
path: root/include/osmocore/debug.h
blob: 0caec28316ad85b3fdae7177f84991cf4a110160 (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
122
123
124
125
126
127
128
129
130
#ifndef _OSMOCORE_DEBUG_H
#define _OSMOCORE_DEBUG_H

#include <stdio.h>
#include <stdint.h>
#include <osmocore/linuxlist.h>

#define DEBUG_MAX_CATEGORY	32
#define DEBUG_MAX_CTX		8
#define DEBUG_MAX_FILTERS	8

#define DEBUG

#ifdef DEBUG
#define DEBUGP(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 0, fmt, ## args)
#define DEBUGPC(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 1, fmt, ## args)
#else
#define DEBUGP(xss, fmt, args...)
#define DEBUGPC(ss, fmt, args...)
#endif

#define static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1];

char *hexdump(const unsigned char *buf, int len);
void debugp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));

/* new logging interface */
#define LOGP(ss, level, fmt, args...) \
	debugp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
#define LOGPC(ss, level, fmt, args...) \
	debugp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)

/* different levels */
#define LOGL_DEBUG	1	/* debugging information */
#define LOGL_INFO	3
#define LOGL_NOTICE	5	/* abnormal/unexpected condition */
#define LOGL_ERROR	7	/* error condition, requires user action */
#define LOGL_FATAL	8	/* fatal, program aborted */

#define DEBUG_FILTER_ALL	0x0001

struct debug_category {
	uint8_t loglevel;
	uint8_t enabled;
};

struct debug_info_cat {
	const char *name;
	const char *color;
	const char *description;
	uint8_t loglevel;
	uint8_t enabled;
};

/* debug context information, passed to filter */
struct debug_context {
	void *ctx[DEBUG_MAX_CTX+1];
};

struct debug_target;

typedef int debug_filter(const struct debug_context *ctx,
			 struct debug_target *target);

struct debug_info {
	/* filter callback function */
	debug_filter *filter_fn;

	/* per-category information */
	const struct debug_info_cat *cat;
	unsigned int num_cat;
};

struct debug_target {
        struct llist_head entry;

	int filter_map;
	void *filter_data[DEBUG_MAX_FILTERS+1];

	struct debug_category categories[DEBUG_MAX_CATEGORY+1];
	uint8_t loglevel;
	int use_color:1;
	int print_timestamp:1;

	union {
		struct {
			FILE *out;
		} tgt_stdout;

		struct {
			int priority;
		} tgt_syslog;

		struct {
			void *vty;
		} tgt_vty;
	};

        void (*output) (struct debug_target *target, const char *string);
};

/* use the above macros */
void debugp2(unsigned int subsys, unsigned int level, char *file,
	     int line, int cont, const char *format, ...)
				__attribute__ ((format (printf, 6, 7)));
void debug_init(const struct debug_info *cat);

/* context management */
void debug_reset_context(void);
int debug_set_context(uint8_t ctx, void *value);

/* filter on the targets */
void debug_set_all_filter(struct debug_target *target, int);

void debug_set_use_color(struct debug_target *target, int);
void debug_set_print_timestamp(struct debug_target *target, int);
void debug_set_log_level(struct debug_target *target, int log_level);
void debug_parse_category_mask(struct debug_target *target, const char* mask);
int debug_parse_level(const char *lvl);
int debug_parse_category(const char *category);
void debug_set_category_filter(struct debug_target *target, int category,
			       int enable, int level);

/* management of the targets */
struct debug_target *debug_target_create(void);
struct debug_target *debug_target_create_stderr(void);
void debug_add_target(struct debug_target *target);
void debug_del_target(struct debug_target *target);

#endif /* _OSMOCORE_DEBUG_H */