1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/*
* report() - calls syslog
*/
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <stdio.h>
#include <syslog.h>
#include "report.h"
#ifndef LOG_NDELAY
#define LOG_NDELAY 0
#endif
#ifndef LOG_DAEMON
#define LOG_DAEMON 0
#endif
#ifndef LOG_BOOTP
#define LOG_BOOTP LOG_DAEMON
#endif
extern int debug;
extern char *progname;
/*
* This is initialized so you get stderr until you call
* report_init()
*/
static int stderr_only = 1;
void
report_init(nolog)
int nolog;
{
stderr_only = nolog;
#ifdef SYSLOG
if (!stderr_only) {
openlog(progname, LOG_PID | LOG_NDELAY, LOG_BOOTP);
}
#endif
}
/*
* This routine reports errors and such via stderr and syslog() if
* appopriate. It just helps avoid a lot of "#ifdef SYSLOG" constructs
* from being scattered throughout the code.
*
* The syntax is identical to syslog(3), but %m is not considered special
* for output to stderr (i.e. you'll see "%m" in the output. . .). Also,
* control strings should normally end with \n since newlines aren't
* automatically generated for stderr output (whereas syslog strips out all
* newlines and adds its own at the end).
*/
static char *levelnames[] = {
#ifdef LOG_SALERT
"level(0): ",
"alert(1): ",
"alert(2): ",
"emerg(3): ",
"error(4): ",
"crit(5): ",
"warn(6): ",
"note(7): ",
"info(8): ",
"debug(9): ",
"level(?): "
#else
"emerg(0): ",
"alert(1): ",
"crit(2): ",
"error(3): ",
"warn(4): ",
"note(5): ",
"info(6): ",
"debug(7): ",
"level(?): "
#endif
};
static int numlevels = sizeof(levelnames) / sizeof(levelnames[0]);
/*
* Print a log message using syslog(3) and/or stderr.
* The message passed in should not include a newline.
*/
#ifdef __STDC__
void
report(int priority, char *fmt,...)
#else
/*VARARGS2*/
void
report(priority, fmt, va_alist)
int priority;
char *fmt;
va_dcl
#endif
{
va_list ap;
static char buf[256];
if ((priority < 0) || (priority >= numlevels)) {
priority = numlevels - 1;
}
#ifdef __STDC__
va_start(ap, fmt);
#else
va_start(ap);
#endif
vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
/*
* Print the message
*/
if (stderr_only || (debug > 2)) {
fprintf(stderr, "%s: %s %s\n",
progname, levelnames[priority], buf);
}
#ifdef SYSLOG
if (!stderr_only)
syslog((priority | LOG_BOOTP), "%s", buf);
#endif
}
/*
* Return pointer to static string which gives full filesystem error message.
*/
char *
get_errmsg()
{
extern int errno;
extern char *strerror();
return strerror(errno);
}
/*
* Local Variables:
* tab-width: 4
* c-indent-level: 4
* c-argdecl-indent: 4
* c-continued-statement-offset: 4
* c-continued-brace-offset: -4
* c-label-offset: -4
* c-brace-offset: 0
* End:
*/
|