X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fftp.c;h=645e565d8584a5f2394c4752d9f35a249b7ea092;hb=6aec825b936986e74763b3e635874903ae0b3065;hp=302714afda99cd78bd0187ca7b8b8051d66f669c;hpb=68740f10dd55cb272bcad0bd0c5199bbdef5b26e;p=wget diff --git a/src/ftp.c b/src/ftp.c index 302714af..645e565d 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -1,6 +1,6 @@ /* File Transfer Protocol support. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -17,17 +17,18 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wget. If not, see . -In addition, as a special exception, the Free Software Foundation -gives permission to link the code of its release of Wget with the -OpenSSL project's "OpenSSL" library (or with modified versions of it -that use the same license as the "OpenSSL" library), and distribute -the linked executables. You must obey the GNU General Public License -in all respects for all of the code used other than "OpenSSL". If you -modify this file, you may extend this exception to your version of the -file, but you are not obligated to do so. If you do not wish to do -so, delete this exception statement from your version. */ +Additional permission under GNU GPL version 3 section 7 -#include +If you modify this program, or any covered work, by linking or +combining it with the OpenSSL project's OpenSSL library (or a +modified version of that library), containing parts covered by the +terms of the OpenSSL or SSLeay licenses, the Free Software Foundation +grants you additional permission to convey the resulting work. +Corresponding Source for a non-source form of such a combination +shall include the source code for the parts of OpenSSL used as well +as that of the covered work. */ + +#include "wget.h" #include #include @@ -39,7 +40,6 @@ so, delete this exception statement from your version. */ #include #include -#include "wget.h" #include "utils.h" #include "url.h" #include "retr.h" @@ -566,8 +566,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 (escnonprint (u->dir))); fd_close (csock); con->csock = -1; return err; @@ -823,8 +823,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 (escnonprint (u->file))); fd_close (dtsock); fd_close (local_sock); return err; @@ -870,8 +870,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; @@ -918,7 +918,7 @@ Error in server response, closing control connection.\n")); if (opt.backups) rotate_backups (con->target); - if (restval) + if (restval && !(con->cmd & DO_LIST)) fp = fopen (con->target, "ab"); else if (opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct || opt.output_document) @@ -1094,7 +1094,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) if (opt.noclobber && 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; } @@ -1141,7 +1141,9 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) } /* Decide whether or not to restart. */ - if (opt.always_rest + if (con->cmd & DO_LIST) + restval = 0; + else if (opt.always_rest && stat (locf, &st) == 0 && S_ISREG (st.st_mode)) /* When -c is used, continue from on-disk size. (Can't use @@ -1163,8 +1165,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 @@ -1232,8 +1234,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 @@ -1316,7 +1318,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); @@ -1331,7 +1333,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)); } xfree (lf); con->cmd &= ~DO_LIST; @@ -1435,15 +1437,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 { @@ -1501,8 +1503,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 */ @@ -1513,8 +1515,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 (escnonprint (f->name))); break; case FT_PLAINFILE: /* Call the retrieve loop. */ @@ -1628,8 +1630,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 (escnonprint (newdir))); continue; } @@ -1693,8 +1695,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 (escnonprint (f->name))); f = delelement (f, &start); } else @@ -1707,8 +1709,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 (escnonprint (f->name))); f = delelement (f, &start); } else @@ -1716,31 +1718,47 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) } /* Now weed out the files that do not match our globbing pattern. If we are dealing with a globbing pattern, that is. */ - if (*u->file && (action == GLOB_GLOBALL || action == GLOB_GETONE)) + if (*u->file) { - int (*matcher) (const char *, const char *, int) - = opt.ignore_case ? fnmatch_nocase : fnmatch; - int matchres = 0; - - f = start; - while (f) + if (action == GLOB_GLOBALL) { - matchres = matcher (u->file, f->name, 0); + int (*matcher) (const char *, const char *, int) + = opt.ignore_case ? fnmatch_nocase : fnmatch; + int matchres = 0; + + f = start; + while (f) + { + matchres = matcher (u->file, f->name, 0); + if (matchres == -1) + { + logprintf (LOG_NOTQUIET, _("Error matching %s against %s: %s\n"), + u->file, escnonprint (f->name), strerror (errno)); + break; + } + if (matchres == FNM_NOMATCH) + f = delelement (f, &start); /* delete the element from the list */ + else + f = f->next; /* leave the element in the list */ + } if (matchres == -1) { - logprintf (LOG_NOTQUIET, "%s: %s\n", con->target, - strerror (errno)); - break; + freefileinfo (start); + return RETRBADPATTERN; } - if (matchres == FNM_NOMATCH) - f = delelement (f, &start); /* delete the element from the list */ - else - f = f->next; /* leave the element in the list */ } - if (matchres == -1) + else if (action == GLOB_GETONE) { - freefileinfo (start); - return RETRBADPATTERN; + int (*cmp) (const char *, const char *) + = opt.ignore_case ? strcasecmp : strcmp; + f = start; + while (f) + { + if (0 != cmp(u->file, f->name)) + f = delelement (f, &start); + else + f = f->next; + } } } if (start) @@ -1748,15 +1766,15 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) /* Just get everything. */ ftp_retrieve_list (u, start, con); } - else if (!start) + else { if (action == GLOB_GLOBALL) { /* 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 (escnonprint (u->file))); } else /* GLOB_GETONE or GLOB_GETALL */ { @@ -1821,13 +1839,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); }