static void net_loop(void) { unsigned i; struct cap cap; signed fds[IFACE_MAX]; signed fdmax = INT_MIN; struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; memset(&cap, 0, sizeof cap); for (i = 0; i < Iface_Cnt; i++) { fds[i] = pcap_get_selectable_fd(Pcap[i]); if (fds[i] > fdmax) fdmax = fds[i]; } while (!Shutdown) { fd_set rd; signed sel; FD_ZERO(&rd); if (Reload_Config) { /* reload config file if requested */ Reload_Config = 0; printf("Clearing existing rules...\n"); rules_clear(); printf("Reloading config file...\n"); parse_config(); } for (i = 0; i < Iface_Cnt; i++) FD_SET(fds[i], &rd); sel = select(fdmax + 1, &rd, NULL, NULL, NULL); if (-1 == sel) { perror("select"); continue; } else if (0 == sel) { continue; } for (i = 0; i < Iface_Cnt; i++) { if (!FD_ISSET(fds[i], &rd)) continue; if (1 != pcap_next_ex(Pcap[i], &cap.pkt[0].data.logic.header, (const unsigned char **)&cap.raw)) continue; cap.len = (unsigned)cap.pkt[0].data.logic.header->len; process_packet(i, &cap); } } }
void destroy_config(void) { rules_clear(&rules); }