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