/* \summary: Trivial File Transfer Protocol (TFTP) printer */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include <config.h>
-#include <netdissect-stdinc.h>
-
-#include <string.h>
+#include "netdissect-stdinc.h"
#include "netdissect.h"
#include "extract.h"
#define EEXISTS 6 /* file already exists */
#define ENOUSER 7 /* no such user */
-static const char tstr[] = " [|tftp]";
/* op code to string mapping */
static const struct tok op2str[] = {
const u_char *bp, u_int length)
{
const char *cp;
- int opcode;
+ u_int opcode;
u_int ui;
+ ndo->ndo_protocol = "tftp";
+
+ /* Print protocol */
+ nd_print_protocol_caps(ndo);
/* Print length */
- ND_PRINT((ndo, " %d", length));
+ ND_PRINT(", length %u", length);
/* Print tftp request type */
if (length < 2)
goto trunc;
- ND_TCHECK_2(bp);
- opcode = EXTRACT_BE_U_2(bp);
- cp = tok2str(op2str, "tftp-#%d", opcode);
- ND_PRINT((ndo, " %s", cp));
+ opcode = GET_BE_U_2(bp);
+ cp = tok2str(op2str, "tftp-#%u", opcode);
+ ND_PRINT(", %s", cp);
/* Bail if bogus opcode */
if (*cp == 't')
return;
case WRQ:
if (length == 0)
goto trunc;
- ND_PRINT((ndo, " "));
+ ND_PRINT(" ");
/* Print filename */
- ND_PRINT((ndo, "\""));
- ui = fn_printztn(ndo, bp, length, ndo->ndo_snapend);
- ND_PRINT((ndo, "\""));
+ ND_PRINT("\"");
+ ui = nd_printztn(ndo, bp, length, ndo->ndo_snapend);
+ ND_PRINT("\"");
if (ui == 0)
goto trunc;
bp += ui;
/* Print the mode - RRQ and WRQ only */
if (length == 0)
goto trunc; /* no mode */
- ND_PRINT((ndo, " "));
- ui = fn_printztn(ndo, bp, length, ndo->ndo_snapend);
+ ND_PRINT(" ");
+ ui = nd_printztn(ndo, bp, length, ndo->ndo_snapend);
if (ui == 0)
goto trunc;
bp += ui;
/* Print options, if any */
while (length != 0) {
- ND_TCHECK_1(bp);
- if (EXTRACT_U_1(bp) != '\0')
- ND_PRINT((ndo, " "));
- ui = fn_printztn(ndo, bp, length, ndo->ndo_snapend);
+ if (GET_U_1(bp) != '\0')
+ ND_PRINT(" ");
+ ui = nd_printztn(ndo, bp, length, ndo->ndo_snapend);
if (ui == 0)
goto trunc;
bp += ui;
case OACK:
/* Print options */
while (length != 0) {
- ND_TCHECK_1(bp);
- if (EXTRACT_U_1(bp) != '\0')
- ND_PRINT((ndo, " "));
- ui = fn_printztn(ndo, bp, length, ndo->ndo_snapend);
+ if (GET_U_1(bp) != '\0')
+ ND_PRINT(" ");
+ ui = nd_printztn(ndo, bp, length, ndo->ndo_snapend);
if (ui == 0)
goto trunc;
bp += ui;
case DATA:
if (length < 2)
goto trunc; /* no block number */
- ND_TCHECK_2(bp);
- ND_PRINT((ndo, " block %d", EXTRACT_BE_U_2(bp)));
+ ND_PRINT(" block %u", GET_BE_U_2(bp));
break;
case TFTP_ERROR:
/* Print error code string */
if (length < 2)
goto trunc; /* no error code */
- ND_TCHECK_2(bp);
- ND_PRINT((ndo, " %s", tok2str(err2str, "tftp-err-#%d \"",
- EXTRACT_BE_U_2(bp))));
+ ND_PRINT(" %s", tok2str(err2str, "tftp-err-#%u \"",
+ GET_BE_U_2(bp)));
bp += 2;
length -= 2;
/* Print error message string */
if (length == 0)
goto trunc; /* no error message */
- ND_PRINT((ndo, " \""));
- ui = fn_printztn(ndo, bp, length, ndo->ndo_snapend);
- ND_PRINT((ndo, "\""));
+ ND_PRINT(" \"");
+ ui = nd_printztn(ndo, bp, length, ndo->ndo_snapend);
+ ND_PRINT("\"");
if (ui == 0)
goto trunc;
break;
default:
/* We shouldn't get here */
- ND_PRINT((ndo, "(unknown #%d)", opcode));
+ ND_PRINT("(unknown #%u)", opcode);
break;
}
return;
trunc:
- ND_PRINT((ndo, "%s", tstr));
- return;
+ nd_print_trunc(ndo);
}