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