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