X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fgetaddrinfo.c;h=b52f6c536cfc188fe096cc9e94eb9228723744a6;hb=a9527ef447794713570f93f8cddef6e352536f6b;hp=26557d82f09e67af7ceaf0fa1ae3ee6ff744fcaf;hpb=dedbc922fbe49e599466f41c618ba9ba8ddb9477;p=pazpar2-moved-to-github.git diff --git a/src/getaddrinfo.c b/src/getaddrinfo.c index 26557d8..b52f6c5 100644 --- a/src/getaddrinfo.c +++ b/src/getaddrinfo.c @@ -1,4 +1,4 @@ -/* $Id: getaddrinfo.c,v 1.1 2007-04-21 12:00:54 adam Exp $ +/* $Id: getaddrinfo.c,v 1.8 2007-07-25 13:20:46 adam Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -39,6 +39,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "pazpar2.h" +#include "connection.h" +#include "host.h" struct work { char *hostport; /* hostport to be resolved in separate thread */ @@ -52,14 +54,19 @@ void perform_getaddrinfo(struct work *w) { int res = 0; char *port; +#if HAVE_GETADDRINFO struct addrinfo *addrinfo, hints; +#else + struct hostent *hp; +#endif char *hostport = xstrdup(w->hostport); if ((port = strchr(hostport, ':'))) *(port++) = '\0'; else port = "210"; - + +#if HAVE_GETADDRINFO hints.ai_flags = 0; hints.ai_family = PF_INET; hints.ai_socktype = SOCK_STREAM; @@ -86,8 +93,26 @@ void perform_getaddrinfo(struct work *w) addrbuf[0], addrbuf[1], addrbuf[2], addrbuf[3], port); freeaddrinfo(addrinfo); w->ipport = xstrdup(ipport); - yaz_log(log_level, "%s -> %s", hostport, ipport); + yaz_log(log_level, "Resolved %s -> %s", hostport, ipport); + } +#else + hp = gethostbyname(hostport); + if (!hp) + { + yaz_log(YLOG_WARN|YLOG_ERRNO, "Failed to resolve %s", hostport); } + else + { + char ipport[128]; + unsigned char addrbuf[4]; + + memcpy(addrbuf, *hp->h_addr_list, 4 * sizeof(unsigned char)); + sprintf(ipport, "%u.%u.%u.%u:%s", + addrbuf[0], addrbuf[1], addrbuf[2], addrbuf[3], port); + w->ipport = xstrdup(ipport); + yaz_log(log_level, "Resolved %s -> %s", hostport, ipport); + } +#endif xfree(hostport); } @@ -111,11 +136,8 @@ void iochan_handler(struct iochan *i, int event) if (event & EVENT_INPUT) { struct work *w = sel_thread_result(p); - if (w->ipport) - yaz_log(log_level, "resolved result %s", w->ipport); - else - yaz_log(log_level, "unresolved result"); w->host->ipport = w->ipport; + connect_resolver_host(w->host); xfree(w); } } @@ -125,7 +147,9 @@ static sel_thread_t resolver_thread = 0; static void getaddrinfo_start(void) { int fd; - sel_thread_t p = resolver_thread = sel_thread_create(work_handler, &fd); + sel_thread_t p = resolver_thread = + sel_thread_create(work_handler, 0 /* work_destroy */, &fd, + 3 /* no of resolver threads */); if (!p) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "sel_create_create failed"); @@ -144,7 +168,7 @@ static void getaddrinfo_start(void) int host_getaddrinfo(struct host *host) { struct work *w = xmalloc(sizeof(*w)); - int use_thread = 1; + int use_thread = 1; /* =0 to disable threading entirely */ w->hostport = host->hostport; w->ipport = 0;