+2000-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * all: Use xfree() instead of free.
+
+ * utils.c (xfree): New function.
+
+2000-11-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * url.c (convert_links): HTML-quote the converted string.
+
+ * utils.c (html_quote_string): Move here from ftp-ls.c
+ (html_quote_string): Make non-static; declare in utils.h.
+ (html_quote_string): Convert SP to  .
+
2000-11-21 Hrvoje Niksic <hniksic@arsdigita.com>
* ftp.c (getftp): Reformat Jan's code according to GNU coding
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline != '2')
{
- free (respline);
+ xfree (respline);
return FTPSRVERR;
}
- free (respline);
+ xfree (respline);
/* Send USER username. */
request = ftp_request ("USER", acc);
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
/* An unprobable possibility of logging without a password. */
if (*respline == '2')
{
- free (respline);
+ xfree (respline);
return FTPOK;
}
/* Else, only response 3 is appropriate. */
if (*respline != '3')
{
- free (respline);
+ xfree (respline);
return FTPLOGREFUSED;
}
#ifdef USE_OPIE
else
{
bad:
- free (respline);
+ xfree (respline);
return FTPLOGREFUSED;
}
if ((cp = calculate_skey_response (skey_sequence, cp, pass)) == 0)
}
}
#endif /* USE_OPIE */
- free (respline);
+ xfree (respline);
/* Send PASS password. */
request = ftp_request ("PASS", pass);
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline != '2')
{
- free (respline);
+ xfree (respline);
return FTPLOGINC;
}
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline != '2')
{
- free (respline);
+ xfree (respline);
return FTPPORTERR;
}
- free (respline);
+ xfree (respline);
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get the server response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline != '2')
{
- free (respline);
+ xfree (respline);
return FTPNOPASV;
}
/* Parse the request. */
else if (i < 5)
{
/* When on the last number, anything can be a terminator. */
- free (respline);
+ xfree (respline);
return FTPINVPASV;
}
}
- free (respline);
+ xfree (respline);
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline != '2')
{
- free (respline);
+ xfree (respline);
return FTPUNKNOWNTYPE;
}
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline == '5')
{
- free (respline);
+ xfree (respline);
return FTPNSFOD;
}
if (*respline != '2')
{
- free (respline);
+ xfree (respline);
return FTPRERR;
}
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline != '3')
{
- free (respline);
+ xfree (respline);
return FTPRESTFAIL;
}
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline == '5')
{
- free (respline);
+ xfree (respline);
return FTPNSFOD;
}
if (*respline != '1')
{
- free (respline);
+ xfree (respline);
return FTPRERR;
}
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate respone. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline == '5')
{
- free (respline);
+ xfree (respline);
return FTPNSFOD;
}
if (*respline != '1')
{
- free (respline);
+ xfree (respline);
return FTPRERR;
}
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline == '5')
{
- free (respline);
+ xfree (respline);
return FTPSRVERR;
}
else
*host_type = ST_OTHER;
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
if (nwritten < 0)
{
- free (request);
+ xfree (request);
return WRITEFAILED;
}
- free (request);
+ xfree (request);
/* Get appropriate response. */
err = ftp_response (rbuf, &respline);
if (err != FTPOK)
{
- free (respline);
+ xfree (respline);
return err;
}
if (*respline == '5')
{
- free (respline);
+ xfree (respline);
return FTPSRVERR;
}
strtok (respline, "\"");
request = strtok (NULL, "\"");
- /* Has the `pwd' been already allocated? Free! */
- if (*pwd) free (*pwd);
+ /* Has the `pwd' been already allocated? Free! */
+ FREE_MAYBE (*pwd);
*pwd = xstrdup (request);
- free (respline);
+ xfree (respline);
/* All OK. */
return FTPOK;
}
/* Skip if total... */
if (!strncasecmp (line, "total", 5))
{
- free (line);
+ xfree (line);
continue;
}
/* Get the first token (permissions). */
tok = strtok (line, " ");
if (!tok)
{
- free (line);
+ xfree (line);
continue;
}
DEBUGP (("Skipping.\n"));
FREE_MAYBE (cur.name);
FREE_MAYBE (cur.linkto);
- free (line);
+ xfree (line);
continue;
}
timestruct.tm_isdst = -1;
l->tstamp = mktime (×truct); /* store the time-stamp */
- free (line);
+ xfree (line);
}
fclose (fp);
l->tstamp = fp.mtime;
}
- free (line);
+ xfree (line);
}
fclose (fp);
\f
/* Stuff for creating FTP index. */
-/* The function returns the pointer to the malloc-ed quoted version of
- string s. It will recognize and quote numeric and special graphic
- entities, as per RFC1866:
-
- `&' -> `&'
- `<' -> `<'
- `>' -> `>'
- `"' -> `"'
-
- No other entities are recognized or replaced. */
-static char *
-html_quote_string (const char *s)
-{
- const char *b = s;
- char *p, *res;
- int i;
-
- /* Pass through the string, and count the new size. */
- for (i = 0; *s; s++, i++)
- {
- if (*s == '&')
- i += 4; /* `amp;' */
- else if (*s == '<' || *s == '>')
- i += 3; /* `lt;' and `gt;' */
- else if (*s == '\"')
- i += 5; /* `quot;' */
- }
- res = (char *)xmalloc (i + 1);
- s = b;
- for (p = res; *s; s++)
- {
- switch (*s)
- {
- case '&':
- *p++ = '&';
- *p++ = 'a';
- *p++ = 'm';
- *p++ = 'p';
- *p++ = ';';
- break;
- case '<': case '>':
- *p++ = '&';
- *p++ = (*s == '<' ? 'l' : 'g');
- *p++ = 't';
- *p++ = ';';
- break;
- case '\"':
- *p++ = '&';
- *p++ = 'q';
- *p++ = 'u';
- *p++ = 'o';
- *p++ = 't';
- *p++ = ';';
- break;
- default:
- *p++ = *s;
- }
- }
- *p = '\0';
- return res;
-}
-
/* The function creates an HTML index containing references to given
directories and files on the appropriate host. The references are
FTP. */
upwd = (char *)xmalloc (strlen (tmpu)
+ (tmpp ? (1 + strlen (tmpp)) : 0) + 2);
sprintf (upwd, "%s%s%s@", tmpu, tmpp ? ":" : "", tmpp ? tmpp : "");
- free (tmpu);
+ xfree (tmpu);
FREE_MAYBE (tmpp);
}
else
else if (f->type == FT_SYMLINK)
fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)");
putc ('\n', fp);
- free (htclfile);
+ xfree (htclfile);
f = f->next;
}
fprintf (fp, "</pre>\n</body>\n</html>\n");
- free (upwd);
+ xfree (upwd);
if (!opt.dfp)
fclose (fp);
else
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)
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)
{
while ((line = read_whole_line (fp)))
{
logprintf (LOG_ALWAYS, "%s\n", line);
- free (line);
+ xfree (line);
}
fclose (fp);
}
#ifdef WINDOWS
ws_changetitle (hurl, 1);
#endif
- free (hurl);
+ xfree (hurl);
}
/* Send getftp the proper length, if fileinfo was provided. */
if (f)
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))
else
logprintf (LOG_VERBOSE, _("Removed `%s'.\n"), list_filename);
}
- free (list_filename);
+ xfree (list_filename);
con->cmd &= ~DO_LIST;
return f;
}
else
DEBUGP (("Unrecognized permissions for %s.\n", u->local));
- free (u->local);
+ xfree (u->local);
u->local = olocal;
u->file = ofile;
/* Break on fatals. */
_("Wrote HTML-ized index to `%s'.\n"),
filename);
}
- free (filename);
+ xfree (filename);
}
freefileinfo (f);
}
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;
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;
}
}
void
hash_table_destroy (struct hash_table *ht)
{
- free (ht->mappings);
- free (ht);
+ xfree (ht->mappings);
+ xfree (ht);
}
/* The heart of almost all functions in this file -- find the mapping
hash_table_put (ht, mp_key, mp->value);
}
assert (ht->count == old_count);
- free (old_mappings);
+ xfree (old_mappings);
}
/* Put VALUE in the hash table HT under the key KEY. This regrows the
if (hash_table_get_pair (ht, line, &line_copy, NULL))
{
hash_table_remove (ht, line);
- free (line_copy);
+ xfree (line_copy);
}
}
#endif
DEBUGP (("Comparing hosts %s and %s...\n", p1, p2));
if (strcasecmp (p1, p2) == 0)
{
- free (p1);
- free (p2);
+ xfree (p1);
+ xfree (p2);
DEBUGP (("They are quite alike.\n"));
return 1;
}
else if (opt.simple_check)
{
- free (p1);
- free (p2);
+ xfree (p1);
+ xfree (p2);
DEBUGP (("Since checking is simple, I'd say they are not the same.\n"));
return 0;
}
real1 = realhost (p1);
real2 = realhost (p2);
- free (p1);
- free (p2);
+ xfree (p1);
+ xfree (p2);
if (strcasecmp (real1, real2) == 0)
{
DEBUGP (("They are alike, after realhost()->%s.\n", real1));
- free (real1);
- free (real2);
+ xfree (real1);
+ xfree (real2);
return 1;
}
else
{
DEBUGP (("They are not the same (%s, %s).\n", real1, real2));
- free (real1);
- free (real2);
+ xfree (real1);
+ xfree (real2);
return 0;
}
}
/* Forget old pool contents. The allocated memory is not freed. */
#define POOL_REWIND(pool) pool.index = 0
-/* Free heap-allocated memory for contents of POOL. This calls free()
- if the memory was allocated through malloc. It also restores
- `contents' and `size' to their original, pre-malloc values. That
- way after POOL_FREE, the pool is fully usable, just as if it were
- freshly initialized with POOL_INIT. */
+/* Free heap-allocated memory for contents of POOL. This calls
+ xfree() if the memory was allocated through malloc. It also
+ restores `contents' and `size' to their original, pre-malloc
+ values. That way after POOL_FREE, the pool is fully usable, just
+ as if it were freshly initialized with POOL_INIT. */
#define POOL_FREE(pool) do { \
if (!(pool).alloca_p) \
- free ((pool).contents); \
+ xfree ((pool).contents); \
(pool).contents = (pool).orig_contents; \
(pool).size = (pool).orig_size; \
(pool).index = 0; \
finish:
POOL_FREE (pool);
if (!attr_pair_alloca_p)
- free (pairs);
+ xfree (pairs);
}
#undef ADVANCE
if (!newbase)
break;
if (closure->base)
- free (closure->base);
+ xfree (closure->base);
if (closure->parent_base)
closure->base = url_concat (closure->parent_base, newbase);
else
s->tag = strdupdelim (p, buf);
if (*buf == '>')
{
- free (s->tag);
+ xfree (s->tag);
s->tag = NULL;
++buf, --bufsize;
continue;
upwd = (char *)xmalloc (strlen (tmpu)
+ (tmpp ? (1 + strlen (tmpp)) : 0) + 2);
sprintf (upwd, "%s%s%s@", tmpu, tmpp ? ":" : "", tmpp ? tmpp : "");
- free (tmpu);
+ xfree (tmpu);
FREE_MAYBE (tmpp);
}
else
else if (f->type == FT_SYMLINK)
fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)");
putc ('\n', fp);
- free (htclfile);
+ xfree (htclfile);
f = f->next;
}
fprintf (fp, "</pre>\n</body>\n</html>\n");
- free (upwd);
+ xfree (upwd);
if (!opt.dfp)
fclose (fp);
else
what you accept." Oh boy. */
logputs (LOG_VERBOSE, "\n");
logputs (LOG_NOTQUIET, _("End of file while parsing headers.\n"));
- free (hdr);
+ xfree (hdr);
FREE_MAYBE (type);
FREE_MAYBE (hs->newloc);
FREE_MAYBE (all_headers);
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
strerror (errno));
- free (hdr);
+ xfree (hdr);
FREE_MAYBE (type);
FREE_MAYBE (hs->newloc);
FREE_MAYBE (all_headers);
hs->error = xstrdup (_("No data received"));
else
hs->error = xstrdup (_("Malformed status line"));
- free (hdr);
+ xfree (hdr);
break;
}
else if (!*error)
/* Exit on empty header. */
if (!*hdr)
{
- free (hdr);
+ xfree (hdr);
break;
}
}
}
done_header:
- free (hdr);
+ xfree (hdr);
}
logputs (LOG_VERBOSE, "\n");
retrying it. */
failed:
logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
- free (authenticate_h);
+ xfree (authenticate_h);
return AUTHFAILED;
}
else if (!known_authentication_scheme_p (authenticate_h))
{
- free (authenticate_h);
+ xfree (authenticate_h);
logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
return AUTHFAILED;
}
/* We do not need this anymore. */
if (authenticate_h)
{
- free (authenticate_h);
+ xfree (authenticate_h);
authenticate_h = NULL;
}
if (((suf = suffix (u->local)) != NULL)
&& (!strcmp (suf, "html") || !strcmp (suf, "htm")))
*dt |= TEXTHTML;
- free (suf);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (suf);
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
/* Another harmless lie: */
return RETROK;
}
#ifdef WINDOWS
ws_changetitle (hurl, 1);
#endif
- free (hurl);
+ xfree (hurl);
}
/* Default document type is empty. However, if spider mode is
case HOSTERR: case CONREFUSED: case PROXERR: case AUTHFAILED:
/* Fatal errors just return from the function. */
FREEHSTAT (hstat);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return err;
break;
case FWRITEERR: case FOPENERR:
logprintf (LOG_NOTQUIET, _("Cannot write to `%s' (%s).\n"),
u->local, strerror (errno));
FREEHSTAT (hstat);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return err;
break;
case NEWLOCATION:
logprintf (LOG_NOTQUIET,
_("ERROR: Redirection (%d) without location.\n"),
hstat.statcode);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return WRONGCODE;
}
FREEHSTAT (hstat);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return NEWLOCATION;
break;
case RETRFINISHED:
/* #### Ugly ugly ugly! */
char *hurl = str_url (u->proxy ? u->proxy : u, 1);
logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
- free (hurl);
+ xfree (hurl);
}
logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
tms, hstat.statcode, hstat.error);
logputs (LOG_VERBOSE, "\n");
FREEHSTAT (hstat);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return WRONGCODE;
}
Server file no newer than local file `%s' -- not retrieving.\n\n"),
local_filename);
FREEHSTAT (hstat);
- free(filename_plus_orig_suffix);/*must precede every return!*/
+ xfree (filename_plus_orig_suffix); /*must precede every return!*/
return RETROK;
}
else if (tml >= tmr)
if (opt.spider)
{
logprintf (LOG_NOTQUIET, "%d %s\n\n", hstat.statcode, hstat.error);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return RETROK;
}
else
downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree(filename_plus_orig_suffix); /* must precede every return! */
return RETROK;
}
else if (hstat.res == 0) /* No read error */
else
downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return RETROK;
}
else if (hstat.len < hstat.contlen) /* meaning we lost the
else
downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return RETROK;
}
else /* the same, but not accepted */
break;
}
while (!opt.ntry || (count < opt.ntry));
- free(filename_plus_orig_suffix); /* must precede every return! */
+ xfree (filename_plus_orig_suffix); /* must precede every return! */
return TRYLIMEXC;
}
\f
return NULL;
if (!file_exists_p (file))
{
- free (file);
+ xfree (file);
return NULL;
}
return file;
/* Parse the line. */
status = parse_line (line, &com, &val);
- free (line);
+ xfree (line);
/* If everything is OK, set the value. */
if (status == 1)
{
if (!setval (com, val))
fprintf (stderr, _("%s: Error in %s at line %d.\n"), exec_name,
file, ln);
- free (com);
- free (val);
+ xfree (com);
+ xfree (val);
}
else if (status == 0)
fprintf (stderr, _("%s: Error in %s at line %d.\n"), exec_name,
else
#endif
run_wgetrc (file);
- free (file);
+ xfree (file);
return;
}
\f
/* If the command is invalid, exit now. */
if (comind (*com) == -1)
{
- free (*com);
+ xfree (*com);
return 0;
}
/* If '=' not found, bail out. */
if (*p != '=')
{
- free (*com);
+ xfree (*com);
return 0;
}
/* Skip spaces after '='. */
if (opt.dfp)
fclose (opt.dfp);
FREE_MAYBE (opt.lfilename);
- free (opt.dir_prefix);
+ xfree (opt.dir_prefix);
FREE_MAYBE (opt.input_filename);
FREE_MAYBE (opt.output_document);
free_vec (opt.accepts);
free_vec (opt.domains);
free_vec (opt.follow_tags);
free_vec (opt.ignore_tags);
- free (opt.ftp_acc);
- free (opt.ftp_pass);
+ xfree (opt.ftp_acc);
+ xfree (opt.ftp_pass);
FREE_MAYBE (opt.ftp_proxy);
FREE_MAYBE (opt.http_proxy);
free_vec (opt.no_proxy);
struct log_ln *ln = log_lines + num;
if (ln->malloced_line)
{
- free (ln->malloced_line);
+ xfree (ln->malloced_line);
ln->malloced_line = NULL;
}
ln->content = NULL;
saved_append (write_ptr);
fputs (write_ptr, logfp);
if (bigmsg)
- free (bigmsg);
+ xfree (bigmsg);
}
if (!opt.no_flush)
fflush (logfp);
logfp = stdin;
}
fprintf (stderr, messij, logfile);
- free (logfile);
+ xfree (logfile);
/* Dump the previous screenful of output to LOGFILE. */
log_dump ();
save_log_p = 0;
optarg);
exit (1);
}
- free (com);
- free (val);
+ xfree (com);
+ xfree (val);
}
break;
case 'G':
strcpy (wspathsave, buffer);
return wspathsave;
}
- free (buffer);
+ xfree (buffer);
return NULL;
}
char *path = (char *)alloca (strlen (home) + 1
+ strlen (NETRC_FILE_NAME) + 1);
sprintf (path, "%s/%s", home, NETRC_FILE_NAME);
- free (home);
+ xfree (home);
err = stat (path, &buf);
if (err == 0)
netrc_list = parse_netrc (path);
}
if (c == EOF && !i)
{
- free(line);
+ xfree(line);
return NULL;
}
if (a && ! a->acc)
{
/* Free any allocated space. */
- free (a->host);
- free (a->acc);
- free (a->passwd);
+ xfree (a->host);
+ xfree (a->acc);
+ xfree (a->passwd);
}
else
{
}
}
- free (line);
+ xfree (line);
}
fclose (fp);
/* Finalize the last machine entry we found. */
maybe_add_to_list (¤t, &retval);
- free (current);
+ xfree (current);
/* Reverse the order of the list so that it appears in file order. */
current = retval;
FREE_MAYBE (l->acc);
FREE_MAYBE (l->passwd);
FREE_MAYBE (l->host);
- free(l);
+ xfree (l);
l = t;
}
}
/* Just lowercase the hostname. */
for (p = u->host; *p; p++)
*p = TOLOWER (*p);
- free (u->url);
+ xfree (u->url);
u->url = str_url (u, 0);
}
- free (constr);
+ xfree (constr);
constr = xstrdup (u->url);
string_set_add (undesirable_urls, constr);
if (!inl && !((u->proto == URLFTP) && !this_url_ftp))
rfile = url_filename (rurl);
forbidden = parse_robots (rfile);
freeurl (rurl, 1);
- free (rfile);
+ xfree (rfile);
}
}
}
if (newloc)
{
- free (constr);
+ xfree (constr);
constr = newloc;
}
/* In case of convert_links: If there was no error, add it to
err = parseurl (url, u, 0);
assert (err == URLOK && u->proto == URLHTTP);
- free (u->file);
- free (u->dir);
- free (u->url);
+ xfree (u->file);
+ xfree (u->dir);
+ xfree (u->url);
u->dir = xstrdup ("");
u->file = xstrdup (robots_filename);
u->url = str_url (u, 0);
for (cmd = line; *cmd && ISSPACE (*cmd); cmd++);
if (!*cmd)
{
- free (line);
+ xfree (line);
DEBUGP (("(chucked out)\n"));
continue;
}
for (str = cmd; *str && *str != ':'; str++);
if (!*str)
{
- free (line);
+ xfree (line);
DEBUGP (("(chucked out)\n"));
continue;
}
}
else if (!wget_matched)
{
- free (line);
+ xfree (line);
DEBUGP (("(chucking out since it is not applicable for Wget)\n"));
continue;
}
/* unknown command */
DEBUGP (("(chucked out)\n"));
}
- free (line);
+ xfree (line);
}
fclose (fp);
return entries;
freeurl (u, 1);
if (redirections)
string_set_free (redirections);
- free (url);
+ xfree (url);
return result;
}
freeurl (u, 1);
if (redirections)
string_set_free (redirections);
- free (url);
+ xfree (url);
return PROXERR;
}
/* Parse the proxy URL. */
freeurl (u, 1);
if (redirections)
string_set_free (redirections);
- free (url);
+ xfree (url);
return PROXERR;
}
u->proto = URLHTTP;
there break the rules and use relative URLs, and popular
browsers are lenient about this, so wget should be too. */
construced_newloc = url_concat (url, mynewloc);
- free (mynewloc);
+ xfree (mynewloc);
mynewloc = construced_newloc;
/* Now, see if this new location makes sense. */
freeurl (u, 1);
if (redirections)
string_set_free (redirections);
- free (url);
- free (mynewloc);
+ xfree (url);
+ xfree (mynewloc);
return result;
}
/* Now mynewloc will become newloc_struct->url, because if the
Location contained relative paths like .././something, we
don't want that propagating as url. */
- free (mynewloc);
+ xfree (mynewloc);
mynewloc = xstrdup (newloc_struct->url);
if (!redirections)
freeurl (u, 1);
if (redirections)
string_set_free (redirections);
- free (url);
- free (mynewloc);
+ xfree (url);
+ xfree (mynewloc);
return WRONGCODE;
}
string_set_add (redirections, newloc_struct->url);
- free (url);
+ xfree (url);
url = mynewloc;
freeurl (u, 1);
u = newloc_struct;
if (newloc)
*newloc = url;
else
- free (url);
+ xfree (url);
return result;
}
if (contains_unsafe (s)) \
{ \
char *uc_tmp = encode_string (s); \
- free (s); \
+ xfree (s); \
(s) = uc_tmp; \
} \
} while (0)
if (u->proxy)
freeurl (u->proxy, 1);
if (complete)
- free (u);
+ xfree (u);
return;
}
\f
tmp[1] = '2';
tmp[2] = 'F';
strcpy (tmp + 3, dir + 1);
- free (dir);
+ xfree (dir);
dir = tmp;
}
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;
while (l)
{
urlpos *next = l->next;
- free (l->url);
+ xfree (l->url);
FREE_MAYBE (l->local_name);
- free (l);
+ xfree (l);
l = next;
}
}
{
if (S_ISDIR (st.st_mode))
{
- free (t);
+ xfree (t);
return 0;
}
else
res = make_directory (t);
if (res != 0)
logprintf (LOG_NOTQUIET, "%s: %s", t, strerror (errno));
- free (t);
+ xfree (t);
return res;
}
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
else
dirpref = "";
}
- free (host);
+ xfree (host);
/* If there is a prefix, prepend it. */
if (*dirpref)
/* 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;
}
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;
}
}
/* Find a unique name. */
name = unique_name (file);
- free (file);
+ xfree (file);
return name;
}
{
/* 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);
}
{
/* 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;
+ 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->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;
+ xfree (quoted_newlink);
DEBUGP (("TO_COMPLETE: <something> to %s at position %d in %s.\n",
newlink, l->pos, file));
}
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;
/* xmalloc, xrealloc and xstrdup exit the program if there is not
enough memory. xstrdup also implements strdup on systems that do
- not have it. */
+ not have it. xfree is provided to make leak-tracking easier.
+ Currently it's a no-op. */
+
void *
xmalloc (size_t size)
{
return res;
}
+void
+xfree (void *ptr)
+{
+ free (ptr);
+}
+
void *
xrealloc (void *obj, size_t size)
{
return filename;
else
{
- free (filename);
+ xfree (filename);
return NULL;
}
}
}
if (length == 0 || ferror (fp))
{
- free (line);
+ xfree (line);
return NULL;
}
if (length + 1 < bufsize)
lose:
if (!inhibit_close)
close (fd);
- free (fm->content);
- free (fm);
+ xfree (fm->content);
+ xfree (fm);
return NULL;
}
/* Release the resources held by FM. Specifically, this calls
- munmap() or free() on fm->content, depending whether mmap or
+ munmap() or xfree() on fm->content, depending whether mmap or
malloc/read were used to read in the file. It also frees the
memory needed to hold the FM structure itself. */
else
#endif
{
- free (fm->content);
+ xfree (fm->content);
}
- free (fm);
+ xfree (fm);
}
\f
/* Free the pointers in a NULL-terminated vector of pointers, then
{
char **p = vec;
while (*p)
- free (*p++);
- free (vec);
+ xfree (*p++);
+ xfree (vec);
}
}
if (!*v2)
{
/* To avoid j == 0 */
- free (v2);
+ xfree (v2);
return v1;
}
/* Count v1. */
/* Reallocate v1. */
v1 = (char **)xrealloc (v1, (i + j + 1) * sizeof (char **));
memcpy (v1 + i, v2, (j + 1) * sizeof (char *));
- free (v2);
+ xfree (v2);
return v1;
}
while (l)
{
slist *n = l->next;
- free (l->string);
- free (l);
+ xfree (l->string);
+ xfree (l);
l = n;
}
}
static int
string_set_free_mapper (void *key, void *value_ignored, void *arg_ignored)
{
- free (key);
+ xfree (key);
return 0;
}
static int
free_keys_and_values_mapper (void *key, void *value, void *arg_ignored)
{
- free (key);
- free (value);
+ xfree (key);
+ xfree (value);
return 0;
}
*p = '\0';
#endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
}
+\f
+/* This should probably be at a better place, but it doesn't really
+ fit into html-parse.c. */
+
+/* The function returns the pointer to the malloc-ed quoted version of
+ string s. It will recognize and quote numeric and special graphic
+ entities, as per RFC1866:
+
+ `&' -> `&'
+ `<' -> `<'
+ `>' -> `>'
+ `"' -> `"'
+ SP -> ` '
+
+ No other entities are recognized or replaced. */
+char *
+html_quote_string (const char *s)
+{
+ const char *b = s;
+ char *p, *res;
+ int i;
+
+ /* Pass through the string, and count the new size. */
+ for (i = 0; *s; s++, i++)
+ {
+ if (*s == '&')
+ i += 4; /* `amp;' */
+ else if (*s == '<' || *s == '>')
+ i += 3; /* `lt;' and `gt;' */
+ else if (*s == '\"')
+ i += 5; /* `quot;' */
+ else if (*s == ' ')
+ i += 4; /* #32; */
+ }
+ res = (char *)xmalloc (i + 1);
+ s = b;
+ for (p = res; *s; s++)
+ {
+ switch (*s)
+ {
+ case '&':
+ *p++ = '&';
+ *p++ = 'a';
+ *p++ = 'm';
+ *p++ = 'p';
+ *p++ = ';';
+ break;
+ case '<': case '>':
+ *p++ = '&';
+ *p++ = (*s == '<' ? 'l' : 'g');
+ *p++ = 't';
+ *p++ = ';';
+ break;
+ case '\"':
+ *p++ = '&';
+ *p++ = 'q';
+ *p++ = 'u';
+ *p++ = 'o';
+ *p++ = 't';
+ *p++ = ';';
+ break;
+ case ' ':
+ *p++ = '&';
+ *p++ = '#';
+ *p++ = '3';
+ *p++ = '2';
+ *p++ = ';';
+ break;
+ default:
+ *p++ = *s;
+ }
+ }
+ *p = '\0';
+ return res;
+}
int numdigit PARAMS ((long));
void long_to_string PARAMS ((char *, long));
+char *html_quote_string PARAMS ((const char *));
+
#endif /* UTILS_H */
/* Defined in `utils.c', but used literally everywhere. */
void *xmalloc PARAMS ((size_t));
+void xfree PARAMS ((void *));
void *xrealloc PARAMS ((void *, size_t));
char *xstrdup PARAMS ((const char *));
} while (0)
/* Free FOO if it is non-NULL. */
-#define FREE_MAYBE(foo) do { if (foo) free (foo); } while (0)
+#define FREE_MAYBE(foo) do { if (foo) xfree (foo); } while (0)
/* #### Hack: OPTIONS_DEFINED_HERE is defined in main.c. */
/* [Is this weird hack really necessary on any compilers? No ANSI C compiler