/** Records given fragment. */ void record_frag(void* ctx, instrlist_t* frag, frag_id_t id) { bool flushed; struct trace_buffer_t* tb; tb = dr_get_tls_field(ctx); tb_tlv_complete(tb); for(flushed = false; ; tb_flush(tb), flushed = true) { struct frag_t* frag_data; void* current; tb_tlv(tb, TYPE_FRAG); frag_data = tb->current; current = record_frag_instrs(ctx, frag, &frag_data->chunks, tb_end(tb)); if(current) { frag_data->id = id; tb->current = current; tb_tlv_complete(tb); tb_tlv(tb, TYPE_TRACE); break; } else { if(flushed) { dr_fprintf(STDERR, "fatal: not enough buffer space after flush\n"); dr_exit_process(1); } tb_tlv_cancel(tb); } } }
void show_help(void) { if (rawmode) return; tb_start(); foreach_view(add_view_tb); tb_end(); message_set(tmp_buf); }
void show_view(void) { if (rawmode) return; tb_start(); tbprintf("%s %g", curr_view->name, naptime); tb_end(); message_set(tmp_buf); }
void print_fld_double(field_def *fld, double val) { int len; if (fld == NULL) return; len = fld->width; if (len < 1) return; tb_start(); if (tbprintf("%.2f", val) > len) print_fld_str(fld, "*"); else print_fld_tb(fld); tb_end(); }
void print_pf(void) { char *debug; time_t tm; int i; struct pf_status *s = &status; int cur = 0; int end = dispstart + maxprint; if (end > num_disp) end = num_disp; tm = time(NULL) - s->since; ADD_LINE_S("pf", "Status", s->running ? "Enabled" : "Disabled"); ADD_LINE_A("pf", "Since", tm); switch (s->debug) { case LOG_EMERG: debug = "emerg"; break; case LOG_ALERT: debug = "alert"; break; case LOG_CRIT: debug = "crit"; break; case LOG_ERR: debug = "err"; break; case LOG_WARNING: debug = "warning"; break; case LOG_NOTICE: debug = "notice"; break; case LOG_INFO: debug = "info"; break; case LOG_DEBUG: debug = "debug"; break; } ADD_LINE_S("pf", "Debug", debug); tb_start(); tbprintf("0x%08x\n", ntohl(s->hostid)); tb_end(); ADD_LINE_S("pf", "Hostid", tmp_buf); if (s->ifname[0] != 0) { ADD_EMPTY_LINE; ADD_LINE_VD(s->ifname, "Bytes In", s->bcounters[0][0], "IPv4"); ADD_LINE_VD(s->ifname, "Bytes In", s->bcounters[1][0], "IPv6"); ADD_LINE_VD(s->ifname, "Bytes Out", s->bcounters[0][1], "IPv4"); ADD_LINE_VD(s->ifname, "Bytes Out", s->bcounters[1][1], "IPv6"); ADD_LINE_VD(s->ifname, "Packets In", s->pcounters[0][0][PF_PASS], "IPv4, Passed"); ADD_LINE_VD(s->ifname, "Packets In", s->pcounters[1][0][PF_PASS], "IPv6, Passed"); ADD_LINE_VD(s->ifname, "Packets In", s->pcounters[0][0][PF_DROP], "IPv4, Blocked"); ADD_LINE_VD(s->ifname, "Packets In", s->pcounters[1][0][PF_DROP], "IPv6, Blocked"); ADD_LINE_VD(s->ifname, "Packets Out", s->pcounters[0][1][PF_PASS], "IPv4, Passed"); ADD_LINE_VD(s->ifname, "Packets Out", s->pcounters[1][1][PF_PASS], "IPv6, Passed"); ADD_LINE_VD(s->ifname, "Packets Out", s->pcounters[0][1][PF_DROP], "IPv4, Blocked"); ADD_LINE_VD(s->ifname, "Packets Out", s->pcounters[1][1][PF_DROP], "IPv6, Blocked"); } ADD_EMPTY_LINE; ADD_LINE_V("state", "Count", s->states); for (i = 0; i < FCNT_MAX; i++) { if (tm > 0) ADD_LINE_VR("state", pf_fcounters[i], s->fcounters[i], (double)s->fcounters[i] / (double)tm); else ADD_LINE_V("state", pf_fcounters[i], s->fcounters[i]); } ADD_EMPTY_LINE; ADD_LINE_V("src track", "Count", s->src_nodes); for (i = 0; i < SCNT_MAX; i++) { if (tm > 0) ADD_LINE_VR("src track", pf_scounters[i], s->scounters[i], (double)s->scounters[i] / (double)tm); else ADD_LINE_V("src track", pf_scounters[i], s->scounters[i]); } ADD_EMPTY_LINE; for (i = 0; i < PFRES_MAX; i++) { if (tm > 0) ADD_LINE_VR("counter", pf_reasons[i], s->counters[i], (double)s->counters[i] / (double)tm); else ADD_LINE_V("counter", pf_reasons[i], s->counters[i]); } ADD_EMPTY_LINE; for (i = 0; i < LCNT_MAX; i++) { if (tm > 0) ADD_LINE_VR("limit counter", pf_lcounters[i], s->lcounters[i], (double)s->lcounters[i] / (double)tm); else ADD_LINE_V("limit counter", pf_lcounters[i], s->lcounters[i]); } }
size_t tb_available(struct trace_buffer_t* tb) { return tb_end(tb) - tb->current; }