/*
 * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
 *
 * PROPRIETARY/CONFIDENTIAL
 *
 * This software is the confidential and proprietary information of Samsung
 * Electronics Co., Ltd. ("Confidential Information"). You shall not disclose such
 * Confidential Information and shall use it only in accordance with the terms of
 * the license agreement you entered into with Samsung Electronics Co., Ltd. ("SAMSUNG")
 * SAMSUNG MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
 * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT
 * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SAMSUNG SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
 * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include "dsmsta_klog.h"

#define LOG_BUF_MAX 512

static int klog_level = INFO_LEVEL;

static int open_klog(void)
{
	static const char *kmsg_device = "/dev/kmsg";

	return open(kmsg_device, O_WRONLY | O_CLOEXEC);
}

static void klog_writev(const char *buf, int buf_len)
{
	int klog_fd;

	klog_fd = open_klog();
	if (klog_fd == -1) {
		return;
	}

	write(klog_fd, buf, buf_len);

	close(klog_fd);
}

void klog_set_level(int level)
{
	klog_level = level;
}

void klog_write(int level, const char *fmt, ...)
{
	int ret;
	va_list ap;
	char buf[LOG_BUF_MAX];

	if (level > klog_level)
		return;

	va_start(ap, fmt);
	ret = vsnprintf(buf, sizeof(buf), fmt, ap);
	va_end(ap);
	buf[LOG_BUF_MAX - 1] = '\0';

	if (ret >= 0) {
		klog_writev(buf, strnlen(buf, LOG_BUF_MAX));
	}
}
