projects
/
oweals
/
busybox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ntpd: speed up reaction to poll interval decrease
[oweals/busybox.git]
/
networking
/
arping.c
diff --git
a/networking/arping.c
b/networking/arping.c
index 6a17b18eebdb467c2413cdfb324becb45be902ef..e3418a9459bbe0a781b0fbaa38a91ff6db7cabcf 100644
(file)
--- a/
networking/arping.c
+++ b/
networking/arping.c
@@
-61,10
+61,16
@@
struct globals {
#define received (G.received )
#define brd_recv (G.brd_recv )
#define req_recv (G.req_recv )
#define received (G.received )
#define brd_recv (G.brd_recv )
#define req_recv (G.req_recv )
-#define INIT_G() \
- do { \
- count = -1; \
- } while (0)
+#define INIT_G() do { \
+ count = -1; \
+} while (0)
+
+// If GNUisms are not available...
+//static void *mempcpy(void *_dst, const void *_src, int n)
+//{
+// memcpy(_dst, _src, n);
+// return (char*)_dst + n;
+//}
static int send_pack(struct in_addr *src_addr,
struct in_addr *dst_addr, struct sockaddr_ll *ME,
static int send_pack(struct in_addr *src_addr,
struct in_addr *dst_addr, struct sockaddr_ll *ME,
@@
-75,27
+81,21
@@
static int send_pack(struct in_addr *src_addr,
struct arphdr *ah = (struct arphdr *) buf;
unsigned char *p = (unsigned char *) (ah + 1);
struct arphdr *ah = (struct arphdr *) buf;
unsigned char *p = (unsigned char *) (ah + 1);
- ah->ar_hrd = htons(ME->sll_hatype);
ah->ar_hrd = htons(ARPHRD_ETHER);
ah->ar_pro = htons(ETH_P_IP);
ah->ar_hln = ME->sll_halen;
ah->ar_pln = 4;
ah->ar_op = option_mask32 & ADVERT ? htons(ARPOP_REPLY) : htons(ARPOP_REQUEST);
ah->ar_hrd = htons(ARPHRD_ETHER);
ah->ar_pro = htons(ETH_P_IP);
ah->ar_hln = ME->sll_halen;
ah->ar_pln = 4;
ah->ar_op = option_mask32 & ADVERT ? htons(ARPOP_REPLY) : htons(ARPOP_REQUEST);
- memcpy(p, &ME->sll_addr, ah->ar_hln);
- p += ME->sll_halen;
-
- memcpy(p, src_addr, 4);
- p += 4;
+ p = mempcpy(p, &ME->sll_addr, ah->ar_hln);
+ p = mempcpy(p, src_addr, 4);
if (option_mask32 & ADVERT)
if (option_mask32 & ADVERT)
-
mem
cpy(p, &ME->sll_addr, ah->ar_hln);
+
p = memp
cpy(p, &ME->sll_addr, ah->ar_hln);
else
else
- memcpy(p, &HE->sll_addr, ah->ar_hln);
- p += ah->ar_hln;
+ p = mempcpy(p, &HE->sll_addr, ah->ar_hln);
- memcpy(p, dst_addr, 4);
- p += 4;
+ p = mempcpy(p, dst_addr, 4);
err = sendto(sock_fd, buf, p - buf, 0, (struct sockaddr *) HE, sizeof(*HE));
if (err == p - buf) {
err = sendto(sock_fd, buf, p - buf, 0, (struct sockaddr *) HE, sizeof(*HE));
if (err == p - buf) {
@@
-107,7
+107,7
@@
static int send_pack(struct in_addr *src_addr,
return err;
}
return err;
}
-static void finish(void)
ATTRIBUTE_
NORETURN;
+static void finish(void) NORETURN;
static void finish(void)
{
if (!(option_mask32 & QUIET)) {
static void finish(void)
{
if (!(option_mask32 & QUIET)) {
@@
-153,6
+153,15
@@
static bool recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM)
struct arphdr *ah = (struct arphdr *) buf;
unsigned char *p = (unsigned char *) (ah + 1);
struct in_addr src_ip, dst_ip;
struct arphdr *ah = (struct arphdr *) buf;
unsigned char *p = (unsigned char *) (ah + 1);
struct in_addr src_ip, dst_ip;
+ /* moves below assume in_addr is 4 bytes big, ensure that */
+ struct BUG_in_addr_must_be_4 {
+ char BUG_in_addr_must_be_4[
+ sizeof(struct in_addr) == 4 ? 1 : -1
+ ];
+ char BUG_s_addr_must_be_4[
+ sizeof(src_ip.s_addr) == 4 ? 1 : -1
+ ];
+ };
/* Filter out wild packets */
if (FROM->sll_pkttype != PACKET_HOST
/* Filter out wild packets */
if (FROM->sll_pkttype != PACKET_HOST
@@
-160,7
+169,7
@@
static bool recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM)
&& FROM->sll_pkttype != PACKET_MULTICAST)
return false;
&& FROM->sll_pkttype != PACKET_MULTICAST)
return false;
- /* Only these types are recogni
s
ed */
+ /* Only these types are recogni
z
ed */
if (ah->ar_op != htons(ARPOP_REQUEST) && ah->ar_op != htons(ARPOP_REPLY))
return false;
if (ah->ar_op != htons(ARPOP_REQUEST) && ah->ar_op != htons(ARPOP_REPLY))
return false;
@@
-171,13
+180,13
@@
static bool recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM)
/* Protocol must be IP. */
if (ah->ar_pro != htons(ETH_P_IP)
/* Protocol must be IP. */
if (ah->ar_pro != htons(ETH_P_IP)
-
|| (ah->ar_pln != 4)
-
|| (ah->ar_hln != me.sll_halen)
-
|| (len < sizeof(*ah) + 2 * (4 + ah->ar_hln
)))
+ || (ah->ar_pln != 4)
+ || (ah->ar_hln != me.sll_halen)
+
|| (len < (int)(sizeof(*ah) + 2 * (4 + ah->ar_hln)
)))
return false;
return false;
- m
emcpy(&src_ip, p + ah->ar_hln, 4
);
- m
emcpy(&dst_ip, p + ah->ar_hln + 4 + ah->ar_hln, 4
);
+ m
ove_from_unaligned32(src_ip.s_addr, p + ah->ar_hln
);
+ m
ove_from_unaligned32(dst_ip.s_addr, p + ah->ar_hln + 4 + ah->ar_hln
);
if (dst.s_addr != src_ip.s_addr)
return false;
if (dst.s_addr != src_ip.s_addr)
return false;
@@
-200,7
+209,7
@@
static bool recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM)
dst_ip/dst_hw do not matter.
*/
if ((memcmp(p, &me.sll_addr, me.sll_halen) == 0)
dst_ip/dst_hw do not matter.
*/
if ((memcmp(p, &me.sll_addr, me.sll_halen) == 0)
-
|| (src.s_addr && src.s_addr != dst_ip.s_addr))
+ || (src.s_addr && src.s_addr != dst_ip.s_addr))
return false;
}
if (!(option_mask32 & QUIET)) {
return false;
}
if (!(option_mask32 & QUIET)) {
@@
-228,7
+237,7
@@
static bool recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM)
} else {
printf(" UNSOLICITED?\n");
}
} else {
printf(" UNSOLICITED?\n");
}
- fflush
(stdout
);
+ fflush
_all(
);
}
received++;
if (FROM->sll_pkttype != PACKET_HOST)
}
received++;
if (FROM->sll_pkttype != PACKET_HOST)
@@
-245,7
+254,7
@@
static bool recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM)
}
int arping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
}
int arping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int arping_main(int argc
ATTRIBUTE_UNUSED
, char **argv)
+int arping_main(int argc
UNUSED_PARAM
, char **argv)
{
const char *device = "eth0";
char *source = NULL;
{
const char *device = "eth0";
char *source = NULL;
@@
-264,16
+273,14
@@
int arping_main(int argc ATTRIBUTE_UNUSED, char **argv)
err_str = xasprintf("interface %s %%s", device);
{
unsigned opt;
err_str = xasprintf("interface %s %%s", device);
{
unsigned opt;
- char *str_
count, *str_
timeout;
+ char *str_timeout;
/* Dad also sets quit_on_reply.
* Advert also sets unsolicited.
*/
/* Dad also sets quit_on_reply.
* Advert also sets unsolicited.
*/
- opt_complementary = "=1:Df:AU";
+ opt_complementary = "=1:Df:AU
:c+
";
opt = getopt32(argv, "DUAqfbc:w:I:s:",
opt = getopt32(argv, "DUAqfbc:w:I:s:",
- &str_count, &str_timeout, &device, &source);
- if (opt & 0x40) /* -c: count */
- count = xatoi_u(str_count);
+ &count, &str_timeout, &device, &source);
if (opt & 0x80) /* -w: timeout */
timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000 + 500000;
//if (opt & 0x200) /* -s: source */
if (opt & 0x80) /* -w: timeout */
timeout_us = xatou_range(str_timeout, 0, INT_MAX/2000000) * 1000000 + 500000;
//if (opt & 0x200) /* -s: source */
@@
-288,7
+295,7
@@
int arping_main(int argc ATTRIBUTE_UNUSED, char **argv)
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
- strncpy
(ifr.ifr_name, device, sizeof(ifr.ifr_name) - 1
);
+ strncpy
_IFNAMSIZ(ifr.ifr_name, device
);
/* We use ifr.ifr_name in error msg so that problem
* with truncated name will be visible */
ioctl_or_perror_and_die(sock_fd, SIOCGIFINDEX, &ifr, err_str, "not found");
/* We use ifr.ifr_name in error msg so that problem
* with truncated name will be visible */
ioctl_or_perror_and_die(sock_fd, SIOCGIFINDEX, &ifr, err_str, "not found");
@@
-308,7
+315,7
@@
int arping_main(int argc ATTRIBUTE_UNUSED, char **argv)
/* if (!inet_aton(target, &dst)) - not needed */ {
len_and_sockaddr *lsa;
lsa = xhost_and_af2sockaddr(target, 0, AF_INET);
/* if (!inet_aton(target, &dst)) - not needed */ {
len_and_sockaddr *lsa;
lsa = xhost_and_af2sockaddr(target, 0, AF_INET);
-
memcpy(&dst, &lsa->u.sin.sin_addr.s_addr, 4)
;
+
dst = lsa->u.sin.sin_addr
;
if (ENABLE_FEATURE_CLEAN_UP)
free(lsa);
}
if (ENABLE_FEATURE_CLEAN_UP)
free(lsa);
}
@@
-324,8
+331,7
@@
int arping_main(int argc ATTRIBUTE_UNUSED, char **argv)
struct sockaddr_in saddr;
int probe_fd = xsocket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in saddr;
int probe_fd = xsocket(AF_INET, SOCK_DGRAM, 0);
- if (setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device) + 1) == -1)
- bb_perror_msg("cannot bind to device %s", device);
+ setsockopt_bindtodevice(probe_fd, device);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
if (src.s_addr) {
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
if (src.s_addr) {
@@
-342,9
+348,10
@@
int arping_main(int argc ATTRIBUTE_UNUSED, char **argv)
if (setsockopt(probe_fd, SOL_SOCKET, SO_DONTROUTE, &const_int_1, sizeof(const_int_1)) == -1)
bb_perror_msg("setsockopt(SO_DONTROUTE)");
xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
if (setsockopt(probe_fd, SOL_SOCKET, SO_DONTROUTE, &const_int_1, sizeof(const_int_1)) == -1)
bb_perror_msg("setsockopt(SO_DONTROUTE)");
xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
- if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) {
- bb_perror_msg_and_die("getsockname");
- }
+ getsockname(probe_fd, (struct sockaddr *) &saddr, &alen);
+ //never happens:
+ //if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1)
+ // bb_perror_msg_and_die("getsockname");
if (saddr.sin_family != AF_INET)
bb_error_msg_and_die("no IP address configured");
src = saddr.sin_addr;
if (saddr.sin_family != AF_INET)
bb_error_msg_and_die("no IP address configured");
src = saddr.sin_addr;
@@
-359,10
+366,10
@@
int arping_main(int argc ATTRIBUTE_UNUSED, char **argv)
{
socklen_t alen = sizeof(me);
{
socklen_t alen = sizeof(me);
-
- if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1) {
- bb_perror_msg_and_die("getsockname");
- }
+ getsockname(sock_fd, (struct sockaddr *) &me, &alen);
+ //never happens:
+ //if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1)
+ // bb_perror_msg_and_die("getsockname");
}
if (me.sll_halen == 0) {
bb_error_msg(err_str, "is not ARPable (no ll address)");
}
if (me.sll_halen == 0) {
bb_error_msg(err_str, "is not ARPable (no ll address)");