diff --git a/src/capwap/cw_log_debug.c b/src/capwap/cw_log_debug.c index 7d520129..951e917c 100644 --- a/src/capwap/cw_log_debug.c +++ b/src/capwap/cw_log_debug.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "cw_log.h" @@ -107,14 +108,15 @@ int cw_log_debug_dump_(int level,const uint8_t * data, int len,const char * form int cw_log_debug_level=0; -static int dbg_opt_line_numbers=1; -static int dbg_opt_type=DBG_CAPWAP_MSG; +int cw_dbg_opt_detail=0; +int cw_dbg_opt_type=0; + void cw_log_dbg_(int type, const char * file, int line, const char * format, ...) { - if (!(type & dbg_opt_type)) + if (!(type & cw_dbg_opt_type)) return; char buf[2048]; @@ -124,7 +126,7 @@ void cw_log_dbg_(int type, const char * file, int line, const char * format, ... vsprintf(buf,format,args); va_end(args); - if (dbg_opt_line_numbers) + if (cw_dbg_opt_detail & DBG_DETAIL_LINE_NUMBERS) cw_log(LOG_DEBUG,"%s:%d: %s",file,line,buf); else cw_log(LOG_DEBUG,buf); @@ -132,6 +134,115 @@ void cw_log_dbg_(int type, const char * file, int line, const char * format, ... +void cw_log_dbg_dmp_(int type,const char * file, int line, const uint8_t * data, int len,const char * format, ...) +{ + + if (!(type & cw_dbg_opt_type)) + return; + + + int maxtlen=2048; + int i; + int rowlen = CW_LOG_DUMP_ROW_LEN; + int rows = len/rowlen; + int tlen=0; + + int md; + if (cw_dbg_opt_detail & DBG_DETAIL_ASC_DMP) + md=2; + else + md=1; + + + + char * dst = malloc(md*( len*3+(rows*2) + 8+maxtlen)) ; + if ( !dst ) + return; + + if (format != NULL){ + va_list args; + va_start(args,format); + tlen = vsnprintf(dst,maxtlen,format,args); + va_end(args); + } + + + + if (len%CW_LOG_DUMP_ROW_LEN) + rows++; + + + + char * pdst=dst+tlen; + sprintf(pdst,"\n\t"); + pdst+=2; + + char asc_buffer[128]; + char *ascdst=asc_buffer; + + for (i=0; i0x80) + c='.'; + *ascdst=c; + ascdst++; + } + + pdst+=3; + if ((i+1)%rowlen==0){ + int l; + if (cw_dbg_opt_detail & DBG_DETAIL_ASC_DMP){ + *ascdst=0; + l=sprintf(pdst," | %s\n\t",asc_buffer); + ascdst=asc_buffer; + + } + else{ + l=sprintf(pdst,"\n\t"); + } + pdst+=l; + } + + } + + if (cw_dbg_opt_detail & DBG_DETAIL_ASC_DMP){ + *ascdst=0; + if (strlen(asc_buffer)) + pdst+=sprintf(pdst," | %s",asc_buffer); + + } + + if (cw_dbg_opt_detail & DBG_DETAIL_LINE_NUMBERS) + cw_log(LOG_DEBUG,"%s:%d: %s",file,line,dst); + else + cw_log(LOG_DEBUG,dst); + + free (dst); + return; + +} + + + + + + + + + + + + + + + + + + + void (*cw_log_debug_cbs[])(const char * fromat, ...) = { cw_log_debug0_, cw_log_debug1_,