diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/htsftp.c | 12 | ||||
-rw-r--r-- | src/htslib.c | 61 | ||||
-rw-r--r-- | src/htslib.h | 4 |
3 files changed, 46 insertions, 31 deletions
diff --git a/src/htsftp.c b/src/htsftp.c index 1a9ff77..331d35b 100644 --- a/src/htsftp.c +++ b/src/htsftp.c @@ -256,6 +256,7 @@ int run_launch_ftp(FTPDownloadStruct * pStruct) { t_hostent *hp; char *a; char _adr[256]; + const char *error = "unknown error"; _adr[0] = '\0'; //T_SOC soc_ctl; @@ -272,9 +273,10 @@ int run_launch_ftp(FTPDownloadStruct * pStruct) { // récupérer adresse résolue strcpybuff(back->info, "host name"); - hp = hts_gethostbyname(opt, _adr, &fullhostent_buffer); + hp = hts_gethostbyname2(opt, _adr, &fullhostent_buffer, &error); if (hp == NULL) { - strcpybuff(back->r.msg, "Unable to get server's address"); + snprintf(back->r.msg, sizeof(back->r.msg), + "Unable to get server's address: %s", error); // back->status=STATUS_FTP_READY; // fini back->r.statuscode = STATUSCODE_NON_FATAL; _HALT_FTP return 0; @@ -583,6 +585,7 @@ int run_launch_ftp(FTPDownloadStruct * pStruct) { SOCaddr server; int server_size = sizeof(server); t_hostent *hp; + const char *error = "unknown error"; // effacer structure memset(&server, 0, sizeof(server)); @@ -592,7 +595,7 @@ int run_launch_ftp(FTPDownloadStruct * pStruct) { // résoudre if (adr_ip[0]) { - hp = hts_gethostbyname(opt, adr_ip, &fullhostent_buffer); + hp = hts_gethostbyname2(opt, adr_ip, &fullhostent_buffer, &error); if (hp) { SOCaddr_copyaddr(server, server_size, hp->h_addr_list[0], hp->h_length); @@ -657,7 +660,8 @@ int run_launch_ftp(FTPDownloadStruct * pStruct) { back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } else { - sprintf(back->r.msg, "Unable to resolve IP %s", adr_ip); + snprintf(back->r.msg, sizeof(back->r.msg), + "Unable to resolve IP %s: %s", adr_ip, error); // back->status=STATUS_FTP_READY; // fini back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts diff --git a/src/htslib.c b/src/htslib.c index f29afad..dbd6ddb 100644 --- a/src/htslib.c +++ b/src/htslib.c @@ -2241,6 +2241,7 @@ T_SOC newhttp(httrackp * opt, const char *_iadr, htsblk * retour, int port, SOCaddr server; int server_size = sizeof(server); t_hostent *hp; + const char *error = "unknown error"; // effacer structure memset(&server, 0, sizeof(server)); @@ -2277,17 +2278,16 @@ T_SOC newhttp(httrackp * opt, const char *_iadr, htsblk * retour, int port, strncatbuff(iadr2, iadr, (int) (a - iadr)); // adresse sans le :xx - hp = hts_gethostbyname(opt, iadr2, &fullhostent_buffer); + hp = hts_gethostbyname2(opt, iadr2, &fullhostent_buffer, &error); } else { // adresse normale (port par défaut par la suite) - hp = hts_gethostbyname(opt, iadr, &fullhostent_buffer); - + hp = hts_gethostbyname2(opt, iadr, &fullhostent_buffer, &error); } } else // port défini - hp = hts_gethostbyname(opt, iadr, &fullhostent_buffer); + hp = hts_gethostbyname2(opt, iadr, &fullhostent_buffer, &error); // Conversion iadr -> adresse // structure recevant le nom de l'hôte, etc @@ -2298,15 +2298,11 @@ T_SOC newhttp(httrackp * opt, const char *_iadr, htsblk * retour, int port, #endif if (retour && retour->msg) { #ifdef _WIN32 - int last_errno = WSAGetLastError(); - - sprintf(retour->msg, "Unable to get server's address: %s", - strerror(last_errno)); + snprintf(retour->msg, sizeof(retour->msg), + "Unable to get server's address: %s", error); #else - int last_errno = errno; - - sprintf(retour->msg, "Unable to get server's address: %s", - strerror(last_errno)); + snprintf(retour->msg, sizeof(retour->msg), + "Unable to get server's address: %s", error); #endif } return INVALID_SOCKET; @@ -2352,24 +2348,22 @@ T_SOC newhttp(httrackp * opt, const char *_iadr, htsblk * retour, int port, // bind this address if (retour != NULL && retour->req.proxy.bindhost[0] != 0) { t_fullhostent bind_buffer; + const char *error = "unknown error"; - hp = hts_gethostbyname(opt, retour->req.proxy.bindhost, &bind_buffer); + hp = hts_gethostbyname2(opt, retour->req.proxy.bindhost, &bind_buffer, + &error); if (hp == NULL || bind(soc, (struct sockaddr *) hp->h_addr_list[0], hp->h_length) != 0) { if (retour && retour->msg) { #ifdef _WIN32 - int last_errno = WSAGetLastError(); - - sprintf(retour->msg, - "Unable to bind the specificied server address: %s", - strerror(last_errno)); + snprintf(retour->msg, sizeof(retour->msg), + "Unable to bind the specificied server address: %s", + error); #else - int last_errno = errno; - - sprintf(retour->msg, - "Unable to bind the specificied server address: %s", - strerror(last_errno)); + snprintf(retour->msg, sizeof(retour->msg), + "Unable to bind the specificied server address: %s", + error); #endif } deletesoc(soc); @@ -4782,7 +4776,7 @@ int hts_dnstest(httrackp * opt, const char *_iadr) { return ret; } -HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { +HTSEXT_API t_hostent *vxgethostbyname2(char *hostname, void *v_buffer, const char **error) { t_fullhostent *buffer = (t_fullhostent *) v_buffer; /* Clear */ @@ -4831,6 +4825,7 @@ HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { */ struct addrinfo *res = NULL; struct addrinfo hints; + int gerr; memset(&hints, 0, sizeof(hints)); if (IPV6_resolver == 1) // V4 only (for bogus V6 entries) @@ -4841,7 +4836,7 @@ HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; - if (getaddrinfo(hostname, NULL, &hints, &res) == 0) { + if ( ( gerr = getaddrinfo(hostname, NULL, &hints, &res) ) == 0) { if (res) { if ((res->ai_addr) && (res->ai_addrlen) && (res->ai_addrlen <= buffer->addr_maxlen)) { @@ -4851,6 +4846,10 @@ HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { return &(buffer->hp); } } + } else { + if (error != NULL) { + *error = gai_strerror(gerr); + } } if (res) { freeaddrinfo(res); @@ -4860,8 +4859,12 @@ HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { return NULL; } +HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { + return vxgethostbyname2(hostname, v_buffer, NULL); +} + // cache dns interne à HTS // ** FREE A FAIRE sur la chaine -t_hostent *hts_gethostbyname(httrackp * opt, const char *_iadr, void *v_buffer) { +t_hostent *hts_gethostbyname2(httrackp * opt, const char *_iadr, void *v_buffer, const char **error) { char BIGSTK iadr[HTS_URLMAXSIZE * 2]; t_fullhostent *buffer = (t_fullhostent *) v_buffer; t_dnscache *cache = _hts_cache(opt); // adresse du cache @@ -4920,7 +4923,7 @@ t_hostent *hts_gethostbyname(httrackp * opt, const char *_iadr, void *v_buffer) #if DEBUGDNS printf("resolving (not cached) %s\n", iadr); #endif - hp = vxgethostbyname(iadr, buffer); // calculer IP host + hp = vxgethostbyname2(iadr, buffer, error); // calculer IP host } else { // numérique, convertir sans passer par le dns buffer->hp.h_addr_list[0] = (char *) &inetaddr; buffer->hp.h_length = 4; @@ -4948,6 +4951,10 @@ t_hostent *hts_gethostbyname(httrackp * opt, const char *_iadr, void *v_buffer) } // retour hp du cache } +t_hostent *hts_gethostbyname(httrackp * opt, const char *_iadr, void *v_buffer) { + return hts_gethostbyname2(opt ,_iadr, v_buffer, NULL); +} + #else HTS_INLINE t_hostent *hts_gethostbyname(httrackp * opt, char *iadr, t_fullhostent * buffer) { diff --git a/src/htslib.h b/src/htslib.h index b622137..bf7a73b 100644 --- a/src/htslib.h +++ b/src/htslib.h @@ -290,9 +290,12 @@ HTSEXT_API void infostatuscode(char *msg, int statuscode); htsblk xhttpget(httrackp * opt, char *adr, char *fil); htsblk http_gethead(httrackp * opt, char *adr, char *fil); LLint http_xfread1(htsblk * r, int bufl); +HTS_INLINE t_hostent *hts_gethostbyname2(httrackp * opt, const char *iadr, + void *v_buffer, const char **error); HTS_INLINE t_hostent *hts_gethostbyname(httrackp * opt, const char *iadr, void *v_buffer); #ifndef HTTRACK_DEFLIB +HTSEXT_API t_hostent *vxgethostbyname2(char *hostname, void *v_buffer, const char **error); HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer); #endif t_hostent *_hts_ghbn(t_dnscache * cache, const char *iadr, t_hostent * retour); @@ -608,6 +611,7 @@ HTS_STATIC int strcmpnocase(char *a, char *b) { #ifdef _WIN32 #define strcasecmp(a,b) stricmp(a,b) #define strncasecmp(a,b,n) strnicmp(a,b,n) +#define snprintf _snprintf #endif #define strfield2(f,s) ( (strlen(f)!=strlen(s)) ? 0 : (strfield(f,s)) ) |