diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-21 23:48:38 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-21 23:48:38 +0000 |
commit | a771e7c0057d0f506f8cdf67be39268e1c9f0735 (patch) | |
tree | bef7afb1304b3510d4857148a50e162a0578c363 /libbb | |
parent | e6b10ef0a7a5761c4cd0fe5f48bad953aa92240e (diff) | |
download | busybox-w32-a771e7c0057d0f506f8cdf67be39268e1c9f0735.tar.gz busybox-w32-a771e7c0057d0f506f8cdf67be39268e1c9f0735.tar.bz2 busybox-w32-a771e7c0057d0f506f8cdf67be39268e1c9f0735.zip |
*: remove check for errors on getsockaddr in cases we know they can't happen
libbb: make get_sock_lsa use only one getsockaddr syscall, not two
function old new delta
get_sock_lsa 72 101 +29
do_iplink 1151 1137 -14
arping_main 1585 1569 -16
dolisten 789 755 -34
xrtnl_open 161 94 -67
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/xconnect.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/libbb/xconnect.c b/libbb/xconnect.c index 1b4f4f78a..f853e9593 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c | |||
@@ -37,16 +37,21 @@ int FAST_FUNC setsockopt_bindtodevice(int fd, const char *iface) | |||
37 | 37 | ||
38 | len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd) | 38 | len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd) |
39 | { | 39 | { |
40 | len_and_sockaddr *lsa; | 40 | len_and_sockaddr lsa; |
41 | socklen_t len = 0; | 41 | len_and_sockaddr *lsa_ptr; |
42 | 42 | ||
43 | /* Can be optimized to do only one getsockname() */ | 43 | lsa.len = LSA_SIZEOF_SA; |
44 | if (getsockname(fd, NULL, &len) != 0) | 44 | if (getsockname(fd, &lsa.u.sa, &lsa.len) != 0) |
45 | return NULL; | 45 | return NULL; |
46 | lsa = xzalloc(LSA_LEN_SIZE + len); | 46 | |
47 | lsa->len = len; | 47 | lsa_ptr = xzalloc(LSA_LEN_SIZE + lsa.len); |
48 | getsockname(fd, &lsa->u.sa, &lsa->len); | 48 | if (lsa.len > LSA_SIZEOF_SA) { /* rarely (if ever) happens */ |
49 | return lsa; | 49 | lsa_ptr->len = lsa.len; |
50 | getsockname(fd, &lsa_ptr->u.sa, &lsa_ptr->len); | ||
51 | } else { | ||
52 | memcpy(lsa_ptr, &lsa, LSA_LEN_SIZE + lsa.len); | ||
53 | } | ||
54 | return lsa_ptr; | ||
50 | } | 55 | } |
51 | 56 | ||
52 | void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen) | 57 | void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen) |