static int print_body(struct binrpc_parse_ctx* in_pkt, unsigned char* body, int size, char* fmt) { unsigned char* p; unsigned char* end; struct binrpc_val val; int ret; int rec; char *f; char* s; int f_size; int fmt_has_values; p=body; end=p+size; rec=0; f=fmt; fmt_has_values=0; /* read body */ while(p<end){ if (f){ do{ if (*f==0) f=fmt; /* reset */ s=f; f=parse_fmt(f, &val.type, &f_size); printf("%.*s", f_size, s); if (val.type!=-1){ fmt_has_values=1; goto read_value; } }while(*f || fmt_has_values); val.type=BINRPC_T_ALL; }else{ val.type=BINRPC_T_ALL; } read_value: val.name.s=0; val.name.len=0; p=binrpc_read_record(in_pkt, p, end, &val, 1, &ret); if (ret<0){ if (fmt) putchar('\n'); /*if (ret==E_BINRPC_MORE_DATA) goto error_read_again;*/ if (ret==E_BINRPC_EOP){ printf("end of message detected\n"); break; } fprintf(stderr, "ERROR:: while parsing the record %d," " @%d: %02x : %s\n", rec, in_pkt->offset, *p, binrpc_error(ret)); goto error; } rec++; if (fmt){ print_binrpc_val(&val, 0); }else{ print_binrpc_val(&val, in_pkt->in_struct+in_pkt->in_array); putchar('\n'); } } if (fmt && *f){ /* print the rest, with empty values */ while(*f){ s=f; f=parse_fmt(f, &val.type, &f_size); printf("%.*s", f_size, s); } } return 0; error: return -1; /*error_read_again: fprintf(stderr, "ERROR: more data needed\n"); return -2; */ }
int binrpc_print_response(struct binrpc_response_handle *resp_handle, char* fmt) { unsigned char* p; unsigned char* end; struct binrpc_val val; int ret; int rec; char *f; char* s; int f_size; int fmt_has_values; if (!resp_handle) { goto error; } resp_handle->in_pkt.offset = resp_handle->in_pkt.in_struct = resp_handle->in_pkt.in_array = 0; p=resp_handle->reply_buf; end=p+resp_handle->in_pkt.tlen; rec=0; f=fmt; fmt_has_values=0; /* read body */ while(p<end){ if (f){ do{ if (*f==0) f=fmt; /* reset */ s=f; f=parse_fmt(f, &val.type, &f_size); printf("%.*s", f_size, s); if (val.type!=-1){ fmt_has_values=1; goto read_value; } }while(*f || fmt_has_values); val.type=BINRPC_T_ALL; }else{ val.type=BINRPC_T_ALL; } read_value: val.name.s=0; val.name.len=0; p=binrpc_read_record(&resp_handle->in_pkt, p, end, &val, &ret); if (ret<0){ if (fmt) putchar('\n'); /*if (ret==E_BINRPC_MORE_DATA) goto error_read_again;*/ if (ret==E_BINRPC_EOP){ printf("end of message detected\n"); break; } snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1, "error while parsing the record %d," " @%d: %02x : %s", rec, resp_handle->in_pkt.offset, *p, binrpc_error(ret)); goto error; } rec++; if (fmt){ print_binrpc_val(&val, 0); }else{ print_binrpc_val(&val, resp_handle->in_pkt.in_struct+resp_handle->in_pkt.in_array); putchar('\n'); } } if (fmt && *f){ /* print the rest, with empty values */ while(*f){ s=f; f=parse_fmt(f, &val.type, &f_size); printf("%.*s", f_size, s); } } return 0; error: return FATAL_ERROR; /*error_read_again: snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1, "ERROR: more data needed"); return -2; */ }