}
}
-/*
- * Print out a null-terminated filename (or other ASCII string), part of
- * the packet buffer.
- * If ep is NULL, assume no truncation check is needed.
- * Return true if truncated.
- * Stop at ep (if given) or before the null char, whichever is first.
- */
-int
-nd_print(netdissect_options *ndo,
- const u_char *s, const u_char *ep)
-{
- int ret;
- u_char c;
-
- ret = 1; /* assume truncated */
- while (ep == NULL || s < ep) {
- c = GET_U_1(s);
- s++;
- if (c == '\0') {
- ret = 0;
- break;
- }
- fn_print_char(ndo, c);
- }
- return(ret);
-}
-
/*
* Print out a null-terminated filename (or other ASCII string) from
* a fixed-length field in the packet buffer, or from what remains of
}
/*
- * Print out a null-padded filename (or other ASCII string), part of
- * the packet buffer.
- * If ep is NULL, assume no truncation check is needed.
- * Return true if truncated.
- * Stop at ep (if given) or after n bytes or before the null char,
+ * Print a counted filename (or other ASCII string), part of
+ * the packet buffer, filtering out non-printable characters.
+ * Stop if truncated (via GET_U_1/longjmp) or after n bytes,
* whichever is first.
+ * The suffix comes from: j:longJmp, n:after N bytes.
*/
-int
-nd_printzp(netdissect_options *ndo,
- const u_char *s, u_int n,
- const u_char *ep)
+void
+nd_printjn(netdissect_options *ndo, const u_char *s, u_int n)
{
- int ret;
- u_char c;
-
- ret = 1; /* assume truncated */
- while (n > 0 && (ep == NULL || s < ep)) {
+ while (n > 0) {
+ fn_print_char(ndo, GET_U_1(s));
n--;
- c = GET_U_1(s);
s++;
- if (c == '\0') {
- ret = 0;
- break;
- }
- fn_print_char(ndo, c);
}
- return (n == 0) ? 0 : ret;
}
/*
{
time_t Time = sec;
struct tm *tm;
- char timestr[32];
+ char timebuf[32];
+ const char *timestr;
if ((unsigned)sec & 0x80000000) {
ND_PRINT("[Error converting time]");
else
tm = gmtime(&Time);
- if (!tm) {
- ND_PRINT("[Error converting time]");
- return;
+ if (date_flag == WITH_DATE) {
+ timestr = nd_format_time(timebuf, sizeof(timebuf),
+ "%Y-%m-%d %H:%M:%S", tm);
+ } else {
+ timestr = nd_format_time(timebuf, sizeof(timebuf),
+ "%H:%M:%S", tm);
}
- if (date_flag == WITH_DATE)
- strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", tm);
- else
- strftime(timestr, sizeof(timestr), "%H:%M:%S", tm);
ND_PRINT("%s", timestr);
ts_frac_print(ndo, usec);
unsigned_relts_print(ndo, secs);
}
+/*
+ * Format a struct tm with strftime().
+ * If the pointer to the struct tm is null, that means that the
+ * routine to convert a time_t to a struct tm failed; the localtime()
+ * and gmtime() in the Microsoft Visual Studio C library will fail,
+ * returning null, if the value is before the UNIX Epoch.
+ */
+const char *
+nd_format_time(char *buf, size_t bufsize, const char *format,
+ const struct tm *timeptr)
+{
+ if (timeptr != NULL) {
+ if (strftime(buf, bufsize, format, timeptr) != 0)
+ return (buf);
+ else
+ return ("[nd_format_time() buffer is too small]");
+ } else
+ return ("[localtime() or gmtime() couldn't convert the date and time]");
+}
+
/* Print the truncated string */
void nd_print_trunc(netdissect_options *ndo)
{
int
print_unknown_data(netdissect_options *ndo, const u_char *cp,
- const char *ident, u_int len)
+ const char *indent, u_int len)
{
- u_int len_to_print;
-
- len_to_print = len;
if (!ND_TTEST_LEN(cp, 0)) {
- ND_PRINT("%sDissector error: print_unknown_data called with pointer past end of packet",
- ident);
+ ND_PRINT("%sDissector error: %s() called with pointer past end of packet",
+ indent, __func__);
return(0);
}
- if (ND_BYTES_AVAILABLE_AFTER(cp) < len_to_print)
- len_to_print = ND_BYTES_AVAILABLE_AFTER(cp);
- hex_print(ndo, ident, cp, len_to_print);
+ hex_print(ndo, indent, cp, ND_MIN(len, ND_BYTES_AVAILABLE_AFTER(cp)));
return(1); /* everything is ok */
}
/*
* Convert a token value to a string; use "fmt" if not found.
*/
-const char *
+static const char *
tok2strbuf(const struct tok *lp, const char *fmt,
- u_int v, char *buf, size_t bufsize)
+ const u_int v, char *buf, const size_t bufsize)
{
if (lp != NULL) {
while (lp->s != NULL) {
* in round-robin fashion.
*/
const char *
-tok2str(const struct tok *lp, const char *fmt,
- u_int v)
+tok2str(const struct tok *lp, const char *fmt, const u_int v)
{
static char buf[4][TOKBUFSIZE];
static int idx = 0;
*/
static char *
bittok2str_internal(const struct tok *lp, const char *fmt,
- u_int v, const char *sep)
+ const u_int v, const char *sep)
{
static char buf[1024+1]; /* our string buffer */
char *bufp = buf;
* this is useful for parsing bitfields, the output strings are not separated.
*/
char *
-bittok2str_nosep(const struct tok *lp, const char *fmt,
- u_int v)
+bittok2str_nosep(const struct tok *lp, const char *fmt, const u_int v)
{
return (bittok2str_internal(lp, fmt, v, ""));
}
* this is useful for parsing bitfields, the output strings are comma separated.
*/
char *
-bittok2str(const struct tok *lp, const char *fmt,
- u_int v)
+bittok2str(const struct tok *lp, const char *fmt, const u_int v)
{
return (bittok2str_internal(lp, fmt, v, ", "));
}
* correct for bounds-checking.
*/
const char *
-tok2strary_internal(const char **lp, int n, const char *fmt,
- int v)
+tok2strary_internal(const char **lp, int n, const char *fmt, const int v)
{
static char buf[TOKBUFSIZE];
*/
int
-mask2plen(uint32_t mask)
+mask2plen(const uint32_t mask)
{
- uint32_t bitmasks[33] = {
+ const uint32_t bitmasks[33] = {
0x00000000,
0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
*/
static int
fetch_token(netdissect_options *ndo, const u_char *pptr, u_int idx, u_int len,
- u_char *tbuf, size_t tbuflen)
+ u_char *tbuf, size_t tbuflen)
{
size_t toklen = 0;
u_char c;
(defined(__s390__) || defined(__s390x__) || defined(__zarch__)) || \
defined(__vax__)
/*
- * The procesor natively handles unaligned loads, so just use memcpy()
+ * The processor natively handles unaligned loads, so just use memcpy()
* and memcmp(), to enable those optimizations.
*
* XXX - are those all the x86 tests we need?