/*
 * dsyslog - a dumb syslog (e.g. syslog for people who have a clue)
 * Copyright (c) 2008 William Pitcock <nenolod@sacredspiral.co.uk>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice is present in all copies.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "dsyslog.h"

static void
output_file_destructor(dsyslog_output_t *output)
{
	FILE *f;

	_ENTER;

	f = (FILE *) output->opaque;
	fflush(f);
	fclose(f);

	_LEAVE;
}

static void
output_file_handler(dsyslog_event_t *event, dsyslog_output_t *output)
{
	FILE *f;
	int ret;

	_ENTER;

	if (!output->path) {
		_LEAVE;
	}

	if (!output->opaque) {
		output->opaque = fopen(output->path, "a+");
		output->destructor = output_file_destructor;
	}

	f = (FILE *) output->opaque;

	if (event->pid != 0)
		ret = fprintf(f, "%s %s %s[%d]: %s\n", event->datestamp, event->source, event->program, event->pid, event->message);
	else
		ret = fprintf(f, "%s %s %s: %s\n", event->datestamp, event->source, event->program, event->message);

	fflush(f);

	_LEAVE;
}

void
_modinit(void)
{
	_ENTER;

	dsyslog_output_type_register("file", output_file_handler);

	_LEAVE;
}

void
_modfini(void)
{
	_ENTER;

	dsyslog_output_type_unregister("file");

	_LEAVE;
}
