1 #include <stdarg.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <pthread.h>
7 #include "log.h"
8 
9 /* $Id: log.c,v 1.2 2002/06/24 04:04:32 fred_nerk Exp $ */
10 
11 #undef	FLUSH_LOG_STREAM
12 
13 int global_log_level;
14 int log_show_function = false;
15 int log_show_pid = false;
16 int log_show_file = true;
17 int log_show_level = true;
18 int log_show_date = true;
19 FILE *log_stream = NULL;
20 
21 pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
22 
log_set_level(int level)23 void log_set_level(int level)
24 {
25 	global_log_level = level;
26 }
27 
log(int level,const char * file,int line,const char * function,const char * format,...)28 void log(int level, const char *file, int line, const char *function, const char *format, ...)
29 {
30 	va_list ap;
31 	va_start(ap, format);
32 
33 	if (!log_stream)
34 		log_stream = stderr;
35 
36 	if (global_log_level >= level)
37 	{
38 		pthread_mutex_lock(&log_mutex);
39 		if (log_show_date)
40 			fprintf(log_stream, "%s", date_iso(NULL));
41 		if (log_show_level)
42 			fprintf(log_stream, " %2d", level);
43 		if (log_show_pid)
44 			fprintf(log_stream, " %5d", getpid());
45 		if (log_show_file)
46 			fprintf(log_stream, " %10s:%-3d", file, line);
47 		if (log_show_function && function)
48 			fprintf(log_stream, " %13s()", function);
49 		if (log_show_function || log_show_date || log_show_date || log_show_pid || log_show_file)
50 			fprintf(log_stream, ": ");
51 		vfprintf(log_stream, format, ap);
52 		fprintf(log_stream, "\n");
53 #ifndef FLUSH_LOG_STREAM
54 		fflush(log_stream);
55 #endif
56 		pthread_mutex_unlock(&log_mutex);
57 	}
58 }
59 
log_open(char * filename)60 int log_open(char *filename)
61 {
62 	static char *saved_log_filename = NULL;
63 
64 	if (log_stream && log_stream != stderr)
65 		log_close();
66 
67 	if (filename == NULL && saved_log_filename)
68 	{
69 		filename = saved_log_filename;
70 	}
71 
72 	if (filename)
73 	{
74 		if (saved_log_filename) free(saved_log_filename);
75 		saved_log_filename = strdup(filename);
76 		log_stream = fopen(filename, "w+");
77 		if (!log_stream)
78 		{
79 			log_stream = stderr;
80 			return false;
81 		}
82 		fseek(log_stream, 0, SEEK_END);
83 	}
84 	else
85 	{
86 		log_stream = stderr;
87 	}
88 
89 	return true;
90 }
91 
log_close()92 int log_close()
93 {
94 	if (log_stream && log_stream != stderr)
95 	{
96 		fflush(log_stream);
97 		fclose(log_stream);
98 	}
99 
100 	log_stream = stderr;
101 	return true;
102 }
103 
log_hex(int level,const char * file,int line,const char * function,const char * title,const char * data,int maxsize)104 void log_hex(int level, const char *file, int line, const char *function, const char *title, const char *data, int maxsize)
105 {
106 	unsigned int i, j;
107 	unsigned const char *d = (unsigned const char *)data;
108 
109 	if (global_log_level >= level)
110 	{
111 		log(level, file, line, function, "%s (%d bytes):", title, maxsize);
112 		pthread_mutex_lock(&log_mutex);
113 		for (i = 0; i < maxsize; )
114 		{
115 			fprintf(log_stream, "%4X: ", i);
116 			for (j = i; j < maxsize && j < (i + 16); j++)
117 			{
118 				fprintf(log_stream, "%02X ", d[j]);
119 				if (j == i + 7)
120 					fputs(": ", log_stream);
121 			}
122 
123 			for (; j < i + 16; j++)
124 			{
125 				fputs("   ", log_stream);
126 				if (j == i + 7)
127 					fputs(": ", log_stream);
128 			}
129 
130 			fputs("  ", log_stream);
131 			for (j = i; j < maxsize && j < (i + 16); j++)
132 			{
133 				if (d[j] >= 0x20 && d[j] < 0x7f && d[j] != 0x20)
134 					fputc(d[j], log_stream);
135 				else
136 					fputc('.', log_stream);
137 
138 				if (j == i + 7)
139 					fputs("  ", log_stream);
140 			}
141 
142 			i = j;
143 			fputs("\n", log_stream);
144 		}
145 		fflush(log_stream);
146 		pthread_mutex_unlock(&log_mutex);
147 	}
148 }
149 
date_now()150 Date *date_now()
151 {
152 	time_t tt;
153 	Date *date;
154 
155 	date = (Date *)malloc(sizeof(Date));
156 	tt = time(NULL);
157 	date->tm = localtime(&tt);
158 
159 	return date;
160 }
161 
date_free(Date * date)162 void date_free(Date *date)
163 {
164 	free(date);
165 }
166 
date_iso(Date * date)167 char *date_iso(Date *date)
168 {
169 	Date *tempdate;
170 	static char *buffer = NULL;
171 
172 	tempdate = date;
173 
174 	if (!tempdate)
175 		tempdate = date_now();
176 
177 	if (!buffer) buffer = (char *)malloc(20);
178 
179 	sprintf(buffer, "%4d-%02d-%02d %02d:%02d:%02d", tempdate->tm->tm_year + 1900, tempdate->tm->tm_mon + 1, tempdate->tm->tm_mday,
180 	        tempdate->tm->tm_hour, tempdate->tm->tm_min, tempdate->tm->tm_sec);
181 
182 	if (!date)
183 		date_free(tempdate);
184 
185 	return buffer;
186 }
187 
log_get_level()188 int log_get_level()
189 {
190 	return global_log_level;
191 }
192 
193