int csock, dtsock, local_sock, res;
uerr_t err = RETROK; /* appease the compiler */
FILE *fp;
- char *user, *passwd, *respline;
- char *tms;
- const char *tmrate;
+ char *respline, *tms;
+ const char *user, *passwd, *tmrate;
int cmd = con->cmd;
bool pasv_mode_open = false;
wgint expected_bytes = 0;
{
char *host = con->proxy ? con->proxy->host : u->host;
int port = con->proxy ? con->proxy->port : u->port;
- char *logname = user;
-
- if (con->proxy)
- {
- /* If proxy is in use, log in as username@target-site. */
- logname = concat_strings (user, "@", u->host, (char *) 0);
- }
/* Login to the server: */
csock = connect_to_host (host, port);
if (csock == E_HOST)
- {
- if (con->proxy)
- xfree (logname);
-
return HOSTERR;
- }
else if (csock < 0)
- {
- if (con->proxy)
- xfree (logname);
-
return (retryable_socket_connect_error (errno)
? CONERROR : CONIMPOSSIBLE);
- }
if (cmd & LEAVE_PENDING)
con->csock = csock;
quotearg_style (escape_quoting_style, user));
if (opt.server_response)
logputs (LOG_ALWAYS, "\n");
- err = ftp_login (csock, logname, passwd);
-
if (con->proxy)
- xfree (logname);
+ {
+ /* If proxy is in use, log in as username@target-site. */
+ char *logname = concat_strings (user, "@", u->host, (char *) 0);
+ err = ftp_login (csock, logname, passwd);
+ xfree (logname);
+ }
+ else
+ err = ftp_login (csock, user, passwd);
/* FTPRERR, FTPSRVERR, WRITEFAILED, FTPLOGREFUSED, FTPLOGINC */
switch (err)
logputs (LOG_VERBOSE, _("==> CWD not needed.\n"));
else
{
- char *targ = NULL;
+ const char *targ = NULL;
int cwd_count;
int cwd_end;
int cwd_start;
The VMS restriction may be relaxed when the squirrely code
above is reformed.
*/
- if ((con->rs == ST_VMS) && (target[0] != '/'))
- {
- cwd_start = 0;
- DEBUGP (("Using two-step CWD for relative path.\n"));
- }
- else
- {
+ if ((con->rs == ST_VMS) && (target[0] != '/'))
+ {
+ cwd_start = 0;
+ DEBUGP (("Using two-step CWD for relative path.\n"));
+ }
+ else
+ {
/* Go straight to the target. */
- cwd_start = 1;
- }
+ cwd_start = 1;
+ }
/* At least one VMS FTP server (TCPware V5.6-2) can switch to
a UNIX emulation mode when given a UNIX-like directory
Unlike the rest of this block, this particular behavior
_is_ VMS-specific, so it gets its own VMS test.
*/
- if ((con->rs == ST_VMS) && (strchr( target, '/') != NULL))
+ if ((con->rs == ST_VMS) && (strchr( target, '/') != NULL))
{
cwd_end = 3;
- DEBUGP (("Using extra \"CWD []\" step for VMS server.\n"));
+ DEBUGP (("Using extra \"CWD []\" step for VMS server.\n"));
}
else
{
/* 2004-09-20 SMS. */
/* Sorry about the deviant indenting. Laziness. */
- for (cwd_count = cwd_start; cwd_count < cwd_end; cwd_count++)
- {
+ for (cwd_count = cwd_start; cwd_count < cwd_end; cwd_count++)
+ {
switch (cwd_count)
{
case 0:
- /* Step one (optional): Go to the initial directory,
- exactly as reported by the server.
- */
- targ = con->id;
+ /* Step one (optional): Go to the initial directory,
+ exactly as reported by the server.
+ */
+ targ = con->id;
break;
case 1:
- /* Step two: Go to the target directory. (Absolute or
- relative will work now.)
- */
- targ = target;
+ /* Step two: Go to the target directory. (Absolute or
+ relative will work now.)
+ */
+ targ = target;
break;
case 2:
default:
/* Can't happen. */
assert (1);
- }
+ }
if (!opt.server_response)
logprintf (LOG_VERBOSE, "==> CWD (%d) %s ... ", cwd_count,
if (cmd & DO_RETR)
{
/* If we're in spider mode, don't really retrieve anything except
- the directory listing and verify whether the given "file" exists. */
+ the directory listing and verify whether the given "file" exists. */
if (opt.spider)
{
- bool exists = false;
- uerr_t res;
- struct fileinfo *f;
- res = ftp_get_listing (u, con, &f);
- /* Set the DO_RETR command flag again, because it gets unset when
- calling ftp_get_listing() and would otherwise cause an assertion
- failure earlier on when this function gets repeatedly called
- (e.g., when recursing). */
- con->cmd |= DO_RETR;
- if (res == RETROK)
- {
- while (f)
- {
- if (!strcmp (f->name, u->file))
- {
- exists = true;
- break;
- }
- f = f->next;
- }
+ bool exists = false;
+ uerr_t res;
+ struct fileinfo *f;
+ res = ftp_get_listing (u, con, &f);
+ /* Set the DO_RETR command flag again, because it gets unset when
+ calling ftp_get_listing() and would otherwise cause an assertion
+ failure earlier on when this function gets repeatedly called
+ (e.g., when recursing). */
+ con->cmd |= DO_RETR;
+ if (res == RETROK)
+ {
+ while (f)
+ {
+ if (!strcmp (f->name, u->file))
+ {
+ exists = true;
+ break;
+ }
+ f = f->next;
+ }
if (exists)
{
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, _("File %s exists.\n"),
quote (u->file));
}
- else
+ else
{
- logputs (LOG_VERBOSE, "\n");
- logprintf (LOG_NOTQUIET, _("No such file %s.\n"),
- quote (u->file));
- }
- }
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("No such file %s.\n"),
+ quote (u->file));
+ }
+ }
fd_close (csock);
con->csock = -1;
fd_close (dtsock);
else if (opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct
|| opt.output_document || count > 0)
{
- if (opt.unlink && file_exists_p (con->target))
- {
- int res = unlink (con->target);
- if (res < 0)
- {
- logprintf (LOG_NOTQUIET, "%s: %s\n", con->target,
- strerror (errno));
- fd_close (csock);
- con->csock = -1;
- fd_close (dtsock);
- fd_close (local_sock);
- return UNLINKERR;
- }
- }
+ if (opt.unlink && file_exists_p (con->target))
+ {
+ int res = unlink (con->target);
+ if (res < 0)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", con->target,
+ strerror (errno));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return UNLINKERR;
+ }
+ }
#ifdef __VMS
int open_id;
logprintf (LOG_ALWAYS, "%s: %s\n", con->target, strerror (errno));
else
{
- char *line;
- /* The lines are being read with read_whole_line because of
+ char *line = NULL;
+ size_t bufsize = 0;
+ ssize_t len;
+
+ /* The lines are being read with getline because of
no-buffering on opt.lfile. */
- while ((line = read_whole_line (fp)) != NULL)
+ while ((len = getline (&line, &bufsize, fp)) > 0)
{
- char *p = strchr (line, '\0');
- while (p > line && (p[-1] == '\n' || p[-1] == '\r'))
- *--p = '\0';
+ while (len > 0 && (line[len - 1] == '\n' || line[len - 1] == '\r'))
+ line[--len] = '\0';
logprintf (LOG_ALWAYS, "%s\n",
quotearg_style (escape_quoting_style, line));
- xfree (line);
}
+ xfree (line);
fclose (fp);
}
} /* con->cmd & DO_LIST && server_response */
/* If the output_document was given, then this check was already done and
the file didn't exist. Hence the !opt.output_document */
- if (opt.noclobber && !opt.output_document && file_exists_p (con->target))
+
+ /* If we receive .listing file it is necessary to determine system type of the ftp
+ server even if opn.noclobber is given. Thus we must ignore opt.noclobber in
+ order to establish connection with the server and get system type. */
+ if (opt.noclobber && !opt.output_document && file_exists_p (con->target)
+ && !((con->cmd & DO_LIST) && !(con->cmd & DO_RETR)))
{
logprintf (LOG_VERBOSE,
_("File %s already there; not retrieving.\n"), quote (con->target));
orig_lp = con->cmd & LEAVE_PENDING ? 1 : 0;
- /* For file RETR requests, we can write a WARC record.
- We record the file contents to a temporary file. */
- if (warc_enabled && (con->cmd & DO_RETR))
- {
- warc_tmp = warc_tempfile ();
- if (warc_tmp == NULL)
- return WARC_TMP_FOPENERR;
-
- if (!con->proxy && con->csock != -1)
- {
- warc_ip = (ip_address *) alloca (sizeof (ip_address));
- socket_ip_address (con->csock, warc_ip, ENDPOINT_PEER);
- }
- }
-
/* THE loop. */
do
{
con->cmd |= DO_CWD;
}
+ /* For file RETR requests, we can write a WARC record.
+ We record the file contents to a temporary file. */
+ if (warc_enabled && (con->cmd & DO_RETR) && warc_tmp == NULL)
+ {
+ warc_tmp = warc_tempfile ();
+ if (warc_tmp == NULL)
+ return WARC_TMP_FOPENERR;
+
+ if (!con->proxy && con->csock != -1)
+ {
+ warc_ip = (ip_address *) alloca (sizeof (ip_address));
+ socket_ip_address (con->csock, warc_ip, ENDPOINT_PEER);
+ }
+ }
+
/* Decide whether or not to restart. */
if (con->cmd & DO_LIST)
restval = 0;