diff options
author | Maxim Biro <nurupo.contributions@gmail.com> | 2017-03-02 02:38:57 -0500 |
---|---|---|
committer | Maxim Biro <nurupo.contributions@gmail.com> | 2017-06-04 16:07:03 -0400 |
commit | b0aec02225b642b2e420e634dce919beee0cd0f2 (patch) | |
tree | df290f8e2f76efda437f1455411f576b3f9f7766 /other/bootstrap_daemon/src/log.c | |
parent | 1e8fa85aadf602bdca3a540de09a8184f7139a6c (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.c | 106 |
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 |
37 | static LOG_BACKEND current_backend = INVALID_BACKEND; | 30 | static LOG_BACKEND current_backend = INVALID_BACKEND; |
38 | 31 | ||
39 | bool open_log(LOG_BACKEND backend) | 32 | bool 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 | ||
54 | bool close_log(void) | 53 | bool 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 | ||
69 | static 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 | |||
85 | static 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 | ||
105 | static FILE *level_stdout(LOG_LEVEL level) | 75 | bool 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 | |||
119 | static 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 | |||
125 | bool 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 | } |