X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fgetaddrinfo.c;h=4bce64eb3633c21519140426b5b6fa174726db38;hb=85b1f355522cc620452552d76fd517f089c98ab2;hp=97a3c1ef03730f9c1938ad06a0e558ea89e12053;hpb=0291c6ee6723896494ce389d33d540bf6391e46a;p=pazpar2-moved-to-github.git diff --git a/src/getaddrinfo.c b/src/getaddrinfo.c index 97a3c1e..4bce64e 100644 --- a/src/getaddrinfo.c +++ b/src/getaddrinfo.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2013 Index Data + Copyright (C) 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 @@ -61,15 +61,16 @@ struct work { 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 */ + int error; }; static int log_level = YLOG_LOG; -void perform_getaddrinfo(struct work *w) +static void perform_getaddrinfo(struct work *w) { struct addrinfo hints, *res; char host[512], *cp; - char *port = 0; + char *port = "210"; int error; hints.ai_flags = 0; @@ -81,18 +82,32 @@ void perform_getaddrinfo(struct work *w) hints.ai_canonname = NULL; hints.ai_next = NULL; - strncpy(host, w->hostport, sizeof(host)-1); + if (!strncmp(w->hostport, "http://", 7)) + { + port = "80"; + strncpy(host, w->hostport + 7, sizeof(host)-1); + } + else if (!strncmp(w->hostport, "https://", 8)) + { + port = "443"; + strncpy(host, w->hostport + 8, sizeof(host)-1); + } + else + { + strncpy(host, w->hostport, sizeof(host)-1); + } host[sizeof(host)-1] = 0; if ((cp = strrchr(host, ':'))) { *cp = '\0'; port = cp + 1; } - error = getaddrinfo(host, port ? port : "210", &hints, &res); + error = getaddrinfo(host, port, &hints, &res); if (error) { yaz_log(YLOG_WARN, "Failed to resolve %s: %s", w->hostport, gai_strerror(error)); + w->error = error; } else { @@ -144,6 +159,7 @@ void iochan_handler(struct iochan *i, int event) { struct work *w = sel_thread_result(p); w->host->ipport = w->ipport; + w->host->error = w->error; connect_resolver_host(w->host, w->iochan_man); xfree(w); } @@ -177,12 +193,13 @@ static void getaddrinfo_start(iochan_man_t iochan_man) int host_getaddrinfo(struct host *host, iochan_man_t iochan_man) { struct work *w = xmalloc(sizeof(*w)); - int use_thread = 0; /* =0 to disable threading entirely */ + int use_thread = 1; /* =0 to disable threading entirely */ w->hostport = host->tproxy ? host->tproxy : host->proxy; w->ipport = 0; w->host = host; w->iochan_man = iochan_man; + w->error = 0; #if USE_THREADED_RESOLVER if (use_thread) { @@ -195,6 +212,7 @@ int host_getaddrinfo(struct host *host, iochan_man_t iochan_man) #endif perform_getaddrinfo(w); host->ipport = w->ipport; + host->error = w->error; xfree(w); if (!host->ipport) return -1;