]> The Tcpdump Group git mirrors - tcpdump/commitdiff
NDOize timed decoder
authorDenis Ovsienko <[email protected]>
Thu, 3 Apr 2014 11:37:46 +0000 (15:37 +0400)
committerDenis Ovsienko <[email protected]>
Thu, 3 Apr 2014 11:37:46 +0000 (15:37 +0400)
interface.h
netdissect.h
print-timed.c
print-udp.c

index 3d0c2597c6ef7cb99081581e1f6d62df830ab5fb..3d165ccfbb5c2f7fb9ea28fa4dccfa49bf7b96df 100644 (file)
@@ -159,7 +159,6 @@ extern u_int16_t create_osi_cksum(const u_int8_t *, int, int);
 extern void ascii_print(const u_char *, u_int);
 extern void default_print(const u_char *, u_int);
 extern char *q922_string(const u_char *);
-extern void timed_print(const u_char *);
 extern char *smb_errstr(int, int);
 extern const char *nt_errstr(u_int32_t);
 
index c385facd4d8faea250ce85264c4972cd63b0b0c1..989b70f01eca294b4a1f0cc90199ff59948021a3 100644 (file)
@@ -522,13 +522,13 @@ extern u_int ppp_hdlc_if_print(netdissect_options *, const struct pcap_pkthdr *,
 extern u_int ppp_bsdos_if_print(netdissect_options *, const struct pcap_pkthdr *, const u_char *);
 extern void lldp_print(netdissect_options *, const u_char *, u_int);
 extern void rsvp_print(netdissect_options *, const u_char *, u_int);
+extern void timed_print(netdissect_options *, const u_char *);
 
 /* stuff that has not yet been rototiled */
 
 #if 0
 extern void ascii_print(netdissect_options *,u_int);
 extern void default_print(netdissect_options *,const u_char *, u_int);
-extern void timed_print(netdissect_options *,const u_char *, u_int);
 extern char *smb_errstr(netdissect_options *,int, int);
 extern const char *nt_errstr(netdissect_options *, u_int32_t);
 #endif
index cbeaf00dff6e7b4e2bb3e6e6df9fc571f310df74..efbdd1969382a9b2667c8b4d155795e0907e2094 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <tcpdump-stdinc.h>
 
-#include <stdio.h>
-#include <string.h>
-
 #include "interface.h"
 #include "extract.h"
 
@@ -94,68 +92,56 @@ static const char *tsptype[TSPTYPENUMBER] =
   "TEST", "SETDATE", "SETDATEREQ", "LOOP" };
 
 void
-timed_print(register const u_char *bp)
+timed_print(netdissect_options *ndo,
+            register const u_char *bp)
 {
-#define endof(x) ((u_char *)&(x) + sizeof (x))
        struct tsp *tsp = (struct tsp *)bp;
        long sec, usec;
-       const u_char *end;
 
-       if (endof(tsp->tsp_type) > snapend) {
-               printf("%s", tstr);
-               return;
-       }
+       ND_TCHECK(tsp->tsp_type);
        if (tsp->tsp_type < TSPTYPENUMBER)
-               printf("TSP_%s", tsptype[tsp->tsp_type]);
+               ND_PRINT((ndo, "TSP_%s", tsptype[tsp->tsp_type]));
        else
-               printf("(tsp_type %#x)", tsp->tsp_type);
-
-       if (endof(tsp->tsp_vers) > snapend) {
-               printf(" %s", tstr);
-               return;
-       }
-       printf(" vers %d", tsp->tsp_vers);
-
-       if (endof(tsp->tsp_seq) > snapend) {
-               printf(" %s", tstr);
-               return;
-       }
-       printf(" seq %d", tsp->tsp_seq);
-
-       if (tsp->tsp_type == TSP_LOOP) {
-               if (endof(tsp->tsp_hopcnt) > snapend) {
-                       printf(" %s", tstr);
-                       return;
-               }
-               printf(" hopcnt %d", tsp->tsp_hopcnt);
-       } else if (tsp->tsp_type == TSP_SETTIME ||
-         tsp->tsp_type == TSP_ADJTIME ||
-         tsp->tsp_type == TSP_SETDATE ||
-         tsp->tsp_type == TSP_SETDATEREQ) {
-               if (endof(tsp->tsp_time) > snapend) {
-                       printf(" %s", tstr);
-                       return;
-               }
+               ND_PRINT((ndo, "(tsp_type %#x)", tsp->tsp_type));
+
+       ND_TCHECK(tsp->tsp_vers);
+       ND_PRINT((ndo, " vers %u", tsp->tsp_vers));
+
+       ND_TCHECK(tsp->tsp_seq);
+       ND_PRINT((ndo, " seq %u", tsp->tsp_seq));
+
+       switch (tsp->tsp_type) {
+       case TSP_LOOP:
+               ND_TCHECK(tsp->tsp_hopcnt);
+               ND_PRINT((ndo, " hopcnt %u", tsp->tsp_hopcnt));
+               break;
+       case TSP_SETTIME:
+       case TSP_ADJTIME:
+       case TSP_SETDATE:
+       case TSP_SETDATEREQ:
+               ND_TCHECK(tsp->tsp_time);
                sec = EXTRACT_32BITS(&tsp->tsp_time.tv_sec);
                usec = EXTRACT_32BITS(&tsp->tsp_time.tv_usec);
+               /* XXX The comparison below is always false? */
                if (usec < 0)
                        /* corrupt, skip the rest of the packet */
                        return;
-               fputs(" time ", stdout);
+               ND_PRINT((ndo, " time "));
                if (sec < 0 && usec != 0) {
                        sec++;
                        if (sec == 0)
-                               fputc('-', stdout);
+                               ND_PRINT((ndo, "-"));
                        usec = 1000000 - usec;
                }
-               printf("%ld.%06ld", sec, usec);
-       }
-
-       end = memchr(tsp->tsp_name, '\0', snapend - (u_char *)tsp->tsp_name);
-       if (end == NULL)
-               printf(" %s", tstr);
-       else {
-               fputs(" name ", stdout);
-               fwrite(tsp->tsp_name, end - (u_char *)tsp->tsp_name, 1, stdout);
+               ND_PRINT((ndo, "%ld.%06ld", sec, usec));
+               break;
        }
+       ND_TCHECK(tsp->tsp_name);
+       ND_PRINT((ndo, " name "));
+       if (fn_print((u_char *)tsp->tsp_name, (u_char *)tsp->tsp_name + sizeof(tsp->tsp_name)))
+               goto trunc;
+       return;
+
+trunc:
+       ND_PRINT((ndo, " %s", tstr));
 }
index d059603967a9193b05eb5d14157b6305d05cfe19..8ae99923b191664c36e29eb716a756dd4217d627 100644 (file)
@@ -568,7 +568,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length,
                else if (ISPORT(MULTICASTDNS_PORT))
                        ns_print(ndo, (const u_char *)(up + 1), length, 1);
                else if (ISPORT(TIMED_PORT))
-                       timed_print((const u_char *)(up + 1));
+                       timed_print(ndo, (const u_char *)(up + 1));
                else if (ISPORT(TFTP_PORT))
                        tftp_print(ndo, (const u_char *)(up + 1), length);
                else if (ISPORT(IPPORT_BOOTPC) || ISPORT(IPPORT_BOOTPS))