/*
 * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
 * Copyright (c) 2017 Intel Corporation
 * Copyright (c) 2019, Infosys Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <time.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include "log.h"
#include <sys/syscall.h>

bool g_nolog = false;
enum log_levels g_log_level = LOG_INFO;

int pid = 0;
char processName[255] = {0};

static const char *log_level_name[] = { "INFO", "DEBUG", "WARN", "ERROR" };

void log_message(int l, const char *file, int line, const char *fmt, ...)
{
	va_list arg;
	if (g_nolog) return;
	if(g_log_level > l) return;

	FILE *fp = fopen("/tmp/mmelogs.txt", "a+");
        if (fp == NULL)
        {
                printf("Could not open log file");
                exit(0);
        }

	fprintf(fp,"%s(%d:%ld):%s-%s:%d:", processName, pid, syscall(SYS_gettid), log_level_name[l], file, line);
	va_start(arg, fmt);
//	vfprintf(stderr, fmt, arg);
	vfprintf(fp, fmt, arg);
	va_end(arg);
	fclose(fp);
//	fprintf(stderr, "\n");
}

