]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ascii.c
DHCP: Fix a comment about formats for (un)signed longs/shorts data
[tcpdump] / print-ascii.c
index 237cf636caa21bc9f33b9c81948f860bbef19a38..f379c6c43678784a8c1416e875caec247dbad021 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: print-ascii.c,v 1.1 1999/09/30 14:49:12 sjg Exp $      */
+/*     $NetBSD: print-ascii.c,v 1.1 1999/09/30 14:49:12 sjg Exp $      */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -38,9 +38,7 @@
 
 /* \summary: ASCII packet dump printer */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
 
 #include "netdissect-stdinc.h"
 
 #define HEXDUMP_HEXSTUFF_PER_LINE \
                (HEXDUMP_HEXSTUFF_PER_SHORT * HEXDUMP_SHORTS_PER_LINE)
 
-static void hex_and_ascii_print_with_offset(netdissect_options *, const char *, const u_char *, u_int, u_int);
-
 void
 ascii_print(netdissect_options *ndo,
             const u_char *cp, u_int length)
 {
        u_int caplength;
        u_char s;
+       int truncated = FALSE;
 
        ndo->ndo_protocol = "ascii";
-       caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0;
-       if (length > caplength)
+       caplength = ND_BYTES_AVAILABLE_AFTER(cp);
+       if (length > caplength) {
                length = caplength;
+               truncated = TRUE;
+       }
        ND_PRINT("\n");
        while (length > 0) {
                s = GET_U_1(cp);
@@ -96,6 +95,8 @@ ascii_print(netdissect_options *ndo,
                                ND_PRINT("%c", s);
                }
        }
+       if (truncated)
+               nd_trunc_longjmp(ndo);
 }
 
 static void
@@ -106,12 +107,15 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident,
        u_int i;
        u_int s1, s2;
        u_int nshorts;
+       int truncated = FALSE;
        char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp;
        char asciistuff[ASCII_LINELENGTH+1], *asp;
 
-       caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0;
-       if (length > caplength)
+       caplength = ND_BYTES_AVAILABLE_AFTER(cp);
+       if (length > caplength) {
                length = caplength;
+               truncated = TRUE;
+       }
        nshorts = length / sizeof(u_short);
        i = 0;
        hsp = hexstuff; asp = asciistuff;
@@ -151,6 +155,8 @@ hex_and_ascii_print_with_offset(netdissect_options *ndo, const char *ident,
                     ident, oset, HEXDUMP_HEXSTUFF_PER_LINE,
                     hexstuff, asciistuff);
        }
+       if (truncated)
+               nd_trunc_longjmp(ndo);
 }
 
 void
@@ -171,10 +177,13 @@ hex_print_with_offset(netdissect_options *ndo,
        u_int caplength;
        u_int i, s;
        u_int nshorts;
+       int truncated = FALSE;
 
-       caplength = (ndo->ndo_snapend > cp) ? ND_BYTES_AVAILABLE_AFTER(cp) : 0;
-       if (length > caplength)
+       caplength = ND_BYTES_AVAILABLE_AFTER(cp);
+       if (length > caplength) {
                length = caplength;
+               truncated = TRUE;
+       }
        nshorts = length / sizeof(u_short);
        i = 0;
        while (nshorts != 0) {
@@ -193,15 +202,15 @@ hex_print_with_offset(netdissect_options *ndo,
                        ND_PRINT("%s0x%04x: ", ident, oset);
                ND_PRINT(" %02x", GET_U_1(cp));
        }
+       if (truncated)
+               nd_trunc_longjmp(ndo);
 }
 
-/*
- * just for completeness
- */
 void
-hex_print(netdissect_options *ndo,const char *ident, const u_char *cp, u_int length)
+hex_print(netdissect_options *ndo,
+         const char *ident, const u_char *cp, u_int length)
 {
-  hex_print_with_offset(ndo, ident, cp, length, 0);
+       hex_print_with_offset(ndo, ident, cp, length, 0);
 }
 
 #ifdef MAIN