X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Furl.c;h=eea36a10d865d0e7ad7cea42735921a73ca560d2;hb=7b5ad90acfc8c101a6cf919cd2a00217f0194e93;hp=c077f000250598ef028ce96395ccf2b593146258;hpb=b0b1c815c15e49c9172f59428810713097a65e37;p=wget diff --git a/src/url.c b/src/url.c index c077f000..eea36a10 100644 --- a/src/url.c +++ b/src/url.c @@ -61,7 +61,7 @@ static char unsafe_char_table[256]; if (contains_unsafe (s)) \ { \ char *uc_tmp = encode_string (s); \ - free (s); \ + xfree (s); \ (s) = uc_tmp; \ } \ } while (0) @@ -176,6 +176,7 @@ init_unsafe_char_table (void) int i; for (i = 0; i < 256; i++) if (i < 32 || i >= 127 + || i == ' ' || i == '<' || i == '>' || i == '\"' @@ -377,7 +378,7 @@ freeurl (struct urlinfo *u, int complete) if (u->proxy) freeurl (u->proxy, 1); if (complete) - free (u); + xfree (u); return; } @@ -697,7 +698,7 @@ str_url (const struct urlinfo *u, int hide) tmp[1] = '2'; tmp[2] = 'F'; strcpy (tmp + 3, dir + 1); - free (dir); + xfree (dir); dir = tmp; } @@ -741,9 +742,9 @@ str_url (const struct urlinfo *u, int hide) if (*dir) res[l++] = '/'; strcpy (res + l, file); - free (host); - free (dir); - free (file); + xfree (host); + xfree (dir); + xfree (file); FREE_MAYBE (user); FREE_MAYBE (passwd); return res; @@ -839,9 +840,9 @@ free_urlpos (urlpos *l) while (l) { urlpos *next = l->next; - free (l->url); + xfree (l->url); FREE_MAYBE (l->local_name); - free (l); + xfree (l); l = next; } } @@ -894,7 +895,7 @@ mkalldirs (const char *path) { if (S_ISDIR (st.st_mode)) { - free (t); + xfree (t); return 0; } else @@ -918,7 +919,7 @@ mkalldirs (const char *path) res = make_directory (t); if (res != 0) logprintf (LOG_NOTQUIET, "%s: %s", t, strerror (errno)); - free (t); + xfree (t); return res; } @@ -962,7 +963,7 @@ mkstruct (const struct urlinfo *u) if (opt.add_hostdir && !opt.simple_check) { char *nhost = realhost (host); - free (host); + xfree (host); host = nhost; } /* Add dir_prefix and hostname (if required) to the beginning of @@ -985,7 +986,7 @@ mkstruct (const struct urlinfo *u) else dirpref = ""; } - free (host); + xfree (host); /* If there is a prefix, prepend it. */ if (*dirpref) @@ -1008,7 +1009,7 @@ mkstruct (const struct urlinfo *u) /* Finally, construct the full name. */ res = (char *)xmalloc (strlen (dir) + 1 + strlen (file) + 1); sprintf (res, "%s%s%s", dir, *dir ? "/" : "", file); - free (dir); + xfree (dir); return res; } @@ -1042,7 +1043,7 @@ url_filename (const struct urlinfo *u) char *nfile = (char *)xmalloc (strlen (opt.dir_prefix) + 1 + strlen (file) + 1); sprintf (nfile, "%s/%s", opt.dir_prefix, file); - free (file); + xfree (file); file = nfile; } } @@ -1071,7 +1072,7 @@ url_filename (const struct urlinfo *u) /* Find a unique name. */ name = unique_name (file); - free (file); + xfree (file); return name; } @@ -1245,11 +1246,11 @@ opt_url (struct urlinfo *u) { /* Find the "true" host. */ char *host = realhost (u->host); - free (u->host); + xfree (u->host); u->host = host; assert (u->dir != NULL); /* the URL must have been parsed */ /* Refresh the printed representation. */ - free (u->url); + xfree (u->url); u->url = str_url (u, 0); } @@ -1313,6 +1314,8 @@ convert_links (const char *file, urlpos *l) char *p; downloaded_file_t downloaded_file_return; + logprintf (LOG_VERBOSE, _("Converting %s... "), file); + { /* First we do a "dry run": go through the list L and see whether any URL needs to be converted in the first place. If not, just @@ -1320,18 +1323,15 @@ convert_links (const char *file, urlpos *l) int count = 0; urlpos *dry = l; for (dry = l; dry; dry = dry->next) - if (dry->flags & (UABS2REL | UREL2ABS)) + if (dry->convert != CO_NOCONVERT) ++count; if (!count) { - logprintf (LOG_VERBOSE, _("Nothing to do while converting %s.\n"), - file); + logputs (LOG_VERBOSE, _("nothing to do.\n")); return; } } - logprintf (LOG_VERBOSE, _("Converting %s... "), file); - fm = read_file (file); if (!fm) { @@ -1376,10 +1376,9 @@ convert_links (const char *file, urlpos *l) break; } /* If the URL is not to be converted, skip it. */ - if (!(l->flags & (UABS2REL | UREL2ABS))) + if (l->convert == CO_NOCONVERT) { - DEBUGP (("Skipping %s at position %d (flags %d).\n", l->url, - l->pos, l->flags)); + DEBUGP (("Skipping %s at position %d.\n", l->url, l->pos)); continue; } @@ -1387,29 +1386,33 @@ convert_links (const char *file, urlpos *l) quote, to the outfile. */ fwrite (p, 1, url_start - p, fp); p = url_start; - if (l->flags & UABS2REL) + if (l->convert == CO_CONVERT_TO_RELATIVE) { /* Convert absolute URL to relative. */ char *newname = construct_relative (file, l->local_name); + char *quoted_newname = html_quote_string (newname); putc (*p, fp); /* quoting char */ - fputs (newname, fp); + fputs (quoted_newname, fp); p += l->size - 1; putc (*p, fp); /* close quote */ ++p; - DEBUGP (("ABS2REL: %s to %s at position %d in %s.\n", + xfree (newname); + xfree (quoted_newname); + DEBUGP (("TO_RELATIVE: %s to %s at position %d in %s.\n", l->url, newname, l->pos, file)); - free (newname); } - else if (l->flags & UREL2ABS) + else if (l->convert == CO_CONVERT_TO_COMPLETE) { /* Convert the link to absolute URL. */ char *newlink = l->url; + char *quoted_newlink = html_quote_string (newlink); putc (*p, fp); /* quoting char */ - fputs (newlink, fp); + fputs (quoted_newlink, fp); p += l->size - 1; putc (*p, fp); /* close quote */ ++p; - DEBUGP (("REL2ABS: to %s at position %d in %s.\n", + xfree (quoted_newlink); + DEBUGP (("TO_COMPLETE: to %s at position %d in %s.\n", newlink, l->pos, file)); } } @@ -1555,7 +1558,19 @@ write_backup_file (const char *file, downloaded_file_t downloaded_file_return) rather than making a copy of the string... Another note is that I thought I could just add a field to the urlpos structure saying that we'd written a .orig file for this URL, but that didn't work, - so I had to make this separate list. */ + so I had to make this separate list. + + This [adding a field to the urlpos structure] didn't work + because convert_file() is called twice: once after all its + sublinks have been retrieved in recursive_retrieve(), and + once at the end of the day in convert_all_links(). The + original linked list collected in recursive_retrieve() is + lost after the first invocation of convert_links(), and + convert_all_links() makes a new one (it calls get_urls_html() + for each file it covers.) That's why your approach didn't + work. The way to make it work is perhaps to make this flag a + field in the `urls_html' list. */ + converted_file_ptr = xmalloc(sizeof(*converted_file_ptr)); converted_file_ptr->string = xstrdup(file); /* die on out-of-mem. */ converted_file_ptr->next = converted_files; @@ -1563,6 +1578,14 @@ write_backup_file (const char *file, downloaded_file_t downloaded_file_return) } } +typedef struct _downloaded_file_list { + char* file; + downloaded_file_t download_type; + struct _downloaded_file_list* next; +} downloaded_file_list; + +static downloaded_file_list *downloaded_files; + /* Remembers which files have been downloaded. In the standard case, should be called with mode == FILE_DOWNLOADED_NORMALLY for each file we actually download successfully (i.e. not for ones we have failures on or that we skip @@ -1578,15 +1601,7 @@ write_backup_file (const char *file, downloaded_file_t downloaded_file_return) downloaded_file_t downloaded_file (downloaded_file_t mode, const char* file) { - typedef struct _downloaded_file_list - { - char* file; - downloaded_file_t download_type; - struct _downloaded_file_list* next; - } downloaded_file_list; - boolean found_file = FALSE; - static downloaded_file_list* downloaded_files = NULL; downloaded_file_list* rover = downloaded_files; while (rover != NULL) @@ -1614,6 +1629,19 @@ downloaded_file (downloaded_file_t mode, const char* file) return FILE_NOT_ALREADY_DOWNLOADED; } } + +void +downloaded_files_free (void) +{ + downloaded_file_list* rover = downloaded_files; + while (rover) + { + downloaded_file_list *next = rover->next; + xfree (rover->file); + xfree (rover); + rover = next; + } +} /* Initialization of static stuff. */ void