1/*
2 * Copyright 2008 Google Inc. All Rights Reserved.
3 *
4 * Author: md@google.com (Michael Davidson)
5 */
6
7#include <stdarg.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11
12#include "logging.h"
13
14
15static FILE		*log_fp		= NULL;
16static const char	*program	= "";
17static int		debug		= 0;
18
19
20void set_log_file(FILE *fp)
21{
22	log_fp = fp;
23}
24
25void set_program_name(const char *name)
26{
27	program = name;
28}
29
30void set_debug_level(int level)
31{
32	debug = level;
33}
34
35void msg(enum msg_type msg_type, int data, const char *fmt, ...)
36{
37	va_list		ap;
38	int		err	= 0;
39	const char	*type 	= NULL;
40
41	/*
42	 * default is to log to stdout
43	 */
44	if (!log_fp)
45		log_fp = stdout;
46
47	switch (msg_type) {
48		case MSG_DEBUG:
49			if (data > debug)
50				return;
51			type = "DEBUG";
52			break;
53		case MSG_INFO:
54			type = "INFO";
55			break;
56		case MSG_WARN:
57			type = "WARN";
58			break;
59		case MSG_ERROR:
60			type = "ERROR";
61			err = data;
62			break;
63		case MSG_FATAL:
64			type = "FATAL";
65			err = data;
66			break;
67	}
68
69	va_start(ap, fmt);
70
71	if (type)
72		fprintf(log_fp, "%s: ", type);
73
74	if (program)
75		fprintf(log_fp, "%s: ", program);
76
77	vfprintf(log_fp, fmt, ap);
78
79	if (err) {
80		fprintf(log_fp, ": %s\n", strerror(err));
81	} else {
82		fputc('\n', log_fp);
83	}
84
85	va_end(ap);
86
87	if (msg_type == MSG_FATAL)
88		exit(EXIT_FAILURE);
89}
90