]> git.meshlink.io Git - meshlink/blob - src/logger.c
bac5afac9f3faa363441108c1af5c5fb6cfe0128
[meshlink] / src / logger.c
1 /*
2     logger.c -- logging code
3     Copyright (C) 2004-2013 Guus Sliepen <guus@meshlink.io>
4                   2004-2005 Ivo Timmermans
5
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License along
17     with this program; if not, write to the Free Software Foundation, Inc.,
18     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include "system.h"
22
23 #include "conf.h"
24 #include "meta.h"
25 #include "logger.h"
26 #include "connection.h"
27 #include "sptps.h"
28
29 debug_t debug_level = DEBUG_NOTHING;
30 static logmode_t logmode = LOGMODE_STDERR;
31 static pid_t logpid;
32 #ifdef HAVE_MINGW
33 static HANDLE loghandle = NULL;
34 #endif
35 static const char *logident = NULL;
36
37 static void real_logger(int level, int priority, const char *message) {
38         char timestr[32] = "";
39         static bool suppress = false;
40
41         // Bail out early if there is nothing to do.
42         if(suppress)
43                 return;
44
45         if(level > debug_level || logmode == LOGMODE_NULL)
46                 return;
47
48         if(level <= debug_level) {
49                 switch(logmode) {
50                         case LOGMODE_STDERR:
51                                 fprintf(stderr, "%s\n", message);
52                                 fflush(stderr);
53                                 break;
54                         case LOGMODE_SYSLOG:
55 #ifdef HAVE_MINGW
56                                 {
57                                         const char *messages[] = {message};
58                                         ReportEvent(loghandle, priority, 0, 0, NULL, 1, 0, messages, NULL);
59                                 }
60 #else
61 #ifdef HAVE_SYSLOG_H
62                                 syslog(priority, "%s", message);
63 #endif
64 #endif
65                                 break;
66                         case LOGMODE_NULL:
67                                 break;
68                 }
69         }
70 }
71
72 void logger(int level, int priority, const char *format, ...) {
73         va_list ap;
74         char message[1024] = "";
75
76         va_start(ap, format);
77         int len = vsnprintf(message, sizeof message, format, ap);
78         va_end(ap);
79
80         if(len > 0 && len < sizeof message && message[len - 1] == '\n')
81                 message[len - 1] = 0;
82
83         real_logger(level, priority, message);
84 }
85
86 static void sptps_logger(sptps_t *s, int s_errno, const char *format, va_list ap) {
87         char message[1024] = "";
88         int len = vsnprintf(message, sizeof message, format, ap);
89         if(len > 0 && len < sizeof message && message[len - 1] == '\n')
90                 message[len - 1] = 0;
91
92         real_logger(DEBUG_ALWAYS, LOG_ERR, message);
93 }
94
95 void openlogger(const char *ident, logmode_t mode) {
96         logident = ident;
97         logmode = mode;
98
99         switch(mode) {
100                 case LOGMODE_STDERR:
101                         logpid = getpid();
102                         break;
103                 case LOGMODE_SYSLOG:
104 #ifdef HAVE_MINGW
105                         loghandle = RegisterEventSource(NULL, logident);
106                         if(!loghandle) {
107                                 fprintf(stderr, "Could not open log handle!");
108                                 logmode = LOGMODE_NULL;
109                         }
110                         break;
111 #else
112 #ifdef HAVE_SYSLOG_H
113                         openlog(logident, LOG_CONS | LOG_PID, LOG_DAEMON);
114                         break;
115 #endif
116 #endif
117                 case LOGMODE_NULL:
118                         break;
119         }
120
121         if(logmode != LOGMODE_NULL)
122                 sptps_log = sptps_logger;
123         else
124                 sptps_log = sptps_log_quiet;
125 }
126
127 void closelogger(void) {
128         switch(logmode) {
129                 case LOGMODE_SYSLOG:
130 #ifdef HAVE_MINGW
131                         DeregisterEventSource(loghandle);
132                         break;
133 #else
134 #ifdef HAVE_SYSLOG_H
135                         closelog();
136                         break;
137 #endif
138 #endif
139                 case LOGMODE_NULL:
140                 case LOGMODE_STDERR:
141                         break;
142                         break;
143         }
144 }