diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-11 14:55:46 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-11 14:55:46 +0100 |
commit | ba3b9dbf065438402d89655d7baefb0ccc6f0663 (patch) | |
tree | 4669edd0fb031940a794eaf8942bdbf314efea2e | |
parent | d3162773d5c722cc1f5c5b1ea5171c8d3c208135 (diff) | |
download | busybox-w32-ba3b9dbf065438402d89655d7baefb0ccc6f0663.tar.gz busybox-w32-ba3b9dbf065438402d89655d7baefb0ccc6f0663.tar.bz2 busybox-w32-ba3b9dbf065438402d89655d7baefb0ccc6f0663.zip |
libbb: introduce and use bb_getsockname()
function old new delta
bb_getsockname - 18 +18
xrtnl_open 88 83 -5
do_iplink 1216 1209 -7
arping_main 1686 1668 -18
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/3 up/down: 18/-30) Total: -12 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | include/libbb.h | 1 | ||||
-rw-r--r-- | libbb/bb_getsockname.c | 19 | ||||
-rw-r--r-- | networking/arping.c | 15 | ||||
-rw-r--r-- | networking/inetd.c | 5 | ||||
-rw-r--r-- | networking/libiproute/iplink.c | 4 | ||||
-rw-r--r-- | networking/libiproute/libnetlink.c | 5 |
6 files changed, 29 insertions, 20 deletions
diff --git a/include/libbb.h b/include/libbb.h index e2bedaf41..2c34859a2 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -636,6 +636,7 @@ void setsockopt_reuseaddr(int fd) FAST_FUNC; /* On Linux this never fails. */ | |||
636 | int setsockopt_keepalive(int fd) FAST_FUNC; | 636 | int setsockopt_keepalive(int fd) FAST_FUNC; |
637 | int setsockopt_broadcast(int fd) FAST_FUNC; | 637 | int setsockopt_broadcast(int fd) FAST_FUNC; |
638 | int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC; | 638 | int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC; |
639 | int bb_getsockname(int sockfd, void *addr, socklen_t addrlen) FAST_FUNC; | ||
639 | /* NB: returns port in host byte order */ | 640 | /* NB: returns port in host byte order */ |
640 | unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC; | 641 | unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC; |
641 | typedef struct len_and_sockaddr { | 642 | typedef struct len_and_sockaddr { |
diff --git a/libbb/bb_getsockname.c b/libbb/bb_getsockname.c new file mode 100644 index 000000000..1af9b39b9 --- /dev/null +++ b/libbb/bb_getsockname.c | |||
@@ -0,0 +1,19 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Utility routines. | ||
4 | * | ||
5 | * Licensed under GPLv2, see file LICENSE in this source tree. | ||
6 | */ | ||
7 | //kbuild:lib-y += bb_getsockname.o | ||
8 | |||
9 | #include "libbb.h" | ||
10 | |||
11 | int FAST_FUNC bb_getsockname(int sockfd, void *addr, socklen_t addrlen) | ||
12 | { | ||
13 | /* The usefullness of this function is that for getsockname(), | ||
14 | * addrlen must go on stack (to _have_ an address to be passed), | ||
15 | * but many callers do not need its modified value. | ||
16 | * By using this shim, they can avoid unnecessary stack spillage. | ||
17 | */ | ||
18 | return getsockname(sockfd, (struct sockaddr *)addr, &addrlen); | ||
19 | } | ||
diff --git a/networking/arping.c b/networking/arping.c index a16f04b9f..59092a7d7 100644 --- a/networking/arping.c +++ b/networking/arping.c | |||
@@ -363,15 +363,13 @@ int arping_main(int argc UNUSED_PARAM, char **argv) | |||
363 | xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); | 363 | xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); |
364 | } else { /* !(option_mask32 & DAD) case */ | 364 | } else { /* !(option_mask32 & DAD) case */ |
365 | /* Find IP address on this iface */ | 365 | /* Find IP address on this iface */ |
366 | socklen_t alen = sizeof(saddr); | ||
367 | |||
368 | saddr.sin_port = htons(1025); | 366 | saddr.sin_port = htons(1025); |
369 | saddr.sin_addr = dst; | 367 | saddr.sin_addr = dst; |
370 | 368 | ||
371 | if (setsockopt_SOL_SOCKET_1(probe_fd, SO_DONTROUTE) != 0) | 369 | if (setsockopt_SOL_SOCKET_1(probe_fd, SO_DONTROUTE) != 0) |
372 | bb_perror_msg("setsockopt(%s)", "SO_DONTROUTE"); | 370 | bb_perror_msg("setsockopt(%s)", "SO_DONTROUTE"); |
373 | xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); | 371 | xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); |
374 | getsockname(probe_fd, (struct sockaddr *) &saddr, &alen); | 372 | bb_getsockname(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); |
375 | //never happens: | 373 | //never happens: |
376 | //if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) | 374 | //if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) |
377 | // bb_perror_msg_and_die("getsockname"); | 375 | // bb_perror_msg_and_die("getsockname"); |
@@ -387,13 +385,10 @@ int arping_main(int argc UNUSED_PARAM, char **argv) | |||
387 | me.sll_protocol = htons(ETH_P_ARP); | 385 | me.sll_protocol = htons(ETH_P_ARP); |
388 | xbind(sock_fd, (struct sockaddr *) &me, sizeof(me)); | 386 | xbind(sock_fd, (struct sockaddr *) &me, sizeof(me)); |
389 | 387 | ||
390 | { | 388 | bb_getsockname(sock_fd, (struct sockaddr *) &me, sizeof(me)); |
391 | socklen_t alen = sizeof(me); | 389 | //never happens: |
392 | getsockname(sock_fd, (struct sockaddr *) &me, &alen); | 390 | //if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1) |
393 | //never happens: | 391 | // bb_perror_msg_and_die("getsockname"); |
394 | //if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1) | ||
395 | // bb_perror_msg_and_die("getsockname"); | ||
396 | } | ||
397 | if (me.sll_halen == 0) { | 392 | if (me.sll_halen == 0) { |
398 | bb_error_msg(err_str, "is not ARPable (no ll address)"); | 393 | bb_error_msg(err_str, "is not ARPable (no ll address)"); |
399 | BUILD_BUG_ON(DAD != 2); | 394 | BUILD_BUG_ON(DAD != 2); |
diff --git a/networking/inetd.c b/networking/inetd.c index 4dfa0089a..6843845fb 100644 --- a/networking/inetd.c +++ b/networking/inetd.c | |||
@@ -497,10 +497,9 @@ static void register_rpc(servtab_t *sep) | |||
497 | { | 497 | { |
498 | int n; | 498 | int n; |
499 | struct sockaddr_in ir_sin; | 499 | struct sockaddr_in ir_sin; |
500 | socklen_t size; | ||
501 | 500 | ||
502 | size = sizeof(ir_sin); | 501 | if (bb_getsockname(sep->se_fd, (struct sockaddr *) &ir_sin, sizeof(ir_sin)) < 0) { |
503 | if (getsockname(sep->se_fd, (struct sockaddr *) &ir_sin, &size) < 0) { | 502 | //TODO: verify that such failure is even possible in Linux kernel |
504 | bb_perror_msg("getsockname"); | 503 | bb_perror_msg("getsockname"); |
505 | return; | 504 | return; |
506 | } | 505 | } |
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c index aef5f6490..f38fba055 100644 --- a/networking/libiproute/iplink.c +++ b/networking/libiproute/iplink.c | |||
@@ -132,7 +132,6 @@ static int get_address(char *dev, int *htype) | |||
132 | { | 132 | { |
133 | struct ifreq ifr; | 133 | struct ifreq ifr; |
134 | struct sockaddr_ll me; | 134 | struct sockaddr_ll me; |
135 | socklen_t alen; | ||
136 | int s; | 135 | int s; |
137 | 136 | ||
138 | s = xsocket(PF_PACKET, SOCK_DGRAM, 0); | 137 | s = xsocket(PF_PACKET, SOCK_DGRAM, 0); |
@@ -146,8 +145,7 @@ static int get_address(char *dev, int *htype) | |||
146 | me.sll_ifindex = ifr.ifr_ifindex; | 145 | me.sll_ifindex = ifr.ifr_ifindex; |
147 | me.sll_protocol = htons(ETH_P_LOOP); | 146 | me.sll_protocol = htons(ETH_P_LOOP); |
148 | xbind(s, (struct sockaddr*)&me, sizeof(me)); | 147 | xbind(s, (struct sockaddr*)&me, sizeof(me)); |
149 | alen = sizeof(me); | 148 | bb_getsockname(s, (struct sockaddr*)&me, sizeof(me)); |
150 | getsockname(s, (struct sockaddr*)&me, &alen); | ||
151 | //never happens: | 149 | //never happens: |
152 | //if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) | 150 | //if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) |
153 | // bb_perror_msg_and_die("getsockname"); | 151 | // bb_perror_msg_and_die("getsockname"); |
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c index f08d862d0..40955fcae 100644 --- a/networking/libiproute/libnetlink.c +++ b/networking/libiproute/libnetlink.c | |||
@@ -15,16 +15,13 @@ | |||
15 | 15 | ||
16 | void FAST_FUNC xrtnl_open(struct rtnl_handle *rth/*, unsigned subscriptions*/) | 16 | void FAST_FUNC xrtnl_open(struct rtnl_handle *rth/*, unsigned subscriptions*/) |
17 | { | 17 | { |
18 | socklen_t addr_len; | ||
19 | |||
20 | memset(rth, 0, sizeof(*rth)); | 18 | memset(rth, 0, sizeof(*rth)); |
21 | rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); | 19 | rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); |
22 | rth->local.nl_family = AF_NETLINK; | 20 | rth->local.nl_family = AF_NETLINK; |
23 | /*rth->local.nl_groups = subscriptions;*/ | 21 | /*rth->local.nl_groups = subscriptions;*/ |
24 | 22 | ||
25 | xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)); | 23 | xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)); |
26 | addr_len = sizeof(rth->local); | 24 | bb_getsockname(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)); |
27 | getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len); | ||
28 | 25 | ||
29 | /* too much paranoia | 26 | /* too much paranoia |
30 | if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) | 27 | if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) |