X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fgetaddrinfo.c;h=13f7c24f01c68ddde4d9b32e9b220335fd9b6290;hb=87e9791ee9a652b3665d59ca5bf0e927e935e666;hp=4718f5bad362b2915792f08edb48a06517608d4f;hpb=1fe492e303ea029960bad9e50afc36dc7e8fe735;p=pazpar2-moved-to-github.git diff --git a/src/getaddrinfo.c b/src/getaddrinfo.c index 4718f5b..13f7c24 100644 --- a/src/getaddrinfo.c +++ b/src/getaddrinfo.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2009 Index Data + Copyright (C) 2006-2013 Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -47,7 +47,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#include "pazpar2.h" +#include "session.h" #include "connection.h" #include "host.h" @@ -64,6 +64,7 @@ struct work { char *hostport; /* hostport to be resolved in separate thread */ char *ipport; /* result or NULL if it could not be resolved */ struct host *host; /* host that we're dealing with - mother thread */ + iochan_man_t iochan_man; /* iochan manager */ }; static int log_level = YLOG_LOG; @@ -78,11 +79,12 @@ void perform_getaddrinfo(struct work *w) 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; @@ -97,7 +99,7 @@ void perform_getaddrinfo(struct work *w) // returns AF_INET address. if ((res = getaddrinfo(hostport, port, &hints, &addrinfo))) { - yaz_log(YLOG_WARN, "Failed to resolve %s: %s", + yaz_log(YLOG_WARN, "Failed to resolve %s %s", w->hostport, gai_strerror(res)); } else @@ -105,7 +107,7 @@ void perform_getaddrinfo(struct work *w) char ipport[128]; unsigned char addrbuf[4]; assert(addrinfo->ai_family == PF_INET); - memcpy(addrbuf, + memcpy(addrbuf, &((struct sockaddr_in*)addrinfo->ai_addr)->sin_addr.s_addr, 4); sprintf(ipport, "%u.%u.%u.%u:%s", addrbuf[0], addrbuf[1], addrbuf[2], addrbuf[3], port); @@ -158,17 +160,17 @@ void iochan_handler(struct iochan *i, int event) { struct work *w = sel_thread_result(p); w->host->ipport = w->ipport; - connect_resolver_host(w->host); + connect_resolver_host(w->host, w->iochan_man); xfree(w); } } static sel_thread_t resolver_thread = 0; -static void getaddrinfo_start(void) +static void getaddrinfo_start(iochan_man_t iochan_man) { int fd; - sel_thread_t p = resolver_thread = + sel_thread_t p = resolver_thread = sel_thread_create(work_handler, 0 /* work_destroy */, &fd, 3 /* no of resolver threads */); if (!p) @@ -178,28 +180,30 @@ static void getaddrinfo_start(void) } else { - IOCHAN chan = iochan_create(fd, iochan_handler, EVENT_INPUT); + IOCHAN chan = iochan_create(fd, iochan_handler, EVENT_INPUT, + "getaddrinfo_socket"); iochan_setdata(chan, p); - pazpar2_add_channel(chan); + iochan_add(iochan_man, chan); } yaz_log(log_level, "resolver start"); resolver_thread = p; } #endif -int host_getaddrinfo(struct host *host) +int host_getaddrinfo(struct host *host, iochan_man_t iochan_man) { struct work *w = xmalloc(sizeof(*w)); - int use_thread = 1; /* =0 to disable threading entirely */ + int use_thread = 0; /* =0 to disable threading entirely */ - w->hostport = host->hostport; + w->hostport = host->tproxy ? host->tproxy : host->proxy; w->ipport = 0; w->host = host; + w->iochan_man = iochan_man; #if USE_THREADED_RESOLVER if (use_thread) { if (resolver_thread == 0) - getaddrinfo_start(); + getaddrinfo_start(iochan_man); assert(resolver_thread); sel_thread_add(resolver_thread, w); return 0;