X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fftp.c;h=482651be62cd769f94ab404d25fc69297a0cc03f;hb=ef113e51d8c80b16902042de7279ef634e7fdc2a;hp=e6163880ec0c7996cea37c4d2eddeee0e1f3a938;hpb=888c30ba01f2ea7fe4ba1f24b536aafe887b2c37;p=wget diff --git a/src/ftp.c b/src/ftp.c index e6163880..482651be 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -227,6 +227,8 @@ print_length (wgint size, wgint start, bool authoritative) logputs (LOG_VERBOSE, !authoritative ? _(" (unauthoritative)\n") : "\n"); } +static uerr_t ftp_get_listing (struct url *, ccon *, struct fileinfo **); + /* Retrieves a file with denoted parameters through opening an FTP connection to the server. It always closes the data connection, and closes the control connection in case of error. */ @@ -300,7 +302,8 @@ getftp (struct url *u, wgint *len, wgint restval, ccon *con) con->csock = -1; /* Second: Login with proper USER/PASS sequence. */ - logprintf (LOG_VERBOSE, _("Logging in as %s ... "), escnonprint (user)); + logprintf (LOG_VERBOSE, _("Logging in as %s ... "), + quotearg_style (escape_quoting_style, user)); if (opt.server_response) logputs (LOG_ALWAYS, "\n"); err = ftp_login (csock, logname, passwd); @@ -545,7 +548,8 @@ Error in server response, closing control connection.\n")); } if (!opt.server_response) - logprintf (LOG_VERBOSE, "==> CWD %s ... ", escnonprint (target)); + logprintf (LOG_VERBOSE, "==> CWD %s ... ", + quotearg_style (escape_quoting_style, target)); err = ftp_cwd (csock, target); /* FTPRERR, WRITEFAILED, FTPNSFOD */ switch (err) @@ -566,8 +570,8 @@ Error in server response, closing control connection.\n")); return err; case FTPNSFOD: logputs (LOG_VERBOSE, "\n"); - logprintf (LOG_NOTQUIET, _("No such directory `%s'.\n\n"), - escnonprint (u->dir)); + logprintf (LOG_NOTQUIET, _("No such directory %s.\n\n"), + quote (u->dir)); fd_close (csock); con->csock = -1; return err; @@ -588,7 +592,8 @@ Error in server response, closing control connection.\n")); if (opt.verbose) { if (!opt.server_response) - logprintf (LOG_VERBOSE, "==> SIZE %s ... ", escnonprint (u->file)); + logprintf (LOG_VERBOSE, "==> SIZE %s ... ", + quotearg_style (escape_quoting_style, u->file)); } err = ftp_size (csock, u->file, len); @@ -776,12 +781,43 @@ Error in server response, closing control connection.\n")); if (cmd & DO_RETR) { - /* If we're in spider mode, don't really retrieve anything. The - fact that we got to this point should be proof enough that - the file exists, vaguely akin to HTTP's concept of a "HEAD" - request. */ + /* If we're in spider mode, don't really retrieve anything except + 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; + } + if (exists) + { + logputs (LOG_VERBOSE, "\n"); + logprintf (LOG_NOTQUIET, _("File %s exists.\n"), + quote (u->file)); + } + else + { + logputs (LOG_VERBOSE, "\n"); + logprintf (LOG_NOTQUIET, _("No such file %s.\n"), + quote (u->file)); + } + } fd_close (csock); con->csock = -1; fd_close (dtsock); @@ -795,7 +831,8 @@ Error in server response, closing control connection.\n")); { if (restval) logputs (LOG_VERBOSE, "\n"); - logprintf (LOG_VERBOSE, "==> RETR %s ... ", escnonprint (u->file)); + logprintf (LOG_VERBOSE, "==> RETR %s ... ", + quotearg_style (escape_quoting_style, u->file)); } } @@ -823,8 +860,8 @@ Error in server response, closing control connection.\n")); return err; case FTPNSFOD: logputs (LOG_VERBOSE, "\n"); - logprintf (LOG_NOTQUIET, _("No such file `%s'.\n\n"), - escnonprint (u->file)); + logprintf (LOG_NOTQUIET, _("No such file %s.\n\n"), + quote (u->file)); fd_close (dtsock); fd_close (local_sock); return err; @@ -870,8 +907,8 @@ Error in server response, closing control connection.\n")); return err; case FTPNSFOD: logputs (LOG_VERBOSE, "\n"); - logprintf (LOG_NOTQUIET, _("No such file or directory `%s'.\n\n"), - "."); + logprintf (LOG_NOTQUIET, _("No such file or directory %s.\n\n"), + quote (".")); fd_close (dtsock); fd_close (local_sock); return err; @@ -1063,7 +1100,8 @@ Error in server response, closing control connection.\n")); char *p = strchr (line, '\0'); while (p > line && (p[-1] == '\n' || p[-1] == '\r')) *--p = '\0'; - logprintf (LOG_ALWAYS, "%s\n", escnonprint (line)); + logprintf (LOG_ALWAYS, "%s\n", + quotearg_style (escape_quoting_style, line)); xfree (line); } fclose (fp); @@ -1092,11 +1130,11 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) con->target = url_file_name (u); /* If the output_document was given, then this check was already done and - the file doesn't exist. Hence the !opt.output_document */ + the file didn't exist. Hence the !opt.output_document */ if (opt.noclobber && !opt.output_document && file_exists_p (con->target)) { logprintf (LOG_VERBOSE, - _("File `%s' already there; not retrieving.\n"), con->target); + _("File %s already there; not retrieving.\n"), quote (con->target)); /* If the file is there, we suppose it's retrieved OK. */ return RETROK; } @@ -1167,8 +1205,8 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) strcpy (tmp, " "); if (count > 1) sprintf (tmp, _("(try:%2d)"), count); - logprintf (LOG_VERBOSE, "--%s-- %s\n %s => `%s'\n", - tms, hurl, tmp, locf); + logprintf (LOG_VERBOSE, "--%s-- %s\n %s => %s\n", + tms, hurl, tmp, quote (locf)); #ifdef WINDOWS ws_changetitle (hurl); #endif @@ -1236,8 +1274,8 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) con->csock = -1; } if (!opt.spider) - logprintf (LOG_VERBOSE, _("%s (%s) - `%s' saved [%s]\n\n"), - tms, tmrate, locf, number_to_static_string (len)); + logprintf (LOG_VERBOSE, _("%s (%s) - %s saved [%s]\n\n"), + tms, tmrate, quote (locf), number_to_static_string (len)); if (!opt.verbose && !opt.quiet) { /* Need to hide the password from the URL. The `if' is here @@ -1320,7 +1358,7 @@ ftp_get_listing (struct url *u, ccon *con, struct fileinfo **f) uf = url_file_name (u); lf = file_merge (uf, LIST_FILENAME); xfree (uf); - DEBUGP ((_("Using `%s' as listing tmp file.\n"), lf)); + DEBUGP ((_("Using %s as listing tmp file.\n"), quote (lf))); con->target = lf; err = ftp_loop_internal (u, NULL, con); @@ -1334,7 +1372,7 @@ ftp_get_listing (struct url *u, ccon *con, struct fileinfo **f) if (unlink (lf)) logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno)); else - logprintf (LOG_VERBOSE, _("Removed `%s'.\n"), lf); + logprintf (LOG_VERBOSE, _("Removed %s.\n"), quote (lf)); } } else @@ -1441,15 +1479,15 @@ ftp_retrieve_list (struct url *u, struct fileinfo *f, ccon *con) /* Remote file is older, file sizes can be compared and are both equal. */ logprintf (LOG_VERBOSE, _("\ -Remote file no newer than local file `%s' -- not retrieving.\n"), con->target); +Remote file no newer than local file %s -- not retrieving.\n"), quote (con->target)); dlthis = false; } else if (eq_size) { /* Remote file is newer or sizes cannot be matched */ logprintf (LOG_VERBOSE, _("\ -Remote file is newer than local file `%s' -- retrieving.\n\n"), - con->target); +Remote file is newer than local file %s -- retrieving.\n\n"), + quote (con->target)); } else { @@ -1491,14 +1529,15 @@ The sizes do not match (local %s) -- retrieving.\n\n"), { logprintf (LOG_VERBOSE, _("\ Already have correct symlink %s -> %s\n\n"), - con->target, escnonprint (f->linkto)); + quote (con->target), + quote (f->linkto)); dlthis = false; break; } } } logprintf (LOG_VERBOSE, _("Creating symlink %s -> %s\n"), - con->target, escnonprint (f->linkto)); + quote (con->target), quote (f->linkto)); /* Unlink before creating symlink! */ unlink (con->target); if (symlink (f->linkto, con->target) == -1) @@ -1507,8 +1546,8 @@ Already have correct symlink %s -> %s\n\n"), } /* have f->linkto */ #else /* not HAVE_SYMLINK */ logprintf (LOG_NOTQUIET, - _("Symlinks not supported, skipping symlink `%s'.\n"), - con->target); + _("Symlinks not supported, skipping symlink %s.\n"), + quote (con->target)); #endif /* not HAVE_SYMLINK */ } else /* opt.retr_symlinks */ @@ -1519,8 +1558,8 @@ Already have correct symlink %s -> %s\n\n"), break; case FT_DIRECTORY: if (!opt.recursive) - logprintf (LOG_NOTQUIET, _("Skipping directory `%s'.\n"), - escnonprint (f->name)); + logprintf (LOG_NOTQUIET, _("Skipping directory %s.\n"), + quote (f->name)); break; case FT_PLAINFILE: /* Call the retrieve loop. */ @@ -1529,7 +1568,7 @@ Already have correct symlink %s -> %s\n\n"), break; case FT_UNKNOWN: logprintf (LOG_NOTQUIET, _("%s: unknown/unsupported file type.\n"), - escnonprint (f->name)); + quote (f->name)); break; } /* switch */ @@ -1634,8 +1673,8 @@ ftp_retrieve_dirs (struct url *u, struct fileinfo *f, ccon *con) if (!accdir (newdir)) { logprintf (LOG_VERBOSE, _("\ -Not descending to `%s' as it is excluded/not-included.\n"), - escnonprint (newdir)); +Not descending to %s as it is excluded/not-included.\n"), + quote (newdir)); continue; } @@ -1699,8 +1738,8 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) { if (f->type != FT_DIRECTORY && !acceptable (f->name)) { - logprintf (LOG_VERBOSE, _("Rejecting `%s'.\n"), - escnonprint (f->name)); + logprintf (LOG_VERBOSE, _("Rejecting %s.\n"), + quote (f->name)); f = delelement (f, &start); } else @@ -1713,8 +1752,8 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) { if (has_insecure_name_p (f->name)) { - logprintf (LOG_VERBOSE, _("Rejecting `%s'.\n"), - escnonprint (f->name)); + logprintf (LOG_VERBOSE, _("Rejecting %s.\n"), + quote (f->name)); f = delelement (f, &start); } else @@ -1737,7 +1776,8 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) if (matchres == -1) { logprintf (LOG_NOTQUIET, _("Error matching %s against %s: %s\n"), - u->file, escnonprint (f->name), strerror (errno)); + u->file, quotearg_style (escape_quoting_style, f->name), + strerror (errno)); break; } if (matchres == FNM_NOMATCH) @@ -1777,8 +1817,8 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) /* No luck. */ /* #### This message SUCKS. We should see what was the reason that nothing was retrieved. */ - logprintf (LOG_VERBOSE, _("No matches on pattern `%s'.\n"), - escnonprint (u->file)); + logprintf (LOG_VERBOSE, _("No matches on pattern %s.\n"), + quote (u->file)); } else /* GLOB_GETONE or GLOB_GETALL */ { @@ -1843,13 +1883,13 @@ ftp_loop (struct url *u, int *dt, struct url *proxy, bool recursive, bool glob) else sz = -1; logprintf (LOG_NOTQUIET, - _("Wrote HTML-ized index to `%s' [%s].\n"), - filename, number_to_static_string (sz)); + _("Wrote HTML-ized index to %s [%s].\n"), + quote (filename), number_to_static_string (sz)); } else logprintf (LOG_NOTQUIET, - _("Wrote HTML-ized index to `%s'.\n"), - filename); + _("Wrote HTML-ized index to %s.\n"), + quote (filename)); } xfree (filename); }