/* 
 * dhcpcd - DHCP client daemon
 * Copyright 2006-2008 Roy Marples <roy@marples.name>
 * All rights reserved

 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>

#include "common.h"
#include "logger.h"

#ifdef ANDROID
#include <android/log.h>
#endif

static int loglevel = LOG_ERR;
static char logprefix[12] = {0};

void
setloglevel(int level)
{
	loglevel = level;
}

void
setlogprefix(const char *prefix)
{
	strlcpy(logprefix, prefix, sizeof(logprefix));
}

void
logger(int level, const char *fmt, ...)
{
	va_list p, p2;
	FILE *f = stderr;
	size_t len, fmt2len;
	char *fmt2, *pf;

	va_start(p, fmt);
#ifdef ANDROID
	if (level <= loglevel) {
		if (level <= LOG_ERR) {
			level = ANDROID_LOG_ERROR;
		} else {
			level = ANDROID_LOG_DEBUG;
		}
		__android_log_vprint(level, "dhcpcd", fmt, p);
	}
#else
	va_copy(p2, p);

	if (level <= LOG_ERR || level <= loglevel) {
		fprintf(f, "%s", logprefix);
		vfprintf(f, fmt, p);
		fputc('\n', f);
	}

	if (level < LOG_DEBUG || level <= loglevel) {
		len = strlen(logprefix);
		fmt2len = strlen(fmt) + len + 1;
		fmt2 = pf = malloc(sizeof(char) * fmt2len);
		if (fmt2) {
			strlcpy(pf, logprefix, fmt2len);
			pf += len;
			strlcpy(pf, fmt, fmt2len - len);
			vsyslog(level, fmt2, p2);
			free(fmt2);
		} else {
			vsyslog(level, fmt, p2);
			syslog(LOG_ERR, "logger: memory exhausted");
			exit(EXIT_FAILURE);
		}
	}

	va_end(p2);
#endif
	va_end(p);
}
