summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-06-04 10:33:48 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-06-04 10:33:48 +0000
commit821cc25f435fa4b463f20669b2b9baf198ea04c4 (patch)
tree5ca7ad997400931e6d978111e43715f43cffb949
parent74324c86663f57a19c1de303ee8c8e5449db9ef2 (diff)
ping: stop using data/bss
function old new delta ping_main 375 392 +17 unpack_tail 317 320 +3 ping4 525 528 +3 ping6 772 773 +1 sendping6 99 98 -1 sendping4 184 183 -1 myid 2 - -2 sendping_tail 154 151 -3 tsum 4 - -4 tmin 4 - -4 tmax 4 - -4 source_lsa 4 - -4 pingsock 4 - -4 pingcount 4 - -4 ntransmitted 4 - -4 nrepeats 4 - -4 nreceived 4 - -4 if_index 4 - -4 hostname 8 4 -4 dotted 4 - -4 datalen 4 - -4 pingaddr 28 - -28 rcvd_tbl 128 - -128 ------------------------------------------------------------------------------ (add/remove: 0/15 grow/shrink: 4/4 up/down: 24/-215) Total: -191 bytes text data bss dec hex filename 679835 2728 16736 699299 aaba3 busybox_old 679851 2720 16536 699107 aaae3 busybox_unstripped
-rw-r--r--networking/ping.c62
1 files changed, 44 insertions, 18 deletions
diff --git a/networking/ping.c b/networking/ping.c
index 9db3180f1..6b5045eb3 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -235,27 +235,51 @@ enum {
};
-static union {
- struct sockaddr sa;
- struct sockaddr_in sin;
+struct globals {
+ int pingsock;
+ len_and_sockaddr *source_lsa;
+ unsigned datalen;
+ int if_index;
+ unsigned long ntransmitted, nreceived, nrepeats, pingcount;
+ uint16_t myid;
+ unsigned tmin, tmax;
+ unsigned long tsum;
+ const char *hostname;
+ const char *dotted;
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
#if ENABLE_PING6
- struct sockaddr_in6 sin6;
+ struct sockaddr_in6 sin6;
#endif
-} pingaddr;
-static len_and_sockaddr *source_lsa;
-static int pingsock = -1;
-static unsigned datalen; /* intentionally uninitialized to work around gcc bug */
-
-static int if_index;
-
-static unsigned long ntransmitted, nreceived, nrepeats, pingcount;
-static uint16_t myid;
-static unsigned tmin = UINT_MAX, tmax;
-static unsigned long tsum;
-static char rcvd_tbl[MAX_DUP_CHK / 8];
+ } pingaddr;
+ char rcvd_tbl[MAX_DUP_CHK / 8];
+};
+#define G (*(struct globals*)&bb_common_bufsiz1)
+#define pingsock (G.pingsock )
+#define source_lsa (G.source_lsa )
+#define datalen (G.datalen )
+#define if_index (G.if_index )
+#define ntransmitted (G.ntransmitted)
+#define nreceived (G.nreceived )
+#define nrepeats (G.nrepeats )
+#define pingcount (G.pingcount )
+#define myid (G.myid )
+#define tmin (G.tmin )
+#define tmax (G.tmax )
+#define tsum (G.tsum )
+#define hostname (G.hostname )
+#define dotted (G.dotted )
+#define pingaddr (G.pingaddr )
+#define rcvd_tbl (G.rcvd_tbl )
+void BUG_ping_globals_too_big(void);
+#define INIT_G() do { \
+ if (sizeof(G) > COMMON_BUFSIZE) \
+ BUG_ping_globals_too_big(); \
+ pingsock = -1; \
+ tmin = UINT_MAX; \
+} while (0)
-static const char *hostname;
-static const char *dotted;
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
@@ -652,6 +676,8 @@ int ping_main(int argc, char **argv)
char *opt_c, *opt_s, *opt_I;
USE_PING6(sa_family_t af = AF_UNSPEC;)
+ INIT_G();
+
datalen = DEFDATALEN; /* initialized here rather than in global scope to work around gcc bug */
/* exactly one argument needed, -v and -q don't mix */