]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util-print.c
Update some tests files if the packet time is > 2038-01-19 03:14:07 UTC
[tcpdump] / util-print.c
index f9ea618d1a4dce8823d01e31ab3862985c3f0656..dd43219b198d425bfe333f40581d75972c35eb55 100644 (file)
@@ -94,33 +94,6 @@ fn_print_str(netdissect_options *ndo, const u_char *s)
        }
 }
 
-/*
- * 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
@@ -198,6 +171,23 @@ nd_printn(netdissect_options *ndo,
        return (n == 0) ? 0 : 1;
 }
 
+/*
+ * 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.
+ */
+void
+nd_printjn(netdissect_options *ndo, const u_char *s, u_int n)
+{
+       while (n > 0) {
+               fn_print_char(ndo, GET_U_1(s));
+               n--;
+               s++;
+       }
+}
+
 /*
  * Print a null-padded filename (or other ASCII string), part of
  * the packet buffer, filtering out non-printable characters.
@@ -257,7 +247,8 @@ ts_date_hmsfrac_print(netdissect_options *ndo, long sec, long usec,
 {
        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]");
@@ -269,14 +260,13 @@ ts_date_hmsfrac_print(netdissect_options *ndo, long sec, long usec,
        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);
@@ -432,6 +422,26 @@ signed_relts_print(netdissect_options *ndo,
        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)
 {
@@ -485,7 +495,7 @@ print_unknown_data(netdissect_options *ndo, const u_char *cp,
 /*
  * 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)
 {
@@ -631,7 +641,7 @@ uint2tokary_internal(const struct uint_tokary dict[], const size_t size,
 int
 mask2plen(uint32_t mask)
 {
-       uint32_t bitmasks[33] = {
+       const uint32_t bitmasks[33] = {
                0x00000000,
                0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
                0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
@@ -821,11 +831,10 @@ print_txt_line(netdissect_options *ndo, const char *prefix,
 
        /*
         * All printable ASCII, but no line ending after that point
-        * in the buffer; treat this as if it were truncated.
+        * in the buffer.
         */
        linelen = idx - startidx;
        ND_PRINT("%s%.*s", prefix, (int)linelen, pptr + startidx);
-       nd_print_trunc(ndo);
        return (0);
 
 print:
@@ -944,7 +953,7 @@ txtproto_print(netdissect_options *ndo, const u_char *pptr, u_int len,
     (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?