The time in Observer files is in nanoseconds since midnight, January 1,
authorGuy Harris <guy@alum.mit.edu>
Sat, 1 Nov 2003 03:38:10 +0000 (03:38 -0000)
committerGuy Harris <guy@alum.mit.edu>
Sat, 1 Nov 2003 03:38:10 +0000 (03:38 -0000)
2000, 00:00:00 *local* time.  The amount to add to that is just the UNIX
time stamp value for that point in time; get it with "mktime()".

svn path=/trunk/; revision=8854

wiretap/network_instruments.c
wiretap/network_instruments.h

index eb64cd9cf0b6dd565a9a2b55ecfc4a03845f58ef..61712887b18d867a2d8f9517c3383c925b1e41fc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: network_instruments.c,v 1.2 2003/10/31 08:06:24 guy Exp $
+ * $Id: network_instruments.c,v 1.3 2003/11/01 03:38:09 guy Exp $
  */
 
 /***************************************************************************
@@ -36,12 +36,27 @@ static const int true_magic_length = 17;
 
 static const guint32 observer_packet_magic = 0x88888888;
 
-       static const int observer_encap[] = {
-               WTAP_ENCAP_ETHERNET,
-               WTAP_ENCAP_TOKEN_RING
-       };
+static const int observer_encap[] = {
+       WTAP_ENCAP_ETHERNET,
+       WTAP_ENCAP_TOKEN_RING
+};
 #define NUM_OBSERVER_ENCAPS (sizeof observer_encap / sizeof observer_encap[0])
 
+/*
+ * The time in Observer files is in nanoseconds since midnight, January 1,
+ * 2000, 00:00:00 local time.
+ *
+ * We want the seconds portion to be seconds since midnight, January 1,
+ * 1970, 00:00:00 GMT.
+ *
+ * To do that, we add the number of seconds between midnight, January 1,
+ * 2000, 00:00:00 local time and midnight, January 1, 1970, 00:00:00 GMT.
+ * (That gets the wrong answer if the time zone is being read in a different
+ * time zone, but there's not much we can do about that.)
+ */
+static gboolean have_time_offset;
+static time_t seconds1970to2000;
+
 static gboolean fill_time_struct(guint64 ns_since2000, observer_time* time_conversion);
 static gboolean observer_read(wtap *wth, int *err, long *data_offset);
 static gboolean observer_seek_read(wtap *wth, long seek_off,
@@ -55,6 +70,31 @@ int network_instruments_open(wtap *wth, int *err)
        capture_file_header file_header;
        packet_entry_header packet_header;
 
+       /*
+        * We need the offset between midnight, January 1, 2000 UTC
+        * and midnight, January 1, 2000 local time, as the time stamps
+        * are in the form of nanoseconds since midnight, January 1,
+        * 2000 local time.
+        */
+       if (!have_time_offset) {
+               struct tm midnight_2000_01_01;
+
+               /*
+                * Get the number of seconds between midnight, January 1,
+                * 2000, 00:00:00 local time - that's just the UNIX
+                * time stamp for 2000-01-01 00:00:00 local time.
+                */
+               midnight_2000_01_01.tm_year = 2000 - 1900;
+               midnight_2000_01_01.tm_mon = 0;
+               midnight_2000_01_01.tm_mday = 1;
+               midnight_2000_01_01.tm_hour = 0;
+               midnight_2000_01_01.tm_min = 0;
+               midnight_2000_01_01.tm_sec = 0;
+               midnight_2000_01_01.tm_isdst = -1;
+               seconds1970to2000 = mktime(&midnight_2000_01_01);
+               have_time_offset = TRUE;
+       }
+
        errno = WTAP_ERR_CANT_READ;
 
        /* Read in the buffer file header */
@@ -172,11 +212,7 @@ static gboolean observer_read(wtap *wth, int *err, long *data_offset)
            GUINT64_FROM_LE(packet_header.nano_seconds_since_2000);
        fill_time_struct(packet_header.nano_seconds_since_2000, &packet_time);
        useconds = (long)(packet_time.useconds_from_1970 - ((guint64)packet_time.seconds_from_1970)*1000000);
-#if 0
-       seconds = (long)packet_time.seconds_from_1970 - packet_time.time_stamp.tm_gmtoff;
-#else
        seconds = (long)packet_time.seconds_from_1970;
-#endif
 
        /* set-up the packet header */
        packet_header.network_size =
@@ -275,7 +311,6 @@ static gboolean observer_seek_read(wtap *wth, long seek_off,
        return TRUE;
 }
 
-static guint32 seconds1970to2000 = (((30*365)+7)*24*60*60); /* 7 leap years */
 gboolean fill_time_struct(guint64 ns_since2000, observer_time* time_conversion)
 {
        time_conversion->ns_since2000 = ns_since2000;
@@ -285,10 +320,6 @@ gboolean fill_time_struct(guint64 ns_since2000, observer_time* time_conversion)
        time_conversion->seconds_from_1970 = seconds1970to2000 + time_conversion->sec_since2000;
        time_conversion->useconds_from_1970 = ((guint64)seconds1970to2000*1000000)+time_conversion->us_since2000;
 
-#if 0
-       time_conversion->time_stamp = *localtime(&time_conversion->seconds_from_1970);
-#endif
-
        return TRUE;
 }
 
index 3c3e7f731ed337ca155ba250d6d4bdc55d579f59..3432ea568d053ca0f2ef315b52db2d2fbd572e6d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: network_instruments.h,v 1.2 2003/10/31 08:06:25 guy Exp $
+ * $Id: network_instruments.h,v 1.3 2003/11/01 03:38:10 guy Exp $
  */
 
 /***************************************************************************
@@ -72,9 +72,6 @@ typedef struct tlv_user_commnent
 typedef struct observer_time
 {
        guint64 ns_since2000;           /* given in packet_entry_header */
-#if 0
-       struct tm time_stamp;
-#endif
 
        guint64 us_since2000;           /* Micro-Seconds since 1-1-2000 */
        guint64 sec_since2000;          /* Seconds since 1-1-2000 */