summaryrefslogtreecommitdiff
path: root/other/bootstrap_daemon/src/log.c
diff options
context:
space:
mode:
authorMaxim Biro <nurupo.contributions@gmail.com>2017-03-02 02:38:57 -0500
committerMaxim Biro <nurupo.contributions@gmail.com>2017-06-04 16:07:03 -0400
commitb0aec02225b642b2e420e634dce919beee0cd0f2 (patch)
treedf290f8e2f76efda437f1455411f576b3f9f7766 /other/bootstrap_daemon/src/log.c
parent1e8fa85aadf602bdca3a540de09a8184f7139a6c (diff)
Split daemon's logging backends in separate modules
Diffstat (limited to 'other/bootstrap_daemon/src/log.c')
-rw-r--r--other/bootstrap_daemon/src/log.c106
1 files changed, 30 insertions, 76 deletions
diff --git a/other/bootstrap_daemon/src/log.c b/other/bootstrap_daemon/src/log.c
index a0517528..26d10a12 100644
--- a/other/bootstrap_daemon/src/log.c
+++ b/other/bootstrap_daemon/src/log.c
@@ -23,42 +23,47 @@
23 * along with Tox. If not, see <http://www.gnu.org/licenses/>. 23 * along with Tox. If not, see <http://www.gnu.org/licenses/>.
24 */ 24 */
25#include "log.h" 25#include "log.h"
26 26#include "log_backend_stdout.h"
27#include "global.h" 27#include "log_backend_syslog.h"
28
29#include "../../../toxcore/ccompat.h"
30
31#include <assert.h>
32#include <syslog.h>
33#include <stdarg.h>
34#include <stdio.h>
35 28
36#define INVALID_BACKEND (LOG_BACKEND)-1u 29#define INVALID_BACKEND (LOG_BACKEND)-1u
37static LOG_BACKEND current_backend = INVALID_BACKEND; 30static LOG_BACKEND current_backend = INVALID_BACKEND;
38 31
39bool open_log(LOG_BACKEND backend) 32bool log_open(LOG_BACKEND backend)
40{ 33{
41 if (current_backend != INVALID_BACKEND) { 34 if (current_backend != INVALID_BACKEND) {
42 return false; 35 return false;
43 } 36 }
44 37
45 if (backend == LOG_BACKEND_SYSLOG) {
46 openlog(DAEMON_NAME, LOG_NOWAIT | LOG_PID, LOG_DAEMON);
47 }
48
49 current_backend = backend; 38 current_backend = backend;
50 39
40 switch (current_backend) {
41 case LOG_BACKEND_STDOUT:
42 // nothing to do here
43 break;
44
45 case LOG_BACKEND_SYSLOG:
46 log_backend_syslog_open();
47 break;
48 }
49
51 return true; 50 return true;
52} 51}
53 52
54bool close_log(void) 53bool log_close(void)
55{ 54{
56 if (current_backend == INVALID_BACKEND) { 55 if (current_backend == INVALID_BACKEND) {
57 return false; 56 return false;
58 } 57 }
59 58
60 if (current_backend == LOG_BACKEND_SYSLOG) { 59 switch (current_backend) {
61 closelog(); 60 case LOG_BACKEND_STDOUT:
61 // nothing to do here
62 break;
63
64 case LOG_BACKEND_SYSLOG:
65 log_backend_syslog_close();
66 break;
62 } 67 }
63 68
64 current_backend = INVALID_BACKEND; 69 current_backend = INVALID_BACKEND;
@@ -66,78 +71,27 @@ bool close_log(void)
66 return true; 71 return true;
67} 72}
68 73
69static int level_syslog(LOG_LEVEL level)
70{
71 switch (level) {
72 case LOG_LEVEL_INFO:
73 return LOG_INFO;
74
75 case LOG_LEVEL_WARNING:
76 return LOG_WARNING;
77
78 case LOG_LEVEL_ERROR:
79 return LOG_ERR;
80 }
81
82 return LOG_INFO;
83}
84
85static void log_syslog(LOG_LEVEL level, const char *format, va_list args)
86{
87 va_list args2;
88
89 va_copy(args2, args);
90 int size = vsnprintf(NULL, 0, format, args2);
91 va_end(args2);
92
93 assert(size >= 0);
94
95 if (size < 0) {
96 return;
97 }
98
99 VLA(char, buf, size + 1);
100 vsnprintf(buf, size + 1, format, args);
101
102 syslog(level_syslog(level), "%s", buf);
103}
104 74
105static FILE *level_stdout(LOG_LEVEL level) 75bool log_write(LOG_LEVEL level, const char *format, ...)
106{ 76{
107 switch (level) { 77 if (current_backend == INVALID_BACKEND) {
108 case LOG_LEVEL_INFO: 78 return false;
109 return stdout;
110
111 case LOG_LEVEL_WARNING: // intentional fallthrough
112 case LOG_LEVEL_ERROR:
113 return stderr;
114 } 79 }
115 80
116 return stdout;
117}
118
119static void log_stdout(LOG_LEVEL level, const char *format, va_list args)
120{
121 vfprintf(level_stdout(level), format, args);
122 fflush(level_stdout(level));
123}
124
125bool write_log(LOG_LEVEL level, const char *format, ...)
126{
127 va_list args; 81 va_list args;
128 va_start(args, format); 82 va_start(args, format);
129 83
130 switch (current_backend) { 84 switch (current_backend) {
131 case LOG_BACKEND_SYSLOG: 85 case LOG_BACKEND_STDOUT:
132 log_syslog(level, format, args); 86 log_backend_stdout_write(level, format, args);
133 break; 87 break;
134 88
135 case LOG_BACKEND_STDOUT: 89 case LOG_BACKEND_SYSLOG:
136 log_stdout(level, format, args); 90 log_backend_syslog_write(level, format, args);
137 break; 91 break;
138 } 92 }
139 93
140 va_end(args); 94 va_end(args);
141 95
142 return current_backend != INVALID_BACKEND; 96 return true;
143} 97}