udhcp: use improved gethostbyname replacement from IPv6 code

This commit is contained in:
Denis Vlasenko 2007-02-04 02:41:57 +00:00
parent 1094452423
commit e991303406
4 changed files with 20 additions and 11 deletions

View File

@ -11,7 +11,8 @@
#include "busybox.h" #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 { struct {
char fn; char fn;

View File

@ -319,13 +319,15 @@ int xconnect_stream(const len_and_sockaddr *lsa);
* UNIX socket address being returned, IPX sockaddr etc... * UNIX socket address being returned, IPX sockaddr etc...
* On error does bb_error_msg and returns NULL */ * On error does bb_error_msg and returns NULL */
len_and_sockaddr* host2sockaddr(const char *host, int port); 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); len_and_sockaddr* xhost2sockaddr(const char *host, int port);
#if ENABLE_FEATURE_IPV6 #if ENABLE_FEATURE_IPV6
/* Same, useful if you want to force family (e.g. 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); len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af);
#else #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))) #define xhost_and_af2sockaddr(host, port, af) ((void)(af), xhost2sockaddr((host), (port)))
#endif #endif
/* Assign sin[6]_port member if the socket is of corresponding type, /* 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 // "old" (ipv4 only) API
// users: traceroute.c hostname.c // users: traceroute.c hostname.c
struct hostent *xgethostbyname(const char *name); 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); extern char *xstrdup(const char *s);

View File

@ -182,6 +182,11 @@ USE_FEATURE_IPV6(sa_family_t af,)
#endif #endif
#if ENABLE_FEATURE_IPV6 #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) len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af)
{ {
return str2sockaddr(host, port, af, DIE_ON_ERROR); return str2sockaddr(host, port, af, DIE_ON_ERROR);

View File

@ -21,15 +21,14 @@
/* on these functions, make sure you datatype matches */ /* on these functions, make sure you datatype matches */
static int read_ip(const char *line, void *arg) static int read_ip(const char *line, void *arg)
{ {
struct in_addr *addr = arg; len_and_sockaddr *lsa;
struct hostent *host; int retval = 0;
int retval = 1;
if (!inet_aton(line, addr)) { lsa = host_and_af2sockaddr(line, 0, AF_INET);
host = gethostbyname(line); if (lsa) {
if (host) *(struct in_addr*)arg = lsa->sin.sin_addr;
addr->s_addr = *((unsigned long *) host->h_addr_list[0]); free(lsa);
else retval = 0; retval = 1;
} }
return retval; return retval;
} }