diff options
-rw-r--r-- | libbb/inet_common.c | 318 |
1 files changed, 163 insertions, 155 deletions
diff --git a/libbb/inet_common.c b/libbb/inet_common.c index 52fd1349e..16dd1db7c 100644 --- a/libbb/inet_common.c +++ b/libbb/inet_common.c @@ -4,7 +4,7 @@ * * Heavily modified by Manuel Novoa III Mar 12, 2001 * - * Version: $Id: inet_common.c,v 1.4 2002/11/26 02:35:15 bug1 Exp $ + * Version: $Id: inet_common.c,v 1.5 2002/11/28 09:52:23 bug1 Exp $ * */ @@ -21,181 +21,187 @@ #endif -const char bb_INET_default[]="default"; +const char bb_INET_default[] = "default"; int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst) { - struct hostent *hp; - struct netent *np; - - /* Grmpf. -FvK */ - s_in->sin_family = AF_INET; - s_in->sin_port = 0; - - /* Default is special, meaning 0.0.0.0. */ - if (!strcmp(name, bb_INET_default)) { - s_in->sin_addr.s_addr = INADDR_ANY; - return (1); - } - /* Look to see if it's a dotted quad. */ - if (inet_aton(name, &s_in->sin_addr)) { - return 0; - } - /* If we expect this to be a hostname, try hostname database first */ + struct hostent *hp; + struct netent *np; + + /* Grmpf. -FvK */ + s_in->sin_family = AF_INET; + s_in->sin_port = 0; + + /* Default is special, meaning 0.0.0.0. */ + if (!strcmp(name, bb_INET_default)) { + s_in->sin_addr.s_addr = INADDR_ANY; + return (1); + } + /* Look to see if it's a dotted quad. */ + if (inet_aton(name, &s_in->sin_addr)) { + return 0; + } + /* If we expect this to be a hostname, try hostname database first */ #ifdef DEBUG - if (hostfirst) fprintf (stderr, "gethostbyname (%s)\n", name); + if (hostfirst) { + error_msg("gethostbyname (%s)", name); + } #endif - if (hostfirst && - (hp = gethostbyname(name)) != (struct hostent *) NULL) { - memcpy((char *) &s_in->sin_addr, (char *) hp->h_addr_list[0], - sizeof(struct in_addr)); - return 0; - } - /* Try the NETWORKS database to see if this is a known network. */ + if (hostfirst && (hp = gethostbyname(name)) != (struct hostent *) NULL) { + memcpy((char *) &s_in->sin_addr, (char *) hp->h_addr_list[0], + sizeof(struct in_addr)); + return 0; + } + /* Try the NETWORKS database to see if this is a known network. */ #ifdef DEBUG - fprintf (stderr, "getnetbyname (%s)\n", name); + error_msg("getnetbyname (%s)", name); #endif - if ((np = getnetbyname(name)) != (struct netent *) NULL) { - s_in->sin_addr.s_addr = htonl(np->n_net); - return 1; - } - if (hostfirst) { - /* Don't try again */ - errno = h_errno; - return -1; - } + if ((np = getnetbyname(name)) != (struct netent *) NULL) { + s_in->sin_addr.s_addr = htonl(np->n_net); + return 1; + } + if (hostfirst) { + /* Don't try again */ + errno = h_errno; + return -1; + } #ifdef DEBUG - res_init(); - _res.options |= RES_DEBUG; + res_init(); + _res.options |= RES_DEBUG; #endif #ifdef DEBUG - fprintf (stderr, "gethostbyname (%s)\n", name); + error_msg("gethostbyname (%s)", name); #endif - if ((hp = gethostbyname(name)) == (struct hostent *) NULL) { - errno = h_errno; - return -1; - } - memcpy((char *) &s_in->sin_addr, (char *) hp->h_addr_list[0], - sizeof(struct in_addr)); - - return 0; + if ((hp = gethostbyname(name)) == (struct hostent *) NULL) { + errno = h_errno; + return -1; + } + memcpy((char *) &s_in->sin_addr, (char *) hp->h_addr_list[0], + sizeof(struct in_addr)); + + return 0; } /* cache */ struct addr { - struct sockaddr_in addr; - char *name; - int host; - struct addr *next; + struct sockaddr_in addr; + char *name; + int host; + struct addr *next; }; -static struct addr *INET_nn = NULL; /* addr-to-name cache */ +static struct addr *INET_nn = NULL; /* addr-to-name cache */ /* numeric: & 0x8000: default instead of *, * & 0x4000: host instead of net, * & 0x0fff: don't resolve */ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, - int numeric, unsigned int netmask) + int numeric, unsigned int netmask) { - struct hostent *ent; - struct netent *np; - struct addr *pn; - unsigned long ad, host_ad; - int host = 0; - - /* Grmpf. -FvK */ - if (s_in->sin_family != AF_INET) { + struct hostent *ent; + struct netent *np; + struct addr *pn; + unsigned long ad, host_ad; + int host = 0; + + /* Grmpf. -FvK */ + if (s_in->sin_family != AF_INET) { #ifdef DEBUG - fprintf(stderr, "rresolve: unsupport address family %d !\n", s_in->sin_family); + error_msg("rresolve: unsupport address family %d !", + s_in->sin_family); #endif - errno = EAFNOSUPPORT; - return (-1); - } - ad = (unsigned long) s_in->sin_addr.s_addr; + errno = EAFNOSUPPORT; + return (-1); + } + ad = (unsigned long) s_in->sin_addr.s_addr; #ifdef DEBUG - fprintf (stderr, "rresolve: %08lx, mask %08x, num %08x \n", ad, netmask, numeric); + error_msg("rresolve: %08lx, mask %08x, num %08x", ad, netmask, numeric); #endif - if (ad == INADDR_ANY) { - if ((numeric & 0x0FFF) == 0) { - if (numeric & 0x8000) - safe_strncpy(name, bb_INET_default, len); - else - safe_strncpy(name, "*", len); - return (0); - } - } - if (numeric & 0x0FFF) { - safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); - return (0); - } + if (ad == INADDR_ANY) { + if ((numeric & 0x0FFF) == 0) { + if (numeric & 0x8000) + safe_strncpy(name, bb_INET_default, len); + else + safe_strncpy(name, "*", len); + return (0); + } + } + if (numeric & 0x0FFF) { + safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); + return (0); + } - if ((ad & (~netmask)) != 0 || (numeric & 0x4000)) - host = 1; + if ((ad & (~netmask)) != 0 || (numeric & 0x4000)) + host = 1; #if 0 - INET_nn = NULL; + INET_nn = NULL; #endif - pn = INET_nn; - while (pn != NULL) { - if (pn->addr.sin_addr.s_addr == ad && pn->host == host) { - safe_strncpy(name, pn->name, len); + pn = INET_nn; + while (pn != NULL) { + if (pn->addr.sin_addr.s_addr == ad && pn->host == host) { + safe_strncpy(name, pn->name, len); #ifdef DEBUG - fprintf (stderr, "rresolve: found %s %08lx in cache\n", (host? "host": "net"), ad); + error_msg("rresolve: found %s %08lx in cache", + (host ? "host" : "net"), ad); #endif - return (0); + return (0); + } + pn = pn->next; } - pn = pn->next; - } - host_ad = ntohl(ad); - np = NULL; - ent = NULL; - if (host) { + host_ad = ntohl(ad); + np = NULL; + ent = NULL; + if (host) { #ifdef DEBUG - fprintf (stderr, "gethostbyaddr (%08lx)\n", ad); + error_msg("gethostbyaddr (%08lx)", ad); #endif - ent = gethostbyaddr((char *) &ad, 4, AF_INET); - if (ent != NULL) - safe_strncpy(name, ent->h_name, len); - } else { + ent = gethostbyaddr((char *) &ad, 4, AF_INET); + if (ent != NULL) { + safe_strncpy(name, ent->h_name, len); + } + } else { #ifdef DEBUG - fprintf (stderr, "getnetbyaddr (%08lx)\n", host_ad); + error_msg("getnetbyaddr (%08lx)", host_ad); #endif - np = getnetbyaddr(host_ad, AF_INET); - if (np != NULL) - safe_strncpy(name, np->n_name, len); - } - if ((ent == NULL) && (np == NULL)) - safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); - pn = (struct addr *) xmalloc(sizeof(struct addr)); - pn->addr = *s_in; - pn->next = INET_nn; - pn->host = host; - pn->name = xstrdup(name); - INET_nn = pn; - - return (0); + np = getnetbyaddr(host_ad, AF_INET); + if (np != NULL) { + safe_strncpy(name, np->n_name, len); + } + } + if ((ent == NULL) && (np == NULL)) { + safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); + } + pn = (struct addr *) xmalloc(sizeof(struct addr)); + pn->addr = *s_in; + pn->next = INET_nn; + pn->host = host; + pn->name = xstrdup(name); + INET_nn = pn; + + return (0); } #ifdef CONFIG_FEATURE_IPV6 int INET6_resolve(char *name, struct sockaddr_in6 *sin6) { - struct addrinfo req, *ai; - int s; - - memset (&req, '\0', sizeof req); - req.ai_family = AF_INET6; - if ((s = getaddrinfo(name, NULL, &req, &ai))) { - fprintf(stderr, "getaddrinfo: %s: %d\n", name, s); - return -1; - } - memcpy(sin6, ai->ai_addr, sizeof(struct sockaddr_in6)); + struct addrinfo req, *ai; + int s; + + memset(&req, '\0', sizeof req); + req.ai_family = AF_INET6; + if ((s = getaddrinfo(name, NULL, &req, &ai))) { + error_msg("getaddrinfo: %s: %d", name, s); + return -1; + } + memcpy(sin6, ai->ai_addr, sizeof(struct sockaddr_in6)); - freeaddrinfo(ai); + freeaddrinfo(ai); - return (0); + return (0); } #ifndef IN6_IS_ADDR_UNSPECIFIED @@ -205,37 +211,39 @@ int INET6_resolve(char *name, struct sockaddr_in6 *sin6) #endif -int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, int numeric) +int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, + int numeric) { - int s; + int s; - /* Grmpf. -FvK */ - if (sin6->sin6_family != AF_INET6) { + /* Grmpf. -FvK */ + if (sin6->sin6_family != AF_INET6) { #ifdef DEBUG - fprintf(stderr, _("rresolve: unsupport address family %d !\n"), - sin6->sin6_family); + error_msg(_("rresolve: unsupport address family %d !\n"), + sin6->sin6_family); #endif - errno = EAFNOSUPPORT; - return (-1); - } - if (numeric & 0x7FFF) { - inet_ntop(AF_INET6, &sin6->sin6_addr, name, len); - return (0); - } - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - if (numeric & 0x8000) - strcpy(name, "default"); - else - strcpy(name, "*"); + errno = EAFNOSUPPORT; + return (-1); + } + if (numeric & 0x7FFF) { + inet_ntop(AF_INET6, &sin6->sin6_addr, name, len); + return (0); + } + if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + if (numeric & 0x8000) { + strcpy(name, "default"); + } else { + strcpy(name, "*"); + } + return (0); + } + + s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), name, len, NULL, 0, 0); + if (s) { + error_msg("getnameinfo failed"); + return -1; + } return (0); - } - - if ((s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), - name, len , NULL, 0, 0))) { - fputs("getnameinfo failed\n", stderr); - return -1; - } - return (0); } -#endif /* CONFIG_FEATURE_IPV6 */ +#endif /* CONFIG_FEATURE_IPV6 */ |