/* \summary: REdis Serialization Protocol (RESP) printer */
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include "netdissect-stdinc.h"
#include "netdissect.h"
* TEST_RET_LEN
* If ret_len is < 0, jump to the trunc tag which returns (-1)
* and 'bubbles up' to printing tstr. Otherwise, return ret_len.
+ *
+ * Note that using this macro with a semicolon at the end emits a warning from
+ * Sun C about an unreachable statement (the semicolon is the statement).
*/
#define TEST_RET_LEN(rl) \
if (rl < 0) { goto trunc; } else { return rl; }
ND_PRINT(" \""); \
if (nd_printn(_ndo, _bp, _len, _ndo->ndo_snapend)) \
goto trunc; \
- fn_print_char(_ndo, '"');
+ ND_PRINT("\"");
void
resp_print(netdissect_options *ndo, const u_char *bp, u_int length)
ndo->ndo_protocol = "resp";
ND_PRINT(": RESP");
- while (length > 0) {
+ while (length != 0) {
/*
* This block supports redis pipelining.
* For example, multiple operations can be pipelined within the same string:
* including invalid packet errors; that's what we want, as
* we have to give up on further parsing in that case.
*/
- TEST_RET_LEN(ret_len);
+ TEST_RET_LEN(ret_len) // without a semicolon
trunc:
return (-1);
* preceding the \r\n. That includes the opcode, so don't print
* that.
*/
- len = ND_BYTES_BETWEEN(bp_ptr, bp);
+ len = ND_BYTES_BETWEEN(bp, bp_ptr);
RESP_PRINT_SEGMENT(ndo, bp, len);
ret_len = 1 /*<opcode>*/ + len /*<string>*/ + 2 /*<CRLF>*/;
- TEST_RET_LEN(ret_len);
+ TEST_RET_LEN(ret_len) // without a semicolon
trunc:
return (-1);
* Found it; bp_ptr points to the \r or \n, so bp_ptr - bp is the
* Length of the line text that precedes it. Print it.
*/
- len = ND_BYTES_BETWEEN(bp_ptr, bp);
+ len = ND_BYTES_BETWEEN(bp, bp_ptr);
RESP_PRINT_SEGMENT(ndo, bp, len);
/*