1 #include <stdbool.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <syslog.h>
5 
6 #define QLOG_BUF_SIZE 512
7 
8 static const char default_tag[] = "libqrtr";
9 static const char *current_tag = default_tag;
10 static int min_priority = LOG_INFO;
11 
12 static bool logging_to_syslog = false;
13 
qlog_setup(const char * tag,bool use_syslog)14 void qlog_setup(const char *tag, bool use_syslog)
15 {
16 	current_tag = tag;
17 	logging_to_syslog = use_syslog;
18 
19 	openlog(tag, LOG_PID, LOG_USER);
20 }
21 
qlog_set_min_priority(int priority)22 void qlog_set_min_priority(int priority)
23 {
24 	if (priority < LOG_EMERG || priority > LOG_DEBUG)
25 		return;
26 
27 	min_priority = priority;
28 }
29 
get_priority_string(int priority)30 static const char *get_priority_string(int priority)
31 {
32 	switch (priority) {
33 	case LOG_EMERG:
34 		return "EMERG";
35 	case LOG_ALERT:
36 		return "ALERT";
37 	case LOG_CRIT:
38 		return "CRIT";
39 	case LOG_ERR:
40 		return "ERROR";
41 	case LOG_WARNING:
42 		return "WARNING";
43 	case LOG_NOTICE:
44 		return "NOTICE";
45 	case LOG_INFO:
46 		return "INFO";
47 	case LOG_DEBUG:
48 		return "DEBUG";
49 	}
50 	return "";
51 }
52 
qlog(int priority,const char * format,...)53 void qlog(int priority, const char *format, ...)
54 {
55 	va_list ap;
56 
57 	if (priority > min_priority)
58 		return;
59 
60 	va_start(ap, format);
61 
62 	if (logging_to_syslog) {
63 		vsyslog(priority, format, ap);
64 	} else {
65 		char buf[QLOG_BUF_SIZE];
66 		vsnprintf(buf, QLOG_BUF_SIZE, format, ap);
67 
68 		fprintf(stderr, "%s %s: %s\n",
69 		        get_priority_string(priority), current_tag, buf);
70 	}
71 
72 	va_end(ap);
73 }
74