- /* Set up pipe end */
- poll_fds[0].fd = pipe_fd;
- poll_fds[0].events = POLLOUT;
-
- /* Set up pcap device */
- poll_fds[1].fd = pcap_fileno (pcap_obj);
- poll_fds[1].events = POLLIN | POLLPRI;
-
- while (pipe_fd > 0)
- {
- DBG ("poll (...)");
- status = poll (poll_fds, 2, -1 /* wait forever for a change */);
-
- if (status < 0)
- {
- syslog (LOG_ERR, "named plugin: poll(2) failed: %s",
- strerror (errno));
- break;
- }
-
- if (poll_fds[0].revents & (POLLERR | POLLHUP | POLLNVAL))
- {
- DBG ("Pipe closed. Exiting.");
- syslog (LOG_NOTICE, "named plugin: Pipe closed. Exiting.");
- break;
- }
- else if (poll_fds[0].revents & POLLOUT)
- {
- DBG ("Sending data..");
- counter_list_send (qtype_list, pipe_fd);
- counter_list_send (opcode_list, pipe_fd);
- counter_list_send (rcode_list, pipe_fd);
- }
-
- if (poll_fds[1].revents & (POLLERR | POLLHUP | POLLNVAL))
- {
- DBG ("pcap-device closed. Exiting.");
- syslog (LOG_ERR, "named plugin: pcap-device closed. Exiting.");
- break;
- }
- else if (poll_fds[1].revents & (POLLIN | POLLPRI))
- {
- status = pcap_dispatch (pcap_obj,
- 10 /* Only handle 10 packets at a time */,
- handle_pcap /* callback */,
- NULL /* Whatever this means.. */);
- if (status < 0)
- {
- DBG ("pcap_dispatch failed: %s", pcap_geterr (pcap_obj));
- syslog (LOG_ERR, "named plugin: pcap_dispatch failed: %s",
- pcap_geterr (pcap_obj));
- break;
- }
- }
- } /* while (42) */
+ status = pcap_loop (pcap_obj,
+ -1 /* loop forever */,
+ handle_pcap /* callback */,
+ NULL /* Whatever this means.. */);
+ if (status < 0)
+ syslog (LOG_ERR, "dns plugin: Listener thread is exiting "
+ "abnormally: %s", pcap_geterr (pcap_obj));