diff options
author | deniel <deniel@f5534014-38df-0310-8fa8-9805f1628bb7> | 2003-05-15 13:40:20 +0000 |
---|---|---|
committer | deniel <deniel@f5534014-38df-0310-8fa8-9805f1628bb7> | 2003-05-15 13:40:20 +0000 |
commit | bf05d2e27d890469093d66352f2db760acb5022e (patch) | |
tree | 3b40245d5a750e49f176b57cb7ec3cd2accf07e9 /capture.c | |
parent | d2a5cfb6c987d777a048089434d78a1ac76f74e6 (diff) |
Implement a ring buffer switch duration:
when the new "Rotate capture file every n second(s)" checkbox or the
-b <# of file>[:<duration>] argument are used, [t]ethereal will skip to the
next ring buffer file if the specified duration has elapsed (even if the
specified capture size is not reached). This is useful when you want to have
separate capture files per hour or day for instance.
I let the autostop filesize parameter mandatory (i.e. the "rotate capture
file after n kilobytes") but this could be no longer strictly necessary when
that new feature is used ...
Another point: it might be interesting to really truncate the file at the
switch and not the closure ... According to user comments and my own real
case tests, I might plan to enhance this point and others (still ring buffer
related) in the future.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@7678 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'capture.c')
-rw-r--r-- | capture.c | 22 |
1 files changed, 21 insertions, 1 deletions
@@ -1,7 +1,7 @@ /* capture.c * Routines for packet capture windows * - * $Id: capture.c,v 1.206 2003/04/24 09:07:36 guy Exp $ + * $Id: capture.c,v 1.207 2003/05/15 13:33:53 deniel Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -1368,6 +1368,7 @@ capture(gboolean *stats_known, struct pcap_stat *stats) int err, inpkts; condition *cnd_stop_capturesize = NULL; condition *cnd_stop_timeout = NULL; + condition *cnd_ring_timeout = NULL; unsigned int i; static const char capstart_msg = SP_CAPSTART; char errmsg[4096+1]; @@ -1757,6 +1758,10 @@ capture(gboolean *stats_known, struct pcap_stat *stats) cnd_stop_timeout = cnd_new(CND_CLASS_TIMEOUT,(gint32)capture_opts.autostop_duration); + if (capture_opts.ringbuffer_on && capture_opts.has_ring_duration) + cnd_ring_timeout = + cnd_new(CND_CLASS_TIMEOUT, capture_opts.ringbuffer_duration); + while (ld.go) { while (gtk_events_pending()) gtk_main_iteration(); @@ -1861,6 +1866,9 @@ capture(gboolean *stats_known, struct pcap_stat *stats) if (ringbuf_switch_file(&cfile, &ld.pdh, &ld.err)) { /* File switch succeeded: reset the condition */ cnd_reset(cnd_stop_capturesize); + if (cnd_ring_timeout) { + cnd_reset(cnd_ring_timeout); + } } else { /* File switch failed: stop here */ ld.go = FALSE; @@ -1918,8 +1926,18 @@ capture(gboolean *stats_known, struct pcap_stat *stats) if (cnd_stop_timeout != NULL && cnd_eval(cnd_stop_timeout)) { /* The specified capture time has elapsed; stop the capture. */ ld.go = FALSE; + } else if (cnd_ring_timeout != NULL && cnd_eval(cnd_ring_timeout)) { + /* time elasped for this ring file, swith to the next */ + if (ringbuf_switch_file(&cfile, &ld.pdh, &ld.err)) { + /* File switch succeeded: reset the condition */ + cnd_reset(cnd_ring_timeout); + } else { + /* File switch failed: stop here */ + ld.go = FALSE; + } } } + } /* while (ld.go) */ /* delete stop conditions */ @@ -1927,6 +1945,8 @@ capture(gboolean *stats_known, struct pcap_stat *stats) cnd_delete(cnd_stop_capturesize); if (cnd_stop_timeout != NULL) cnd_delete(cnd_stop_timeout); + if (cnd_ring_timeout != NULL) + cnd_delete(cnd_ring_timeout); if (ld.pcap_err) { snprintf(errmsg, sizeof(errmsg), "Error while capturing packets: %s", |