tcpdump mailing list archives
Patch: Fix atexit() handler for pcap-dag
From: Jesper Peterson <jesper () endace com>
Date: Thu, 02 Oct 2003 17:05:50 +1200
This patch fixes the pcap-dag atexit() handler for non-execing child processes. Previously a fork()/exit() would stop the packet capture (doh!).
Also contains a couple of minor optimisations. -- Jesper Peterson, Senior Software Developer http://www.endace.com, +64 7 839 0540
Index: pcap-dag.c
===================================================================
RCS file: /tcpdump/master/libpcap/pcap-dag.c,v
retrieving revision 1.8
diff -u -r1.8 pcap-dag.c
--- pcap-dag.c 18 Aug 2003 22:00:16 -0000 1.8
+++ pcap-dag.c 2 Oct 2003 05:00:07 -0000
@@ -69,6 +69,7 @@
typedef struct pcap_dag_node {
struct pcap_dag_node *next;
pcap_t *p;
+ pid_t pid;
} pcap_dag_node_t;
static pcap_dag_node_t *pcap_dags = NULL;
@@ -149,13 +150,15 @@
}
#endif
delete_pcap_dag(p);
- /* XXX - does "dag_close()" do this? If so, we don't need to. */
- close(p->fd);
}
static void atexit_handler(void) {
while (pcap_dags != NULL) {
- dag_platform_close(pcap_dags->p);
+ if (pcap_dags->pid == getpid()) {
+ dag_platform_close(pcap_dags->p);
+ } else {
+ delete_pcap_dag(pcap_dags->p);
+ }
}
}
@@ -173,6 +176,7 @@
node->next = pcap_dags;
node->p = p;
+ node->pid = getpid();
pcap_dags = node;
@@ -187,19 +191,19 @@
register dag_record_t *record;
int rlen;
- if (p->md.dag_mem_top - p->md.dag_mem_bottom < dag_record_size) {
+ /*
+ * The buffer is guaranteed to only contain complete records so any
+ * time top and bottom differ there will be at least one record available.
+ * Here we test the difference is at least the size of a record header
+ * using the poorly named constant 'dag_record_size'.
+ */
+ while ((p->md.dag_mem_top - p->md.dag_mem_bottom) < dag_record_size) {
p->md.dag_mem_top = dag_offset(p->fd, &(p->md.dag_mem_bottom), 0);
}
record = (dag_record_t *)(p->md.dag_mem_base + p->md.dag_mem_bottom);
- rlen = ntohs(record->rlen);
- while (p->md.dag_mem_top - p->md.dag_mem_bottom < rlen) {
- p->md.dag_mem_top = dag_offset(p->fd, &(p->md.dag_mem_bottom), 0);
- record = (dag_record_t *)(p->md.dag_mem_base + p->md.dag_mem_bottom);
- rlen = ntohs(record->rlen);
- }
- p->md.dag_mem_bottom += rlen;
+ p->md.dag_mem_bottom += ntohs(record->rlen);
return record;
}
Current thread:
- Patch: Fix atexit() handler for pcap-dag Jesper Peterson (Oct 01)
- Re: Patch: Fix atexit() handler for pcap-dag Guy Harris (Oct 02)
