Mercurial > gftp.yaz
diff lib/protocols.c @ 944:5b681cba67b2
2008-01-24 Brian Masney <masneyb@gftp.org>
* lib/gftp.h lib/rfc959.c lib/protocols.c lib/misc.c - don't store
the structure from getaddrinfo()/gethostbyname() in the
gftp_request structure. Instead, store the address of the current
server in a separate pointer.
author | masneyb |
---|---|
date | Thu, 24 Jan 2008 23:31:26 +0000 |
parents | f37091406523 |
children | c7d7a081cd9c |
line wrap: on
line diff
--- a/lib/protocols.c Thu Jan 24 23:29:20 2008 +0000 +++ b/lib/protocols.c Thu Jan 24 23:31:26 2008 +0000 @@ -48,15 +48,9 @@ if (request->username) g_free (request->username); if (request->password) - { - memset (request->password, 0, strlen (request->password)); - g_free (request->password); - } + g_free (request->password); if (request->account) - { - memset (request->account, 0, strlen (request->account)); - g_free (request->account); - } + g_free (request->account); if (request->directory) g_free (request->directory); if (request->last_ftp_response) @@ -64,6 +58,11 @@ if (request->protocol_data) g_free (request->protocol_data); +#if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) + if (request->remote_addr != NULL) + g_free (request->remote_addr); +#endif + if (request->local_options_vars != NULL) { gftp_config_free_options (request->local_options_vars, @@ -143,12 +142,6 @@ { g_return_if_fail (request != NULL); -#if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) - if (request->free_hostp && request->hostp != NULL) - freeaddrinfo (request->hostp); -#endif - request->hostp = NULL; - #ifdef USE_SSL if (request->ssl != NULL) { @@ -1164,6 +1157,7 @@ } +/* FIXME - clean up this function */ static int gftp_need_proxy (gftp_request * request, char *service, char *proxy_hostname, unsigned int proxy_port) @@ -1177,10 +1171,12 @@ gint32 netaddr; char *pos; #if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) - struct addrinfo hints; + struct addrinfo hints, *hostp; unsigned int port; int errnum; char serv[8]; +#else + struct hostent host, *hostp; #endif gftp_lookup_global_option ("dont_use_proxy", &proxy_hosts); @@ -1191,9 +1187,8 @@ return (proxy_hostname != NULL && *proxy_hostname != '\0'); - request->hostp = NULL; + hostp = NULL; #if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) - request->free_hostp = 1; memset (&hints, 0, sizeof (hints)); hints.ai_flags = AI_CANONNAME; hints.ai_family = PF_UNSPEC; @@ -1209,7 +1204,7 @@ _("Looking up %s\n"), request->hostname); if ((errnum = getaddrinfo (request->hostname, serv, &hints, - &request->hostp)) != 0) + &hostp)) != 0) { request->logging_function (gftp_logging_error, request, _("Cannot look up hostname %s: %s\n"), @@ -1217,14 +1212,13 @@ return (GFTP_ERETRYABLE); } - addr = request->hostp->ai_addr; + addr = hostp->ai_addr; #else /* !HAVE_GETADDRINFO */ request->logging_function (gftp_logging_misc, request, _("Looking up %s\n"), request->hostname); - if (!(request->hostp = r_gethostbyname (request->hostname, &request->host, - NULL))) + if (!(hostp = r_gethostbyname (request->hostname, &host, NULL))) { request->logging_function (gftp_logging_error, request, _("Cannot look up hostname %s: %s\n"), @@ -1232,7 +1226,7 @@ return (GFTP_ERETRYABLE); } - addr = (struct sockaddr *) request->host.h_addr_list[0]; + addr = (struct sockaddr *) host.h_addr_list[0]; #endif /* HAVE_GETADDRINFO */ @@ -1286,7 +1280,7 @@ savepos = *endpos; *endpos = '\0'; - *dest = g_malloc ((gulong) (endpos - source + 1)); + *dest = g_malloc0 ((gulong) (endpos - source + 1)); strcpy (*dest, source); *endpos = savepos; @@ -1917,7 +1911,7 @@ fle = g_malloc0 (sizeof (*fle)); while (gftp_get_next_file (request, NULL, fle) > 0) { - newsize = g_malloc (sizeof (*newsize)); + newsize = g_malloc0 (sizeof (*newsize)); *newsize = fle->size; g_hash_table_insert (dirhash, fle->file, newsize); fle->file = NULL; @@ -1981,7 +1975,7 @@ return (NULL); } - fle = g_malloc (sizeof (*fle)); + fle = g_malloc0 (sizeof (*fle)); templist = NULL; while (gftp_get_next_file (transfer->fromreq, NULL, fle) > 0) { @@ -2345,43 +2339,32 @@ return (port); } -#endif int -gftp_connect_server (gftp_request * request, char *service, - char *proxy_hostname, unsigned int proxy_port) +gftp_connect_server_with_getaddr (gftp_request * request, char *service, + char *proxy_hostname, unsigned int proxy_port) { + struct addrinfo *hostp, *current_hostp; char *connect_host, *disphost; - unsigned int port; - int sock = -1; -#if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) struct addrinfo hints, *res; intptr_t enable_ipv6; + unsigned int port; + int ret, sock = -1; char serv[8]; - int errnum; - - if ((errnum = gftp_need_proxy (request, service, proxy_hostname, + + if ((ret = gftp_need_proxy (request, service, proxy_hostname, proxy_port)) < 0) - return (errnum); + return (ret); else - { - request->use_proxy = errnum; - if (request->use_proxy) - request->hostp = NULL; - } + request->use_proxy = ret; gftp_lookup_request_option (request, "enable_ipv6", &enable_ipv6); - request->free_hostp = 1; memset (&hints, 0, sizeof (hints)); hints.ai_flags = AI_CANONNAME; - if (enable_ipv6) - hints.ai_family = PF_UNSPEC; - else - hints.ai_family = AF_INET; - + hints.ai_family = enable_ipv6 ? PF_UNSPEC : AF_INET; hints.ai_socktype = SOCK_STREAM; if (request->use_proxy) @@ -2395,27 +2378,24 @@ port = request->port; } - if (request->hostp == NULL) + if (port == 0) + strcpy (serv, service); + else + snprintf (serv, sizeof (serv), "%d", port); + + request->logging_function (gftp_logging_misc, request, + _("Looking up %s\n"), connect_host); + if ((ret = getaddrinfo (connect_host, serv, &hints, + &hostp)) != 0) { - if (port == 0) - strcpy (serv, service); - else - snprintf (serv, sizeof (serv), "%d", port); - - request->logging_function (gftp_logging_misc, request, - _("Looking up %s\n"), connect_host); - if ((errnum = getaddrinfo (connect_host, serv, &hints, - &request->hostp)) != 0) - { - request->logging_function (gftp_logging_error, request, - _("Cannot look up hostname %s: %s\n"), - connect_host, gai_strerror (errnum)); - return (GFTP_ERETRYABLE); - } + request->logging_function (gftp_logging_error, request, + _("Cannot look up hostname %s: %s\n"), + connect_host, gai_strerror (ret)); + return (GFTP_ERETRYABLE); } disphost = connect_host; - for (res = request->hostp; res != NULL; res = res->ai_next) + for (res = hostp; res != NULL; res = res->ai_next) { disphost = res->ai_canonname ? res->ai_canonname : connect_host; port = get_port (res); @@ -2443,25 +2423,42 @@ continue; } - request->current_hostp = res; + current_hostp = res; request->ai_family = res->ai_family; break; } if (res == NULL) { - if (request->hostp != NULL) - { - freeaddrinfo (request->hostp); - request->hostp = NULL; - } + if (hostp != NULL) + freeaddrinfo (hostp); + return (GFTP_ERETRYABLE); } -#else /* !HAVE_GETADDRINFO */ + request->remote_addr_len = current_hostp->ai_addrlen; + request->remote_addr = g_malloc0 (request->remote_addr_len); + memcpy (request->remote_addr, &((struct sockaddr_in *) current_hostp->ai_addr)->sin_addr, + request->remote_addr_len); + + request->logging_function (gftp_logging_misc, request, + _("Connected to %s:%d\n"), connect_host, port); + + return (sock); +} +#endif + + +int +gftp_connect_server_legacy (gftp_request * request, char *service, + char *proxy_hostname, unsigned int proxy_port) +{ struct sockaddr_in remote_address; + char *connect_host, *disphost; + struct hostent host, *hostp; struct servent serv_struct; - int ret; + int ret, sock, curhost; + unsigned int port; if ((ret = gftp_need_proxy (request, service, proxy_hostname, proxy_port)) < 0) @@ -2469,7 +2466,7 @@ request->use_proxy = ret; if (request->use_proxy == 1) - request->hostp = NULL; + hostp = NULL; request->ai_family = AF_INET; if ((sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) @@ -2513,33 +2510,30 @@ remote_address.sin_port = htons (port); - if (request->hostp == NULL) + request->logging_function (gftp_logging_misc, request, + _("Looking up %s\n"), connect_host); + + if (!(hostp = r_gethostbyname (connect_host, &host, NULL))) { - request->logging_function (gftp_logging_misc, request, - _("Looking up %s\n"), connect_host); - if (!(request->hostp = r_gethostbyname (connect_host, &request->host, - NULL))) - { - request->logging_function (gftp_logging_error, request, - _("Cannot look up hostname %s: %s\n"), - connect_host, g_strerror (errno)); - close (sock); - return (GFTP_ERETRYABLE); - } + request->logging_function (gftp_logging_error, request, + _("Cannot look up hostname %s: %s\n"), + connect_host, g_strerror (errno)); + close (sock); + return (GFTP_ERETRYABLE); } disphost = NULL; - for (request->curhost = 0; - request->host.h_addr_list[request->curhost] != NULL; - request->curhost++) + for (curhost = 0; + host.h_addr_list[curhost] != NULL; + curhost++) { - disphost = request->host.h_name; + disphost = host.h_name; memcpy (&remote_address.sin_addr, - request->host.h_addr_list[request->curhost], - request->host.h_length); + host.h_addr_list[curhost], + host.h_length); request->logging_function (gftp_logging_misc, request, _("Trying %s:%d\n"), - request->host.h_name, port); + host.h_name, port); if (connect (sock, (struct sockaddr *) &remote_address, sizeof (remote_address)) == -1) @@ -2551,25 +2545,42 @@ break; } - if (request->host.h_addr_list[request->curhost] == NULL) + if (host.h_addr_list[curhost] == NULL) { close (sock); return (GFTP_ERETRYABLE); } -#endif /* HAVE_GETADDRINFO */ + + return (sock); +} + + +int +gftp_connect_server (gftp_request * request, char *service, + char *proxy_hostname, unsigned int proxy_port) +{ + int sock; + +#if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) + sock = gftp_connect_server_with_getaddr (request, service, proxy_hostname, + proxy_port); +#else + sock = gftp_connect_server_legacy (request, service, proxy_hostname, + proxy_port); +#endif + + if (sock < 0) + return (sock); if (fcntl (sock, F_SETFD, 1) == -1) { request->logging_function (gftp_logging_error, request, _("Error: Cannot set close on exec flag: %s\n"), g_strerror (errno)); - + close (sock); return (GFTP_ERETRYABLE); } - request->logging_function (gftp_logging_misc, request, - _("Connected to %s:%d\n"), connect_host, port); - if (gftp_fd_set_sockblocking (request, sock, 1) < 0) { close (sock);