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