xref: /minix/minix/include/minix/log.h (revision 83133719)
1 #ifndef __LOG_H__
2 #define __LOG_H__
3 /*
4  * Simple logging functions
5  */
6 
7 #include <stdarg.h>
8 
9 /*
10  * LEVEL_NONE  do not log anything.
11  * LEVEL_WARN  Information that needs to be known.
12  * LEVEL_INFO  Basic information like startup messages and occasional events.
13  * LEVEL_DEBUG debug statements about things happening that are less expected.
14  * LEVEL_TRACE Way to much information for anybody.
15  */
16 
17 #define LEVEL_NONE 0
18 #define LEVEL_WARN 1
19 #define LEVEL_INFO 2
20 #define LEVEL_DEBUG 3
21 #define LEVEL_TRACE 4
22 
23 static const char *level_string[5] = {
24 	"none",
25 	"warn",
26 	"info",
27 	"debug",
28 	"trace"
29 };
30 
31 /*
32  * struct to be initialized by the user of the logging system.
33  *
34  * name: The name attribute is used in logging statements do differentiate
35  * drivers
36  *
37  * log_level The level attribute describes the requested logging level. a level
38  * of 1 will only print warnings while a level of 4 will print all the trace
39  * information.
40  *
41  * log_func The logging function to use to log, log.h provides default_log
42  * to display information on the kernel output buffer. As a bonus if the
43  * requested log level is debug or trace the method , file and line number will
44  * be printed to the steam.
45  */
46 struct log
47 {
48 	const char *name;
49 	int log_level;
50 
51 	/* the logging function itself */
52 	void (*log_func) (struct log * driver,
53 	    int level,
54 	    const char *file,
55 	    const char *function, int line, const char *fmt, ...);
56 
57 };
58 
59 #define __log(driver,log_level, fmt, args...) \
60 		((driver)->log_func(driver,log_level, \
61 				__FILE__, __FUNCTION__, __LINE__,\
62 				fmt, ## args))
63 
64 /* Log a warning */
65 #define log_warn(driver, fmt, args...) \
66 		__log(driver, LEVEL_WARN, fmt, ## args)
67 
68 /* Log an information message  */
69 #define log_info(driver, fmt, args...) \
70 		__log(driver, LEVEL_INFO, fmt, ## args)
71 
72 /* log debugging output  */
73 #define log_debug(driver, fmt, args...) \
74 		__log(driver, LEVEL_DEBUG, fmt, ## args)
75 
76 /* log trace output  */
77 #define log_trace(driver, fmt, args...) \
78 		__log(driver, LEVEL_TRACE, fmt, ## args)
79 
80 #endif /* __LOG_H__ */
81 
82 static void
83 default_log(struct log *driver,
84     int level,
85     const char *file, const char *function, int line, const char *fmt, ...)
86 {
87 	va_list args;
88 
89 	if (level > driver->log_level) {
90 		return;
91 	}
92 	/* If the wanted level is debug also display line/method information */
93 	if (driver->log_level >= LEVEL_DEBUG) {
94 		printf("%s(%s):%s+%d(%s):", driver->name,
95 		    level_string[level], file, line, function);
96 	} else {
97 		printf("%s(%s)", driver->name, level_string[level]);
98 	}
99 
100 	va_start(args, fmt);
101 	vprintf(fmt, args);
102 	va_end(args);
103 }
104 
105 #ifdef hacks
106 static void
107 hexdump(unsigned char *d, unsigned int size)
108 {
109 	int s;
110 	for (s = 0; s < size; s += 4) {
111 		fprintf(stdout, "0x%04x 0x%02X%02X%02X%02X %c%c%c%c\n", s,
112 		    (unsigned int) d[s], (unsigned int) d[s + 1],
113 		    (unsigned int) d[s + 2], (unsigned int) d[s + 3], d[s],
114 		    d[s + 1], d[s + 2], d[s + 3]);
115 	}
116 }
117 #endif
118