summaryrefslogtreecommitdiffstats
path: root/rtemslwip/common/syslog.c
blob: 4da911e8dafd478babc477759d12c575b3cd404a (plain) (blame)
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);
}