Only say we have a new resolved MAC address if it's actually *new*.
[metze/wireshark/wip.git] / text2pcap.c
index 7cd67e44fb7580f8edb2f7d4b46b98560222dfd2..bc958cbb4fe15c4aa538d35b8c2196407f5c516c 100644 (file)
 #include <string.h>
 #include <wsutil/file_util.h>
 #include <wsutil/crash_info.h>
+#include <wsutil/ws_diag_control.h>
 #include <wsutil/ws_version_info.h>
+#include <wsutil/inet_addr.h>
 
 #include <time.h>
 #include <glib.h>
 
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
 #endif
 
 #include "pcapio.h"
 #include "text2pcap.h"
-#include "version_info.h"
 
 #ifdef _WIN32
 #include <wsutil/unicode-utils.h>
 #endif /* _WIN32 */
 
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-
-#ifdef HAVE_WINSOCK2_H
-#include <winsock2.h>       /* needed to define AF_ values on Windows */
-#endif
-
-#ifndef HAVE_INET_ATON
-# include "wsutil/inet_aton.h"
-#endif
-
-#ifdef HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-
-#ifdef NEED_INET_V6DEFS_H
-# include "wsutil/inet_v6defs.h"
-#endif
-
 /*--- Options --------------------------------------------------------------------*/
 
 /* File format */
@@ -190,9 +167,9 @@ static long hdr_ip_proto = 0;
 /* Destination and source addresses for IP header */
 static guint32 hdr_ip_dest_addr = 0;
 static guint32 hdr_ip_src_addr = 0;
-static guint8 hdr_ipv6_dest_addr[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-static guint8 hdr_ipv6_src_addr[16]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-static guint8 NO_IPv6_ADDRESS[16]    = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static struct e_in6_addr hdr_ipv6_dest_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+static struct e_in6_addr hdr_ipv6_src_addr  = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+static struct e_in6_addr NO_IPv6_ADDRESS    = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
 
 /* Dummy UDP header */
 static int     hdr_udp       = FALSE;
@@ -352,17 +329,6 @@ static struct {         /* pseudo header for checksum calculation */
 
 /* headers taken from glibc */
 
-/* IPv6 address */
-struct hdr_in6_addr
-{
-    union
-    {
-       guint8  __u6_addr8[16];
-       guint16 __u6_addr16[8];
-       guint32 __u6_addr32[4];
-    } __in6_u;
-};
-
 typedef struct {
     union  {
         struct ip6_hdrctl {
@@ -373,15 +339,15 @@ typedef struct {
         } ip6_un1;
         guint8 ip6_un2_vfc;       /* 4 bits version, 4 bits priority */
     } ip6_ctlun;
-    struct hdr_in6_addr ip6_src;      /* source address */
-    struct hdr_in6_addr ip6_dst;      /* destination address */
+    struct e_in6_addr ip6_src;      /* source address */
+    struct e_in6_addr ip6_dst;      /* destination address */
 } hdr_ipv6_t;
 
 static hdr_ipv6_t HDR_IPv6;
 
 static struct {                 /* pseudo header ipv6 for checksum calculation */
-    struct  hdr_in6_addr src_addr6;
-    struct  hdr_in6_addr dst_addr6;
+    struct  e_in6_addr src_addr6;
+    struct  e_in6_addr dst_addr6;
     guint32 protocol;
     guint32 zero;
 } pseudoh6;
@@ -705,10 +671,10 @@ write_current_packet (gboolean cont)
             HDR_IP.hdr_checksum = in_checksum(&HDR_IP, sizeof(HDR_IP));
             write_bytes((const char *)&HDR_IP, sizeof(HDR_IP));
         } else if (hdr_ipv6) {
-            if (memcmp(isInbound ? hdr_ipv6_dest_addr : hdr_ipv6_src_addr, NO_IPv6_ADDRESS, sizeof(struct hdr_in6_addr)))
-                memcpy(&HDR_IPv6.ip6_src, isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, sizeof(struct hdr_in6_addr));
-            if (memcmp(isInbound ? hdr_ipv6_src_addr : hdr_ipv6_dest_addr, NO_IPv6_ADDRESS, sizeof(struct hdr_in6_addr)))
-                memcpy(&HDR_IPv6.ip6_dst, isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, sizeof(struct hdr_in6_addr));
+            if (memcmp(isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, &NO_IPv6_ADDRESS, sizeof(struct e_in6_addr)))
+                memcpy(&HDR_IPv6.ip6_src, isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, sizeof(struct e_in6_addr));
+            if (memcmp(isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, &NO_IPv6_ADDRESS, sizeof(struct e_in6_addr)))
+                memcpy(&HDR_IPv6.ip6_dst, isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, sizeof(struct e_in6_addr));
 
             HDR_IPv6.ip6_ctlun.ip6_un2_vfc &= 0x0F;
             HDR_IPv6.ip6_ctlun.ip6_un2_vfc |= (6<< 4);
@@ -921,22 +887,21 @@ write_file_header (void)
     gboolean success;
 
     if (use_pcapng) {
-#ifdef GITVERSION
-        const char *appname = "text2pcap (" GITVERSION " from " GITBRANCH ")";
-#else
-        const char *appname = "text2pcap";
-#endif
-        char comment[100];
+        char *appname;
+        char *comment;
 
-        g_snprintf(comment, sizeof(comment), "Generated from input file %s.", input_filename);
+        appname = g_strdup_printf("text2pcap (Wireshark) %s", get_ws_vcs_version_info());
+        comment = g_strdup_printf("Generated from input file %s.", input_filename);
         success = pcapng_write_session_header_block(output_file,
                                                     comment,
-                                                    NULL,
-                                                    NULL,
+                                                    NULL,    /* HW */
+                                                    NULL,    /* OS */
                                                     appname,
-                                                    -1,
+                                                    -1,      /* section_length */
                                                     &bytes_written,
                                                     &err);
+        g_free(appname);
+        g_free(comment);
         if (success) {
             success = pcapng_write_interface_description_block(output_file,
                                                                NULL,
@@ -963,34 +928,6 @@ write_file_header (void)
     }
 }
 
-static void
-write_file_trailer (void)
-{
-    int      err;
-    gboolean success;
-
-    if (use_pcapng) {
-        success = pcapng_write_interface_statistics_block(output_file,
-                                                          0,
-                                                          &bytes_written,
-                                                          "Counters provided by text2pcap",
-                                                          0,
-                                                          0,
-                                                          num_packets_written,
-                                                          num_packets_written - num_packets_written,
-                                                          &err);
-
-    } else {
-        success = TRUE;
-    }
-    if (!success) {
-        fprintf(stderr, "File write error [%s] : %s\n",
-                output_filename, g_strerror(err));
-        exit(1);
-    }
-   return;
-}
-
 /*----------------------------------------------------------------------
  * Append a token to the packet preamble.
  */
@@ -1282,9 +1219,10 @@ parse_token (token_t token, char *str)
                     write_current_packet(FALSE);
                     state = INIT;
                 }
-            } else
+            } else {
                 state = READ_OFFSET;
-                pkt_lnstart = packet_buf + num;
+            }
+            pkt_lnstart = packet_buf + num;
             break;
         case T_EOL:
             state = START_OF_LINE;
@@ -1537,8 +1475,8 @@ parse_options (int argc, char *argv[])
     int   c;
     char *p;
     static const struct option long_options[] = {
-        {(char *)"help", no_argument, NULL, 'h'},
-        {(char *)"version", no_argument, NULL, 'v'},
+        {"help", no_argument, NULL, 'h'},
+        {"version", no_argument, NULL, 'v'},
         {0, 0, 0, 0 }
     };
 
@@ -1547,13 +1485,11 @@ parse_options (int argc, char *argv[])
     create_app_running_mutex();
 #endif /* _WIN32 */
 
-    /* Assemble the compile-time version information string */
-    comp_info_str = g_string_new("Compiled ");
-    get_compiled_version_info(comp_info_str, NULL, get_text2pcap_compiled_info);
+    /* Get the compile-time version information string */
+    comp_info_str = get_compiled_version_info(NULL, get_text2pcap_compiled_info);
 
-    /* Assemble the run-time version information string */
-    runtime_info_str = g_string_new("Running ");
-    get_runtime_version_info(runtime_info_str, get_text2pcap_runtime_info);
+    /* get the run-time version information string */
+    runtime_info_str = get_runtime_version_info(get_text2pcap_runtime_info);
 
     /* Add it to the information to be reported on a crash. */
     ws_add_crash_info("Text2pcap (Wireshark) %s\n"
@@ -1569,7 +1505,7 @@ parse_options (int argc, char *argv[])
         case 'h':
             printf("Text2pcap (Wireshark) %s\n"
                    "Generate a capture file from an ASCII hexdump of packets.\n"
-                   "See http://www.wireshark.org for more information.\n",
+                   "See https://www.wireshark.org for more information.\n",
                    get_ws_vcs_version_info());
             print_usage(stdout);
             exit(0);
@@ -1800,13 +1736,13 @@ parse_options (int argc, char *argv[])
             hdr_ethernet = TRUE;
 
             if (hdr_ipv6 == TRUE) {
-                if (inet_pton( AF_INET6, optarg, hdr_ipv6_src_addr) <= 0) {
+                if (!ws_inet_pton6(optarg, &hdr_ipv6_src_addr)) {
                         fprintf(stderr, "Bad src addr -%c '%s'\n", c, p);
                         print_usage(stderr);
                         exit(1);
                 }
             } else {
-                if (inet_pton( AF_INET, optarg, &hdr_ip_src_addr) <= 0) {
+                if (!ws_inet_pton4(optarg, &hdr_ip_src_addr)) {
                         fprintf(stderr, "Bad src addr -%c '%s'\n", c, p);
                         print_usage(stderr);
                         exit(1);
@@ -1821,13 +1757,13 @@ parse_options (int argc, char *argv[])
             }
 
             if (hdr_ipv6 == TRUE) {
-                if (inet_pton( AF_INET6, p, hdr_ipv6_dest_addr) <= 0) {
+                if (!ws_inet_pton6(p, &hdr_ipv6_dest_addr)) {
                         fprintf(stderr, "Bad dest addr for -%c '%s'\n", c, p);
                         print_usage(stderr);
                         exit(1);
                 }
             } else {
-                if (inet_pton( AF_INET, p, &hdr_ip_dest_addr) <= 0) {
+                if (!ws_inet_pton4(p, &hdr_ip_dest_addr)) {
                         fprintf(stderr, "Bad dest addr for -%c '%s'\n", c, p);
                         print_usage(stderr);
                         exit(1);
@@ -1911,7 +1847,7 @@ parse_options (int argc, char *argv[])
                              hdr_src_port, hdr_dest_port);
         if (hdr_sctp) fprintf(stderr, "Generate dummy SCTP header: Source port: %u. Dest port: %u. Tag: %u\n",
                               hdr_sctp_src, hdr_sctp_dest, hdr_sctp_tag);
-        if (hdr_data_chunk) fprintf(stderr, "Generate dummy DATA chunk header: TSN: %u. SID: %d. SSN: %d. PPID: %u\n",
+        if (hdr_data_chunk) fprintf(stderr, "Generate dummy DATA chunk header: TSN: %u. SID: %u. SSN: %u. PPID: %u\n",
                                     hdr_data_chunk_tsn, hdr_data_chunk_sid, hdr_data_chunk_ssn, hdr_data_chunk_ppid);
     }
 }
@@ -1955,7 +1891,6 @@ main(int argc, char *argv[])
     yylex();
 
     write_current_packet(FALSE);
-    write_file_trailer();
     fclose(input_file);
     fclose(output_file);
     if (debug)