Don't enable dnsmasq IPSET functionality on 2.4 kernel
[tomato.git] / release / src / router / radvd / log.c
blob96596c1601b90ad98e4271ebc5a401305d846751
1 /*
3 * Authors:
4 * Lars Fenneberg <lf@elemental.net>
6 * This software is Copyright 1996,1997 by the above mentioned author(s),
7 * All Rights Reserved.
9 * The license which is distributed with this software in the file
10 * COPYRIGHT applies to this software. If your distribution is missing
11 * this file, you may request it from <pekkas@netcore.fi>.
15 #include "config.h"
16 #include "includes.h"
17 #include "radvd.h"
19 static int log_method = L_NONE;
20 static char *log_ident;
21 static char *log_file;
22 static FILE *log_file_fd;
23 static int log_facility;
24 static int debug_level = 0;
26 int
27 log_open(int method, char *ident, char *log, int facility)
29 log_method = method;
30 log_ident = ident;
32 switch (log_method) {
33 case L_NONE:
34 case L_STDERR:
35 break;
36 case L_STDERR_SYSLOG:
37 /* fallthrough */
38 case L_SYSLOG:
39 if (facility == -1)
40 log_facility = LOG_DAEMON;
41 else
42 log_facility = facility;
44 openlog(log_ident, LOG_PID, log_facility);
45 break;
46 case L_LOGFILE:
47 if (!log)
49 fprintf(stderr, "%s: no logfile specified\n", log_ident);
50 return (-1);
52 log_file = log;
53 if ((log_file_fd = fopen(log_file, "a")) == NULL)
55 fprintf(stderr, "%s: can't open %s: %s\n", log_ident, log_file, strerror(errno));
56 return (-1);
58 break;
59 default:
60 fprintf(stderr, "%s: unknown logging method: %d\n", log_ident, log_method);
61 log_method = L_NONE;
62 return (-1);
64 return 0;
67 /* note: [dfv]log() is also called from root context */
68 static int
69 vlog(int prio, char *format, va_list ap)
71 char tstamp[64], buff[1024];
72 struct tm *tm;
73 time_t current;
75 vsnprintf(buff, sizeof(buff), format, ap);
77 switch (log_method) {
78 case L_NONE:
79 break;
80 case L_SYSLOG:
81 syslog(prio, "%s", buff);
82 break;
83 case L_STDERR_SYSLOG:
84 syslog(prio, "%s", buff);
85 if (prio > LOG_ERR) /* fall through for messages with high priority */
86 break;
87 case L_STDERR:
88 current = time(NULL);
89 tm = localtime(&current);
90 (void) strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);
92 fprintf(stderr, "[%s] %s: %s\n", tstamp, log_ident, buff);
93 fflush(stderr);
94 break;
95 case L_LOGFILE:
96 current = time(NULL);
97 tm = localtime(&current);
98 (void) strftime(tstamp, sizeof(tstamp), LOG_TIME_FORMAT, tm);
100 fprintf(log_file_fd, "[%s] %s: %s\n", tstamp, log_ident, buff);
101 fflush(log_file_fd);
102 break;
103 default:
104 fprintf(stderr, "%s: unknown logging method: %d\n", log_ident, log_method);
105 log_method = L_NONE;
106 return (-1);
108 return 0;
111 void
112 dlog(int prio, int level, char *format, ...)
114 va_list ap;
116 if (debug_level < level)
117 return;
119 va_start(ap, format);
120 vlog(prio, format, ap);
121 va_end(ap);
124 void
125 flog(int prio, char *format, ...)
127 va_list ap;
129 va_start(ap, format);
130 vlog(prio, format, ap);
131 va_end(ap);
135 log_close(void)
137 switch (log_method) {
138 case L_NONE:
139 case L_STDERR:
140 break;
141 case L_STDERR_SYSLOG:
142 case L_SYSLOG:
143 closelog();
144 break;
145 case L_LOGFILE:
146 fclose(log_file_fd);
147 break;
148 default:
149 fprintf(stderr, "%s: unknown logging method: %d\n", log_ident, log_method);
150 log_method = L_NONE;
151 return (-1);
153 return 0;
156 void
157 set_debuglevel(int level)
159 debug_level = level;
163 get_debuglevel(void)
165 return debug_level;