Mercurial > hg > freeDiameter
comparison libfdproto/log.c @ 1088:1d1a20a0779d
Second part of changeset 1083, now the code compiles again. Still missing some functions implementation, though
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Sat, 04 May 2013 21:25:27 +0200 |
parents | 7d7266115a34 |
children | eab8cad30b4c |
comparison
equal
deleted
inserted
replaced
1087:1c5d410788cc | 1088:1d1a20a0779d |
---|---|
35 | 35 |
36 #include "fdproto-internal.h" | 36 #include "fdproto-internal.h" |
37 | 37 |
38 #include <stdarg.h> | 38 #include <stdarg.h> |
39 | 39 |
40 FILE * fd_g_debug_fstr; | |
41 | |
42 pthread_mutex_t fd_log_lock = PTHREAD_MUTEX_INITIALIZER; | 40 pthread_mutex_t fd_log_lock = PTHREAD_MUTEX_INITIALIZER; |
43 pthread_key_t fd_log_thname; | 41 pthread_key_t fd_log_thname; |
44 int fd_g_debug_lvl = INFO; | 42 int fd_g_debug_lvl = FD_LOG_NOTICE; |
45 | 43 |
46 static void fd_internal_logger( int, const char *, va_list ); | 44 static void fd_internal_logger( int, const char *, va_list ); |
47 static int use_colors = 0; /* 0: not init, 1: yes, 2: no */ | 45 static int use_colors = 0; /* 0: not init, 1: yes, 2: no */ |
48 | 46 |
49 /* These may be used to pass specific debug requests via the command-line parameters */ | 47 /* These may be used to pass specific debug requests via the command-line parameters */ |
85 { | 83 { |
86 (void)pthread_mutex_unlock((pthread_mutex_t *)mutex); | 84 (void)pthread_mutex_unlock((pthread_mutex_t *)mutex); |
87 } | 85 } |
88 | 86 |
89 | 87 |
90 static void fd_internal_logger( int loglevel, const char *format, va_list ap ) | 88 static void fd_internal_logger( int printlevel, const char *format, va_list ap ) |
91 { | 89 { |
92 char buf[25]; | 90 char buf[25]; |
93 FILE *fstr = fd_g_debug_fstr ?: stdout; | 91 |
94 int local_use_color = 0; | 92 /* Do we need to trace this ? */ |
95 | 93 if (printlevel < fd_g_debug_lvl) |
96 /* logging has been decided by macros outside already */ | 94 return; |
97 | 95 |
98 /* add timestamp */ | 96 /* add timestamp */ |
99 fprintf(fstr, "%s ", fd_log_time(NULL, buf, sizeof(buf))); | 97 printf("%s ", fd_log_time(NULL, buf, sizeof(buf))); |
100 | 98 |
101 /* Use colors on stdout ? */ | 99 /* Use colors on stdout ? */ |
102 if (!use_colors) { | 100 if (!use_colors) { |
103 if (isatty(STDOUT_FILENO)) | 101 if (isatty(STDOUT_FILENO)) |
104 use_colors = 1; | 102 use_colors = 1; |
105 else | 103 else |
106 use_colors = 2; | 104 use_colors = 2; |
107 } | 105 } |
108 | 106 |
109 /* now, this time log, do we use colors? */ | 107 switch(printlevel) { |
110 if ((fstr == stdout) && (use_colors == 1)) | 108 case FD_LOG_ANNOYING: printf("%s A ", (use_colors == 1) ? "\e[0;37m" : ""); break; |
111 local_use_color = 1; | 109 case FD_LOG_DEBUG: printf("%s DBG ", (use_colors == 1) ? "\e[0;37m" : ""); break; |
110 case FD_LOG_NOTICE: printf("%sNOTI ", (use_colors == 1) ? "\e[1;37m" : ""); break; | |
111 case FD_LOG_ERROR: printf("%sERROR ", (use_colors == 1) ? "\e[0;31m" : ""); break; | |
112 case FD_LOG_FATAL: printf("%sFATAL! ", (use_colors == 1) ? "\e[0;31m" : ""); break; | |
113 default: printf("%s ??? ", (use_colors == 1) ? "\e[0;31m" : ""); | |
114 } | |
115 vprintf(format, ap); | |
116 if (use_colors == 1) | |
117 printf("\e[00m"); | |
118 printf("\n"); | |
112 | 119 |
113 switch(loglevel) { | 120 fflush(stdout); |
114 case FD_LOG_DEBUG: fprintf(fstr, "%s DBG ", local_use_color ? "\e[0;37m" : ""); break; | |
115 case FD_LOG_NOTICE: fprintf(fstr, "%sNOTI ", local_use_color ? "\e[1;37m" : ""); break; | |
116 case FD_LOG_ERROR: fprintf(fstr, "%sERROR ", local_use_color ? "\e[0;31m" : ""); break; | |
117 default: fprintf(fstr, "%s ??? ", local_use_color ? "\e[0;31m" : ""); | |
118 } | |
119 vfprintf(fstr, format, ap); | |
120 if (local_use_color) | |
121 fprintf(fstr, "\e[00m"); | |
122 fprintf(fstr, "\n"); | |
123 | |
124 fflush(fstr); | |
125 } | 121 } |
126 | 122 |
127 /* Log a debug message */ | 123 /* Log a debug message */ |
128 void fd_log ( int loglevel, const char * format, ... ) | 124 void fd_log ( int loglevel, const char * format, ... ) |
129 { | 125 { |
209 | 205 |
210 return buf; | 206 return buf; |
211 } | 207 } |
212 | 208 |
213 | 209 |
210 static size_t sys_mempagesz = 0; | |
211 | |
212 static size_t get_mempagesz(void) { | |
213 if (!sys_mempagesz) { | |
214 sys_mempagesz = sysconf(_SC_PAGESIZE); /* We alloc buffer by memory pages for efficiency */ | |
215 if (sys_mempagesz <= 0) | |
216 sys_mempagesz = 1024; /* default size if above call failed */ | |
217 } | |
218 return sys_mempagesz; | |
219 } | |
220 | |
221 | |
214 /* Helper function for fd_*_dump. Prints the format string from 'offset' into '*buf', extends if needed. The location of buf can be updated by this function. */ | 222 /* Helper function for fd_*_dump. Prints the format string from 'offset' into '*buf', extends if needed. The location of buf can be updated by this function. */ |
215 char * fd_dump_extend(char ** buf, size_t *len, size_t *offset, const char * format, ... ) | 223 char * fd_dump_extend(char ** buf, size_t *len, size_t *offset, const char * format, ... ) |
216 { | 224 { |
217 va_list ap; | 225 va_list ap; |
218 int to_write; | 226 int to_write; |
219 size_t o = 0; | 227 size_t o = 0; |
220 static size_t mempagesz = 0; | 228 size_t mempagesz = get_mempagesz(); |
221 | |
222 if (!mempagesz) { | |
223 mempagesz = sysconf(_SC_PAGESIZE); /* We alloc buffer by memory pages for efficiency */ | |
224 if (mempagesz <= 0) | |
225 mempagesz = 1024; /* default size if above call failed */ | |
226 } | |
227 | 229 |
228 /* we do not TRACE_ENTRY this one on purpose */ | 230 /* we do not TRACE_ENTRY this one on purpose */ |
229 | 231 |
230 CHECK_PARAMS_DO(buf && len, return NULL); | 232 CHECK_PARAMS_DO(buf && len, return NULL); |
231 | 233 |
255 if (offset) | 257 if (offset) |
256 *offset += to_write; | 258 *offset += to_write; |
257 | 259 |
258 return *buf; | 260 return *buf; |
259 } | 261 } |
262 | |
263 char * fd_dump_extend_hexdump(char ** buf, size_t *len, size_t *offset, uint8_t *data, size_t datalen, size_t trunc, size_t wrap ) | |
264 { | |
265 int truncated = 0; | |
266 size_t towrite = 0; | |
267 size_t o = 0; | |
268 int i; | |
269 char * p; | |
270 size_t mempagesz = get_mempagesz(); | |
271 #define TRUNK_MARK "[...]" | |
272 | |
273 CHECK_PARAMS_DO(buf && len && data, return NULL); | |
274 | |
275 if (trunc && (datalen > trunc)) { | |
276 datalen = trunc; | |
277 truncated = 1; | |
278 } | |
279 | |
280 towrite = datalen * 2; | |
281 | |
282 if (wrap) | |
283 towrite += datalen / wrap; /* add 1 '\n' every wrap byte */ | |
284 | |
285 if (truncated) | |
286 towrite += CONSTSTRLEN(TRUNK_MARK); | |
287 | |
288 | |
289 if (offset) | |
290 o = *offset; | |
291 | |
292 if (*buf == NULL) { | |
293 /* Directly allocate the size we need */ | |
294 *len = (((towrite + o) / mempagesz) + 1 ) * mempagesz; | |
295 CHECK_MALLOC_DO(*buf = malloc(*len), return NULL); | |
296 } else if ((towrite + o) >= *len) { | |
297 /* There is no room in the buffer, we extend and redo */ | |
298 size_t new_len = (((towrite + o) / mempagesz) + 1) * mempagesz; | |
299 CHECK_MALLOC_DO(*buf = realloc(*buf, new_len), return NULL); | |
300 *len = new_len; | |
301 } | |
302 | |
303 p = *buf + o; | |
304 for (i = 0; i < datalen; i++) { | |
305 sprintf(p, "%2hhX", data[i]); | |
306 p+=2; | |
307 if ((wrap) && ((i+1) % wrap == 0)) { | |
308 *p++='\n'; *p ='\0'; /* we want to ensure the buffer is always 0-terminated */ | |
309 } | |
310 } | |
311 | |
312 if (truncated) | |
313 memcpy(p, TRUNK_MARK, CONSTSTRLEN(TRUNK_MARK)); | |
314 | |
315 if (offset) | |
316 *offset += towrite; | |
317 | |
318 return *buf; | |
319 } |