traceroute: stop using global data/bss

(add/remove: 0/15 grow/shrink: 0/1 up/down: 0/-95)            Total: -95 bytes
   text    data     bss     dec     hex filename
 777245    1094    9008  787347   c0393 busybox_old
 777206    1084    8976  787266   c0342 busybox_unstripped

diff --git a/networking/traceroute.c b/networking/traceroute.c
index 773fc6a..2ba558f 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -22,9 +22,6 @@
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-//#define version "1.4a12"
-
-
 /*
  * traceroute host  - trace the route ip packets follow going to "host".
  *
@@ -272,12 +269,12 @@
 };
 
 /* Data section of the probe packet */
-struct outdata {
+typedef struct outdata {
 	unsigned char seq;             /* sequence number of this packet */
 	unsigned char ttl;             /* ttl packet left with */
 // UNUSED. Retaining to have the same packet size.
 	struct timeval tv_UNUSED ATTRIBUTE_PACKED; /* time packet left */
-};
+} outdata_t;
 
 struct IFADDRLIST {
 	uint32_t addr;
@@ -285,37 +282,6 @@
 };
 
 
-static struct ip *outip;               /* last output (udp) packet */
-static struct udphdr *outudp;          /* last output (udp) packet */
-static struct outdata *outdata;        /* last output (udp) packet */
-
-#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
-static struct icmp *outicmp;           /* last output (icmp) packet */
-#endif
-
-static int s;                          /* receive (icmp) socket file descriptor */
-static int sndsock;                    /* send (udp/icmp) socket file descriptor */
-
-static int packlen;                    /* total length of packet */
-static int minpacket;                  /* min ip packet size */
-static int maxpacket = 32 * 1024;      /* max ip packet size */
-static int pmtu;                       /* Path MTU Discovery (RFC1191) */
-
-static char *hostname;
-
-static uint16_t ident;
-static uint16_t port = 32768 + 666;     /* start udp dest port # for probe packets */
-
-static int waittime = 5;               /* time to wait for response (in seconds) */
-static int doipcksum = 1;              /* calculate ip checksums by default */
-
-#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
-static int optlen;                     /* length of ip options */
-#else
-#define optlen 0
-#endif
-
-
 /* Keep in sync with getopt32 call! */
 #define OPT_DONT_FRAGMNT (1<<0)    /* F */
 #define OPT_USE_ICMP     (1<<1)    /* I */
@@ -346,6 +312,36 @@
 
 
 struct globals {
+	struct ip *outip;               /* last output (udp) packet */
+	struct udphdr *outudp;          /* last output (udp) packet */
+	struct outdata *outdata;        /* last output (udp) packet */
+
+#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
+	struct icmp *outicmp;           /* last output (icmp) packet */
+#endif
+
+	int rcvsock;                    /* receive (icmp) socket file descriptor */
+	int sndsock;                    /* send (udp/icmp) socket file descriptor */
+
+	int packlen;                    /* total length of packet */
+	int minpacket;                  /* min ip packet size */
+	int maxpacket; // 32 * 1024;    /* max ip packet size */
+	int pmtu;                       /* Path MTU Discovery (RFC1191) */
+
+	char *hostname;
+
+	uint16_t ident;
+	uint16_t port; // 32768 + 666;  /* start udp dest port # for probe packets */
+
+	int waittime; // 5;             /* time to wait for response (in seconds) */
+	int doipcksum; // 1;            /* calculate ip checksums by default */
+
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
+	int optlen;                     /* length of ip options */
+#else
+#define optlen 0
+#endif
+
 	struct sockaddr_storage whereto;        /* Who to try to reach */
 	struct sockaddr_storage wherefrom;      /* Who we are */
 	/* last inbound (icmp) packet */
@@ -359,11 +355,35 @@
 };
 
 #define G (*ptr_to_globals)
-#define INIT_G() PTR_TO_GLOBALS = xzalloc(sizeof(G))
+#define outip     (G.outip    )
+#define outudp    (G.outudp   )
+#define outdata   (G.outdata  )
+#define outicmp   (G.outicmp  )
+#define rcvsock   (G.rcvsock  )
+#define sndsock   (G.sndsock  )
+#define packlen   (G.packlen  )
+#define minpacket (G.minpacket)
+#define maxpacket (G.maxpacket)
+#define pmtu      (G.pmtu     )
+#define hostname  (G.hostname )
+#define ident     (G.ident    )
+#define port      (G.port     )
+#define waittime  (G.waittime )
+#define doipcksum (G.doipcksum)
+#if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
+#define optlen    (G.optlen   )
+#endif
 #define packet    (G.packet   )
 #define whereto   (G.whereto  )
 #define wherefrom (G.wherefrom)
 #define gwlist    (G.gwlist   )
+#define INIT_G() do { \
+	PTR_TO_GLOBALS = xzalloc(sizeof(G)); \
+	maxpacket = 32 * 1024; \
+	port = 32768 + 666; \
+	waittime = 5; \
+	doipcksum = 1; \
+} while (0)
 
 
 /*
@@ -1035,15 +1055,15 @@
 	/* Ensure the socket fds won't be 0, 1 or 2 */
 	bb_sanitize_stdio();
 
-	s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
+	rcvsock = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
 
 #if TRACEROUTE_SO_DEBUG
 	if (op & OPT_DEBUG)
-		setsockopt(s, SOL_SOCKET, SO_DEBUG,
+		setsockopt(rcvsock, SOL_SOCKET, SO_DEBUG,
 				&const_int_1, sizeof(const_int_1));
 #endif
 	if (op & OPT_BYPASS_ROUTE)
-		setsockopt(s, SOL_SOCKET, SO_DONTROUTE,
+		setsockopt(rcvsock, SOL_SOCKET, SO_DONTROUTE,
 				&const_int_1, sizeof(const_int_1));
 
 	sndsock = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW);
@@ -1124,7 +1144,7 @@
 		outicmp = (struct icmp *)outp;
 		outicmp->icmp_type = ICMP_ECHO;
 		outicmp->icmp_id = htons(ident);
-		outdata = (struct outdata *)(outp + 8); /* XXX magic number */
+		outdata = (outdata_t *)(outp + 8); /* XXX magic number */
 	} else
 #endif
 	{
@@ -1132,7 +1152,7 @@
 		outudp = (struct udphdr *)outp;
 		outudp->source = htons(ident);
 		outudp->len = htons((uint16_t)(packlen - (sizeof(*outip) + optlen)));
-		outdata = (struct outdata *)(outudp + 1);
+		outdata = (outdata_t *)(outudp + 1);
 	}
 
 	/* Get the interface address list */
@@ -1214,7 +1234,7 @@
 			t1 = monotonic_us();
 			send_probe(++seq, ttl);
 			++sentfirst;
-			while ((cc = wait_for_reply(s, from)) != 0) {
+			while ((cc = wait_for_reply(rcvsock, from)) != 0) {
 				t2 = monotonic_us();
 				i = packet_ok(packet, cc, from, seq);
 				/* Skip short packet */