summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2007-02-04 02:41:57 +0000
committerDenis Vlasenko2007-02-04 02:41:57 +0000
commite99130340610a09de7581abe5c127c024347bc32 (patch)
tree85f96b893cc174965b65d8691901da659468ed97
parent10944524238532ad35aaefec89cf7cc950745d6b (diff)
downloadbusybox-e99130340610a09de7581abe5c127c024347bc32.zip
busybox-e99130340610a09de7581abe5c127c024347bc32.tar.gz
udhcp: use improved gethostbyname replacement from IPv6 code
-rw-r--r--console-tools/setlogcons.c3
-rw-r--r--include/libbb.h8
-rw-r--r--libbb/xconnect.c5
-rw-r--r--networking/udhcp/files.c17
4 files changed, 21 insertions, 12 deletions
diff --git a/console-tools/setlogcons.c b/console-tools/setlogcons.c
index ae15b9b..7b5addc 100644
--- a/console-tools/setlogcons.c
+++ b/console-tools/setlogcons.c
@@ -11,7 +11,8 @@
#include "busybox.h"
-extern int setlogcons_main(int argc, char **argv)
+int setlogcons_main(int argc, char **argv);
+int setlogcons_main(int argc, char **argv)
{
struct {
char fn;
diff --git a/include/libbb.h b/include/libbb.h
index d22efe0..7342f89 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -319,13 +319,15 @@ int xconnect_stream(const len_and_sockaddr *lsa);
* UNIX socket address being returned, IPX sockaddr etc...
* On error does bb_error_msg and returns NULL */
len_and_sockaddr* host2sockaddr(const char *host, int port);
-/* Versions which die on error */
+/* Version which dies on error */
len_and_sockaddr* xhost2sockaddr(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);
len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af);
#else
-/* [we evaluate af: think about "xhost_and_af2sockaddr(..., af++)"] */
+/* [we evaluate af: think about "host_and_af2sockaddr(..., af++)"] */
+#define host_and_af2sockaddr(host, port, af) ((void)(af), host2sockaddr((host), (port)))
#define xhost_and_af2sockaddr(host, port, af) ((void)(af), xhost2sockaddr((host), (port)))
#endif
/* Assign sin[6]_port member if the socket is of corresponding type,
@@ -346,6 +348,8 @@ char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa, socklen_t salen)
// "old" (ipv4 only) API
// users: traceroute.c hostname.c
struct hostent *xgethostbyname(const char *name);
+// Also inetd.c and inetd.c are using gethostbyname(),
+// + inet_common.c has additional IPv4-only stuff
extern char *xstrdup(const char *s);
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index c3ccc47..22f98dc 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -182,6 +182,11 @@ USE_FEATURE_IPV6(sa_family_t af,)
#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);
+}
+
len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af)
{
return str2sockaddr(host, port, af, DIE_ON_ERROR);
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c
index c3ab17d..e35f50a 100644
--- a/networking/udhcp/files.c
+++ b/networking/udhcp/files.c
@@ -21,15 +21,14 @@
/* on these functions, make sure you datatype matches */
static int read_ip(const char *line, void *arg)
{
- struct in_addr *addr = arg;
- struct hostent *host;
- int retval = 1;
-
- if (!inet_aton(line, addr)) {
- host = gethostbyname(line);
- if (host)
- addr->s_addr = *((unsigned long *) host->h_addr_list[0]);
- else retval = 0;
+ len_and_sockaddr *lsa;
+ int retval = 0;
+
+ lsa = host_and_af2sockaddr(line, 0, AF_INET);
+ if (lsa) {
+ *(struct in_addr*)arg = lsa->sin.sin_addr;
+ free(lsa);
+ retval = 1;
}
return retval;
}