diff options
-rw-r--r-- | include/libbb.h | 14 | ||||
-rw-r--r-- | libbb/Kbuild | 1 | ||||
-rw-r--r-- | libbb/xconnect.c | 27 | ||||
-rw-r--r-- | libbb/xgethostbyname2.c | 23 | ||||
-rw-r--r-- | networking/ping.c | 5 | ||||
-rw-r--r-- | networking/ping6.c | 44 |
6 files changed, 62 insertions, 52 deletions
diff --git a/include/libbb.h b/include/libbb.h index e41993796..1a5ce24ad 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -316,15 +316,21 @@ int xconnect_stream(const len_and_sockaddr *lsa); * (depending on host), but in theory nothing prevents e.g. * UNIX socket address being returned, IPX sockaddr etc... */ len_and_sockaddr* host2sockaddr(const char *host, int port); +#if ENABLE_FEATURE_IPV6 +/* Same, useful if you want to force family (e.g. IPv6) */ +len_and_sockaddr* host_and_af2sockaddr(const char *host, int port, sa_family_t af); +#endif /* Assign sin[6]_port member if the socket is of corresponding type, * otherwise no-op. Useful for ftp. * NB: does NOT do htons() internally, just direct assignment. */ void set_nport(len_and_sockaddr *lsa, unsigned port); /* Retrieve sin[6]_port or return -1 for non-INET[6] lsa's */ int get_nport(len_and_sockaddr *lsa); -/* Reverse DNS */ +/* Reverse DNS. Returns NULL on failure. */ char* xmalloc_sockaddr2host(const struct sockaddr *sa, socklen_t salen); -/* This one deosn't fall back to dotted IP and do not append :PORTNUM */ +/* This one doesn't append :PORTNUM */ +char* xmalloc_sockaddr2host_noport(const struct sockaddr *sa, socklen_t salen); +/* This one also doesn't fall back to dotted IP (returns NULL) */ char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa, socklen_t salen); /* inet_[ap]ton on steroids */ char* xmalloc_sockaddr2dotted(const struct sockaddr *sa, socklen_t salen); @@ -334,8 +340,8 @@ char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa, socklen_t salen) //int xconnect_tcp_v4(struct sockaddr_in *s_addr); // users: traceroute.c hostname.c ifconfig.c ping.c struct hostent *xgethostbyname(const char *name); -// ping6 is the only user - convert to new API -struct hostent *xgethostbyname2(const char *name, int af); +//// ping6 is the only user - convert to new API +//struct hostent *xgethostbyname2(const char *name, int af); extern char *xstrdup(const char *s); diff --git a/libbb/Kbuild b/libbb/Kbuild index 1e6b5fea7..a53b17f44 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild @@ -92,7 +92,6 @@ lib-y += xconnect.o lib-y += xfuncs.o lib-y += xgetcwd.o lib-y += xgethostbyname.o -lib-y += xgethostbyname2.o lib-y += xreadlink.o # conditionally compiled objects: diff --git a/libbb/xconnect.c b/libbb/xconnect.c index 188837e36..61fe7fd6c 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c @@ -114,7 +114,10 @@ void set_nport(len_and_sockaddr *lsa, unsigned port) /* host: "1.2.3.4[:port]", "www.google.com[:port]" * port: if neither of above specifies port # */ -static len_and_sockaddr* str2sockaddr(const char *host, int port, int ai_flags) +static len_and_sockaddr* str2sockaddr( + const char *host, int port, +USE_FEATURE_IPV6(sa_family_t af,) + int ai_flags) { int rc; len_and_sockaddr *r; // = NULL; @@ -147,9 +150,10 @@ static len_and_sockaddr* str2sockaddr(const char *host, int port, int ai_flags) } memset(&hint, 0 , sizeof(hint)); - /* hint.ai_family = AF_UNSPEC; - zero anyway */ #if !ENABLE_FEATURE_IPV6 hint.ai_family = AF_INET; /* do not try to find IPv6 */ +#else + hint.ai_family = af; #endif /* Needed. Or else we will get each address thrice (or more) * for each possible socket type (tcp,udp,raw...): */ @@ -165,15 +169,25 @@ static len_and_sockaddr* str2sockaddr(const char *host, int port, int ai_flags) freeaddrinfo(result); return r; } +#if !ENABLE_FEATURE_IPV6 +#define str2sockaddr(host, port, af, ai_flags) str2sockaddr(host, port, ai_flags) +#endif + +#if ENABLE_FEATURE_IPV6 +len_and_sockaddr* host_and_af2sockaddr(const char *host, int port, sa_family_t af) +{ + return str2sockaddr(host, port, af, 0); +} +#endif len_and_sockaddr* host2sockaddr(const char *host, int port) { - return str2sockaddr(host, port, 0); + return str2sockaddr(host, port, AF_UNSPEC, 0); } static len_and_sockaddr* dotted2sockaddr(const char *host, int port) { - return str2sockaddr(host, port, NI_NUMERICHOST); + return str2sockaddr(host, port, AF_UNSPEC, NI_NUMERICHOST); } int xsocket_stream(len_and_sockaddr **lsap) @@ -282,6 +296,11 @@ char* xmalloc_sockaddr2host(const struct sockaddr *sa, socklen_t salen) return sockaddr2str(sa, salen, 0); } +char* xmalloc_sockaddr2host_noport(const struct sockaddr *sa, socklen_t salen) +{ + return sockaddr2str(sa, salen, IGNORE_PORT); +} + char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa, socklen_t salen) { return sockaddr2str(sa, salen, NI_NAMEREQD | IGNORE_PORT); diff --git a/libbb/xgethostbyname2.c b/libbb/xgethostbyname2.c index 83d538669..7af2f75fb 100644 --- a/libbb/xgethostbyname2.c +++ b/libbb/xgethostbyname2.c @@ -1,22 +1 @@ -/* vi: set sw=4 ts=4: */ -/* - * Mini xgethostbyname2 implementation. - * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. - */ - -#include <netdb.h> -#include "libbb.h" - - -#ifdef CONFIG_FEATURE_IPV6 -struct hostent *xgethostbyname2(const char *name, int af) -{ - struct hostent *retval; - - if ((retval = gethostbyname2(name, af)) == NULL) - bb_herror_msg_and_die("%s", name); - - return retval; -} -#endif +/* TO DELETE */ diff --git a/networking/ping.c b/networking/ping.c index 91708d282..fc2de456a 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -97,7 +97,7 @@ static void ping(const char *host) } signal(SIGALRM, noresp); - alarm(5); /* give the host 5000ms to respond */ + alarm(5); /* give the host 5000ms to respond */ /* listen for replies */ while (1) { struct sockaddr_in from; @@ -118,7 +118,8 @@ static void ping(const char *host) break; } } - if (ENABLE_FEATURE_CLEAN_UP) close(pingsock); + if (ENABLE_FEATURE_CLEAN_UP) + close(pingsock); printf("%s is alive!\n", hostname); } diff --git a/networking/ping6.c b/networking/ping6.c index a92387e79..ccb19b2b5 100644 --- a/networking/ping6.c +++ b/networking/ping6.c @@ -48,7 +48,7 @@ static void ping(const char *host); /* simple version */ -static struct hostent *h; +//static struct hostent *h; static void noresp(int ign) { @@ -58,6 +58,7 @@ static void noresp(int ign) static void ping(const char *host) { + len_and_sockaddr *lsa;// struct sockaddr_in6 pingaddr; struct icmp6_hdr *pkt; int pingsock, c; @@ -66,11 +67,12 @@ static void ping(const char *host) pingsock = create_icmp6_socket(); - memset(&pingaddr, 0, sizeof(pingaddr)); - - pingaddr.sin6_family = AF_INET6; - h = xgethostbyname2(host, AF_INET6); - memcpy(&pingaddr.sin6_addr, h->h_addr, sizeof(pingaddr.sin6_addr)); + //memset(&pingaddr, 0, sizeof(pingaddr)); + //pingaddr.sin6_family = AF_INET6; + //h = xgethostbyname2(host, AF_INET6); + //memcpy(&pingaddr.sin6_addr, h->h_addr, sizeof(pingaddr.sin6_addr)); + lsa = host_and_af2sockaddr(host, 0, AF_INET6); + pingaddr = lsa->sin6; pkt = (struct icmp6_hdr *) packet; memset(pkt, 0, sizeof(packet)); @@ -88,7 +90,7 @@ static void ping(const char *host) } signal(SIGALRM, noresp); - alarm(5); /* give the host 5000ms to respond */ + alarm(5); /* give the host 5000ms to respond */ /* listen for replies */ while (1) { struct sockaddr_in6 from; @@ -107,7 +109,8 @@ static void ping(const char *host) break; } } - if (ENABLE_FEATURE_CLEAN_UP) close(pingsock); + if (ENABLE_FEATURE_CLEAN_UP) + close(pingsock); printf("%s is alive!\n", h->h_name); } @@ -141,7 +144,8 @@ static int myid; static unsigned long tmin = ULONG_MAX, tmax, tsum; static char rcvd_tbl[MAX_DUP_CHK / 8]; -static struct hostent *hostent; +//static struct hostent *hostent; +char *hostname; static void sendping(int); static void pingstats(int); @@ -161,7 +165,7 @@ static void pingstats(int junk) signal(SIGINT, SIG_IGN); - printf("\n--- %s ping statistics ---\n", hostent->h_name); + printf("\n--- %s ping statistics ---\n", hostname); printf("%lu packets transmitted, ", ntransmitted); printf("%lu packets received, ", nreceived); if (nrepeats) @@ -314,6 +318,7 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit extern int BUG_bad_offsetof_icmp6_cksum(void); static void ping(const char *host) { + len_and_sockaddr *lsa;// char packet[datalen + MAXIPLEN + MAXICMPLEN]; char buf[INET6_ADDRSTRLEN]; int sockopt; @@ -324,14 +329,15 @@ static void ping(const char *host) pingsock = create_icmp6_socket(); - memset(&pingaddr, 0, sizeof(pingaddr)); - - pingaddr.sin6_family = AF_INET6; - hostent = xgethostbyname2(host, AF_INET6); - if (hostent->h_addrtype != AF_INET6) - bb_error_msg_and_die("unknown address type; only AF_INET6 is currently supported"); - - memcpy(&pingaddr.sin6_addr, hostent->h_addr, sizeof(pingaddr.sin6_addr)); + //memset(&pingaddr, 0, sizeof(pingaddr)); + //pingaddr.sin6_family = AF_INET6; + //hostent = xgethostbyname2(host, AF_INET6); + //if (hostent->h_addrtype != AF_INET6) + // bb_error_msg_and_die("unknown address type; only AF_INET6 is currently supported"); + //memcpy(&pingaddr.sin6_addr, hostent->h_addr, sizeof(pingaddr.sin6_addr)); + lsa = host_and_af2sockaddr(host, 0, AF_INET6); + hostname = xmalloc_sockaddr2host_noport(&lsa->sa, lsa->len); + pingaddr = lsa->sin6; #ifdef ICMP6_FILTER { @@ -367,7 +373,7 @@ static void ping(const char *host) pingaddr.sin6_scope_id = if_index; printf("PING %s (%s): %d data bytes\n", - hostent->h_name, + hostname, inet_ntop(AF_INET6, &pingaddr.sin6_addr, buf, sizeof(buf)), datalen); |