I discovered that with TCPtrace, only the first fragment includes the
packet header line - subsequent fragments do not.  So, I modified the
code to assume that a packet will start almost immediately after the
previous packet.  I modified the code so it is more strict in
identifying the start of data in a packet.

-Marc Milgram



Index: vms.c
===================================================================
RCS file: /cvsroot/ethereal/wiretap/vms.c,v
retrieving revision 1.11
diff -u -r1.11 vms.c
--- vms.c       2002/03/07 21:08:33     1.11
+++ vms.c       2002/03/25 20:27:28
@@ -20,6 +20,13 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  */
 
+/* Notes:
+ *   TCPIPtrace TCP fragments don't have the header line.  So, we are never
+ *   to look for that line for the first line of a packet except the first
+ *   packet.  This allows us to read fragmented packets.  Define
+ *   TCPIPTRACE_FRAGMENTS_HAVE_HEADER_LINE to expect the first line to be
+ *   at the start of every packet.
+ */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -81,6 +88,7 @@
 static int parse_vms_rec_hdr(wtap *wth, FILE_T fh, int *err);
 
 
+#ifdef TCPIPTRACE_FRAGMENTS_HAVE_HEADER_LINE
 /* Seeks to the beginning of the next packet, and returns the
    byte offset.  Returns -1 on failure, and sets "*err" to the error. */
 static long vms_seek_next_packet(wtap *wth, int *err)
@@ -118,6 +126,7 @@
   }
   return -1;
 }
+#endif /* TCPIPTRACE_FRAGMENTS_HAVE_HEADER_LINE */
 
 #define VMS_HEADER_LINES_TO_CHECK    200
 #define VMS_LINE_LENGTH        240
@@ -215,7 +224,11 @@
     int    pkt_len;
 
     /* Find the next packet */
+#ifdef TCPIPTRACE_FRAGMENTS_HAVE_HEADER_LINE
     offset = vms_seek_next_packet(wth, err);
+#else
+    offset = file_tell(wth->fh);
+#endif
     if (offset < 1)
         return FALSE;
 
@@ -261,31 +274,36 @@
     return parse_vms_hex_dump(wth->random_fh, pkt_len, pd, err);
 }
 
-/* isdumpline assumes that dump lines start with some spaces followed by a
- * hex number.
+/* isdumpline assumes that dump lines start with some non-alphanumerics
+ * followed by 4 hex numbers - each 8 digits long, each hex number followed
+ * by 3 spaces.
  */
 static int
 isdumpline( guchar *line )
 {
-    int i = 0;
-
-    while (i<VMS_LINE_LENGTH && line[i] && !isalnum(line[i]))
-        i++;
+    int i, j;
 
-    if (! isxdigit(line[i]))
-        return 0;
+    while (*line && !isalnum(*line))
+       line++;
 
-    while (i<VMS_LINE_LENGTH && isxdigit(line[i]))
-        i++;
+    for (j=0; j<4; j++) {
+       for (i=0; i<8; i++, line++)
+           if (! isxdigit(*line))
+               return FALSE;
+
+       for (i=0; i<3; i++, line++)
+           if (*line != ' ')
+               return FALSE;
+    }
 
-    return isspace(line[i]);
+    return isspace(*line);
 }
 
 /* Parses a packet record header. */
 static int
 parse_vms_rec_hdr(wtap *wth, FILE_T fh, int *err)
 {
-    char    line[VMS_LINE_LENGTH];
+    char   line[VMS_LINE_LENGTH + 1];
     int    num_items_scanned;
     int           pkt_len = 0;
     int           pktnum;
@@ -310,6 +328,8 @@
             }
             return -1;
         }
+       line[VMS_LINE_LENGTH] = '\0';
+
        if ((csec == 101) && (p = strstr(line, "packet "))
            && (! strstr(line, "could not save "))) {
            /* Find text in line starting with "packet ". */
@@ -360,7 +380,7 @@
 static gboolean
 parse_vms_hex_dump(FILE_T fh, int pkt_len, guint8* buf, int *err)
 {
-    guchar line[VMS_LINE_LENGTH];
+    guchar line[VMS_LINE_LENGTH + 1];
     int    i;
     int    offset = 0;
 
@@ -372,8 +392,9 @@
             }
             return FALSE;
         }
+       line[VMS_LINE_LENGTH] = '\0';
         if (i == 0) {
-           while (! isdumpline(line)) /* advance to start of hex data */
+           while (! isdumpline(line)) { /* advance to start of hex data */
                if (file_gets(line, VMS_LINE_LENGTH, fh) == NULL) {
                    *err = file_error(fh);
                    if (*err == 0) {
@@ -381,6 +402,8 @@
                    }
                    return FALSE;
                }
+               line[VMS_LINE_LENGTH] = '\0';
+           }
             while (line[offset] && !isxdigit(line[offset]))
                 offset++;
        }

Reply via email to