/* 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.
You should have received a copy of the GNU General Public License
along with Wget. If not, see <http://www.gnu.org/licenses/>.
-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 <config.h>
+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 <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
-#include "wget.h"
#include "utils.h"
#include "url.h"
#include "retr.h"
#include "recur.h" /* for INFINITE_RECURSION */
/* File where the "ls -al" listing will be saved. */
+#ifdef MSDOS
+#define LIST_FILENAME "_listing"
+#else
#define LIST_FILENAME ".listing"
+#endif
typedef struct
{
res = str_to_wgint (s, (char **) &s, 10);
if (!*s)
return 0;
- while (*s && ISSPACE (*s))
+ while (*s && c_isspace (*s))
++s;
if (!*s)
return 0;
- if (TOLOWER (*s) != 'b')
+ if (c_tolower (*s) != 'b')
continue;
if (strncasecmp (s, "byte", 4))
continue;
if (target[0] != '/'
&& !(con->rs != ST_UNIX
- && ISALPHA (target[0])
+ && c_isalpha (target[0])
&& target[1] == ':')
&& con->rs != ST_OS400)
{
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)
}
/* 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
con->target = old_target;
if (err == RETROK)
- *f = ftp_parse_ls (lf, con->rs);
- else
- *f = NULL;
- if (opt.remove_listing)
{
- if (unlink (lf))
- logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
- else
- logprintf (LOG_VERBOSE, _("Removed `%s'.\n"), lf);
+ *f = ftp_parse_ls (lf, con->rs);
+ if (opt.remove_listing)
+ {
+ if (unlink (lf))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ else
+ logprintf (LOG_VERBOSE, _("Removed `%s'.\n"), lf);
+ }
}
+ else
+ *f = NULL;
xfree (lf);
con->cmd &= ~DO_LIST;
return err;
}
/* 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)
/* Just get everything. */
ftp_retrieve_list (u, start, con);
}
- else if (!start)
+ else
{
if (action == GLOB_GLOBALL)
{