xref: /netbsd-src/usr.sbin/bootp/common/report.c (revision c8f61d2b509f78f0f05810afbf0d6e317b3b8fa4)
1*c8f61d2bSxtraeme /*	$NetBSD: report.c,v 1.7 2008/05/02 19:22:10 xtraeme Exp $	*/
29493bb79Slukem 
39493bb79Slukem #include <sys/cdefs.h>
49493bb79Slukem #ifndef lint
5*c8f61d2bSxtraeme __RCSID("$NetBSD: report.c,v 1.7 2008/05/02 19:22:10 xtraeme Exp $");
69493bb79Slukem #endif
73fe138c1Sperry 
85e9d01f2Sgwr /*
95e9d01f2Sgwr  * report() - calls syslog
105e9d01f2Sgwr  */
115e9d01f2Sgwr 
125e9d01f2Sgwr #include <stdarg.h>
135e9d01f2Sgwr 
145e9d01f2Sgwr #include <stdio.h>
159493bb79Slukem #include <string.h>
165e9d01f2Sgwr #include <syslog.h>
175e9d01f2Sgwr 
185e9d01f2Sgwr #include "report.h"
195e9d01f2Sgwr 
205e9d01f2Sgwr #ifndef LOG_NDELAY
215e9d01f2Sgwr #define LOG_NDELAY	0
225e9d01f2Sgwr #endif
235e9d01f2Sgwr #ifndef LOG_DAEMON
245e9d01f2Sgwr #define LOG_DAEMON	0
255e9d01f2Sgwr #endif
265e9d01f2Sgwr #ifndef	LOG_BOOTP
275e9d01f2Sgwr #define LOG_BOOTP	LOG_DAEMON
285e9d01f2Sgwr #endif
295e9d01f2Sgwr 
305e9d01f2Sgwr extern int debug;
315e9d01f2Sgwr extern char *progname;
325e9d01f2Sgwr 
335e9d01f2Sgwr /*
345e9d01f2Sgwr  * This is initialized so you get stderr until you call
355e9d01f2Sgwr  *	report_init()
365e9d01f2Sgwr  */
375e9d01f2Sgwr static int stderr_only = 1;
385e9d01f2Sgwr 
395e9d01f2Sgwr void
report_init(int nolog)40131109e4Swiz report_init(int nolog)
415e9d01f2Sgwr {
425e9d01f2Sgwr 	stderr_only = nolog;
435e9d01f2Sgwr #ifdef SYSLOG
445e9d01f2Sgwr 	if (!stderr_only) {
455e9d01f2Sgwr 		openlog(progname, LOG_PID | LOG_NDELAY, LOG_BOOTP);
465e9d01f2Sgwr 	}
475e9d01f2Sgwr #endif
485e9d01f2Sgwr }
495e9d01f2Sgwr 
505e9d01f2Sgwr /*
515e9d01f2Sgwr  * This routine reports errors and such via stderr and syslog() if
525e9d01f2Sgwr  * appopriate.  It just helps avoid a lot of "#ifdef SYSLOG" constructs
535e9d01f2Sgwr  * from being scattered throughout the code.
545e9d01f2Sgwr  *
555e9d01f2Sgwr  * The syntax is identical to syslog(3), but %m is not considered special
565e9d01f2Sgwr  * for output to stderr (i.e. you'll see "%m" in the output. . .).  Also,
575e9d01f2Sgwr  * control strings should normally end with \n since newlines aren't
585e9d01f2Sgwr  * automatically generated for stderr output (whereas syslog strips out all
595e9d01f2Sgwr  * newlines and adds its own at the end).
605e9d01f2Sgwr  */
615e9d01f2Sgwr 
62*c8f61d2bSxtraeme static const char *levelnames[] = {
635e9d01f2Sgwr #ifdef LOG_SALERT
645e9d01f2Sgwr 	"level(0): ",
655e9d01f2Sgwr 	"alert(1): ",
665e9d01f2Sgwr 	"alert(2): ",
675e9d01f2Sgwr 	"emerg(3): ",
685e9d01f2Sgwr 	"error(4): ",
695e9d01f2Sgwr 	"crit(5):  ",
705e9d01f2Sgwr 	"warn(6):  ",
715e9d01f2Sgwr 	"note(7):  ",
725e9d01f2Sgwr 	"info(8):  ",
735e9d01f2Sgwr 	"debug(9): ",
745e9d01f2Sgwr 	"level(?): "
755e9d01f2Sgwr #else
765e9d01f2Sgwr 	"emerg(0): ",
775e9d01f2Sgwr 	"alert(1): ",
785e9d01f2Sgwr 	"crit(2):  ",
795e9d01f2Sgwr 	"error(3): ",
805e9d01f2Sgwr 	"warn(4):  ",
815e9d01f2Sgwr 	"note(5):  ",
825e9d01f2Sgwr 	"info(6):  ",
835e9d01f2Sgwr 	"debug(7): ",
845e9d01f2Sgwr 	"level(?): "
855e9d01f2Sgwr #endif
865e9d01f2Sgwr };
875e9d01f2Sgwr static int numlevels = sizeof(levelnames) / sizeof(levelnames[0]);
885e9d01f2Sgwr 
895e9d01f2Sgwr 
905e9d01f2Sgwr /*
915e9d01f2Sgwr  * Print a log message using syslog(3) and/or stderr.
925e9d01f2Sgwr  * The message passed in should not include a newline.
935e9d01f2Sgwr  */
945e9d01f2Sgwr void
report(int priority,const char * fmt,...)95d8302e2dSis report(int priority, const char *fmt,...)
965e9d01f2Sgwr {
975e9d01f2Sgwr 	va_list ap;
985e9d01f2Sgwr 	static char buf[128];
995e9d01f2Sgwr 
1005e9d01f2Sgwr 	if ((priority < 0) || (priority >= numlevels)) {
1015e9d01f2Sgwr 		priority = numlevels - 1;
1025e9d01f2Sgwr 	}
1035e9d01f2Sgwr 	va_start(ap, fmt);
1045e9d01f2Sgwr 	vsprintf(buf, fmt, ap);
1055e9d01f2Sgwr 	va_end(ap);
1065e9d01f2Sgwr 
1075e9d01f2Sgwr 	/*
1085e9d01f2Sgwr 	 * Print the message
1095e9d01f2Sgwr 	 */
1105e9d01f2Sgwr 	if (stderr_only || (debug > 2)) {
1115e9d01f2Sgwr 		fprintf(stderr, "%s: %s %s\n",
1125e9d01f2Sgwr 				progname, levelnames[priority], buf);
1135e9d01f2Sgwr 	}
1145e9d01f2Sgwr #ifdef SYSLOG
1155e9d01f2Sgwr 	if (!stderr_only)
1165e9d01f2Sgwr 		syslog((priority | LOG_BOOTP), "%s", buf);
1175e9d01f2Sgwr #endif
1185e9d01f2Sgwr }
1195e9d01f2Sgwr 
1205e9d01f2Sgwr 
1215e9d01f2Sgwr 
1225e9d01f2Sgwr /*
1235e9d01f2Sgwr  * Return pointer to static string which gives full filesystem error message.
1245e9d01f2Sgwr  */
12566427701Smycroft const char *
get_errmsg(void)126131109e4Swiz get_errmsg(void)
1275e9d01f2Sgwr {
1285e9d01f2Sgwr 	extern int errno;
1295e9d01f2Sgwr 
1305e9d01f2Sgwr 	return strerror(errno);
1315e9d01f2Sgwr }
1325e9d01f2Sgwr 
1335e9d01f2Sgwr /*
1345e9d01f2Sgwr  * Local Variables:
1355e9d01f2Sgwr  * tab-width: 4
1365e9d01f2Sgwr  * c-indent-level: 4
1375e9d01f2Sgwr  * c-argdecl-indent: 4
1385e9d01f2Sgwr  * c-continued-statement-offset: 4
1395e9d01f2Sgwr  * c-continued-brace-offset: -4
1405e9d01f2Sgwr  * c-label-offset: -4
1415e9d01f2Sgwr  * c-brace-offset: 0
1425e9d01f2Sgwr  * End:
1435e9d01f2Sgwr  */
144