aboutsummaryrefslogtreecommitdiffstats
path: root/lib/syserr.c
blob: 66a206765f5ea34245dd2ac938b0ad0570d7c01e (plain)
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
/* 
 * Syslog functions.
 * Copyright (C) 2003, 2004 Mondru AB.
 * 
 * The contents of this file may be used under the terms of the GNU
 * General Public License Version 2, provided that the above copyright
 * notice and this permission notice is included in all copies or
 * substantial portions of the software.
 * 
 */

#include <stdarg.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <syslog.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "syserr.h"

static FILE* err_log;

void sys_err_setlogfile(FILE* log)
{
	err_log = log;
}

void sys_err(int pri, char *fn, int ln, int en, char *fmt, ...)
{
	va_list args;
	char buf[SYSERR_MSGSIZE];

	va_start(args, fmt);
	vsnprintf(buf, SYSERR_MSGSIZE, fmt, args);
	va_end(args);
	buf[SYSERR_MSGSIZE - 1] = 0;	/* Make sure it is null terminated */
	if (en) {
		if (err_log)
			fprintf(err_log, "%s: %d: %d (%s) %s\n",
				fn, ln, en, strerror(en), buf);
		syslog(pri, "%s: %d: %d (%s) %s", fn, ln, en, strerror(en),
		       buf);
	} else {
		if (err_log)
			fprintf(err_log, "%s: %d: %s\n", fn, ln, buf);
		syslog(pri, "%s: %d: %s", fn, ln, buf);
	}
}

void sys_errpack(int pri, char *fn, int ln, int en, struct sockaddr_in *peer,
		 void *pack, unsigned len, char *fmt, ...)
{

	va_list args;
	char buf[SYSERR_MSGSIZE];
	char buf2[SYSERR_MSGSIZE];
	unsigned int n;
	int pos;

	va_start(args, fmt);
	vsnprintf(buf, SYSERR_MSGSIZE, fmt, args);
	va_end(args);
	buf[SYSERR_MSGSIZE - 1] = 0;

	snprintf(buf2, SYSERR_MSGSIZE,
		 "Packet from %s:%u, length: %d, content:",
		 inet_ntoa(peer->sin_addr), ntohs(peer->sin_port), len);
	buf2[SYSERR_MSGSIZE - 1] = 0;
	pos = strlen(buf2);
	for (n = 0; n < len; n++) {
		if ((pos + 4) < SYSERR_MSGSIZE) {
			sprintf((buf2 + pos), " %02hhx",
				((unsigned char *)pack)[n]);
			pos += 3;
		}
	}
	buf2[pos] = 0;

	if (en) {
		if (err_log)
			fprintf(err_log, "%s: %d: %d (%s) %s. %s\n",
				fn, ln, en, strerror(en), buf, buf2);
		syslog(pri, "%s: %d: %d (%s) %s. %s", fn, ln, en, strerror(en),
		       buf, buf2);
	} else {
		if (err_log)
			fprintf(err_log, "%s: %d: %s. %s\n", fn, ln, buf, buf2);
		syslog(pri, "%s: %d: %s. %s", fn, ln, buf, buf2);
	}

}