X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fftp.c;h=9728c3394cfdc0257ae30884d73d80f498a52b0f;hb=8566a727674ab3c2b0df03c31c6085a0d5d5bf81;hp=1d19497a5e40bce677ea6e101ae843b11d063981;hpb=c1fb83c53b27ffd1635fda24702f2a115d939511;p=wget diff --git a/src/ftp.c b/src/ftp.c index 1d19497a..9728c339 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -1,6 +1,5 @@ /* File Transfer Protocol support. - Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 - Free Software Foundation, Inc. + Copyright (C) 1996-2006 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -15,8 +14,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Wget; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +along with Wget; if not, write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. In addition, as a special exception, the Free Software Foundation gives permission to link the code of its release of Wget with the @@ -38,6 +37,7 @@ so, delete this exception statement from your version. */ #endif #include #include +#include #include "wget.h" #include "utils.h" @@ -117,14 +117,14 @@ ftp_do_pasv (int csock, ip_address *addr, int *port) /* If our control connection is over IPv6, then we first try EPSV and then * LPSV if the former is not supported. If the control connection is over * IPv4, we simply issue the good old PASV request. */ - switch (addr->type) + switch (addr->family) { - case IPV4_ADDRESS: + case AF_INET: if (!opt.server_response) logputs (LOG_VERBOSE, "==> PASV ... "); err = ftp_pasv (csock, addr, port); break; - case IPV6_ADDRESS: + case AF_INET6: if (!opt.server_response) logputs (LOG_VERBOSE, "==> EPSV ... "); err = ftp_epsv (csock, addr, port); @@ -160,14 +160,14 @@ ftp_do_port (int csock, int *local_sock) /* If our control connection is over IPv6, then we first try EPRT and then * LPRT if the former is not supported. If the control connection is over * IPv4, we simply issue the good old PORT request. */ - switch (cip.type) + switch (cip.family) { - case IPV4_ADDRESS: + case AF_INET: if (!opt.server_response) logputs (LOG_VERBOSE, "==> PORT ... "); err = ftp_port (csock, local_sock); break; - case IPV6_ADDRESS: + case AF_INET6: if (!opt.server_response) logputs (LOG_VERBOSE, "==> EPRT ... "); err = ftp_eprt (csock, local_sock); @@ -953,7 +953,7 @@ Error in server response, closing control connection.\n")); if (*len) { print_length (*len, restval, true); - expected_bytes = *len; /* for get_contents/show_progress */ + expected_bytes = *len; /* for fd_read_body's progress bar */ } else if (expected_bytes) print_length (expected_bytes, restval, false); @@ -968,49 +968,38 @@ Error in server response, closing control connection.\n")); expected_bytes ? expected_bytes - restval : 0, restval, &rd_size, len, &con->dltime, flags); - tms = time_str (NULL); + tms = time_str (time (NULL)); tmrate = retr_rate (rd_size, con->dltime); total_download_time += con->dltime; - /* Close data connection socket. */ - fd_close (dtsock); fd_close (local_sock); /* Close the local file. */ - { - /* Close or flush the file. We have to be careful to check for - error here. Checking the result of fwrite() is not enough -- - errors could go unnoticed! */ - int flush_res; - if (!output_stream || con->cmd & DO_LIST) - flush_res = fclose (fp); - else - flush_res = fflush (fp); - if (flush_res == EOF) - res = -2; - } - - /* If get_contents couldn't write to fp, bail out. */ + if (!output_stream || con->cmd & DO_LIST) + fclose (fp); + + /* If fd_read_body couldn't write to fp, bail out. */ if (res == -2) { logprintf (LOG_NOTQUIET, _("%s: %s, closing control connection.\n"), con->target, strerror (errno)); fd_close (csock); con->csock = -1; + fd_close (dtsock); return FWRITEERR; } else if (res == -1) { logprintf (LOG_NOTQUIET, _("%s (%s) - Data connection: %s; "), - tms, tmrate, strerror (errno)); + tms, tmrate, fd_errstr (dtsock)); if (opt.server_response) logputs (LOG_ALWAYS, "\n"); } + fd_close (dtsock); /* Get the server to tell us if everything is retrieved. */ err = ftp_response (csock, &respline); if (err != FTPOK) { - xfree (respline); /* The control connection is decidedly closed. Print the time only if it hasn't already been printed. */ if (res != -1) @@ -1161,7 +1150,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) restval = 0; /* Get the current time string. */ - tms = time_str (NULL); + tms = time_str (time (NULL)); /* Print fetch message, if opt.verbose. */ if (opt.verbose) { @@ -1225,7 +1214,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) /* Not as great. */ abort (); } - tms = time_str (NULL); + tms = time_str (time (NULL)); if (!opt.spider) tmrate = retr_rate (len - restval, con->dltime); @@ -1433,7 +1422,7 @@ ftp_retrieve_list (struct url *u, struct fileinfo *f, ccon *con) tml++; #endif /* Compare file sizes only for servers that tell us correct - values. Assumme sizes being equal for servers that lie + values. Assume sizes being equal for servers that lie about file size. */ cor_val = (con->rs == ST_UNIX || con->rs == ST_WINNT); eq_size = cor_val ? (local_size == f->size) : true; @@ -1632,7 +1621,7 @@ ftp_retrieve_dirs (struct url *u, struct fileinfo *f, ccon *con) DEBUGP (("Composing new CWD relative to the initial directory.\n")); DEBUGP ((" odir = '%s'\n f->name = '%s'\n newdir = '%s'\n\n", odir, f->name, newdir)); - if (!accdir (newdir, ALLABS)) + if (!accdir (newdir)) { logprintf (LOG_VERBOSE, _("\ Not descending to `%s' as it is excluded/not-included.\n"), @@ -1725,12 +1714,14 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) If we are dealing with a globbing pattern, that is. */ if (*u->file && (action == GLOB_GLOBALL || action == GLOB_GETONE)) { + int (*matcher) (const char *, const char *, int) + = opt.ignore_case ? fnmatch_nocase : fnmatch; int matchres = 0; f = start; while (f) { - matchres = fnmatch (u->file, f->name, 0); + matchres = matcher (u->file, f->name, 0); if (matchres == -1) { logprintf (LOG_NOTQUIET, "%s: %s\n", con->target, @@ -1783,7 +1774,7 @@ ftp_retrieve_glob (struct url *u, ccon *con, int action) of URL. Inherently, its capabilities are limited on what can be encoded into a URL. */ uerr_t -ftp_loop (struct url *u, int *dt, struct url *proxy) +ftp_loop (struct url *u, int *dt, struct url *proxy, bool recursive, bool glob) { ccon con; /* FTP connection */ uerr_t res; @@ -1801,7 +1792,7 @@ ftp_loop (struct url *u, int *dt, struct url *proxy) /* If the file name is empty, the user probably wants a directory index. We'll provide one, properly HTML-ized. Unless opt.htmlify is 0, of course. :-) */ - if (!*u->file && !opt.recursive) + if (!*u->file && !recursive) { struct fileinfo *f; res = ftp_get_listing (u, &con, &f); @@ -1842,7 +1833,7 @@ ftp_loop (struct url *u, int *dt, struct url *proxy) else { bool ispattern = false; - if (opt.ftp_glob) + if (glob) { /* Treat the URL as a pattern if the file name part of the URL path contains wildcards. (Don't check for u->file @@ -1853,7 +1844,7 @@ ftp_loop (struct url *u, int *dt, struct url *proxy) file_part = u->path; ispattern = has_wildcards_p (file_part); } - if (ispattern || opt.recursive || opt.timestamping) + if (ispattern || recursive || opt.timestamping) { /* ftp_retrieve_glob is a catch-all function that gets called if we need globbing, time-stamping or recursion. Its