|
@ -0,0 +1,147 @@ |
|
|
|
|
|
From 2cfcadf5e6d5c444765aa460915ae27109a8dbce Mon Sep 17 00:00:00 2001 |
|
|
|
|
|
From: Darshit Shah <darnir@gmail.com> |
|
|
|
|
|
Date: Mon, 16 Nov 2015 23:16:25 +0000 |
|
|
|
|
|
Subject: 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 |
|
|
|
|
|
---
|
|
|
|
|
|
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. */ |
|
|
|
|
|
--
|
|
|
|
|
|
cgit v0.9.0.2 |