From 6b078e5b4343ca4011228c114d4ec21bd7623d89 Mon Sep 17 00:00:00 2001 From: Darshit Shah Date: Tue, 17 Nov 2015 00:16:25 +0100 Subject: [PATCH 2/2] Fix compile error when IPv6 is disabled * src/ftp-basic.c: The code for the new FTPS functionality was unintentionally inside a #ifdef IPV6 block. Move the code around so that it is defined even when IPV6 isn't used --- src/ftp-basic.c | 118 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/ftp-basic.c b/src/ftp-basic.c index bcb7847..378374c 100644 --- a/src/ftp-basic.c +++ b/src/ftp-basic.c @@ -429,6 +429,65 @@ ip_address_to_eprt_repr (const ip_address *addr, int port, char *buf, buf[buflen - 1] = '\0'; } +/* Bind a port and send the appropriate PORT command to the FTP + server. Use acceptport after RETR, to get the socket of data + connection. */ +uerr_t +ftp_eprt (int csock, int *local_sock) +{ + uerr_t err; + char *request, *respline; + ip_address addr; + int nwritten; + int port; + /* Must contain the argument of EPRT (of the form |af|addr|port|). + * 4 chars for the | separators, INET6_ADDRSTRLEN chars for addr + * 1 char for af (1-2) and 5 chars for port (0-65535) */ + char bytes[4 + INET6_ADDRSTRLEN + 1 + 5 + 1]; + + /* Get the address of this side of the connection. */ + if (!socket_ip_address (csock, &addr, ENDPOINT_LOCAL)) + return FTPSYSERR; + + /* Setting port to 0 lets the system choose a free port. */ + port = 0; + + /* Bind the port. */ + *local_sock = bind_local (&addr, &port); + if (*local_sock < 0) + return FTPSYSERR; + + /* Construct the argument of EPRT (of the form |af|addr|port|). */ + ip_address_to_eprt_repr (&addr, port, bytes, sizeof (bytes)); + + /* Send PORT request. */ + request = ftp_request ("EPRT", bytes); + nwritten = fd_write (csock, request, strlen (request), -1); + if (nwritten < 0) + { + xfree (request); + fd_close (*local_sock); + return WRITEFAILED; + } + xfree (request); + /* Get appropriate response. */ + err = ftp_response (csock, &respline); + if (err != FTPOK) + { + fd_close (*local_sock); + return err; + } + if (*respline != '2') + { + xfree (respline); + fd_close (*local_sock); + return FTPPORTERR; + } + xfree (respline); + return FTPOK; +} +#endif + #ifdef HAVE_SSL /* * The following three functions defined into this #ifdef block @@ -542,65 +601,6 @@ bail: } #endif /* HAVE_SSL */ -/* Bind a port and send the appropriate PORT command to the FTP - server. Use acceptport after RETR, to get the socket of data - connection. */ -uerr_t -ftp_eprt (int csock, int *local_sock) -{ - uerr_t err; - char *request, *respline; - ip_address addr; - int nwritten; - int port; - /* Must contain the argument of EPRT (of the form |af|addr|port|). - * 4 chars for the | separators, INET6_ADDRSTRLEN chars for addr - * 1 char for af (1-2) and 5 chars for port (0-65535) */ - char bytes[4 + INET6_ADDRSTRLEN + 1 + 5 + 1]; - - /* Get the address of this side of the connection. */ - if (!socket_ip_address (csock, &addr, ENDPOINT_LOCAL)) - return FTPSYSERR; - - /* Setting port to 0 lets the system choose a free port. */ - port = 0; - - /* Bind the port. */ - *local_sock = bind_local (&addr, &port); - if (*local_sock < 0) - return FTPSYSERR; - - /* Construct the argument of EPRT (of the form |af|addr|port|). */ - ip_address_to_eprt_repr (&addr, port, bytes, sizeof (bytes)); - - /* Send PORT request. */ - request = ftp_request ("EPRT", bytes); - nwritten = fd_write (csock, request, strlen (request), -1); - if (nwritten < 0) - { - xfree (request); - fd_close (*local_sock); - return WRITEFAILED; - } - xfree (request); - /* Get appropriate response. */ - err = ftp_response (csock, &respline); - if (err != FTPOK) - { - fd_close (*local_sock); - return err; - } - if (*respline != '2') - { - xfree (respline); - fd_close (*local_sock); - return FTPPORTERR; - } - xfree (respline); - return FTPOK; -} -#endif - /* Similar to ftp_port, but uses `PASV' to initiate the passive FTP transfer. Reads the response from server and parses it. Reads the host and port addresses and returns them. */ -- 2.6.2