X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fftp.c;h=2b9eb0f267e4b63a60db95ae19e7afe35990aebe;hb=d5cd691b121120ec4ff1509f29519e98185fad4d;hp=d628ad1d7527c42e0a0c7f99e4718d0709a8f7c9;hpb=c3d636db033551ec654fecd7116cf7ecac467fd9;p=wget diff --git a/src/ftp.c b/src/ftp.c index d628ad1d..2b9eb0f2 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -57,9 +57,11 @@ extern int h_errno; extern char ftp_last_respline[]; +/* #### Global variables?? These two should be members of struct + ccon! */ + static enum stype host_type=ST_UNIX; static char *pwd; -static int pwd_len; /* Look for regexp "( *[0-9]+ *byte" (literal parenthesis) anywhere in the string S, and return the number converted to long, if found, 0 @@ -133,7 +135,7 @@ getftp (const struct urlinfo *u, long *len, long restval, ccon *con) search_netrc (u->host, (const char **)&user, (const char **)&passwd, 1); user = user ? user : opt.ftp_acc; if (!opt.ftp_pass) - opt.ftp_pass = xstrdup (ftp_getaddress ()); + opt.ftp_pass = ftp_getaddress (); passwd = passwd ? passwd : opt.ftp_pass; assert (user && passwd); @@ -279,7 +281,6 @@ Error in server response, closing control connection.\n")); if (!opt.server_response) logprintf (LOG_VERBOSE, "==> PWD ... "); err = ftp_pwd(&con->rbuf, &pwd); - pwd_len = strlen(pwd); /* FTPRERR */ switch (err) { @@ -352,8 +353,10 @@ Error in server response, closing control connection.\n")); /* Change working directory. If the FTP host runs VMS and the path specified is absolute, we will have to convert it to VMS style as VMS does not like leading slashes */ + DEBUGP (("changing working directory\n")); if (*(u->dir) == '/') { + int pwd_len = strlen (pwd); char *result = (char *)alloca (strlen (u->dir) + pwd_len + 10); *result = '\0'; switch (host_type) @@ -373,6 +376,7 @@ Error in server response, closing control connection.\n")); } break; case ST_UNIX: + case ST_WINNT: /* pwd_len == 1 means pwd = "/", but u->dir begins with '/' already */ if (pwd_len > 1) @@ -869,7 +873,7 @@ Error in server response, closing control connection.\n")); rbuf_discard (&con->rbuf); if (err != FTPOK) { - free (respline); + xfree (respline); /* The control connection is decidedly closed. Print the time only if it hasn't already been printed. */ if (res != -1) @@ -889,13 +893,13 @@ Error in server response, closing control connection.\n")); become apparent later. */ if (*respline != '2') { - free (respline); + xfree (respline); if (res != -1) logprintf (LOG_NOTQUIET, "%s (%s) - ", tms, tmrate); logputs (LOG_NOTQUIET, _("Data transfer aborted.\n")); return FTPRETRINT; } - free (respline); + xfree (respline); if (res == -1) { @@ -927,7 +931,7 @@ Error in server response, closing control connection.\n")); while ((line = read_whole_line (fp))) { logprintf (LOG_ALWAYS, "%s\n", line); - free (line); + xfree (line); } fclose (fp); } @@ -944,8 +948,6 @@ Error in server response, closing control connection.\n")); static uerr_t ftp_loop_internal (struct urlinfo *u, struct fileinfo *f, ccon *con) { - static int first_retrieval = 1; - int count, orig_lp; long restval, len; char *tms, *tmrate, *locf; @@ -982,23 +984,7 @@ ftp_loop_internal (struct urlinfo *u, struct fileinfo *f, ccon *con) { /* Increment the pass counter. */ ++count; - /* Wait before the retrieval (unless this is the very first - retrieval). - Check if we are retrying or not, wait accordingly - HEH */ - if (!first_retrieval && (opt.wait || (count && opt.waitretry))) - { - if (count) - { - if (countst & ON_YOUR_OWN) { con->cmd = 0; @@ -1041,7 +1027,7 @@ ftp_loop_internal (struct urlinfo *u, struct fileinfo *f, ccon *con) #ifdef WINDOWS ws_changetitle (hurl, 1); #endif - free (hurl); + xfree (hurl); } /* Send getftp the proper length, if fileinfo was provided. */ if (f) @@ -1109,7 +1095,7 @@ ftp_loop_internal (struct urlinfo *u, struct fileinfo *f, ccon *con) char *hurl = str_url (u->proxy ? u->proxy : u, 1); logprintf (LOG_NONVERBOSE, "%s URL: %s [%ld] -> \"%s\" [%d]\n", tms, hurl, len, locf, count); - free (hurl); + xfree (hurl); } if ((con->cmd & DO_LIST)) @@ -1196,7 +1182,7 @@ ftp_get_listing (struct urlinfo *u, ccon *con) else logprintf (LOG_VERBOSE, _("Removed `%s'.\n"), list_filename); } - free (list_filename); + xfree (list_filename); con->cmd &= ~DO_LIST; return f; } @@ -1283,7 +1269,7 @@ ftp_retrieve_list (struct urlinfo *u, struct fileinfo *f, ccon *con) if (local_size == f->size && tml >= f->tstamp) { logprintf (LOG_VERBOSE, _("\ -Server file not newer than local file `%s' -- not retrieving.\n\n"), u->local); +Server file no newer than local file `%s' -- not retrieving.\n\n"), u->local); dlthis = 0; } else if (local_size != f->size) @@ -1379,13 +1365,23 @@ Already have correct symlink %s -> %s\n\n"), /* Set the time-stamp information to the local file. Symlinks are not to be stamped because it sets the stamp on the original. :( */ - if (!opt.dfp - && !(f->type == FT_SYMLINK && !opt.retr_symlinks) + if (!(f->type == FT_SYMLINK && !opt.retr_symlinks) && f->tstamp != -1 && dlthis && file_exists_p (u->local)) { - touch (u->local, f->tstamp); + /* #### This code repeats in http.c and ftp.c. Move it to a + function! */ + const char *fl = NULL; + if (opt.output_document) + { + if (opt.od_known_regular) + fl = opt.output_document; + } + else + fl = u->local; + if (fl) + touch (fl, f->tstamp); } else if (f->tstamp == -1) logprintf (LOG_NOTQUIET, _("%s: corrupt time-stamp.\n"), u->local); @@ -1395,7 +1391,7 @@ Already have correct symlink %s -> %s\n\n"), else DEBUGP (("Unrecognized permissions for %s.\n", u->local)); - free (u->local); + xfree (u->local); u->local = olocal; u->file = ofile; /* Break on fatals. */ @@ -1608,7 +1604,7 @@ ftp_loop (struct urlinfo *u, int *dt) _("Wrote HTML-ized index to `%s'.\n"), filename); } - free (filename); + xfree (filename); } freefileinfo (f); } @@ -1634,6 +1630,8 @@ ftp_loop (struct urlinfo *u, int *dt) /* If a connection was left, quench it. */ if (rbuf_initialized_p (&con.rbuf)) CLOSE (RBUF_FD (&con.rbuf)); + FREE_MAYBE (pwd); + pwd = NULL; return res; } @@ -1646,9 +1644,9 @@ delelement (struct fileinfo *f, struct fileinfo **start) struct fileinfo *prev = f->prev; struct fileinfo *next = f->next; - free (f->name); + xfree (f->name); FREE_MAYBE (f->linkto); - free (f); + xfree (f); if (next) next->prev = prev; @@ -1666,10 +1664,10 @@ freefileinfo (struct fileinfo *f) while (f) { struct fileinfo *next = f->next; - free (f->name); + xfree (f->name); if (f->linkto) - free (f->linkto); - free (f); + xfree (f->linkto); + xfree (f); f = next; } }