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
|
/*
* RTEMS version of syslog and associated routines
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems.h>
#include <rtems/thread.h>
#include <stdio.h>
#include <stdarg.h>
#include <errno.h>
#include <syslog.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
static int LogStatus = LOG_CONS;
static const char *LogTag = "syslog";
static int LogFacility = LOG_USER;
static int LogMask = 0xff;
void
syslog (int pri, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
vsyslog (pri, fmt, ap);
va_end (ap);
}
/*
* FIXME: Should cbuf be static? Then we wouldn't
* have to worry about blowing stacks with a local variable
* that large. Could make cbuf bigger, too.
*
* FIXME: This does not properly handle the %m format specifier which should
* insert the string result of strerror(errno).
*/
void
vsyslog (int pri, const char *fmt, va_list ap)
{
int cnt;
char cbuf[200];
if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) {
syslog (LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID,
"syslog: unknown facility/priority: %#x", pri);
pri &= LOG_PRIMASK|LOG_FACMASK;
}
if (!(LOG_MASK(LOG_PRI(pri)) & LogMask))
return;
if ((pri & LOG_FACMASK) == 0)
pri |= LogFacility;
cnt = snprintf (cbuf, sizeof (cbuf), "<%d>", pri);
if (LogTag && cnt < sizeof (cbuf) - 1)
cnt += snprintf (cbuf + cnt, sizeof (cbuf) - cnt, "%s", LogTag);
if (LogStatus & LOG_PID && cnt < sizeof (cbuf) - 1) {
rtems_id tid;
rtems_task_ident (RTEMS_SELF, 0, &tid);
cnt += snprintf (cbuf + cnt, sizeof (cbuf) - cnt, "[%#lx]", (unsigned long)tid);
}
if (LogTag && cnt < sizeof (cbuf) - 1)
cnt += snprintf (cbuf + cnt, sizeof (cbuf) - cnt, ": ");
cnt += vsnprintf (cbuf + cnt, sizeof (cbuf) - cnt, fmt, ap);
if (cnt > sizeof (cbuf) - 1)
cnt = sizeof (cbuf) - 1;
while (cnt > 0 && cbuf[cnt-1] == '\n')
cbuf[--cnt] = '\0';
if (LogStatus & LOG_PERROR)
printf ("%s\n", cbuf);
}
int
setlogmask (int pmask)
{
int omask;
omask = LogMask;
if (pmask != 0)
LogMask = pmask;
return (omask);
}
|