Codebase list dnscat2 / b8ea4170-8ac8-445b-8744-b51f27e5fb2b/main client / libs / log.c
b8ea4170-8ac8-445b-8744-b51f27e5fb2b/main

Tree @b8ea4170-8ac8-445b-8744-b51f27e5fb2b/main (Download .tar.gz)

log.c @b8ea4170-8ac8-445b-8744-b51f27e5fb2b/mainraw · history · blame

/* log.c
 * By Ron Bowes
 *
 * See LICENSE.md
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#include "assert.h"
#include "memory.h"

#include "log.h"

static log_level_t log_console_min = LOG_LEVEL_WARNING;
static log_level_t log_file_min = LOG_LEVEL_INFO;
static FILE *log_file = NULL;

static char *log_levels[] = { "INFO", "WARNING", "ERROR", "FATAL" };

void log_to_file(char *filename, log_level_t min_level)
{
  assert(min_level >= LOG_LEVEL_INFO || min_level <= LOG_LEVEL_FATAL);

#ifdef WIN32
  fopen_s(&log_file, filename, "w");
#else
  log_file = fopen(filename, "w");
#endif
  if(log_file)
    log_file_min = min_level;
  else
    LOG_WARNING("Couldn't open logfile: %s", filename);
}

void log_set_min_console_level(log_level_t min_level)
{
  assert(min_level >= LOG_LEVEL_INFO || min_level <= LOG_LEVEL_FATAL);

  log_console_min = min_level;
}

log_level_t log_get_min_console_level()
{
  return log_console_min;
}

/* Most of this code is from the manpage for vsprintf() */
static void log_internal(log_level_t level, char *format, va_list args)
{
  assert(level >= LOG_LEVEL_INFO || level <= LOG_LEVEL_FATAL);

  if(level >= log_console_min)
  {
    fprintf(stderr, "[[ %s ]] :: ", log_levels[level]);
    vfprintf(stderr, format, args);
    fprintf(stderr, "\n");
  }

  if(log_file && level >= log_file_min)
  {
    vfprintf(log_file, format, args);
  }
}

void log_info(char *format, ...)
{
  va_list args;

  va_start(args, format);
  log_internal(LOG_LEVEL_INFO, format, args);
  va_end(args);
}

void log_warning(char *format, ...)
{
  va_list args;

  va_start(args, format);
  log_internal(LOG_LEVEL_WARNING, format, args);
  va_end(args);
}

void log_error(char *format, ...)
{
  va_list args;

  va_start(args, format);
  log_internal(LOG_LEVEL_ERROR, format, args);
  va_end(args);
}

void log_fatal(char *format, ...)
{
  va_list args;

  va_start(args, format);
  log_internal(LOG_LEVEL_FATAL, format, args);
  va_end(args);
}