vendor/TCPDUMP: Import libpcap 4.99.1
[dragonfly.git] / contrib / tcpdump / print-ssh.c
1 /*
2  * Redistribution and use in source and binary forms, with or without
3  * modification, are permitted provided that: (1) source code
4  * distributions retain the above copyright notice and this paragraph
5  * in its entirety, and (2) distributions including binary code include
6  * the above copyright notice and this paragraph in its entirety in
7  * the documentation or other materials provided with the distribution.
8  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11  * FOR A PARTICULAR PURPOSE.
12  */
13
14 /* \summary: Secure Shell (SSH) printer */
15
16 #ifdef HAVE_CONFIG_H
17 #include <config.h>
18 #endif
19
20 #include "netdissect-stdinc.h"
21 #include "netdissect-ctype.h"
22
23 #include "netdissect.h"
24 #include "extract.h"
25
26 static int
27 ssh_print_version(netdissect_options *ndo, const u_char *pptr, u_int len)
28 {
29         u_int idx = 0;
30
31         if ( GET_U_1(pptr+idx) != 'S' )
32                 return 0;
33         idx++;
34         if ( GET_U_1(pptr+idx) != 'S' )
35                 return 0;
36         idx++;
37         if ( GET_U_1(pptr+idx) != 'H' )
38                 return 0;
39         idx++;
40         if ( GET_U_1(pptr+idx) != '-' )
41                 return 0;
42         idx++;
43
44         while (idx < len) {
45                 u_char c;
46
47                 c = GET_U_1(pptr + idx);
48                 if (c == '\n') {
49                         /*
50                          * LF without CR; end of line.
51                          * Skip the LF and print the line, with the
52                          * exception of the LF.
53                          */
54                         goto print;
55                 } else if (c == '\r') {
56                         /* CR - any LF? */
57                         if ((idx+1) >= len) {
58                                 /* not in this packet */
59                                 goto trunc;
60                         }
61                         if (GET_U_1(pptr + idx + 1) == '\n') {
62                                 /*
63                                  * CR-LF; end of line.
64                                  * Skip the CR-LF and print the line, with
65                                  * the exception of the CR-LF.
66                                  */
67                                 goto print;
68                         }
69
70                         /*
71                          * CR followed by something else; treat this as
72                          * if it were binary data and don't print it.
73                          */
74                         goto trunc;
75                 } else if (!ND_ASCII_ISPRINT(c) ) {
76                         /*
77                          * Not a printable ASCII character; treat this
78                          * as if it were binary data and don't print it.
79                          */
80                         goto trunc;
81                 }
82                 idx++;
83         }
84 trunc:
85         return -1;
86 print:
87         ND_PRINT(": ");
88         nd_print_protocol_caps(ndo);
89         ND_PRINT(": %.*s", (int)idx, pptr);
90         return idx;
91 }
92
93 void
94 ssh_print(netdissect_options *ndo, const u_char *pptr, u_int len)
95 {
96         ndo->ndo_protocol = "ssh";
97
98         ssh_print_version(ndo, pptr, len);
99 }