4a5,6
> *
> * $FreeBSD: head/contrib/tcp_wrappers/scaffold.c 56977 2000-02-03 10:27:03Z shin $
22a25
> #include <resolv.h>
59a63,65
> #ifdef INET6
> + strlen(hp->h_name) + 1
> #endif
68a75,79
> #ifdef INET6
> hb->host.h_name = data + hp->h_length * count;
> strcpy(hb->host.h_name, hp->h_name);
> hb->host.h_addrtype = hp->h_addrtype;
> #endif
76a88,185
> #if defined(INET6) && !defined(USE_GETIPNODEBY)
> /* merge_hostent - merge hostent in one memory block */
>
> static struct hostent *merge_hostent(hp1, hp2)
> struct hostent *hp1, *hp2;
> {
> struct hostent_block {
> struct hostent host;
> char *addr_list[1];
> };
> struct hostent_block *hb;
> int count, count2;
> char *data;
> char *addr;
>
> for (count = 0; hp1->h_addr_list[count] != 0; count++)
> /* void */ ;
> for (count2 = 0; hp2->h_addr_list[count2] != 0; count2++)
> /* void */ ;
> count += count2;
>
> if ((hb = (struct hostent_block *) malloc(sizeof(struct hostent_block)
> + strlen(hp1->h_name) + 1
> + (hp1->h_length + sizeof(char *)) * count)) == 0) {
> fprintf(stderr, "Sorry, out of memory\n");
> exit(1);
> }
> memset((char *) &hb->host, 0, sizeof(hb->host));
> hb->host.h_length = hp1->h_length;
> hb->host.h_addr_list = hb->addr_list;
> hb->host.h_addr_list[count] = 0;
> data = (char *) (hb->host.h_addr_list + count + 1);
> hb->host.h_name = data + hp1->h_length * count;
> strcpy(hb->host.h_name, hp1->h_name);
> hb->host.h_addrtype = hp1->h_addrtype;
>
> for (count = 0; (addr = hp1->h_addr_list[count]) != 0; count++) {
> hb->host.h_addr_list[count] = data + hp1->h_length * count;
> memcpy(hb->host.h_addr_list[count], addr, hp1->h_length);
> }
> for (count2 = 0; (addr = hp2->h_addr_list[count2]) != 0; count2++) {
> hb->host.h_addr_list[count] = data + hp1->h_length * count;
> memcpy(hb->host.h_addr_list[count], addr, hp1->h_length);
> ++count;
> }
> return (&hb->host);
> }
> #endif
>
> static struct hostent *gethostbyname64(host)
> char *host;
> {
> struct hostent *hp = NULL, *hp2 = NULL;
> #ifdef USE_GETIPNODEBY
> int h_error;
>
> if ((hp = getipnodebyname(host, AF_INET6,
> AI_V4MAPPED | AI_ADDRCONFIG | AI_ALL,
> &h_error)) != 0) {
> hp2 = dup_hostent(hp);
> freehostent(hp);
> return (hp2);
> }
> #else
> struct hostent *hp1;
> u_long res_options;
>
> if ((_res.options & RES_INIT) == 0) {
> if (res_init() < 0) {
> tcpd_warn("%s: res_init() failed", host);
> return (NULL);
> }
> }
> res_options = _res.options;
> #ifdef INET6
> _res.options |= RES_USE_INET6;
> if ((hp1 = gethostbyname2(host, AF_INET6)) != NULL)
> hp1 = dup_hostent(hp1);
> #endif
> if ((hp2 = gethostbyname2(host, AF_INET)) != NULL)
> hp2 = dup_hostent(hp2);
> _res.options = res_options;
> #ifdef INET6
> if (hp1 && hp2) {
> hp = merge_hostent(hp1, hp2);
> free((char *) hp1);
> free((char *) hp2);
> return (hp);
> }
> if (hp1)
> return (hp1);
> #endif
> if (hp2)
> return (hp2);
> #endif
> return (NULL);
> }
>
85a195
> static char hnamebuf[BUFSIZ];
93a204,208
> #ifdef INET6
> h.h_addrtype = AF_INET;
> h.h_name = hnamebuf;
> strcpy(h.h_name, host);
> #endif
106a222,224
> #ifdef INET6
> if ((hp = gethostbyname64(host)) == 0) {
> #else
107a226
> #endif
110a230,234
> #ifdef INET6
> if (hp->h_addrtype != AF_INET6) {
> tcpd_warn("%d: not an internet host", hp->h_addrtype);
> free((char *) hp);
> #else
112a237
> #endif
118a244,246
> #ifdef INET6
> return (hp);
> #else
119a248
> #endif
127a257,261
> #ifdef INET6
> struct sockaddr_storage sin;
> char *ap;
> int alen;
> #else
128a263
> #endif
137a273,287
> #ifdef INET6
> sin.ss_family = hp->h_addrtype;
> switch (hp->h_addrtype) {
> case AF_INET:
> ap = (char *)&((struct sockaddr_in *)&sin)->sin_addr;
> alen = sizeof(struct sockaddr_in);
> break;
> case AF_INET6:
> ap = (char *)&((struct sockaddr_in6 *)&sin)->sin6_addr;
> alen = sizeof(struct sockaddr_in6);
> break;
> default:
> return (0);
> }
> #else
138a289
> #endif
140a292,294
> #ifdef INET6
> memcpy(ap, addr, alen);
> #else
141a296
> #endif
> *
> * $FreeBSD: head/contrib/tcp_wrappers/scaffold.c 56977 2000-02-03 10:27:03Z shin $
22a25
> #include <resolv.h>
59a63,65
> #ifdef INET6
> + strlen(hp->h_name) + 1
> #endif
68a75,79
> #ifdef INET6
> hb->host.h_name = data + hp->h_length * count;
> strcpy(hb->host.h_name, hp->h_name);
> hb->host.h_addrtype = hp->h_addrtype;
> #endif
76a88,185
> #if defined(INET6) && !defined(USE_GETIPNODEBY)
> /* merge_hostent - merge hostent in one memory block */
>
> static struct hostent *merge_hostent(hp1, hp2)
> struct hostent *hp1, *hp2;
> {
> struct hostent_block {
> struct hostent host;
> char *addr_list[1];
> };
> struct hostent_block *hb;
> int count, count2;
> char *data;
> char *addr;
>
> for (count = 0; hp1->h_addr_list[count] != 0; count++)
> /* void */ ;
> for (count2 = 0; hp2->h_addr_list[count2] != 0; count2++)
> /* void */ ;
> count += count2;
>
> if ((hb = (struct hostent_block *) malloc(sizeof(struct hostent_block)
> + strlen(hp1->h_name) + 1
> + (hp1->h_length + sizeof(char *)) * count)) == 0) {
> fprintf(stderr, "Sorry, out of memory\n");
> exit(1);
> }
> memset((char *) &hb->host, 0, sizeof(hb->host));
> hb->host.h_length = hp1->h_length;
> hb->host.h_addr_list = hb->addr_list;
> hb->host.h_addr_list[count] = 0;
> data = (char *) (hb->host.h_addr_list + count + 1);
> hb->host.h_name = data + hp1->h_length * count;
> strcpy(hb->host.h_name, hp1->h_name);
> hb->host.h_addrtype = hp1->h_addrtype;
>
> for (count = 0; (addr = hp1->h_addr_list[count]) != 0; count++) {
> hb->host.h_addr_list[count] = data + hp1->h_length * count;
> memcpy(hb->host.h_addr_list[count], addr, hp1->h_length);
> }
> for (count2 = 0; (addr = hp2->h_addr_list[count2]) != 0; count2++) {
> hb->host.h_addr_list[count] = data + hp1->h_length * count;
> memcpy(hb->host.h_addr_list[count], addr, hp1->h_length);
> ++count;
> }
> return (&hb->host);
> }
> #endif
>
> static struct hostent *gethostbyname64(host)
> char *host;
> {
> struct hostent *hp = NULL, *hp2 = NULL;
> #ifdef USE_GETIPNODEBY
> int h_error;
>
> if ((hp = getipnodebyname(host, AF_INET6,
> AI_V4MAPPED | AI_ADDRCONFIG | AI_ALL,
> &h_error)) != 0) {
> hp2 = dup_hostent(hp);
> freehostent(hp);
> return (hp2);
> }
> #else
> struct hostent *hp1;
> u_long res_options;
>
> if ((_res.options & RES_INIT) == 0) {
> if (res_init() < 0) {
> tcpd_warn("%s: res_init() failed", host);
> return (NULL);
> }
> }
> res_options = _res.options;
> #ifdef INET6
> _res.options |= RES_USE_INET6;
> if ((hp1 = gethostbyname2(host, AF_INET6)) != NULL)
> hp1 = dup_hostent(hp1);
> #endif
> if ((hp2 = gethostbyname2(host, AF_INET)) != NULL)
> hp2 = dup_hostent(hp2);
> _res.options = res_options;
> #ifdef INET6
> if (hp1 && hp2) {
> hp = merge_hostent(hp1, hp2);
> free((char *) hp1);
> free((char *) hp2);
> return (hp);
> }
> if (hp1)
> return (hp1);
> #endif
> if (hp2)
> return (hp2);
> #endif
> return (NULL);
> }
>
85a195
> static char hnamebuf[BUFSIZ];
93a204,208
> #ifdef INET6
> h.h_addrtype = AF_INET;
> h.h_name = hnamebuf;
> strcpy(h.h_name, host);
> #endif
106a222,224
> #ifdef INET6
> if ((hp = gethostbyname64(host)) == 0) {
> #else
107a226
> #endif
110a230,234
> #ifdef INET6
> if (hp->h_addrtype != AF_INET6) {
> tcpd_warn("%d: not an internet host", hp->h_addrtype);
> free((char *) hp);
> #else
112a237
> #endif
118a244,246
> #ifdef INET6
> return (hp);
> #else
119a248
> #endif
127a257,261
> #ifdef INET6
> struct sockaddr_storage sin;
> char *ap;
> int alen;
> #else
128a263
> #endif
137a273,287
> #ifdef INET6
> sin.ss_family = hp->h_addrtype;
> switch (hp->h_addrtype) {
> case AF_INET:
> ap = (char *)&((struct sockaddr_in *)&sin)->sin_addr;
> alen = sizeof(struct sockaddr_in);
> break;
> case AF_INET6:
> ap = (char *)&((struct sockaddr_in6 *)&sin)->sin6_addr;
> alen = sizeof(struct sockaddr_in6);
> break;
> default:
> return (0);
> }
> #else
138a289
> #endif
140a292,294
> #ifdef INET6
> memcpy(ap, addr, alen);
> #else
141a296
> #endif