void bpf_dump(struct bpf_program *p, int option) { struct bpf_insn *insn; int i; int n = p->bf_len; insn = p->bf_insns; if (option > 2) { printf("%d\n", n); for (i = 0; i < n; ++insn, ++i) { printf("%u %u %u %u\n", insn->code, insn->jt, insn->jf, insn->k); } return ; } if (option > 1) { for (i = 0; i < n; ++insn, ++i) printf("{ 0x%x, %d, %d, 0x%08x },\n", insn->code, insn->jt, insn->jf, insn->k); return; } for (i = 0; i < n; ++insn, ++i) { #ifdef BDEBUG extern int bids[]; printf(bids[i] > 0 ? "[%02d]" : " -- ", bids[i] - 1); #endif puts(bpf_image(insn, i)); } }
void CompiledFilterOutput::compileFilter() { struct bpf_program fcode; foreach (QString interfaces, intList_) { for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) { interface_t device = g_array_index(global_capture_opts.all_ifaces, interface_t, i); if (interfaces.compare(device.display_name)) { continue; } else { pcap_t *pd = pcap_open_dead(device.active_dlt, WTAP_MAX_PACKET_SIZE); g_mutex_lock(pcap_compile_mtx); if (pcap_compile(pd, &fcode, compile_filter_.toUtf8().constData(), 1, 0) < 0) { compile_results.insert(interfaces, QString("%1").arg(g_strdup(pcap_geterr(pd)))); g_mutex_unlock(pcap_compile_mtx); ui->interfaceList->addItem(new QListWidgetItem(QIcon(":expert/expert_error.png"),interfaces)); } else { GString *bpf_code_dump = g_string_new(""); struct bpf_insn *insn = fcode.bf_insns; int ii, n = fcode.bf_len; gchar *bpf_code_str; for (ii = 0; ii < n; ++insn, ++ii) { g_string_append(bpf_code_dump, bpf_image(insn, ii)); g_string_append(bpf_code_dump, "\n"); } bpf_code_str = g_string_free(bpf_code_dump, FALSE); g_mutex_unlock(pcap_compile_mtx); compile_results.insert(interfaces, QString("%1").arg(g_strdup(bpf_code_str))); ui->interfaceList->addItem(new QListWidgetItem(interfaces)); } break; } } } }