File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / plog.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 4 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

    1: /*	$NetBSD: plog.c,v 1.7 2011/01/28 12:51:40 tteras Exp $	*/
    2: 
    3: /* Id: plog.c,v 1.11 2006/06/20 09:57:31 vanhu Exp */
    4: 
    5: /*
    6:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    7:  * All rights reserved.
    8:  * 
    9:  * Redistribution and use in source and binary forms, with or without
   10:  * modification, are permitted provided that the following conditions
   11:  * are met:
   12:  * 1. Redistributions of source code must retain the above copyright
   13:  *    notice, this list of conditions and the following disclaimer.
   14:  * 2. Redistributions in binary form must reproduce the above copyright
   15:  *    notice, this list of conditions and the following disclaimer in the
   16:  *    documentation and/or other materials provided with the distribution.
   17:  * 3. Neither the name of the project nor the names of its contributors
   18:  *    may be used to endorse or promote products derived from this software
   19:  *    without specific prior written permission.
   20:  * 
   21:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31:  * SUCH DAMAGE.
   32:  */
   33: 
   34: #include "config.h"
   35: 
   36: #include <sys/types.h>
   37: #include <sys/param.h>
   38: 
   39: #include <arpa/inet.h>
   40: #include <stdlib.h>
   41: #include <stdio.h>
   42: #include <string.h>
   43: #include <errno.h>
   44: #ifdef HAVE_STDARG_H
   45: #include <stdarg.h>
   46: #else
   47: #include <varargs.h>
   48: #endif
   49: #if TIME_WITH_SYS_TIME
   50: # include <sys/time.h>
   51: # include <time.h>
   52: #else
   53: # if HAVE_SYS_TIME_H
   54: #  include <sys/time.h>
   55: # else
   56: #  include <time.h>
   57: # endif
   58: #endif
   59: #include <ctype.h>
   60: #include <err.h>
   61: 
   62: #include "var.h"
   63: #include "misc.h"
   64: #include "plog.h"
   65: #include "logger.h"
   66: #include "debug.h"
   67: #include "gcmalloc.h"
   68: 
   69: #ifndef VA_COPY
   70: # define VA_COPY(dst,src) memcpy(&(dst), &(src), sizeof(va_list))
   71: #endif
   72: 
   73: char *pname = NULL;
   74: u_int32_t loglevel = LLV_BASE;
   75: int f_foreground = 0;
   76: 
   77: int print_location = 0;
   78: 
   79: static struct log *logp = NULL;
   80: static char *logfile = NULL;
   81: 
   82: static char *plog_common __P((int, const char *, const char *, struct sockaddr *));
   83: 
   84: static struct plogtags {
   85: 	char *name;
   86: 	int priority;
   87: } ptab[] = {
   88: 	{ "(not defined)",	0, },
   89: 	{ "ERROR",		LOG_INFO, },
   90: 	{ "WARNING",		LOG_INFO, },
   91: 	{ "NOTIFY",		LOG_INFO, },
   92: 	{ "INFO",		LOG_INFO, },
   93: 	{ "DEBUG",		LOG_DEBUG, },
   94: 	{ "DEBUG2",		LOG_DEBUG, },
   95: };
   96: 
   97: static char *
   98: plog_common(pri, fmt, func, sa)
   99: 	int pri;
  100: 	const char *fmt, *func;
  101: 	struct sockaddr *sa;
  102: {
  103: 	static char buf[800];	/* XXX shoule be allocated every time ? */
  104: 	void *addr;
  105: 	char *p;
  106: 	int reslen, len;
  107: 
  108: 	p = buf;
  109: 	reslen = sizeof(buf);
  110: 
  111: 	if (logfile || f_foreground) {
  112: 		time_t t;
  113: 		struct tm *tm;
  114: 
  115: 		t = time(0);
  116: 		tm = localtime(&t);
  117: 		len = strftime(p, reslen, "%Y-%m-%d %T: ", tm);
  118: 		p += len;
  119: 		reslen -= len;
  120: 	}
  121: 
  122: 	if (sa && reslen > 3) {
  123: 		addr = NULL;
  124: 		switch (sa->sa_family) {
  125: 		case AF_INET:
  126: 			addr = &((struct sockaddr_in*)sa)->sin_addr;
  127: 			break;
  128: 		case AF_INET6:
  129: 			addr = &((struct sockaddr_in6*)sa)->sin6_addr;
  130: 			break;
  131: 		}
  132: 		if (inet_ntop(sa->sa_family, addr, p + 1, reslen - 3) != NULL) {
  133: 			*p++ = '[';
  134: 			len = strlen(p);
  135: 			p += len;
  136: 			*p++ = ']';
  137: 			*p++ = ' ';
  138: 			reslen -= len + 3;
  139: 		}
  140: 	}
  141: 
  142: 	if (pri < ARRAYLEN(ptab)) {
  143: 		len = snprintf(p, reslen, "%s: ", ptab[pri].name);
  144: 		p += len;
  145: 		reslen -= len;
  146: 	}
  147: 
  148: 	if (print_location)
  149: 		len = snprintf(p, reslen, "%s: %s", func, fmt);
  150: 	else
  151: 		len = snprintf(p, reslen, "%s", fmt);
  152: 	p += len;
  153: 	reslen -= len;
  154: 
  155: 	/* Force nul termination */
  156: 	if (reslen == 0)
  157: 		p[-1] = 0;
  158: 
  159: #ifdef BROKEN_PRINTF
  160: 	while ((p = strstr(buf,"%z")) != NULL)
  161: 		p[1] = 'l';
  162: #endif
  163: 
  164: 	return buf;
  165: }
  166: 
  167: void
  168: _plog(int pri, const char *func, struct sockaddr *sa, const char *fmt, ...)
  169: {
  170: 	va_list ap;
  171: 
  172: 	va_start(ap, fmt);
  173: 	plogv(pri, func, sa, fmt, ap);
  174: 	va_end(ap);
  175: }
  176: 
  177: void
  178: plogv(int pri, const char *func, struct sockaddr *sa,
  179: 	const char *fmt, va_list ap)
  180: {
  181: 	char *newfmt;
  182: 	va_list ap_bak;
  183: 
  184: 	if (pri > loglevel)
  185: 		return;
  186: 
  187: 	newfmt = plog_common(pri, fmt, func, sa);
  188: 
  189: 	VA_COPY(ap_bak, ap);
  190: 	
  191: 	if (f_foreground)
  192: 		vprintf(newfmt, ap);
  193: 
  194: 	if (logfile)
  195: 		log_vaprint(logp, newfmt, ap_bak);
  196: 	else {
  197: 		if (pri < ARRAYLEN(ptab))
  198: 			vsyslog(ptab[pri].priority, newfmt, ap_bak);
  199: 		else
  200: 			vsyslog(LOG_ALERT, newfmt, ap_bak);
  201: 	}
  202: }
  203: 
  204: void
  205: plogdump(pri, data, len)
  206: 	int pri;
  207: 	void *data;
  208: 	size_t len;
  209: {
  210: 	caddr_t buf;
  211: 	size_t buflen;
  212: 	int i, j;
  213: 
  214: 	if (pri > loglevel)
  215: 		return;
  216: 
  217: 	/*
  218: 	 * 2 words a bytes + 1 space 4 bytes + 1 newline 32 bytes
  219: 	 * + 2 newline + '\0'
  220: 	 */
  221: 	buflen = (len * 2) + (len / 4) + (len / 32) + 3;
  222: 	buf = racoon_malloc(buflen);
  223: 
  224: 	i = 0;
  225: 	j = 0;
  226: 	while (j < len) {
  227: 		if (j % 32 == 0)
  228: 			buf[i++] = '\n';
  229: 		else
  230: 		if (j % 4 == 0)
  231: 			buf[i++] = ' ';
  232: 		snprintf(&buf[i], buflen - i, "%02x",
  233: 			((unsigned char *)data)[j] & 0xff);
  234: 		i += 2;
  235: 		j++;
  236: 	}
  237: 	if (buflen - i >= 2) {
  238: 		buf[i++] = '\n';
  239: 		buf[i] = '\0';
  240: 	}
  241: 	plog(pri, LOCATION, NULL, "%s", buf);
  242: 
  243: 	racoon_free(buf);
  244: }
  245: 
  246: void
  247: ploginit()
  248: {
  249: 	if (logfile) {
  250: 		logp = log_open(250, logfile);
  251: 		if (logp == NULL)
  252: 			errx(1, "ERROR: failed to open log file %s.", logfile);
  253: 		return;
  254: 	}
  255: 
  256:         openlog(pname, LOG_NDELAY, LOG_DAEMON);
  257: }
  258: 
  259: void
  260: plogset(file)
  261: 	char *file;
  262: {
  263: 	if (logfile != NULL)
  264: 		racoon_free(logfile);
  265: 	logfile = racoon_strdup(file);
  266: 	STRDUP_FATAL(logfile);
  267: }
  268: 
  269: /*
  270:    Returns a printable string from (possibly) binary data ;
  271:    concatenates all unprintable chars to one space.
  272:    XXX Maybe the printable chars range is too large...
  273:  */
  274: char*
  275: binsanitize(binstr, n)
  276: 	char *binstr;
  277: 	size_t n;
  278: {
  279: 	int p,q;
  280: 	char* d;
  281: 
  282: 	d = racoon_malloc(n + 1);
  283: 	for (p = 0, q = 0; p < n; p++) {
  284: 		if (isgraph((int)binstr[p])) {
  285: 			d[q++] = binstr[p];
  286: 		} else {
  287: 			if (q && d[q - 1] != ' ')
  288: 				d[q++] = ' ';
  289: 		}
  290: 	}
  291: 	d[q++] = '\0';
  292: 
  293: 	return d;
  294: }
  295: 	

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>