static void message_viewer_wire_question_record(message_viewer *mv, u8 *record_wire, u16 rclass, u16 rtype) { if(mv->view_mode_with & VM_WITH_XFR) { return; } output_stream *os_ = mv->os; /* * There is no padding support for formats on complex types (padding is ignored) * Doing it would be relatively expensive for it's best doing it manually when needed (afaik: only here) */ counter_output_stream_data counters; output_stream cos; counter_output_stream_init(os_, &cos, &counters); output_stream *os = &cos; u64 next = counters.write_count + 24 + 8; /* write NAME + alignment for next item */ osformat(os, ";%{dnsname}", record_wire, ' '); while(counters.write_count < next) { output_stream_write_u8(os, (u8) ' '); } output_stream_write_u8(os, (u8) ' '); next = counters.write_count + 7; /* write CLASS + alignment for next item */ osformat(os, "%7{dnsclass}", &rclass); while(counters.write_count < next) { output_stream_write_u8(os, (u8) ' '); } output_stream_write_u8(os, (u8) ' '); // next = counters.write_count + 7; /* write TYPE */ osformatln(os, "%7{dnstype}", &rtype); }
ya_result output_stream_write_dnslabel_stack(output_stream* os, dnslabel_stack_reference labels, s32 top) { ya_result n = 0; s32 i; for(i = top; i >= 0; i--) { ya_result err; u8 len = labels[i][0] + 1; if(FAIL(err = output_stream_write(os, labels[i], len))) { return err; } n += err; } output_stream_write_u8(os, 0); return n; }
void log_memdump_ex(logger_handle* hndl, u32 level, const void* data_pointer_, size_t size_, size_t line_size, bool hex, bool text, bool address) { if((hndl == NULL) || (level >= MSG_LEVEL_COUNT) || (hndl->channels[level].offset < 0)) { return; } output_stream os; char buffer[4096]; bytearray_output_stream_init((u8*)buffer, sizeof (buffer), &os); u8* data_pointer = (u8*)data_pointer_; s32 size = size_; int dump_size; int i; do { dump_size = MIN(line_size, size); u8* data; if(address) { osformat(&os, "%p ", data_pointer); } if(hex) { data = data_pointer; for(i = 0; i < dump_size; i++) { osformat(&os, "%02x", *data++); if((i & 3) == 3) { output_stream_write_u8(&os, (u8)' '); } } for(; i < line_size; i++) { osprint(&os, " "); if((i & 3) == 0) { osprint(&os, " "); } } } if(hex & text) { output_stream_write(&os, (u8*)" | ", 3); } if(text) { data = data_pointer; for(i = 0; i < dump_size; i++) { char c = *data++; if(c < ' ') { c = '.'; } else if(c == '%') { output_stream_write_u8(&os, '%'); } output_stream_write_u8(&os, (u8)c); } } data_pointer += dump_size; size -= dump_size; if(size != 0) { output_stream_write_u8(&os, 0); logger_handle_msg(hndl, level, "%s", bytearray_output_stream_buffer(&os)); bytearray_output_stream_reset(&os); } } while(size > 0); //if(size_ > line_size) if(bytearray_output_stream_size(&os) > 0) { output_stream_write_u8(&os, 0); logger_handle_msg(hndl, level, "%s", bytearray_output_stream_buffer(&os)); } output_stream_close(&os); }
static void message_viewer_wire_section_record(message_viewer *mv, u8 *record_wire, u8 view_mode_with) { if(!(mv->view_mode_with & view_mode_with)) { return; } /* * there is no padding support for formats on complex types (padding is ignored) * doing it would be relatively expensive for it's best doing it manually when needed (afaik: only here) */ counter_output_stream_data counters; output_stream cos; output_stream *os_ = mv->os; counter_output_stream_init(os_, &cos, &counters); output_stream *os = &cos; /* final output stream */ /* ------------------------------------------------------------ */ /* 1. get the needed parameters: FQDN, TYPE, CLASS, TTL, RDATA size */ u8 *rname = record_wire; u8 *rdata = rname + dnsname_len(rname); u16 rtype = GET_U16_AT(rdata[0]); u16 rclass = GET_U16_AT(rdata[2]); u32 rttl = ntohl(GET_U32_AT(rdata[4])); u16 rdata_size = ntohs(GET_U16_AT(rdata[8])); /** @todo 20150716 gve -- test that rdata_size matches the record size */ /* move pointer to RDATA information in the record_wire */ rdata += 10; /* 2. write the retrieved info into the stream: * FQDN TTL CLASS TYPE RDATA * * e.g. * somedomain.eu. 86400 IN NS ns1.somedomain.eu. */ /* A. write FQDN + alignment for next item */ u64 next = counters.write_count + 24; osformat(os, "%{dnsname}", rname); while(counters.write_count < next) { output_stream_write_u8(os, (u8)' '); } output_stream_write_u8(os, (u8)' '); /* B. write TTL + alignment for next item */ osformat(os, "%7d", rttl); output_stream_write_u8(os, (u8)' '); /* C. write CLASS + alignment for next item */ next = counters.write_count + 7; osformat(os, "%7{dnsclass}", &rclass); while(counters.write_count < next) { output_stream_write_u8(os, (u8) ' '); } output_stream_write_u8(os, (u8)' '); /* D. write TYPE + alignment for next item */ next = counters.write_count + 7; osformat(os, "%7{dnstype} ", &rtype); while(counters.write_count < next) { output_stream_write_u8(os, (u8)' '); } output_stream_write_u8(os, (u8)' '); /* E. write RDATA */ osprint_rdata(os, rtype, rdata, rdata_size); osprintln(os, ""); flushout(); }