aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/usage.h11
-rw-r--r--networking/arp.c72
2 files changed, 50 insertions, 33 deletions
diff --git a/include/usage.h b/include/usage.h
index d38a16e90..9f7358906 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -61,12 +61,11 @@
"\n -v Verbose" \
#define arp_trivial_usage \
- "\n" \
- "[-vn] [-H type] [-i if] -a [hostname]\n" \
- "[-v] [-i if] -d hostname [pub]\n" \
- "[-v] [-H type] [-i if] -s hostname hw_addr [temp]\n" \
- "[-v] [-H type] [-i if] -s hostname hw_addr [netmask nm] pub\n" \
- "[-v] [-H type] [-i if] -Ds hostname ifa [netmask nm] pub\n"
+ "\n[-vn] [-H type] [-i if] -a [hostname]" \
+ "\n[-v] [-i if] -d hostname [pub]" \
+ "\n[-v] [-H type] [-i if] -s hostname hw_addr [temp]" \
+ "\n[-v] [-H type] [-i if] -s hostname hw_addr [netmask nm] pub" \
+ "\n[-v] [-H type] [-i if] -Ds hostname ifa [netmask nm] pub"
#define arp_full_usage "\n\n" \
"Manipulate ARP cache\n" \
"\nOptions:" \
diff --git a/networking/arp.c b/networking/arp.c
index e2c5bbb7f..278f2dc9a 100644
--- a/networking/arp.c
+++ b/networking/arp.c
@@ -27,24 +27,40 @@
#define DFLT_AF "inet"
#define DFLT_HW "ether"
-#define ARP_OPT_A (0x1)
-#define ARP_OPT_p (0x2)
-#define ARP_OPT_H (0x4)
-#define ARP_OPT_t (0x8)
-#define ARP_OPT_i (0x10)
-#define ARP_OPT_a (0x20)
-#define ARP_OPT_d (0x40)
-#define ARP_OPT_n (0x80) /* do not resolve addresses */
-#define ARP_OPT_D (0x100) /* HW-address is devicename */
-#define ARP_OPT_s (0x200)
-#define ARP_OPT_v (0x400 * DEBUG) /* debugging output flag */
-
-
-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 */
+enum {
+ ARP_OPT_A = (1 << 0),
+ ARP_OPT_p = (1 << 1),
+ ARP_OPT_H = (1 << 2),
+ ARP_OPT_t = (1 << 3),
+ ARP_OPT_i = (1 << 4),
+ ARP_OPT_a = (1 << 5),
+ ARP_OPT_d = (1 << 6),
+ ARP_OPT_n = (1 << 7), /* do not resolve addresses */
+ ARP_OPT_D = (1 << 8), /* HW-address is devicename */
+ 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 char options[] ALIGN1 =
"pub\0"
@@ -445,27 +461,30 @@ int arp_main(int argc UNUSED_PARAM, char **argv)
{
const char *hw_type = "ether";
const char *protocol;
+ unsigned opts;
+
+ INIT_G();
- /* Initialize variables... */
+ xmove_fd(xsocket(AF_INET, SOCK_DGRAM, 0), sockfd);
ap = get_aftype(DFLT_AF);
if (!ap)
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);
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);
if (ap == NULL)
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);
if (hw == NULL)
bb_error_msg_and_die("%s: unknown %s", hw_type, "hardware type");
hw_set = 1;
}
- //if (option_mask32 & ARP_OPT_i)... -i
+ //if (opts & ARP_OPT_i)... -i
if (ap->af != AF_INET) {
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",
hw->name, "hardware type");
}
- sockfd = xsocket(AF_INET, SOCK_DGRAM, 0);
/* 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)
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_del(argv);
}
- //if (option_mask32 & ARP_OPT_a) - default
+ //if (opts & ARP_OPT_a) - default
return arp_show(argv[0]);
}