This is a very good point. The file_stop_time element was introduced
when the change was made to interleaving packets instead of concatenating;
nobody thought to set stop_time based on this new information.
It looks like dump_times() could take advantage of the states array
too, since it seems to do the exact same work as open_files().
Anyway, can you try the attached patch? I'm particularly interested
in whether or not there's a fencepost error (e.g. last packet doesn't
get copied because it is at the stop_time).
Thanks,
Bill
Index: tcpslice.c
===================================================================
RCS file: /tcpdump/master/tcpslice/tcpslice.c,v
retrieving revision 1.27
diff -u -r1.27 tcpslice.c
--- tcpslice.c 30 Oct 2001 17:59:47 -0000 1.27
+++ tcpslice.c 27 Feb 2003 02:41:38 -0000
@@ -123,6 +123,7 @@
struct timeval *first_time, struct timeval *last_time );
struct timeval first_packet_time(char filename[], pcap_t **p_addr);
struct timeval lowest_start_time(struct state *states, int numfiles);
+struct timeval latest_end_time(struct state *states, int numfiles);
void get_next_packet(struct state *s);
struct state *open_files(char *filenames[], int numfiles);
void extract_slice(struct state *states, int numfiles, char *write_file_name,
@@ -241,12 +242,7 @@
stop_time = parse_time(stop_time_string, start_time);
else
- {
- stop_time = start_time;
- stop_time.tv_sec += 86400*3660; /* + 10 years; "forever" */
- stop_time.tv_usec = 0;
- }
-
+ stop_time = latest_end_time(states, numfiles);
if (report_times) {
for (; optind < argc; ++optind)
@@ -516,6 +512,21 @@
++states;
}
return min_time;
+}
+
+/* Of all the files, what is the latest end time. */
+struct timeval
+latest_end_time(struct state *states, int numfiles)
+{
+ struct timeval max_time = states->file_start_time;
+
+ while (numfiles--) {
+ if (sf_timestamp_less_than(&max_time, &states->file_start_time)) {
+ max_time = states->file_start_time;
+ }
+ ++states;
+ }
+ return max_time;
}
/* Get the next record in a file. Deal with end of file.