* It is merely a wrapper around ftp_epsv, ftp_lpsv and ftp_pasv.
*/
static uerr_t
-ftp_do_pasv (struct rbuf *rbuf, ip_address *addr, unsigned short *port)
+ftp_do_pasv (struct rbuf *rbuf, ip_address *addr, int *port)
{
uerr_t err;
int family;
* It is merely a wrapper around ftp_eprt, ftp_lprt and ftp_port.
*/
static uerr_t
-ftp_do_port (struct rbuf *rbuf)
+ftp_do_port (struct rbuf *rbuf, int *local_sock)
{
uerr_t err;
int family;
{
if (!opt.server_response)
logputs (LOG_VERBOSE, "==> EPRT ... ");
- err = ftp_eprt (rbuf);
+ err = ftp_eprt (rbuf, local_sock);
/* If EPRT is not supported try LPRT */
if (err == FTPPORTERR)
{
if (!opt.server_response)
logputs (LOG_VERBOSE, "==> LPRT ... ");
- err = ftp_lprt (rbuf);
+ err = ftp_lprt (rbuf, local_sock);
}
}
else
{
if (!opt.server_response)
logputs (LOG_VERBOSE, "==> PORT ... ");
- err = ftp_port (rbuf);
+ err = ftp_port (rbuf, local_sock);
}
return err;
}
#else
-#define ftp_do_pasv ftp_pasv
-#define ftp_do_port ftp_port
+
+static uerr_t
+ftp_do_pasv (struct rbuf *rbuf, ip_address *addr, int *port)
+{
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PASV ... ");
+ return ftp_pasv (rbuf, addr, port);
+}
+
+static uerr_t
+ftp_do_port (struct rbuf *rbuf, int *local_sock)
+{
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PORT ... ");
+ return ftp_port (rbuf, local_sock);
+}
#endif
/* Retrieves a file with denoted parameters through opening an FTP
static uerr_t
getftp (struct url *u, long *len, long restval, ccon *con)
{
- int csock, dtsock, res;
+ int csock, dtsock, local_sock, res;
uerr_t err;
FILE *fp;
char *user, *passwd, *respline;
assert (user && passwd);
dtsock = -1;
+ local_sock = -1;
con->dltime = 0;
if (!(cmd & DO_LOGIN))
else /* cmd & DO_LOGIN */
{
char type_char;
- struct address_list *al;
-
char *host = con->proxy ? con->proxy->host : u->host;
int port = con->proxy ? con->proxy->port : u->port;
char *logname = user;
/* First: Establish the control connection. */
- al = lookup_host (host, 0);
- if (!al)
+ csock = connect_to_host (host, port);
+ if (csock == E_HOST)
return HOSTERR;
- set_connection_host_name (host);
- csock = connect_to_many (al, port, 0);
- set_connection_host_name (NULL);
- address_list_release (al);
-
- if (csock < 0)
+ else if (csock < 0)
return CONNECT_ERROR (errno);
if (cmd & LEAVE_PENDING)
{
if (opt.ftp_pasv > 0)
{
- ip_address passive_addr;
- unsigned short passive_port;
- if (!opt.server_response)
- logputs (LOG_VERBOSE, "==> PASV ... ");
+ ip_address passive_addr;
+ int passive_port;
err = ftp_do_pasv (&con->rbuf, &passive_addr, &passive_port);
/* FTPRERR, WRITEFAILED, FTPNOPASV, FTPINVPASV */
switch (err)
DEBUGP (("trying to connect to %s port %d\n",
pretty_print_address (&passive_addr),
passive_port));
- dtsock = connect_to_one (&passive_addr, passive_port, 1);
+ dtsock = connect_to_ip (&passive_addr, passive_port, NULL);
if (dtsock < 0)
{
int save_errno = errno;
if (!pasv_mode_open) /* Try to use a port command if PASV failed */
{
- if (!opt.server_response)
- logputs (LOG_VERBOSE, "==> PORT ... ");
- err = ftp_do_port (&con->rbuf);
+ err = ftp_do_port (&con->rbuf, &local_sock);
/* FTPRERR, WRITEFAILED, bindport (CONSOCKERR, CONPORTERR, BINDERR,
LISTENERR), HOSTERR, FTPPORTERR */
switch (err)
logputs (LOG_NOTQUIET, _("\
Error in server response, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_NOTQUIET,
_("Write failed, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, "socket: %s\n", strerror (errno));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, _("Bind error (%s).\n"),
strerror (errno));
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
return err;
break;
case FTPPORTERR:
logputs (LOG_VERBOSE, "\n");
logputs (LOG_NOTQUIET, _("Invalid PORT.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_NOTQUIET, _("\
Error in server response, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_NOTQUIET,
_("Write failed, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
_("\nREST failed; will not truncate `%s'.\n"),
con->target);
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return CONTNOTSUPPORTED;
}
if (opt.spider)
{
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return RETRFINISHED;
}
logputs (LOG_NOTQUIET, _("\
Error in server response, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_NOTQUIET,
_("Write failed, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
case FTPNSFOD:
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, _("No such file `%s'.\n\n"), u->file);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
return err;
break;
case FTPOK:
logputs (LOG_NOTQUIET, _("\
Error in server response, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_NOTQUIET,
_("Write failed, closing control connection.\n"));
CLOSE (csock);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
rbuf_uninitialize (&con->rbuf);
return err;
break;
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, _("No such file or directory `%s'.\n\n"),
".");
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
return err;
break;
case FTPOK:
to accept */
{
/* Open the data transmission socket by calling acceptport(). */
- err = acceptport (&dtsock);
+ err = acceptport (local_sock, &dtsock);
/* Possible errors: ACCEPTERR. */
if (err == ACCEPTERR)
{
logprintf (LOG_NOTQUIET, "%s: %s\n", con->target, strerror (errno));
CLOSE (csock);
rbuf_uninitialize (&con->rbuf);
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
return FOPENERR;
}
}
tms = time_str (NULL);
tmrate = retr_rate (*len - restval, con->dltime, 0);
/* Close data connection socket. */
- closeport (dtsock);
+ CLOSE (dtsock);
+ CLOSE (local_sock);
/* Close the local file. */
{
/* Close or flush the file. We have to be careful to check for