]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-telnet.c
Fix spaces
[tcpdump] / print-telnet.c
index 25484cd536667dfce0ed596e4263a96b8ab8b7ca..3bfb19a2f77362b57c83ebc5cac72b83d9b81168 100644 (file)
  *      are preserved in all copies.
  */
 
  *      are preserved in all copies.
  */
 
+/* \summary: Telnet option printer */
+
 #ifdef HAVE_CONFIG_H
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
 #endif
 
 #endif
 
-#include <tcpdump-stdinc.h>
+#include "netdissect-stdinc.h"
 
 #include <stdio.h>
 
 #include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 
 
-#include "interface.h"
-#include "addrtoname.h"
+#include "netdissect.h"
+#include "extract.h"
+
 
 #define TELCMDS
 #define TELOPTS
 
 #define TELCMDS
 #define TELOPTS
@@ -90,7 +91,7 @@
 #define SYNCH  242             /* for telfunc calls */
 
 #ifdef TELCMDS
 #define SYNCH  242             /* for telfunc calls */
 
 #ifdef TELCMDS
-const char *telcmds[] = {
+static const char *telcmds[] = {
        "EOF", "SUSP", "ABORT", "EOR",
        "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
        "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
        "EOF", "SUSP", "ABORT", "EOR",
        "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
        "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
@@ -151,7 +152,7 @@ extern char *telcmds[];
 
 #define        NTELOPTS        (1+TELOPT_NEW_ENVIRON)
 #ifdef TELOPTS
 
 #define        NTELOPTS        (1+TELOPT_NEW_ENVIRON)
 #ifdef TELOPTS
-const char *telopts[NTELOPTS+1] = {
+static const char *telopts[NTELOPTS+1] = {
        "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
        "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
        "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
        "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
        "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
        "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
@@ -380,13 +381,13 @@ numstr(int x)
 {
        static char buf[20];
 
 {
        static char buf[20];
 
-       snprintf(buf, sizeof(buf), "%#x", x);
+       nd_snprintf(buf, sizeof(buf), "%#x", x);
        return buf;
 }
 
 /* sp points to IAC byte */
 static int
        return buf;
 }
 
 /* sp points to IAC byte */
 static int
-telnet_parse(const u_char *sp, u_int length, int print)
+telnet_parse(netdissect_options *ndo, const u_char *sp, u_int length, int print)
 {
        int i, x;
        u_int c;
 {
        int i, x;
        u_int c;
@@ -395,8 +396,9 @@ telnet_parse(const u_char *sp, u_int length, int print)
        do { \
                if (length < 1) \
                        goto pktend; \
        do { \
                if (length < 1) \
                        goto pktend; \
-               TCHECK(*sp); \
-               c = *sp++; \
+               ND_TCHECK_1(sp); \
+               c = EXTRACT_U_1(sp); \
+               sp++; \
                length--; \
        } while (0)
 
                length--; \
        } while (0)
 
@@ -408,7 +410,7 @@ telnet_parse(const u_char *sp, u_int length, int print)
        FETCH(c, sp, length);
        if (c == IAC) {         /* <IAC><IAC>! */
                if (print)
        FETCH(c, sp, length);
        if (c == IAC) {         /* <IAC><IAC>! */
                if (print)
-                       printf("IAC IAC");
+                       ND_PRINT("IAC IAC");
                goto done;
        }
 
                goto done;
        }
 
@@ -426,21 +428,23 @@ telnet_parse(const u_char *sp, u_int length, int print)
                FETCH(x, sp, length);
                if (x >= 0 && x < NTELOPTS) {
                        if (print)
                FETCH(x, sp, length);
                if (x >= 0 && x < NTELOPTS) {
                        if (print)
-                               (void)printf("%s %s", telcmds[i], telopts[x]);
+                               ND_PRINT("%s %s", telcmds[i], telopts[x]);
                } else {
                        if (print)
                } else {
                        if (print)
-                               (void)printf("%s %#x", telcmds[i], x);
+                               ND_PRINT("%s %#x", telcmds[i], x);
                }
                if (c != SB)
                        break;
                /* IAC SB .... IAC SE */
                p = sp;
                while (length > (u_int)(p + 1 - sp)) {
                }
                if (c != SB)
                        break;
                /* IAC SB .... IAC SE */
                p = sp;
                while (length > (u_int)(p + 1 - sp)) {
-                       if (p[0] == IAC && p[1] == SE)
+                       ND_TCHECK_2(p);
+                       if (EXTRACT_U_1(p) == IAC && EXTRACT_U_1(p + 1) == SE)
                                break;
                        p++;
                }
                                break;
                        p++;
                }
-               if (*p != IAC)
+               ND_TCHECK_1(p);
+               if (EXTRACT_U_1(p) != IAC)
                        goto pktend;
 
                switch (x) {
                        goto pktend;
 
                switch (x) {
@@ -449,47 +453,46 @@ telnet_parse(const u_char *sp, u_int length, int print)
                                break;
                        FETCH(c, sp, length);
                        if (print)
                                break;
                        FETCH(c, sp, length);
                        if (print)
-                               (void)printf(" %s", STR_OR_ID(c, authcmd));
+                               ND_PRINT(" %s", STR_OR_ID(c, authcmd));
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
-                               (void)printf(" %s", STR_OR_ID(c, authtype));
+                               ND_PRINT(" %s", STR_OR_ID(c, authtype));
                        break;
                case TELOPT_ENCRYPT:
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
                        break;
                case TELOPT_ENCRYPT:
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
-                               (void)printf(" %s", STR_OR_ID(c, enccmd));
+                               ND_PRINT(" %s", STR_OR_ID(c, enccmd));
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
-                               (void)printf(" %s", STR_OR_ID(c, enctype));
+                               ND_PRINT(" %s", STR_OR_ID(c, enctype));
                        break;
                default:
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
                        break;
                default:
                        if (p <= sp)
                                break;
                        FETCH(c, sp, length);
                        if (print)
-                               (void)printf(" %s", STR_OR_ID(c, cmds));
+                               ND_PRINT(" %s", STR_OR_ID(c, cmds));
                        break;
                }
                while (p > sp) {
                        FETCH(x, sp, length);
                        if (print)
                        break;
                }
                while (p > sp) {
                        FETCH(x, sp, length);
                        if (print)
-                               (void)printf(" %#x", x);
+                               ND_PRINT(" %#x", x);
                }
                /* terminating IAC SE */
                if (print)
                }
                /* terminating IAC SE */
                if (print)
-                       (void)printf(" SE");
+                       ND_PRINT(" SE");
                sp += 2;
                sp += 2;
-               length -= 2;
                break;
        default:
                if (print)
                break;
        default:
                if (print)
-                       (void)printf("%s", telcmds[i]);
+                       ND_PRINT("%s", telcmds[i]);
                goto done;
        }
 
                goto done;
        }
 
@@ -497,50 +500,60 @@ done:
        return sp - osp;
 
 trunc:
        return sp - osp;
 
 trunc:
-       (void)printf("[|telnet]");
+       nd_print_trunc(ndo);
 pktend:
        return -1;
 #undef FETCH
 }
 
 void
 pktend:
        return -1;
 #undef FETCH
 }
 
 void
-telnet_print(const u_char *sp, u_int length)
+telnet_print(netdissect_options *ndo, const u_char *sp, u_int length)
 {
        int first = 1;
        const u_char *osp;
        int l;
 
 {
        int first = 1;
        const u_char *osp;
        int l;
 
+       ndo->ndo_protocol = "telnet";
        osp = sp;
 
        osp = sp;
 
-       while (length > 0 && *sp == IAC) {
-               l = telnet_parse(sp, length, 0);
+       ND_TCHECK_1(sp);
+       while (length > 0 && EXTRACT_U_1(sp) == IAC) {
+               /*
+                * Parse the Telnet command without printing it,
+                * to determine its length.
+                */
+               l = telnet_parse(ndo, sp, length, 0);
                if (l < 0)
                        break;
 
                /*
                 * now print it
                 */
                if (l < 0)
                        break;
 
                /*
                 * now print it
                 */
-               if (Xflag && 2 < vflag) {
+               if (ndo->ndo_Xflag && 2 < ndo->ndo_vflag) {
                        if (first)
                        if (first)
-                               printf("\nTelnet:");
-                       hex_print_with_offset(gndo,"\n", sp, l, sp - osp);
+                               ND_PRINT("\nTelnet:");
+                       hex_print_with_offset(ndo, "\n", sp, l, sp - osp);
                        if (l > 8)
                        if (l > 8)
-                               printf("\n\t\t\t\t");
+                               ND_PRINT("\n\t\t\t\t");
                        else
                        else
-                               printf("%*s\t", (8 - l) * 3, "");
+                               ND_PRINT("%*s\t", (8 - l) * 3, "");
                } else
                } else
-                       printf("%s", (first) ? " [telnet " : ", ");
+                       ND_PRINT("%s", (first) ? " [telnet " : ", ");
 
 
-               (void)telnet_parse(sp, length, 1);
+               (void)telnet_parse(ndo, sp, length, 1);
                first = 0;
 
                sp += l;
                length -= l;
                first = 0;
 
                sp += l;
                length -= l;
+               ND_TCHECK_1(sp);
        }
        if (!first) {
        }
        if (!first) {
-               if (Xflag && 2 < vflag)
-                       printf("\n");
+               if (ndo->ndo_Xflag && 2 < ndo->ndo_vflag)
+                       ND_PRINT("\n");
                else
                else
-                       printf("]");
+                       ND_PRINT("]");
        }
        }
+       return;
+trunc:
+       nd_print_trunc(ndo);
 }
 }