/* 
 * 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"

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)
		syslog(pri, "%s: %d: %d (%s) %s", fn, ln, en, strerror(en),
		       buf);
	else
		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)
		syslog(pri, "%s: %d: %d (%s) %s. %s", fn, ln, en, strerror(en),
		       buf, buf2);
	else
		syslog(pri, "%s: %d: %s. %s", fn, ln, buf, buf2);

}
