From 56f8f399a20275a4a73ebc4450bd8eeba7ee1656 Mon Sep 17 00:00:00 2001
From: Tobias Klauser <tklauser@distanz.ch>
Date: Wed, 19 Aug 2020 13:13:54 +0200
Subject: [PATCH] mausezahn: move variable definitions from mz.h to mausezahn.c

Move variable definitions to avoid "multiple definition of symbol"
linker errors with gcc-10.

Fixes #216

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
[Retrieved from:
https://github.com/netsniff-ng/netsniff-ng/commit/56f8f399a20275a4a73ebc4450bd8eeba7ee1656]
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
 staging/mausezahn.c | 46 ++++++++++++++++++++++++++++++++++++++++
 staging/mz.h        | 51 +++++++++++++++++++++++++--------------------
 2 files changed, 74 insertions(+), 23 deletions(-)

diff --git a/staging/mausezahn.c b/staging/mausezahn.c
index 19d2937a..cae57a1b 100644
--- a/staging/mausezahn.c
+++ b/staging/mausezahn.c
@@ -32,8 +32,54 @@
 #include "die.h"
 #include "dev.h"
 
+enum operating_modes mode;
+
+int ipv6_mode;
+int quiet;           // don't even print 'important standard short messages'
+int verbose;         // report character
+int simulate;        // if 1 then don't really send frames
+
+char path[256];
+char filename[256];
+FILE *fp, *fp2;             // global multipurpose file pointer
+
+long double total_d;
+clock_t mz_start, mz_stop;
+
+int mz_rand;
+int bwidth;
+
+int32_t
+  jitter[TIME_COUNT_MAX];
+
+int
+  rtp_log,
+  time0_flag,        // If set then time0 has valid data
+  sqnr0_flag;
+
+u_int8_t
+  mz_ssrc[4];     // holds RTP stream identifier for rcv_rtp()
+
+u_int16_t
+  sqnr_cur,
+  sqnr_last,
+  sqnr_next;
+
+u_int32_t
+  gind,      // a global index to run through deltaRX, deltaTX, and jitter
+  gind_max;  // the amount of entries used in the (ugly oversized) arrays; per default set to TIME_COUNT
+
+struct tx_struct tx;  // NOTE: tx elements are considered as default values for MOPS
+
+struct device_struct device_list[MZ_MAX_DEVICES];
+
+int device_list_entries;
+
 int verbose_level = 0;
 
+char mz_default_config_path[256];
+char mz_default_log_path[256];
+
 static const char *short_options = "46hqvVSxra:A:b:B:c:d:E:f:F:l:p:P:R:t:T:M:Q:X:";
 
 static void signal_handler(int number)
diff --git a/staging/mz.h b/staging/mz.h
index 42e64cfc..33e74e60 100644
--- a/staging/mz.h
+++ b/staging/mz.h
@@ -108,8 +108,8 @@ static inline void verbose_l2(const char *format, ...)
 #define IPADDRSIZE 46
 
 
-char mz_default_config_path[256];
-char mz_default_log_path[256];
+extern char mz_default_config_path[256];
+extern char mz_default_log_path[256];
 
 
 struct arp_table_struct {
@@ -159,9 +159,11 @@ struct device_struct
    	struct pcap     *p_arp;                  // pcap handle
 	struct arp_table_struct *arp_table; // dedicated ARP table
 	int        ps;                    // packet socket
-} device_list[MZ_MAX_DEVICES];
+};
+
+extern struct device_struct device_list[MZ_MAX_DEVICES];
 
-int device_list_entries;
+extern int device_list_entries;
                
 
 #pragma pack(1)
@@ -270,46 +272,47 @@ enum operating_modes
 	SYSLOG,
 	LLDP,
 	IGMP
-} mode;
+};
 
+extern enum operating_modes mode;
 
-int ipv6_mode;
-int quiet;           // don't even print 'important standard short messages'
-int verbose;         // report character
-int simulate;        // if 1 then don't really send frames
+extern int ipv6_mode;
+extern int quiet;           // don't even print 'important standard short messages'
+extern int verbose;         // report character
+extern int simulate;        // if 1 then don't really send frames
 
-char path[256];
-char filename[256];
-FILE *fp, *fp2;             // global multipurpose file pointer
+extern char path[256];
+extern char filename[256];
+extern FILE *fp, *fp2;             // global multipurpose file pointer
 
-long double total_d;
-clock_t mz_start, mz_stop;
+extern long double total_d;
+extern clock_t mz_start, mz_stop;
 
-int mz_rand;
-int bwidth;
+extern int mz_rand;
+extern int bwidth;
 
 struct mz_timestamp {
 	u_int32_t sec; 
 	u_int32_t nsec;
 };
 
-int32_t
-  jitter[TIME_COUNT_MAX];   
+extern int32_t
+  jitter[TIME_COUNT_MAX];
 
-int 
+extern int
   rtp_log,
   time0_flag,        // If set then time0 has valid data
   sqnr0_flag;  
 
-u_int8_t
+extern u_int8_t
   mz_ssrc[4];     // holds RTP stream identifier for rcv_rtp()
 
-u_int16_t 
+extern u_int16_t
   sqnr_cur,
   sqnr_last, 
   sqnr_next;
 
-u_int32_t
+extern u_int32_t
   gind,      // a global index to run through deltaRX, deltaTX, and jitter
   gind_max;  // the amount of entries used in the (ugly oversized) arrays; per default set to TIME_COUNT
 
@@ -476,7 +479,9 @@ struct tx_struct
      rtp_sqnr,
      rtp_stmp;
    
-} tx;  // NOTE: tx elements are considered as default values for MOPS
+};
+
+extern struct tx_struct tx;  // NOTE: tx elements are considered as default values for MOPS
 
 // ************************************
 //