void read_cb(int fd, short events, void *arg) #endif { struct pcap_pkthdr header; const uint8_t *packet; struct iface_config *ifc; ifc = (struct iface_config *) arg; packet = pcap_next(ifc->pcap_handle, &header); if(packet) pcap_callback(arg, &header, packet); }
int launch_config(struct event_base* base) { bpf_u_int32 netaddr = 0, mask = 0; struct bpf_program filter; char errbuf[PCAP_ERRBUF_SIZE]; memset(errbuf, 0, PCAP_ERRBUF_SIZE); struct config* config_node = config; while (config_node) { struct module* mod = config_node->modules; while (mod) { pre_capture_function* precapture_func = dlsym(mod->mod_handle, "preCapture"); if ((precapture_func && precapture_func(base, config_node->interface, mod->context)) || precapture_func == NULL) { if (offline_file) { if ((mod->pcap_handle = pcap_open_offline(offline_file, errbuf)) == NULL) { fprintf(stderr, "ERROR: %s\n", errbuf); exit(1); } } else { if ((mod->pcap_handle = pcap_open_live(config_node->interface, BUFSIZ, 0, 512, errbuf)) == NULL) { fprintf(stderr, "ERROR: %s\n", errbuf); exit(1); } else if (pcap_lookupnet(config_node->interface, &netaddr, &mask, errbuf) == -1) { fprintf(stderr, "ERROR: %s\n", errbuf); exit(1); } } } pcaprule_function* rule_func = dlsym(mod->mod_handle, "getPcapRule"); if (rule_func == NULL) { fprintf(stderr, "ERROR: %s\n", dlerror()); exit(1); } else if (pcap_compile(mod->pcap_handle, &filter, rule_func(mod->context), 1, mask) == -1) { fprintf(stderr, "ERROR: %s\n", pcap_geterr(mod->pcap_handle)); exit(1); } else if (pcap_setfilter(mod->pcap_handle, &filter) == -1) { fprintf(stderr, "ERROR: %s\n", pcap_geterr(mod->pcap_handle)); exit(1); } else { if (offline_file) { pcap_callback(0, 0, mod); } else { struct event* ev = event_new(base, pcap_fileno(mod->pcap_handle), EV_READ|EV_PERSIST, pcap_callback, mod); event_add(ev, NULL); } } mod = mod->next; } config_node = config_node->next; } return 1; };