#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdarg.h>
#include <syslog.h>

#include "fio.h"

int log_valist(const char *str, va_list args)
{
	if (log_syslog) {
		vsyslog(LOG_INFO, str, args);
		return 0;
	} else {
		char buffer[1024];
		size_t len;

		len = vsnprintf(buffer, sizeof(buffer), str, args);
		return fwrite(buffer, len, 1, f_out);
	}
}

int log_local(const char *format, ...)
{
	char buffer[1024];
	va_list args;
	size_t len;

	va_start(args, format);

	if (log_syslog) {
		vsyslog(LOG_INFO, format, args);
		va_end(args);
		return 0;
	} else {
		len = vsnprintf(buffer, sizeof(buffer), format, args);
		va_end(args);
		return fwrite(buffer, len, 1, f_out);
	}
}

int log_info(const char *format, ...)
{
	char buffer[1024];
	va_list args;
	size_t len;

	va_start(args, format);
	len = vsnprintf(buffer, sizeof(buffer), format, args);
	va_end(args);

	if (is_backend)
		return fio_server_text_output(buffer, len);
	else
		return fwrite(buffer, len, 1, f_out);
}

int log_err(const char *format, ...)
{
	char buffer[1024];
	va_list args;
	size_t len;

	va_start(args, format);
	len = vsnprintf(buffer, sizeof(buffer), format, args);
	va_end(args);

	if (is_backend)
		return fio_server_text_output(buffer, len);
	else {
		if (f_err != stderr)
			fwrite(buffer, len, 1, stderr);

		return fwrite(buffer, len, 1, f_err);
	}
}
