Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / minix / log.h @ 13

History | View | Annotate | Download (2.84 KB)

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