arp: stop using globals

function                                             old     new   delta
hw_set                                                 1       -      -1
arp_main                                            1559    1558      -1
sockfd                                                 8       4      -4
hw                                                     4       -      -4
device                                                 4       -      -4
ap                                                     4       -      -4
packed_usage                                       25402   25393      -9
------------------------------------------------------------------------------
(add/remove: 0/4 grow/shrink: 0/3 up/down: 0/-27)             Total: -27 bytes
This commit is contained in:
Denis Vlasenko 2008-11-13 00:05:17 +00:00
parent fd5a3d2812
commit 4d47692fb8
2 changed files with 48 additions and 31 deletions

View File

@ -61,12 +61,11 @@
"\n -v Verbose" \ "\n -v Verbose" \
#define arp_trivial_usage \ #define arp_trivial_usage \
"\n" \ "\n[-vn] [-H type] [-i if] -a [hostname]" \
"[-vn] [-H type] [-i if] -a [hostname]\n" \ "\n[-v] [-i if] -d hostname [pub]" \
"[-v] [-i if] -d hostname [pub]\n" \ "\n[-v] [-H type] [-i if] -s hostname hw_addr [temp]" \
"[-v] [-H type] [-i if] -s hostname hw_addr [temp]\n" \ "\n[-v] [-H type] [-i if] -s hostname hw_addr [netmask nm] pub" \
"[-v] [-H type] [-i if] -s hostname hw_addr [netmask nm] pub\n" \ "\n[-v] [-H type] [-i if] -Ds hostname ifa [netmask nm] pub"
"[-v] [-H type] [-i if] -Ds hostname ifa [netmask nm] pub\n"
#define arp_full_usage "\n\n" \ #define arp_full_usage "\n\n" \
"Manipulate ARP cache\n" \ "Manipulate ARP cache\n" \
"\nOptions:" \ "\nOptions:" \

View File

@ -27,24 +27,40 @@
#define DFLT_AF "inet" #define DFLT_AF "inet"
#define DFLT_HW "ether" #define DFLT_HW "ether"
#define ARP_OPT_A (0x1) enum {
#define ARP_OPT_p (0x2) ARP_OPT_A = (1 << 0),
#define ARP_OPT_H (0x4) ARP_OPT_p = (1 << 1),
#define ARP_OPT_t (0x8) ARP_OPT_H = (1 << 2),
#define ARP_OPT_i (0x10) ARP_OPT_t = (1 << 3),
#define ARP_OPT_a (0x20) ARP_OPT_i = (1 << 4),
#define ARP_OPT_d (0x40) ARP_OPT_a = (1 << 5),
#define ARP_OPT_n (0x80) /* do not resolve addresses */ ARP_OPT_d = (1 << 6),
#define ARP_OPT_D (0x100) /* HW-address is devicename */ ARP_OPT_n = (1 << 7), /* do not resolve addresses */
#define ARP_OPT_s (0x200) ARP_OPT_D = (1 << 8), /* HW-address is devicename */
#define ARP_OPT_v (0x400 * DEBUG) /* debugging output flag */ ARP_OPT_s = (1 << 9),
ARP_OPT_v = (1 << 10) * DEBUG, /* debugging output flag */
};
enum {
sockfd = 3, /* active socket descriptor */
};
struct globals {
const struct aftype *ap; /* current address family */
const struct hwtype *hw; /* current hardware type */
const char *device; /* current device */
smallint hw_set; /* flag if hw-type was set (-H) */
};
#define G (*(struct globals*)&bb_common_bufsiz1)
#define ap (G.ap )
#define hw (G.hw )
#define device (G.device )
#define hw_set (G.hw_set )
#define INIT_G() do { \
device = ""; \
} while (0)
static const struct aftype *ap; /* current address family */
static const struct hwtype *hw; /* current hardware type */
static int sockfd; /* active socket descriptor */
static smallint hw_set; /* flag if hw-type was set (-H) */
static const char *device = ""; /* current device */
static const char options[] ALIGN1 = static const char options[] ALIGN1 =
"pub\0" "pub\0"
@ -445,27 +461,30 @@ int arp_main(int argc UNUSED_PARAM, char **argv)
{ {
const char *hw_type = "ether"; const char *hw_type = "ether";
const char *protocol; const char *protocol;
unsigned opts;
/* Initialize variables... */ INIT_G();
xmove_fd(xsocket(AF_INET, SOCK_DGRAM, 0), sockfd);
ap = get_aftype(DFLT_AF); ap = get_aftype(DFLT_AF);
if (!ap) if (!ap)
bb_error_msg_and_die("%s: %s not supported", DFLT_AF, "address family"); bb_error_msg_and_die("%s: %s not supported", DFLT_AF, "address family");
getopt32(argv, "A:p:H:t:i:adnDsv", &protocol, &protocol, opts = getopt32(argv, "A:p:H:t:i:adnDsv", &protocol, &protocol,
&hw_type, &hw_type, &device); &hw_type, &hw_type, &device);
argv += optind; argv += optind;
if (option_mask32 & ARP_OPT_A || option_mask32 & ARP_OPT_p) { if (opts & (ARP_OPT_A | ARP_OPT_p)) {
ap = get_aftype(protocol); ap = get_aftype(protocol);
if (ap == NULL) if (ap == NULL)
bb_error_msg_and_die("%s: unknown %s", protocol, "address family"); bb_error_msg_and_die("%s: unknown %s", protocol, "address family");
} }
if (option_mask32 & ARP_OPT_A || option_mask32 & ARP_OPT_p) { if (opts & (ARP_OPT_A | ARP_OPT_p)) {
hw = get_hwtype(hw_type); hw = get_hwtype(hw_type);
if (hw == NULL) if (hw == NULL)
bb_error_msg_and_die("%s: unknown %s", hw_type, "hardware type"); bb_error_msg_and_die("%s: unknown %s", hw_type, "hardware type");
hw_set = 1; hw_set = 1;
} }
//if (option_mask32 & ARP_OPT_i)... -i //if (opts & ARP_OPT_i)... -i
if (ap->af != AF_INET) { if (ap->af != AF_INET) {
bb_error_msg_and_die("%s: kernel only supports 'inet'", ap->name); bb_error_msg_and_die("%s: kernel only supports 'inet'", ap->name);
@ -482,16 +501,15 @@ int arp_main(int argc UNUSED_PARAM, char **argv)
bb_error_msg_and_die("%s: %s without ARP support", bb_error_msg_and_die("%s: %s without ARP support",
hw->name, "hardware type"); hw->name, "hardware type");
} }
sockfd = xsocket(AF_INET, SOCK_DGRAM, 0);
/* Now see what we have to do here... */ /* Now see what we have to do here... */
if (option_mask32 & (ARP_OPT_d|ARP_OPT_s)) { if (opts & (ARP_OPT_d | ARP_OPT_s)) {
if (argv[0] == NULL) if (argv[0] == NULL)
bb_error_msg_and_die("need host name"); bb_error_msg_and_die("need host name");
if (option_mask32 & ARP_OPT_s) if (opts & ARP_OPT_s)
return arp_set(argv); return arp_set(argv);
return arp_del(argv); return arp_del(argv);
} }
//if (option_mask32 & ARP_OPT_a) - default //if (opts & ARP_OPT_a) - default
return arp_show(argv[0]); return arp_show(argv[0]);
} }