5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#ifndef lint
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic char *rcsid = "$Id: log.c,v 1.1 2003/06/04 00:25:53 marka Exp $";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#endif
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews/*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * Copyright (c) 2000 Japan Network Information Center. All rights reserved.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * By using this file, you agree to the terms and conditions set forth bellow.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * LICENSE TERMS AND CONDITIONS
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * The following License Terms and Conditions apply, unless a different
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * license is obtained from Japan Network Information Center ("JPNIC"),
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * Chiyoda-ku, Tokyo 101-0047, Japan.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 1. Use, Modification and Redistribution (including distribution of any
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * modified or derived work) in source and/or binary forms is permitted
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * under this License Terms and Conditions.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 2. Redistribution of source code must retain the copyright notices as they
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * appear in each source code file, this License Terms and Conditions.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 3. Redistribution in binary form must reproduce the Copyright Notice,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * this License Terms and Conditions, in the documentation and/or other
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * materials provided with the distribution. For the purposes of binary
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * distribution the "Copyright Notice" refers to the following language:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved."
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 4. The name of JPNIC may not be used to endorse or promote products
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * derived from this Software without specific prior written approval of
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * JPNIC.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <config.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <stdio.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <stdarg.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <stdlib.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#ifdef HAVE_UNISTD_H
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <unistd.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#endif
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <idn/log.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#define LOGLEVEL_ENV "IDN_LOG_LEVEL"
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#ifdef DEBUG
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#define DEFAULT_LOG_LEVEL idn_log_level_info
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#else
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#define DEFAULT_LOG_LEVEL idn_log_level_error
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#endif
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic int log_level = -1;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic idn_log_proc_t log_proc;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic void initialize(void);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic void log(int level, const char *fmt, va_list args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic void log_to_stderr(int level, const char *buf);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_fatal(const char *fmt, ...) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_list args;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_start(args, fmt);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log(idn_log_level_fatal, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_end(args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews exit(1);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_error(const char *fmt, ...) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_list args;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_start(args, fmt);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log(idn_log_level_error, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_end(args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_warning(const char *fmt, ...) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_list args;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_start(args, fmt);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log(idn_log_level_warning, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_end(args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_info(const char *fmt, ...) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_list args;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_start(args, fmt);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log(idn_log_level_info, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_end(args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_trace(const char *fmt, ...) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_list args;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_start(args, fmt);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log(idn_log_level_trace, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_end(args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_dump(const char *fmt, ...) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_list args;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_start(args, fmt);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log(idn_log_level_dump, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews va_end(args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_setlevel(int level) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (level >= 0)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log_level = level;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsint
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_getlevel(void) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (log_level < 0)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews initialize();
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return log_level;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_log_setproc(idn_log_proc_t proc) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (proc == NULL)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log_proc = log_to_stderr;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews else
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log_proc = proc;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic void
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsinitialize(void) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews char *s;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (log_level < 0) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if ((s = getenv(LOGLEVEL_ENV)) != NULL) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews int level = atoi(s);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (level >= 0)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log_level = level;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (log_level < 0)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log_level = DEFAULT_LOG_LEVEL;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (log_proc == NULL)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews log_proc = log_to_stderr;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic void
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewslog(int level, const char *fmt, va_list args) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews char buf[1024];
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews initialize();
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (log_level < level)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#if HAVE_VSNPRINTF
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews (void)vsnprintf(buf, sizeof(buf), fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#else
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews /* Let's hope 1024 is enough.. */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews (void)vsprintf(buf, fmt, args);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#endif
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews (*log_proc)(level, buf);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsstatic void
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewslog_to_stderr(int level, const char *buf) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews char *title;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews char tmp[20];
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews switch (level) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews case idn_log_level_fatal:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = "FATAL";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews case idn_log_level_error:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = "ERROR";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews case idn_log_level_warning:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = "WARNING";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews case idn_log_level_info:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = "INFO";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews case idn_log_level_trace:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = "TRACE";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews case idn_log_level_dump:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = "DUMP";
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews default:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews (void)sprintf(tmp, "LEVEL%d", level);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews title = tmp;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews break;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews fprintf(stderr, "%u: [%s] %s", (unsigned int)getpid(), title, buf);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}