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 }
"Welcome to our mercurial repository"