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
|
/* $FreeBSD$ */
/*
* report() - calls syslog
*/
#include <stdarg.h>
#include <stdio.h>
#include <syslog.h>
#include <string.h>
#include <errno.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.
*/
void
report(int priority, const char *fmt,...)
{
va_list ap;
static char buf[128];
if ((priority < 0) || (priority >= numlevels)) {
priority = numlevels - 1;
}
va_start(ap, fmt);
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.
*/
const char *
get_errmsg()
{
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:
*/
|