1 /* log-syslog.c - logging functions, writing into syslog */
2 
3 /*
4  * Copyright (c) 2009, Natacha Porté
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22 
23 #include "log.h"
24 
25 #include <errno.h>
26 #include <string.h>
27 #include <syslog.h>
28 #include <unistd.h>
29 
30 
31 /**************************
32  * LOG MANAGING FUNCTIONS *
33  **************************/
34 
35 void
log_open(const char * name)36 log_open(const char *name) {
37 	openlog(name, LOG_PID | LOG_NDELAY, LOG_DAEMON); }
38 
39 void
log_close(void)40 log_close(void) {
41 	closelog(); }
42 
43 
44 
45 /****************************
46  * CLIENT LOGGING FUNCTIONS *
47  ****************************/
48 
49 void
log_c_ambiguous_addr(const char * host,const char * port,struct addrinfo * ai)50 log_c_ambiguous_addr(const char *host, const char *port, struct addrinfo *ai) {
51 	syslog(LOG_ERR, "Ambiguous address for %s:%s\n", host, port);
52 	do {
53 		syslog(LOG_ERR, "   %s\n", ai->ai_canonname);
54 		ai = ai->ai_next;
55 	} while (ai); }
56 
57 
58 void
log_c_bad_cmd(const char * cmd)59 log_c_bad_cmd(const char *cmd) {
60 	syslog(LOG_WARNING, "Unknown client option \"%s\"\n", cmd); }
61 
62 
63 void
log_c_bad_sensor(const char * cmd)64 log_c_bad_sensor(const char *cmd) {
65 	syslog(LOG_WARNING, "Unknown address sensor \"%s\"\n", cmd); }
66 
67 
68 void
log_c_connect(const char * host,const char * port,struct addrinfo * ai)69 log_c_connect(const char *host, const char *port, struct addrinfo *ai) {
70 	syslog(LOG_ERR, "Unable to connect() to %s:%s (%s): %s\n",
71 			host, port, ai->ai_canonname, strerror(errno)); }
72 
73 void
log_c_exiting(void)74 log_c_exiting(void) {
75 	syslog(LOG_INFO, "Client exiting\n"); }
76 
77 
78 void
log_c_getaddrinfo(const char * host,const char * port,int errcode)79 log_c_getaddrinfo(const char *host, const char *port, int errcode) {
80 	syslog(LOG_ERR, "Address lookup of %s:%s failed: %s\n",
81 		host ? host : "*", port ? port : "*", gai_strerror(errcode)); }
82 
83 
84 void
log_c_no_options(void)85 log_c_no_options(void) { }
86 
87 
88 void
log_c_open_conf(const char * filename)89 log_c_open_conf(const char *filename) {
90 	syslog(LOG_ERR, "Unable to open configuration file \"%s\": %s\n",
91 				filename, strerror(errno)); }
92 
93 
94 void
log_c_pipe_bad_addr(const char * buf,size_t size)95 log_c_pipe_bad_addr(const char *buf, size_t size) {
96 	syslog(LOG_ERR, "Bad pipe sesnsor output: \"%.*s\"\n",
97 							(int)size, buf); }
98 
99 void
log_c_pipe_error(const char * cmd)100 log_c_pipe_error(const char *cmd) {
101 	syslog(LOG_ERR, "Error while popen()ing \"%s\"\n", cmd); }
102 
103 
104 void
log_c_pipe_read_error(const char * cmd)105 log_c_pipe_read_error(const char *cmd) {
106 	syslog(LOG_ERR, "Error while reading output of \"%s\"\n", cmd); }
107 
108 
109 void
log_c_send_fail(const void * data,size_t datalen)110 log_c_send_fail(const void *data, size_t datalen) {
111 	(void)data;
112 	(void)datalen;
113 	syslog(LOG_ERR, "Send failure of message: %s\n", strerror(errno)); }
114 
115 
116 void
log_c_send_short(const void * data,size_t datalen,size_t sent)117 log_c_send_short(const void *data, size_t datalen, size_t sent) {
118 	(void)data;
119 	syslog(LOG_ERR, "Short send of message (%zu/%zu)\n", sent, datalen); }
120 
121 
122 void
log_c_short_buf(void)123 log_c_short_buf(void) {
124 	syslog(LOG_ERR, "Message buffer too short\n"); }
125 
126 
127 void
log_c_socket(void)128 log_c_socket(void) {
129 	syslog(LOG_ERR, "Unable to create socket: %s\n", strerror(errno)); }
130 
131 
132 
133 /**************************
134  * MISC LOGGING FUNCTIONS *
135  **************************/
136 
137 void
log_m_bad_user(const char * user)138 log_m_bad_user(const char *user) {
139 	syslog(LOG_ERR, "Unable to get information about user \"%s\"\n",user);}
140 
141 void
log_m_chdir(const char * root)142 log_m_chdir(const char *root) {
143 	(void)root;
144 	syslog(LOG_ERR, "Unable to chdir: %s\n", strerror(errno)); }
145 
146 void
log_m_chroot(const char * root)147 log_m_chroot(const char *root) {
148 	syslog(LOG_ERR, "Unable to chroot(%s); %s\n", root, strerror(errno)); }
149 
150 void
log_m_daemon(void)151 log_m_daemon(void) {
152 	syslog(LOG_INFO, "Process successfully daemonized [%ld]\n",
153 						(long)getpid()); }
154 
155 void
log_m_fork(void)156 log_m_fork(void) {
157 	syslog(LOG_ERR, "Unable to fork(): %s\n", strerror(errno)); }
158 
159 void
log_m_message(struct ddns_message * msg,const unsigned char * peer)160 log_m_message(struct ddns_message *msg, const unsigned char *peer) {
161 	if (peer) {
162 		if (msg->time)
163 			syslog(LOG_INFO,"Message from %u.%u.%u.%u at %ld (%+g)",
164 					peer[0], peer[1], peer[2], peer[3],
165 					(long)msg->time,
166 					difftime(time(0), msg->time));
167 		else	syslog(LOG_INFO, "Message from %u.%u.%u.%u",
168 					peer[0], peer[1], peer[2], peer[3]); }
169 	else {
170 		if (msg->time)
171 			syslog(LOG_INFO, "Message at %ld (%+g)",
172 					(long)msg->time,
173 					difftime(time(0), msg->time));
174 		else	syslog(LOG_INFO, "Message"); }
175 	if (msg->name && msg->namelen)
176 		syslog(LOG_INFO, "    name \"%.*s\" address %u.%u.%u.%u\n",
177 				(int)msg->namelen,msg->name,
178 				msg->addr[0], msg->addr[1],
179 				msg->addr[2], msg->addr[3]);
180 	else
181 		syslog(LOG_INFO, " address %u.%u.%u.%u\n",
182 				msg->addr[0], msg->addr[1],
183 				msg->addr[2], msg->addr[3]); }
184 
185 void
log_m_pid_create(const char * filename)186 log_m_pid_create(const char *filename) {
187 	syslog(LOG_ERR, "Unable to create PID file \"%s\": %s\n",
188 				filename, strerror(errno)); }
189 
190 void
log_m_pid_exist(const char * filename,long pid)191 log_m_pid_exist(const char *filename, long pid) {
192 	syslog(LOG_ERR, "Error: PID file \"%s\" exists and is owned by %ld\n",
193 				filename, pid); }
194 
195 void
log_m_pid_invalid(const char * filename)196 log_m_pid_invalid(const char *filename) {
197 	syslog(LOG_ERR, "Invalid PID in existing PID file \"%s\"\n",filename);}
198 
199 void
log_m_pid_kill(const char * filename,long pid)200 log_m_pid_kill(const char *filename, long pid) {
201 	syslog(LOG_ERR, "kill(%ld, 0) from \"%s\" failure: %s\n",
202 				pid, filename, strerror(errno)); }
203 
204 void
log_m_pid_open(const char * filename)205 log_m_pid_open(const char *filename) {
206 	syslog(LOG_ERR, "Unable to open existing PID file \"%s\": %s\n",
207 				filename, strerror(errno)); }
208 
209 void
log_m_pid_trunc(const char * filename)210 log_m_pid_trunc(const char *filename) {
211 	syslog(LOG_ERR, "Unable to truncate existing PID file \"%s\": %s\n",
212 				filename, strerror(errno)); }
213 
214 void
log_m_setgid(const char * user)215 log_m_setgid(const char *user) {
216 	syslog(LOG_ERR, "Unable to setgid(%s): %s\n", user, strerror(errno)); }
217 
218 void
log_m_setuid(const char * user)219 log_m_setuid(const char *user) {
220 	syslog(LOG_ERR, "Unable to setuid(%s): %s\n", user, strerror(errno)); }
221 
222 void
log_m_setsid(void)223 log_m_setsid(void) {
224 	syslog(LOG_ERR, "Unable to setsid(): %s\n", strerror(errno)); }
225 
226 void
log_m_stat(const char * filename)227 log_m_stat(const char *filename) {
228 	syslog(LOG_ERR, "Unable to stat \"%s\": %s\n",
229 						filename, strerror(errno)); }
230 
231 
232 
233 /****************************
234  * SERVER LOGGING FUNCTIONS *
235  ****************************/
236 
237 void
log_s_account_down(const char * name,size_t nsize,const unsigned char * last_addr)238 log_s_account_down(const char *name, size_t nsize,
239 					const unsigned char *last_addr) {
240 	syslog(LOG_INFO, "Account %.*s timeout (last seen at %u.%u.%u.%u)\n",
241 		(int)nsize, name,
242 		last_addr[0], last_addr[1], last_addr[2], last_addr[3]); }
243 
244 void
log_s_account_up(const char * name,size_t nsize,const unsigned char * addr)245 log_s_account_up(const char *name, size_t nsize, const unsigned char *addr) {
246 	syslog(LOG_INFO, "Account %.*s up (%u.%u.%u.%u)\n",
247 			(int)nsize, name,
248 			addr[0], addr[1], addr[2], addr[3]); }
249 
250 void
log_s_addr_change(const char * name,size_t nsize,const unsigned char * old_addr,const unsigned char * new_addr)251 log_s_addr_change(const char *name, size_t nsize, const unsigned char *old_addr,
252 					const unsigned char *new_addr) {
253 	syslog(LOG_INFO, "Accound %.*s changed address "
254 			"from %u.%u.%u.%u to %u.%u.%u.%u\n",
255 		(int)nsize, name,
256 		old_addr[0], old_addr[1], old_addr[2], old_addr[3],
257 		new_addr[0], new_addr[1], new_addr[2], new_addr[3]); }
258 
259 void
log_s_addr_mismatch(struct ddns_message * msg,const unsigned char * peer)260 log_s_addr_mismatch(struct ddns_message *msg, const unsigned char *peer) {
261 	syslog(LOG_WARNING, "Address mismatch between peer %u.%u.%u.%u "
262 			"and message %u.%u.%u.%u\n",
263 		peer[0], peer[1], peer[2], peer[3],
264 		msg->addr[0], msg->addr[1], msg->addr[2], msg->addr[3]); }
265 
266 void
log_s_bad_account_cmd(const char * cmd)267 log_s_bad_account_cmd(const char *cmd) {
268 	syslog(LOG_WARNING, "Unknown account option \"%s\"\n", cmd); }
269 
270 void
log_s_bad_account_flag(const char * flag)271 log_s_bad_account_flag(const char *flag) {
272 	syslog(LOG_WARNING, "Unknown account flag \"%s\"\n",flag); }
273 
274 void
log_s_bad_cmd(const char * cmd)275 log_s_bad_cmd(const char *cmd) {
276 	syslog(LOG_WARNING, "Unknown server option \"%s\"\n", cmd); }
277 
278 void
log_s_bad_config(void)279 log_s_bad_config(void) {
280 	syslog(LOG_ERR, "Bad starting config, exiting\n"); }
281 
282 void
log_s_bad_effector(const char * cmd)283 log_s_bad_effector(const char *cmd) {
284 	syslog(LOG_WARNING, "Unkown server effector \"%s\"\n", cmd); }
285 
286 void
log_s_bad_hmac(struct ddns_message * msg,unsigned char * real_hmac)287 log_s_bad_hmac(struct ddns_message *msg, unsigned char *real_hmac) {
288 	(void)msg;
289 	(void)real_hmac;
290 	syslog(LOG_WARNING, "HMAC mismatch\n"); }
291 
292 void
log_s_bad_time(struct ddns_message * msg,int dt,int past,int future)293 log_s_bad_time(struct ddns_message *msg, int dt, int past, int future) {
294 	syslog(LOG_WARNING, "Anachronic message %d vs %d,%d\n", dt, past, future);
295 	log_m_message(msg, 0); }
296 
297 void
log_s_bind(const char * host,const char * port)298 log_s_bind(const char *host, const char *port) {
299 	syslog(LOG_ERR, "Unable to bind stocket to %s:%s: %s\n",
300 		host ? host : "*", port ? port : "*", strerror(errno)); }
301 
302 void
log_s_effkill_bad_signal(const char * signal,const char * pidfile)303 log_s_effkill_bad_signal(const char *signal, const char *pidfile) {
304 	(void)pidfile;
305 	syslog(LOG_ERR, "Unkown signal \"%s\"\n", signal); }
306 
307 void
log_s_effkill_open(const char * pidfile)308 log_s_effkill_open(const char *pidfile) {
309 	syslog(LOG_ERR, "Unable to open target PID file \"%s\": %s\n",
310 				pidfile, strerror(errno)); }
311 
312 void
log_s_effkill_bad_pidfile(const char * pidfile)313 log_s_effkill_bad_pidfile(const char *pidfile) {
314 	syslog(LOG_ERR, "Invalid PID file contents in \"%s\"\n", pidfile); }
315 
316 void
log_s_effkill_kill(int pid,const char * pidfile,long sig,const char * signal)317 log_s_effkill_kill(int pid, const char *pidfile, long sig, const char *signal){
318 	syslog(LOG_ERR, "kill(%d \"%s\", %ld \"%s\") failure: %s\n",
319 		pid, pidfile, sig, signal, strerror(errno)); }
320 
321 void
log_s_exiting(void)322 log_s_exiting(void) {
323 	syslog(LOG_INFO, "Server exiting\n"); }
324 
325 void
log_s_getaddrinfo(const char * host,const char * port,int errcode)326 log_s_getaddrinfo(const char *host, const char *port, int errcode) {
327 	syslog(LOG_ERR, "Address lookup of %s:%s failed: %s\n",
328 		host ? host : "*", port ? port : "*", gai_strerror(errcode)); }
329 
330 void
log_s_empty_config(const char * filename)331 log_s_empty_config(const char *filename) {
332 	syslog(LOG_ERR, "Empty configuration file \"%s\"\n", filename); }
333 
334 void
log_s_fd_error(void)335 log_s_fd_error(void) {
336 	syslog(LOG_ERR, "Polled socket is in an error state\n"); }
337 
338 void
log_s_hmac_decode_error(const unsigned char * buf,size_t buflen)339 log_s_hmac_decode_error(const unsigned char *buf, size_t buflen) {
340 	(void)buf;
341 	(void)buflen;
342 	syslog(LOG_WARNING, "HMAC decoding error\n"); }
343 
344 void
log_s_inval_time(const unsigned char * buf,size_t buflen)345 log_s_inval_time(const unsigned char *buf, size_t buflen) {
346 	(void)buf;
347 	(void)buflen;
348 	syslog(LOG_WARNING, "Invalid packet\n"); }
349 
350 void
log_s_listen_nb(int nb)351 log_s_listen_nb(int nb) {
352 	syslog(LOG_INFO, "Listening on %d sockets\n", nb); }
353 
354 void
log_s_no_account(const char * name,size_t namelen)355 log_s_no_account(const char *name, size_t namelen) {
356 	syslog(LOG_ERR, "Account \"%.*s\" not found.\n", (int)namelen, name); }
357 
358 void
log_s_no_config(void)359 log_s_no_config(void) {
360 	syslog(LOG_ERR, "No configuration file provided in invokation\n"); }
361 
362 void
log_s_no_listen(const char * filename)363 log_s_no_listen(const char *filename) {
364 	syslog(LOG_ERR, "No valid listening socket from \"%s\"\n", filename); }
365 
366 void
log_s_open_config(const char * filename)367 log_s_open_config(const char *filename) {
368 	syslog(LOG_ERR, "Unable to open configuration file \"%s\": %s\n",
369 				filename, strerror(errno)); }
370 
371 void
log_s_recvfrom(void)372 log_s_recvfrom(void) {
373 	syslog(LOG_ERR, "recvfrom failure: %s\n", strerror(errno)); }
374 
375 void
log_s_short_addr(const unsigned char * buf,size_t buflen)376 log_s_short_addr(const unsigned char *buf, size_t buflen) {
377 	(void)buf;
378 	(void)buflen;
379 	syslog(LOG_WARNING, "Message too short (packet truncated?)\n"); }
380 
381 void
log_s_short_name(const unsigned char * buf,size_t buflen)382 log_s_short_name(const unsigned char *buf, size_t buflen) {
383 	(void)buf;
384 	(void)buflen;
385 	syslog(LOG_WARNING, "Message too short (packet truncated?)\n"); }
386 
387 void
log_s_short_time(const unsigned char * buf,size_t buflen)388 log_s_short_time(const unsigned char *buf, size_t buflen) {
389 	(void)buf;
390 	(void)buflen;
391 	syslog(LOG_WARNING, "Message too short (packet truncated?)\n"); }
392 
393 void
log_s_socket(const char * host,const char * port)394 log_s_socket(const char *host, const char *port) {
395 	syslog(LOG_ERR, "Unable to create socket for %s:%s: %s\n",
396 		host ? host : "*", port ? port : "*", strerror(errno)); }
397 
398 void
log_s_system(const char * cmd)399 log_s_system(const char *cmd) {
400 	syslog(LOG_ERR, "system(\"%s\") fail\n", cmd); }
401 
402 void
log_s_system_alloc(size_t sz)403 log_s_system_alloc(size_t sz) {
404 	syslog(LOG_ERR, "Unable to allocate %zu bytes for system effector\n",
405 				sz); }
406 
407 void
log_s_system_error(const char * cmd,int status)408 log_s_system_error(const char *cmd, int status) {
409 	syslog(LOG_ERR, "System effector \"%s\" failure (%d)\n", cmd, status);}
410 
411 void
log_s_unsafe_forbidden(struct ddns_message * msg,const unsigned char * peer)412 log_s_unsafe_forbidden(struct ddns_message *msg, const unsigned char *peer) {
413 	syslog(LOG_WARNING, "Rejecting unsafe message\n");
414 	log_m_message(msg, peer); }
415 
416 void
log_s_zone_future_serial(const char * serial,const char * filename)417 log_s_zone_future_serial(const char *serial, const char *filename) {
418 	syslog(LOG_ERR, "Invalid serial \"%.10s\" from zone \"%s\"\n",
419 				serial, filename); }
420 
421 void
log_s_zone_no_serial(const char * filename)422 log_s_zone_no_serial(const char *filename) {
423 	syslog(LOG_ERR, "Unable to find serial in zone \"%s\"\n", filename); }
424 
425 void
log_s_zone_open_r(const char * filename)426 log_s_zone_open_r(const char *filename) {
427 	syslog(LOG_ERR, "Unable to read zone file \"%s\"\n", filename); }
428 
429 void
log_s_zone_open_w(const char * filename)430 log_s_zone_open_w(const char *filename) {
431 	syslog(LOG_ERR, "Unable to write to zone file \"%s\"\n", filename); }
432 
433 void
log_s_zone_realloc(const char * filename,size_t asize)434 log_s_zone_realloc(const char *filename, size_t asize) {
435 	syslog(LOG_ERR, "Unable to realloc() %zu bytes "
436 			"while reading zone \"%s\"\n",
437 			asize, filename); }
438 
439 void
log_s_zone_short_write(const char * filename,size_t written,size_t size)440 log_s_zone_short_write(const char *filename, size_t written, size_t size) {
441 	syslog(LOG_ERR, "Short write to zone file \"%s\" (%zu/%zu)\n",
442 				filename, written, size); }
443 
444 void
log_s_zone_update(const char * filename,const char * name,size_t nsize,unsigned char addr[4])445 log_s_zone_update(const char *filename, const char *name, size_t nsize,
446 					unsigned char addr[4]) {
447 	syslog(LOG_INFO, "Updating zone \"%s\" record \"%.*s\" to %u.%u.%u.%u\n",
448 			filename, (int)nsize, name,
449 			addr[0], addr[1], addr[2], addr[3]); }
450 
451 /* vim: set filetype=c: */
452