summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2007-09-20 16:12:17 +0000
committerBill Meier <wmeier@newsguy.com>2007-09-20 16:12:17 +0000
commitc387e3fbc993a6474f9a462826be98a0111c05c2 (patch)
tree34ff2b5f1dc837e3eb6df7d3b21bb6c35613bbc5
parent79986b222d4f5d1386a10e1aa2814091d3ae996b (diff)
downloadwireshark-c387e3fbc993a6474f9a462826be98a0111c05c2.tar.gz
When -t option: Use current date or time fields for unspecified fields; Fixes bug #1836.
svn path=/trunk/; revision=22916
-rw-r--r--doc/text2pcap.pod3
-rw-r--r--text2pcap.c49
2 files changed, 32 insertions, 20 deletions
diff --git a/doc/text2pcap.pod b/doc/text2pcap.pod
index 92983d4662..5f7521ecc6 100644
--- a/doc/text2pcap.pod
+++ b/doc/text2pcap.pod
@@ -191,6 +191,9 @@ B<NOTE:> The subsecond component delimiter must be specified (.) but no
pattern is required; the remaining number is assumed to be fractions of
a second.
+B<NOTE:> Date/time fields from the current date/time are
+used as the default for unspecified fields.
+
=back
=head1 SEE ALSO
diff --git a/text2pcap.c b/text2pcap.c
index 4d710abdd5..2499de846b 100644
--- a/text2pcap.c
+++ b/text2pcap.c
@@ -177,6 +177,7 @@ static unsigned long num_packets_written = 0;
static gint32 ts_sec = 0;
static guint32 ts_usec = 0;
static char *ts_fmt = NULL;
+static struct tm timecode_default;
/* Input file */
static const char *input_filename;
@@ -732,20 +733,11 @@ parse_preamble (void)
return;
/*
- * Initialize to the Epoch, just in case not all fields
- * of the date and time are specified
- * (or date & time is not parsed or fails to parse below).
+ * Initialize to today localtime, just in case not all fields
+ * of the date and time are specified.
*/
- timecode.tm_sec = 0;
- timecode.tm_min = 0;
- timecode.tm_hour = 0;
- timecode.tm_mday = 1;
- timecode.tm_mon = 0;
- timecode.tm_year = 70;
- timecode.tm_wday = 0;
- timecode.tm_yday = 0;
- timecode.tm_isdst = -1;
- ts_sec = (gint32)mktime( &timecode );
+
+ timecode = timecode_default;
ts_usec = 0;
/*
@@ -761,9 +753,29 @@ parse_preamble (void)
subsecs = strptime( packet_preamble, ts_fmt, &timecode );
if (subsecs != NULL) {
/* Get the long time from the tm structure */
+ /* (will return -1 if failure) */
ts_sec = (gint32)mktime( &timecode );
+ } else
+ ts_sec = -1; /* we failed to parse it */
- /* Get subsecs only if strptime succeeded above */
+ /* This will ensure incorrectly parsed dates get set to zero */
+ if ( -1 == ts_sec )
+ {
+ /* Sanitize - remove all '\r' */
+ char *c;
+ while ((c = strchr(packet_preamble, '\r')) != NULL) *c=' ';
+ fprintf (stderr, "Failure processing time \"%s\" using time format \"%s\"\n (defaulting to Jan 1,1970 00:00:00 GMT)\n",
+ packet_preamble, ts_fmt);
+ if (debug >= 2) {
+ fprintf(stderr, "timecode: %02d/%02d/%d %02d:%02d:%02d %d\n",
+ timecode.tm_mday, timecode.tm_mon, timecode.tm_year,
+ timecode.tm_hour, timecode.tm_min, timecode.tm_sec, timecode.tm_isdst);
+ }
+ ts_sec = 0; /* Jan 1,1970: 00:00 GMT; tshark/wireshark will display date/time as adjusted by timezone */
+ ts_usec = 0;
+ }
+ else
+ {
/* Parse subseconds */
ts_usec = strtol(subsecs, &p, 10);
if (subsecs == p) {
@@ -792,12 +804,6 @@ parse_preamble (void)
ts_usec *= 10;
}
}
- } else { /* subsecs == NULL: strptime failed to parse */
- /* Sanitize - remove all '\r' */
- char *c;
- while ((c = strchr(packet_preamble, '\r')) != NULL) *c=' ';
- fprintf (stderr, "Failure parsing time \"%s\" using time format \"%s\"\n (defaulting to Jan 1,1970 00:00:00)\n",
- packet_preamble, ts_fmt);
}
}
if (debug >= 2) {
@@ -1023,6 +1029,8 @@ usage (void)
" NOTE: The subsecond component delimiter must be given\n"
" (.) but no pattern is required; the remaining number\n"
" is assumed to be fractions of a second.\n"
+ " NOTE: Date/time fields from the current date/time are\n"
+ " used as the default for unspecified fields.\n"
"\n"
"Output:\n"
" -l <typenum> link-layer type number. Default is 1 (Ethernet). \n"
@@ -1289,6 +1297,7 @@ parse_options (int argc, char *argv[])
}
ts_sec = (gint32) time(0); /* initialize to current time */
+ timecode_default = *localtime((time_t *)&ts_sec);
/* Display summary of our state */
if (!quiet) {