]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-pktap.c
change make check to work with POSIX shell
[tcpdump] / print-pktap.c
index 009a663f7d260d4565a055627905a3db0afcfdab..4a295fdf6328582d5bf2f25ceb48324d05272eb3 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+/* \summary: Apple's DLT_PKTAP printer */
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
 
-#include "interface.h"
+#include "netdissect.h"
 #include "extract.h"
 
 #ifdef DLT_PKTAP
@@ -66,20 +68,22 @@ typedef struct pktap_header {
 #define PKT_REC_PACKET 1       /* a packet follows the header */
 
 static inline void
-pktap_header_print(struct netdissect_options *ndo, const u_char *bp, u_int length)
+pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
 {
        const pktap_header_t *hdr;
        uint32_t dlt, hdrlen;
+       const char *dltname;
 
        hdr = (const pktap_header_t *)bp;
 
        dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
        hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+       dltname = pcap_datalink_val_to_name(dlt);
        if (!ndo->ndo_qflag) {
-               ND_PRINT((ndo,"DLT %s (%d) len %d",
-                         pcap_datalink_val_to_name(dlt), dlt, hdrlen));
+               ND_PRINT((ndo,"DLT %s (%d) len %d",
+                         (dltname != NULL ? dltname : "UNKNOWN"), dlt, hdrlen));
         } else {
-               ND_PRINT((ndo,", %s", pcap_datalink_val_to_name(dlt)));
+               ND_PRINT((ndo,"%s", (dltname != NULL ? dltname : "UNKNOWN")));
         }
 
        ND_PRINT((ndo, ", length %u: ", length));
@@ -92,21 +96,21 @@ pktap_header_print(struct netdissect_options *ndo, const u_char *bp, u_int lengt
  * is the number of bytes actually captured.
  */
 u_int
-pktap_if_print(struct netdissect_options *ndo,
+pktap_if_print(netdissect_options *ndo,
                const struct pcap_pkthdr *h, const u_char *p)
 {
        uint32_t dlt, hdrlen, rectype;
        u_int caplen = h->caplen;
        u_int length = h->len;
-       if_ndo_printer ndo_printer;
-        if_printer printer;
-       pktap_header_t *hdr;
+       if_printer printer;
+       const pktap_header_t *hdr;
+       struct pcap_pkthdr nhdr;
 
        if (caplen < sizeof(pktap_header_t) || length < sizeof(pktap_header_t)) {
                ND_PRINT((ndo, "[|pktap]"));
                return (0);
        }
-       hdr = (pktap_header_t *)p;
+       hdr = (const pktap_header_t *)p;
        dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
        hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
        if (hdrlen < sizeof(pktap_header_t)) {
@@ -137,15 +141,17 @@ pktap_if_print(struct netdissect_options *ndo,
 
        case PKT_REC_NONE:
                ND_PRINT((ndo, "no data"));
+               break;
 
        case PKT_REC_PACKET:
                if ((printer = lookup_printer(dlt)) != NULL) {
-                       printer(h, p);
-               } else if ((ndo_printer = lookup_ndo_printer(dlt)) != NULL) {
-                       ndo_printer(ndo, h, p);
+                       nhdr = *h;
+                       nhdr.caplen = caplen;
+                       nhdr.len = length;
+                       hdrlen += printer(ndo, &nhdr, p);
                } else {
                        if (!ndo->ndo_eflag)
-                               pktap_header_print(ndo, (u_char *)hdr,
+                               pktap_header_print(ndo, (const u_char *)hdr,
                                                length + hdrlen);
 
                        if (!ndo->ndo_suppress_default_print)