]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
Merge pull request #377 from msekletar/master
[tcpdump] / tcpdump.c
index f41bf697bf90cc6757750766d51c4840d7150b43..d9f3e0fa96761fa993b0360fca4c53585c254d90 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -650,6 +650,7 @@ show_devices_and_exit (void)
  */
 #define OPTION_NUMBER  128
 #define OPTION_VERSION 129
+#define OPTION_TSTAMP_PRECISION 130
 
 static const struct option longopts[] = {
 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
@@ -665,6 +666,7 @@ static const struct option longopts[] = {
        { "time-stamp-type", required_argument, NULL, 'j' },
        { "list-time-stamp-types", no_argument, NULL, 'J' },
 #endif
+       { "time-stamp-precision", required_argument, NULL, OPTION_TSTAMP_PRECISION},
        { "dont-verify-checksums", no_argument, NULL, 'K' },
        { "list-data-link-types", no_argument, NULL, 'L' },
        { "no-optimize", no_argument, NULL, 'O' },
@@ -846,6 +848,18 @@ get_next_file(FILE *VFile, char *ptr)
        return ret;
 }
 
+static int
+tstamp_precision_from_string(const char *precision)
+{
+       if (strncmp(precision, "nano", strlen("nano")) == 0)
+               return PCAP_TSTAMP_PRECISION_NANO;
+
+       if (strncmp(precision, "micro", strlen("micro")) == 0)
+               return PCAP_TSTAMP_PRECISION_MICRO;
+
+       return -EINVAL;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -1281,6 +1295,12 @@ main(int argc, char **argv)
                        exit(0);
                        break;
 
+               case OPTION_TSTAMP_PRECISION:
+                       gndo->ndo_tstamp_precision = tstamp_precision_from_string(optarg);
+                       if (gndo->ndo_tstamp_precision < 0)
+                               error("unsupported time stamp precision");
+                       break;
+
                default:
                        print_usage();
                        exit(1);
@@ -1372,7 +1392,11 @@ main(int argc, char **argv)
                        RFileName = VFileLine;
                }
 
-               pd = pcap_open_offline(RFileName, ebuf);
+               if (gndo->ndo_tstamp_precision == PCAP_TSTAMP_PRECISION_NANO)
+                       pd = pcap_open_offline_with_tstamp_precision(RFileName, PCAP_TSTAMP_PRECISION_NANO, ebuf);
+               else
+                       pd = pcap_open_offline_with_tstamp_precision(RFileName, PCAP_TSTAMP_PRECISION_MICRO, ebuf);
+
                if (pd == NULL)
                        error("%s", ebuf);
                dlt = pcap_datalink(pd);
@@ -1419,6 +1443,13 @@ main(int argc, char **argv)
                if (Jflag)
                        show_tstamp_types_and_exit(device, pd);
 #endif
+               if (gndo->ndo_tstamp_precision == PCAP_TSTAMP_PRECISION_NANO) {
+                       status = pcap_set_tstamp_precision(pd, PCAP_TSTAMP_PRECISION_NANO);
+                       if (status != 0)
+                               error("%s: Can't set nanosecond time stamp precision: %s",
+                                       device, pcap_statustostr(status));
+                }
+
                /*
                 * Is this an interface that supports monitor mode?
                 */