10a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* $NetBSD: logger.c,v 1.4 2006/09/09 16:22:09 manu Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* $KAME: logger.c,v 1.9 2002/09/03 14:37:03 itojun Exp $ */ 40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved. 80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without 100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions 110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met: 120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright 130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer. 140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright 150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer in the 160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * documentation and/or other materials provided with the distribution. 170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors 180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * may be used to endorse or promote products derived from this software 190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * without specific prior written permission. 200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE. 320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h" 350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h> 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h> 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h> 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h> 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h> 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <errno.h> 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_STDARG_H 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdarg.h> 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <varargs.h> 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if TIME_WITH_SYS_TIME 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h> 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h> 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# if HAVE_SYS_TIME_H 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h> 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# else 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h> 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# endif 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "logger.h" 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h" 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gcmalloc.h" 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct log * 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_open(siz, fname) 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t siz; 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *fname; 670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct log *p; 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = (struct log *)racoon_malloc(sizeof(*p)); 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p == NULL) 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(p, 0, sizeof(*p)); 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->buf = (char **)racoon_malloc(sizeof(char *) * siz); 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->buf == NULL) { 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p); 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(p->buf, 0, sizeof(char *) * siz); 810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->tbuf = (time_t *)racoon_malloc(sizeof(time_t *) * siz); 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->tbuf == NULL) { 840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p->buf); 850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p); 860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(p->tbuf, 0, sizeof(time_t *) * siz); 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->siz = siz; 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (fname) 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->fname = racoon_strdup(fname); 930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return p; 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * append string to ring buffer. 990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * string must be \n-terminated (since we add timestamps). 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * even if not, we'll add \n to avoid formatting mistake (see log_close()). 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_add(p, str) 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct log *p; 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* syslog if p->fname == NULL? */ 1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->buf[p->head]) 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p->buf[p->head]); 1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->buf[p->head] = racoon_strdup(str); 1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->tbuf[p->head] = time(NULL); 1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->head++; 1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p->head %= p->siz; 1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * write out string to the log file, as is. 1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * \n-termination is up to the caller. if you don't add \n, the file 1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * format may be broken. 1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_print(p, str) 1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct log *p; 1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang FILE *fp; 1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->fname == NULL) 1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; /*XXX syslog?*/ 1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fp = fopen(p->fname, "a"); 1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (fp == NULL) 1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fprintf(fp, "%s", str); 1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fclose(fp); 1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_vprint(struct log *p, const char *fmt, ...) 1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang va_list ap; 1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang FILE *fp; 1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->fname == NULL) 1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; /*XXX syslog?*/ 1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fp = fopen(p->fname, "a"); 1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (fp == NULL) 1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang va_start(ap, fmt); 1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfprintf(fp, fmt, ap); 1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang va_end(ap); 1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fclose(fp); 1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_vaprint(struct log *p, const char *fmt, va_list ap) 1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang FILE *fp; 1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->fname == NULL) 1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; /*XXX syslog?*/ 1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fp = fopen(p->fname, "a"); 1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (fp == NULL) 1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfprintf(fp, fmt, ap); 1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fclose(fp); 1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * write out content of ring buffer, and reclaim the log structure 1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_close(p) 1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct log *p; 1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang FILE *fp; 1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i, j; 1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char ts[256]; 1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct tm *tm; 1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->fname == NULL) 1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto nowrite; 1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fp = fopen(p->fname, "a"); 1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (fp == NULL) 1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto nowrite; 1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < p->siz; i++) { 1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang j = (p->head + i) % p->siz; 1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->buf[j]) { 1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tm = localtime(&p->tbuf[j]); 1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strftime(ts, sizeof(ts), "%B %d %T", tm); 1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fprintf(fp, "%s: %s\n", ts, p->buf[j]); 2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*(p->buf[j] + strlen(p->buf[j]) - 1) != '\n') 2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fprintf(fp, "\n"); 2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fclose(fp); 2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangnowrite: 2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_free(p); 2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglog_free(p) 2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct log *p; 2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < p->siz; i++) 2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p->buf[i]); 2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p->buf); 2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p->tbuf); 2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p->fname) 2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p->fname); 2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p); 2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef TEST 2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct log *l; 2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvatest(const char *fmt, ...) 2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang va_list ap; 2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang va_start(ap, fmt); 2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_vaprint(l, fmt, ap); 2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang va_end(ap); 2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangmain(argc, argv) 2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int argc; 2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **argv; 2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang l = log_open(30, "/tmp/hoge"); 2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (l == NULL) 2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "hoge"); 2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < 50; i++) { 2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_add(l, "foo"); 2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_add(l, "baa"); 2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_add(l, "baz"); 2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_print(l, "hoge\n"); 2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_vprint(l, "hoge %s\n", "this is test"); 2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vatest("%s %s\n", "this is", "vprint test"); 2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang abort(); 2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang log_free(l); 2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 263