]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
Change -z command help text to -z postrotate-command
[tcpdump] / tcpdump.c
index e0237061902a89817cd7866d5deaf97d0dc1a682..3d491c4e9315341c3b6a914878ff46a130fb3e2f 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -762,7 +762,6 @@ main(int argc, char **argv)
        register char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
        pcap_handler callback;
        int dlt;
-       int new_dlt;
        const char *dlt_name;
        struct bpf_program fcode;
 #ifndef _WIN32
@@ -1116,6 +1115,8 @@ main(int argc, char **argv)
                                ndo->ndo_packettype = PT_PGM_ZMTP1;
                        else if (ascii_strcasecmp(optarg, "lmp") == 0)
                                ndo->ndo_packettype = PT_LMP;
+            else if (strcasecmp(optarg, "resp") == 0)
+                ndo->ndo_packettype = PT_RESP;
                        else
                                error("unknown packet type `%s'", optarg);
                        break;
@@ -1804,6 +1805,8 @@ main(int argc, char **argv)
                if (VFileName != NULL) {
                        ret = get_next_file(VFile, VFileLine);
                        if (ret) {
+                               int new_dlt;
+
                                RFileName = VFileLine;
                                pd = pcap_open_offline(RFileName, ebuf);
                                if (pd == NULL)
@@ -1816,23 +1819,59 @@ main(int argc, char **argv)
                                }
 #endif
                                new_dlt = pcap_datalink(pd);
-                               if (WFileName && new_dlt != dlt)
-                                       error("%s: new dlt does not match original", RFileName);
-                               ndo->ndo_if_printer = get_if_printer(ndo, new_dlt);
-                               dlt_name = pcap_datalink_val_to_name(new_dlt);
+                               if (new_dlt != dlt) {
+                                       /*
+                                        * The new file has a different
+                                        * link-layer header type from the
+                                        * previous one.
+                                        */
+                                       if (WFileName != NULL) {
+                                               /*
+                                                * We're writing raw packets
+                                                * that match the filter to
+                                                * a pcap file.  pcap files
+                                                * don't support multiple
+                                                * different link-layer
+                                                * header types, so we fail
+                                                * here.
+                                                */
+                                               error("%s: new dlt does not match original", RFileName);
+                                       }
+
+                                       /*
+                                        * We're printing the decoded packets;
+                                        * switch to the new DLT.
+                                        *
+                                        * To do that, we need to change
+                                        * the printer, change the DLT name,
+                                        * and recompile the filter with
+                                        * the new DLT.
+                                        */
+                                       dlt = new_dlt;
+                                       ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+                                       dlt_name = pcap_datalink_val_to_name(dlt);
+                                       if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
+                                               error("%s", pcap_geterr(pd));
+                               }
+
+                               /*
+                                * Set the filter on the new file.
+                                */
+                               if (pcap_setfilter(pd, &fcode) < 0)
+                                       error("%s", pcap_geterr(pd));
+
+                               /*
+                                * Report the new file.
+                                */
                                if (dlt_name == NULL) {
                                        fprintf(stderr, "reading from file %s, link-type %u\n",
-                                       RFileName, new_dlt);
+                                           RFileName, dlt);
                                } else {
                                        fprintf(stderr,
                                        "reading from file %s, link-type %s (%s)\n",
-                                       RFileName, dlt_name,
-                                       pcap_datalink_val_to_description(new_dlt));
+                                           RFileName, dlt_name,
+                                           pcap_datalink_val_to_description(dlt));
                                }
-                               if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
-                                       error("%s", pcap_geterr(pd));
-                               if (pcap_setfilter(pd, &fcode) < 0)
-                                       error("%s", pcap_geterr(pd));
                        }
                }
        }
@@ -2349,7 +2388,7 @@ print_usage(void)
 #endif
        (void)fprintf(stderr, "[ -T type ] [ --version ] [ -V file ]\n");
        (void)fprintf(stderr,
-"\t\t[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ]\n");
+"\t\t[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]\n");
        (void)fprintf(stderr,
 "\t\t[ -Z user ] [ expression ]\n");
 }