source: branches/ithildin-1.1/source/log.c @ 762

Revision 762, 3.3 KB checked in by wd, 6 years ago (diff)

Add recursion protection to log.c

  • Property svn:keywords set to Id Rev
Line 
1/*
2 * log.c: logging support functions
3 *
4 * Copyright 2002 the Ithildin Project.
5 * See the COPYING file for more information on licensing and use.
6 *
7 * This file contains a simple group of functions to log messages from the
8 * daemon.  No actual I/O is done here, this is simply a set of mechanisms to
9 * hook the appropriate events.
10 */
11
12#include <ithildin/stand.h>
13
14IDSTRING(rcsid, "$Id$");
15
16/* convert a log type to a string describing what it is */
17const char *log_conv_str(enum logtypes type) {
18
19    switch (type) {
20        case LOGTYPE_DEBUG:
21            return "debug";
22        case LOGTYPE_NOTICE:
23            return "notice";
24        case LOGTYPE_WARN:
25            return "warning";
26        case LOGTYPE_ERROR:
27            return "error";
28        default:
29            return "unknown";
30    }
31}
32
33/* try to convert a string specifying a logtype to the type itself */
34enum logtypes str_conv_log(const char *str) {
35
36    if (!strcasecmp(str, "debug"))
37        return LOGTYPE_DEBUG;
38    else if (!strcasecmp(str, "notice"))
39        return LOGTYPE_NOTICE;
40    else if (!strncasecmp(str, "warn", 4))
41        return LOGTYPE_WARN;
42    else if (!strncasecmp(str, "err", 3))
43        return LOGTYPE_ERROR;
44    else
45        return LOGTYPE_UNKNOWN;
46}
47
48#ifdef NEED_INDIVIDUAL_LOG_FUNCTIONS
49void log_debug(const char *msg, ...) {
50    va_list ap;
51    va_start(ap, msg);
52    log_vmsg(LOGTYPE_DEBUG, "", msg, ap);
53    va_end(ap);
54}
55
56void log_notice(const char *msg, ...) {
57    va_list ap;
58    va_start(ap, msg);
59    log_vmsg(LOGTYPE_NOTICE, "", msg, ap);
60    va_end(ap);
61}
62
63void log_warn(const char *msg, ...) {
64    va_list ap;
65    va_start(ap, msg);
66    log_vmsg(LOGTYPE_WARN, "", msg, ap);
67    va_end(ap);
68}
69
70void log_error(const char *msg, ...) {
71    va_list ap;
72    va_start(ap, msg);
73    log_vmsg(LOGTYPE_ERROR, "", msg, ap);
74    va_end(ap);
75}
76#endif
77
78void log_msg(enum logtypes type, const char *mod, const char *msg, ...) {
79    va_list ap;
80    va_start(ap, msg);
81    log_vmsg(type, mod, msg, ap);
82    va_end(ap);
83}
84
85/* Recursion protection for logged messages.  If we log_*() and then hook an
86 * event which generates a log_*() we can end up in serious trouble. :) */
87#define LOG_RECURSE_MAX 10
88static uint32_t log_recursed;
89
90void log_vmsg(enum logtypes type, const char *mod, const char *msg,
91        va_list ap) {
92    static char logmsg[LOG_MSG_MAXLEN];
93    struct log_event_data led;
94
95    if (!me.debug && type == LOGTYPE_DEBUG)
96        return; /* avoid doing anything for debug messages when we don't
97                   want to */
98
99    log_recursed++;
100    if (log_recursed == LOG_RECURSE_MAX) {
101        log_recursed--;
102        return;
103    }
104
105    vsnprintf(logmsg, LOG_MSG_MAXLEN, msg, ap);
106
107    led.level = type;
108    led.module = (mod != NULL ? mod : "");
109    led.msg = logmsg;
110
111    switch (type) {
112        case LOGTYPE_DEBUG:
113            hook_event(me.events.log_debug, (void *)&led);
114            break;
115        case LOGTYPE_NOTICE:
116            hook_event(me.events.log_notice, (void *)&led);
117            break;
118        case LOGTYPE_WARN:
119            hook_event(me.events.log_warn, (void *)&led);
120            break;
121        case LOGTYPE_ERROR:
122            hook_event(me.events.log_error, (void *)&led);
123            break;
124        default:
125            hook_event(me.events.log_unknown, (void *)&led);
126            break;
127    }
128
129    log_recursed--;
130}
131
132
133/* vi:set ts=8 sts=4 sw=4 tw=76 et: */
Note: See TracBrowser for help on using the repository browser.