Exemplo n.º 1
0
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);
    }
  }
}
Exemplo n.º 2
0
void destroy_config(void)
{
	rules_clear(&rules);
}