From d26ff3ca0d7998696a9657653d0ffae0b59934b6 Mon Sep 17 00:00:00 2001 From: Micah Cowan Date: Sat, 8 Dec 2007 14:21:37 -0800 Subject: [PATCH] Print arguments of fnmatch properly; don't use fnmatch if we're not in globbing mode. --- src/ChangeLog | 7 +++++++ src/ftp.c | 54 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 39045d96..9313ff46 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2007-12-08 Hrvoje Niksic + + * ftp.c (ftp_retrieve_glob): Print both arguments of fnmatch in + fnmatch error message. + (ftp_retrieve_glob): Don't match with fnmatch if we're only + supposed to get one file. + 2007-12-07 Micah Cowan * Makefile.am: Plug in vars to include stuff from diff --git a/src/ftp.c b/src/ftp.c index a9ff9437..ff5c1e72 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -1716,31 +1716,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,7 +1764,7 @@ 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) { -- 2.39.2