Try to improve the "Kerberos requested but not OpenSSL" message.
[jelmer/wireshark.git] / dumpcap.c
index d6818353c65e070984e8c73351525d13f51d63c1..56a28fea7b880d1990222b29d35043e6cf9e6c9e 100644 (file)
--- a/dumpcap.c
+++ b/dumpcap.c
@@ -1,6 +1,4 @@
 /* dumpcap.c
- *
- * $Id$
  *
  * Wireshark - Network traffic analyzer
  * By Gerald Combs <gerald@wireshark.org>
@@ -180,7 +178,7 @@ static void cap_pipe_close(int pipe_fd, gboolean from_socket _U_);
  * and not continue to capture, should we report it as a warning, or
  * what?
  */
-void
+static void
 enable_kernel_bpf_jit_compiler(void)
 {
     int fd;
@@ -411,7 +409,7 @@ static void WS_MSVC_NORETURN exit_main(int err) G_GNUC_NORETURN;
 
 static void report_new_capture_file(const char *filename);
 static void report_packet_count(unsigned int packet_count);
-static void report_packet_drops(guint32 received, guint32 pcap_drops, guint32 drops, guint32 flushed, gchar *name);
+static void report_packet_drops(guint32 received, guint32 pcap_drops, guint32 drops, guint32 flushed, guint32 ps_ifdrop, gchar *name);
 static void report_capture_error(const char *error_msg, const char *secondary_error_msg);
 static void report_cfilter_error(capture_options *capture_opts, guint i, const char *errmsg);
 
@@ -452,7 +450,7 @@ create_timestamp(void) {
      * Subtract difference, in microseconds, between January 1, 1601
      * 00:00:00 UTC and January 1, 1970, 00:00:00 UTC.
      */
-    timestamp -= G_GINT64_CONSTANT(11644473600000000U);
+    timestamp -= G_GUINT64_CONSTANT(11644473600000000);
 #else
     /*
      * Current time, represented as seconds and microseconds since
@@ -480,7 +478,7 @@ print_usage(gboolean print_ver)
                 "Dumpcap " VERSION "%s\n"
                 "Capture network packets and dump them into a pcapng file.\n"
                 "See http://www.wireshark.org for more information.\n",
-                wireshark_svnversion);
+                wireshark_gitversion);
     } else {
         output = stderr;
     }
@@ -498,7 +496,7 @@ print_usage(gboolean print_ver)
     fprintf(output, "  -I                       capture in monitor mode, if available\n");
 #endif
 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
-    fprintf(output, "  -B <buffer size>         size of kernel buffer in MB (def: %dMB)\n", DEFAULT_CAPTURE_BUFFER_SIZE);
+    fprintf(output, "  -B <buffer size>         size of kernel buffer in MiB (def: %dMiB)\n", DEFAULT_CAPTURE_BUFFER_SIZE);
 #endif
     fprintf(output, "  -y <link type>           link layer type (def: first appropriate)\n");
     fprintf(output, "  -D                       print list of interfaces and exit\n");
@@ -570,7 +568,7 @@ show_version(GString *comp_info_str, GString *runtime_info_str)
         "%s\n"
         "%s\n"
         "See http://www.wireshark.org for more information.\n",
-        wireshark_svnversion, get_copyright_info(), comp_info_str->str, runtime_info_str->str);
+        wireshark_gitversion, get_copyright_info(), comp_info_str->str, runtime_info_str->str);
 }
 
 /*
@@ -767,11 +765,7 @@ open_capture_device(interface_options *interface_opts,
 
 static void
 get_capture_device_open_failure_messages(const char *open_err_str,
-                                         const char *iface
-#ifndef _WIN32
-                                                           _U_
-#endif
-                                         ,
+                                         const char *iface,
                                          char *errmsg, size_t errmsg_len,
                                          char *secondary_errmsg,
                                          size_t secondary_errmsg_len)
@@ -782,7 +776,8 @@ get_capture_device_open_failure_messages(const char *open_err_str,
 #endif
 
     g_snprintf(errmsg, (gulong) errmsg_len,
-               "The capture session could not be initiated (%s).", open_err_str);
+               "The capture session could not be initiated on interface '%s' (%s).",
+               iface, open_err_str);
 #ifdef _WIN32
     if (!has_wpcap) {
       g_snprintf(secondary_errmsg, (gulong) secondary_errmsg_len,
@@ -842,12 +837,7 @@ get_capture_device_open_failure_messages(const char *open_err_str,
 
 /* Set the data link type on a pcap. */
 static gboolean
-set_pcap_linktype(pcap_t *pcap_h, int linktype,
-#ifdef HAVE_PCAP_SET_DATALINK
-                  char *name _U_,
-#else
-                  char *name,
-#endif
+set_pcap_linktype(pcap_t *pcap_h, int linktype, char *name,
                   char *errmsg, size_t errmsg_len,
                   char *secondary_errmsg, size_t secondary_errmsg_len)
 {
@@ -866,8 +856,8 @@ set_pcap_linktype(pcap_t *pcap_h, int linktype,
     set_linktype_err_str =
         "That DLT isn't one of the DLTs supported by this device";
 #endif
-    g_snprintf(errmsg, (gulong) errmsg_len, "Unable to set data link type (%s).",
-               set_linktype_err_str);
+    g_snprintf(errmsg, (gulong) errmsg_len, "Unable to set data link type on interface '%s' (%s).",
+               name, set_linktype_err_str);
     /*
      * If the error isn't "XXX is not one of the DLTs supported by this device",
      * tell the user to tell the Wireshark developers about it.
@@ -1361,7 +1351,7 @@ print_machine_readable_interfaces(GList *if_list)
         else
             printf("\t");
 
-        printf("%u\t", if_info->type);
+        printf("%i\t", if_info->type);
 
         for (addr = g_slist_nth(if_info->addrs, 0); addr != NULL;
                     addr = g_slist_next(addr)) {
@@ -1387,7 +1377,7 @@ print_machine_readable_interfaces(GList *if_list)
                 }
                 break;
             default:
-                printf("<type unknown %u>", if_addr->ifat_type);
+                printf("<type unknown %i>", if_addr->ifat_type);
             }
         }
 
@@ -1701,10 +1691,10 @@ cap_pipe_adjust_header(gboolean byte_swapped, struct pcap_hdr *hdr, struct pcapr
 {
     if (byte_swapped) {
         /* Byte-swap the record header fields. */
-        rechdr->ts_sec = BSWAP32(rechdr->ts_sec);
-        rechdr->ts_usec = BSWAP32(rechdr->ts_usec);
-        rechdr->incl_len = BSWAP32(rechdr->incl_len);
-        rechdr->orig_len = BSWAP32(rechdr->orig_len);
+        rechdr->ts_sec = GUINT32_SWAP_LE_BE(rechdr->ts_sec);
+        rechdr->ts_usec = GUINT32_SWAP_LE_BE(rechdr->ts_usec);
+        rechdr->incl_len = GUINT32_SWAP_LE_BE(rechdr->incl_len);
+        rechdr->orig_len = GUINT32_SWAP_LE_BE(rechdr->orig_len);
     }
 
     /* In file format version 2.3, the "incl_len" and "orig_len" fields were
@@ -1976,7 +1966,7 @@ cap_pipe_open_live(char *pipename,
     wchar_t *err_str;
 #endif
     ssize_t  b;
-    int      fd, sel_ret;
+    int      fd = -1, sel_ret;
     size_t   bytes_read;
     guint32  magic = 0;
 
@@ -2154,6 +2144,11 @@ cap_pipe_open_live(char *pipename,
         /* read the pcap header */
         bytes_read = 0;
         while (bytes_read < sizeof magic) {
+            if (fd == -1) {
+                g_snprintf(errmsg, errmsgl, "Invalid file descriptor");
+                goto error;
+            }
+
             sel_ret = cap_pipe_select(fd);
             if (sel_ret < 0) {
                 g_snprintf(errmsg, errmsgl,
@@ -2285,10 +2280,10 @@ cap_pipe_open_live(char *pipename,
 
     if (pcap_opts->cap_pipe_byte_swapped) {
         /* Byte-swap the header fields about which we care. */
-        hdr->version_major = BSWAP16(hdr->version_major);
-        hdr->version_minor = BSWAP16(hdr->version_minor);
-        hdr->snaplen = BSWAP32(hdr->snaplen);
-        hdr->network = BSWAP32(hdr->network);
+        hdr->version_major = GUINT16_SWAP_LE_BE(hdr->version_major);
+        hdr->version_minor = GUINT16_SWAP_LE_BE(hdr->version_minor);
+        hdr->snaplen = GUINT32_SWAP_LE_BE(hdr->snaplen);
+        hdr->network = GUINT32_SWAP_LE_BE(hdr->network);
     }
     pcap_opts->linktype = hdr->network;
 
@@ -2657,11 +2652,11 @@ capture_loop_open_input(capture_options *capture_opts, loop_data *ld,
             if (interface_opts.buffer_size > 1 &&
                 pcap_setbuff(pcap_opts->pcap_h, interface_opts.buffer_size * 1024 * 1024) != 0) {
                 sync_secondary_msg_str = g_strdup_printf(
-                    "The capture buffer size of %dMB seems to be too high for your machine,\n"
-                    "the default of 1MB will be used.\n"
+                    "The capture buffer size of %d MiB seems to be too high for your machine,\n"
+                    "the default of %d MiB will be used.\n"
                     "\n"
                     "Nonetheless, the capture is started.\n",
-                    interface_opts.buffer_size);
+                    interface_opts.buffer_size, DEFAULT_CAPTURE_BUFFER_SIZE);
                 report_capture_error("Couldn't set the capture buffer size!",
                                      sync_secondary_msg_str);
                 g_free(sync_secondary_msg_str);
@@ -2880,7 +2875,7 @@ capture_loop_init_output(capture_options *capture_opts, loop_data *ld, char *err
             os_info_str = g_string_new("");
             get_os_version_info(os_info_str);
 
-            g_snprintf(appname, sizeof(appname), "Dumpcap " VERSION "%s", wireshark_svnversion);
+            g_snprintf(appname, sizeof(appname), "Dumpcap " VERSION "%s", wireshark_gitversion);
             successful = pcapng_write_session_header_block(ld->pdh,
                                 (const char *)capture_opts->capture_comment,   /* Comment*/
                                 NULL,                        /* HW*/
@@ -3373,7 +3368,7 @@ do_file_switch_or_stop(capture_options *capture_opts,
                 os_info_str = g_string_new("");
                 get_os_version_info(os_info_str);
 
-                g_snprintf(appname, sizeof(appname), "Dumpcap " VERSION "%s", wireshark_svnversion);
+                g_snprintf(appname, sizeof(appname), "Dumpcap " VERSION "%s", wireshark_gitversion);
                 successful = pcapng_write_session_header_block(global_ld.pdh,
                                 NULL,                        /* Comment */
                                 NULL,                        /* HW */
@@ -3576,11 +3571,11 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct
     init_capture_stop_conditions();
     /* create stop conditions */
     if (capture_opts->has_autostop_filesize) {
-        if (capture_opts->autostop_filesize > (((guint32)INT_MAX + 1) / 1024)) {
-            capture_opts->autostop_filesize = ((guint32)INT_MAX + 1) / 1024;
+        if (capture_opts->autostop_filesize > (((guint32)INT_MAX + 1) / 1000)) {
+            capture_opts->autostop_filesize = ((guint32)INT_MAX + 1) / 1000;
         }
         cnd_autostop_size =
-            cnd_new(CND_CLASS_CAPTURESIZE, (guint64)capture_opts->autostop_filesize * 1024);
+            cnd_new(CND_CLASS_CAPTURESIZE, (guint64)capture_opts->autostop_filesize * 1000);
     }
     if (capture_opts->has_autostop_duration)
         cnd_autostop_duration =
@@ -3704,8 +3699,8 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct
         if ((cur_time - upd_time) > DUMPCAP_UPD_TIME) { /* wrap just causes an extra update */
 #else
         gettimeofday(&cur_time, NULL);
-        if ((cur_time.tv_sec * 1000000 + cur_time.tv_usec) >
-            (upd_time.tv_sec * 1000000 + upd_time.tv_usec + DUMPCAP_UPD_TIME*1000)) {
+        if (((guint64)cur_time.tv_sec * 1000000 + cur_time.tv_usec) >
+            ((guint64)upd_time.tv_sec * 1000000 + upd_time.tv_usec + DUMPCAP_UPD_TIME*1000)) {
 #endif
 
             upd_time = cur_time;
@@ -3887,6 +3882,11 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct
         if (pcap_opts->pcap_h != NULL) {
             g_assert(!pcap_opts->from_cap_pipe);
             /* Get the capture statistics, so we know how many packets were dropped. */
+            /*
+             * Older versions of libpcap didn't set ps_ifdrop on some
+             * platforms; initialize it to 0 to handle that.
+             */
+            stats->ps_ifdrop = 0;
             if (pcap_stats(pcap_opts->pcap_h, stats) >= 0) {
                 *stats_known = TRUE;
                 /* Let the parent process know. */
@@ -3898,7 +3898,7 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct
                 report_capture_error(errmsg, please_report);
             }
         }
-        report_packet_drops(received, pcap_dropped, pcap_opts->dropped, pcap_opts->flushed, interface_opts.console_display_name);
+        report_packet_drops(received, pcap_dropped, pcap_opts->dropped, pcap_opts->flushed, stats->ps_ifdrop, interface_opts.console_display_name);
     }
 
     /* close the input file (pcap or capture pipe) */
@@ -4222,7 +4222,7 @@ main(int argc, char *argv[])
            "%s"
            "\n"
            "%s",
-        wireshark_svnversion, comp_info_str->str, runtime_info_str->str);
+        wireshark_gitversion, comp_info_str->str, runtime_info_str->str);
 
 #ifdef _WIN32
     arg_list_utf_16to8(argc, argv);
@@ -5063,7 +5063,7 @@ report_cfilter_error(capture_options *capture_opts, guint i, const char *errmsg)
              */
             interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
             cmdarg_err(
-              "Invalid capture filter \"%s\" for interface %s!\n"
+              "Invalid capture filter \"%s\" for interface '%s'!\n"
               "\n"
               "That string isn't a valid capture filter (%s).\n"
               "See the User's Guide for a description of the capture filter syntax.",
@@ -5089,7 +5089,7 @@ report_capture_error(const char *error_msg, const char *secondary_error_msg)
 }
 
 static void
-report_packet_drops(guint32 received, guint32 pcap_drops, guint32 drops, guint32 flushed, gchar *name)
+report_packet_drops(guint32 received, guint32 pcap_drops, guint32 drops, guint32 flushed, guint32 ps_ifdrop, gchar *name)
 {
     char tmp[SP_DECISIZE+1+1];
     guint32 total_drops = pcap_drops + drops + flushed;
@@ -5098,14 +5098,14 @@ report_packet_drops(guint32 received, guint32 pcap_drops, guint32 drops, guint32
 
     if (capture_child) {
         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
-            "Packets received/dropped on interface %s: %u/%u (pcap:%u/dumpcap:%u/flushed:%u)",
-            name, received, total_drops, pcap_drops, drops, flushed);
+            "Packets received/dropped on interface '%s': %u/%u (pcap:%u/dumpcap:%u/flushed:%u/ps_ifdrop:%u)",
+            name, received, total_drops, pcap_drops, drops, flushed, ps_ifdrop);
         /* XXX: Need to provide interface id, changes to consumers required. */
         pipe_write_block(2, SP_DROPS, tmp);
     } else {
         fprintf(stderr,
-            "Packets received/dropped on interface '%s': %u/%u (pcap:%u/dumpcap:%u/flushed:%u) (%.1f%%)\n",
-            name, received, total_drops, pcap_drops, drops, flushed,
+            "Packets received/dropped on interface '%s': %u/%u (pcap:%u/dumpcap:%u/flushed:%u/ps_ifdrop:%u) (%.1f%%)\n",
+            name, received, total_drops, pcap_drops, drops, flushed, ps_ifdrop,
             received ? 100.0 * received / (received + total_drops) : 0.0);
         /* stderr could be line buffered */
         fflush(stderr);