]> sjero.net Git - wget/blob - src/retr.c
[svn] Limit the maximum amount of memory allocated by fd_read_hunk and its
[wget] / src / retr.c
1 /* File retrieval.
2    Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of GNU Wget.
5
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at
9 your option) any later version.
10
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 In addition, as a special exception, the Free Software Foundation
21 gives permission to link the code of its release of Wget with the
22 OpenSSL project's "OpenSSL" library (or with modified versions of it
23 that use the same license as the "OpenSSL" library), and distribute
24 the linked executables.  You must obey the GNU General Public License
25 in all respects for all of the code used other than "OpenSSL".  If you
26 modify this file, you may extend this exception to your version of the
27 file, but you are not obligated to do so.  If you do not wish to do
28 so, delete this exception statement from your version.  */
29
30 #include <config.h>
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <sys/types.h>
35 #ifdef HAVE_UNISTD_H
36 # include <unistd.h>
37 #endif /* HAVE_UNISTD_H */
38 #include <errno.h>
39 #ifdef HAVE_STRING_H
40 # include <string.h>
41 #else
42 # include <strings.h>
43 #endif /* HAVE_STRING_H */
44 #include <assert.h>
45
46 #include "wget.h"
47 #include "utils.h"
48 #include "retr.h"
49 #include "progress.h"
50 #include "url.h"
51 #include "recur.h"
52 #include "ftp.h"
53 #include "host.h"
54 #include "connect.h"
55 #include "hash.h"
56 #include "convert.h"
57
58 #ifdef HAVE_SSL
59 # include "gen_sslfunc.h"       /* for ssl_iread */
60 #endif
61
62 #ifndef errno
63 extern int errno;
64 #endif
65
66 /* Total size of downloaded files.  Used to enforce quota.  */
67 LARGE_INT total_downloaded_bytes;
68
69 /* If non-NULL, the stream to which output should be written.  This
70    stream is initialized when `-O' is used.  */
71 FILE *output_stream;
72
73 /* Whether output_document is a regular file we can manipulate,
74    i.e. not `-' or a device file. */
75 int output_stream_regular;
76 \f
77 static struct {
78   wgint chunk_bytes;
79   double chunk_start;
80   double sleep_adjust;
81 } limit_data;
82
83 static void
84 limit_bandwidth_reset (void)
85 {
86   limit_data.chunk_bytes = 0;
87   limit_data.chunk_start = 0;
88 }
89
90 /* Limit the bandwidth by pausing the download for an amount of time.
91    BYTES is the number of bytes received from the network, and TIMER
92    is the timer that started at the beginning of download.  */
93
94 static void
95 limit_bandwidth (wgint bytes, struct wget_timer *timer)
96 {
97   double delta_t = wtimer_read (timer) - limit_data.chunk_start;
98   double expected;
99
100   limit_data.chunk_bytes += bytes;
101
102   /* Calculate the amount of time we expect downloading the chunk
103      should take.  If in reality it took less time, sleep to
104      compensate for the difference.  */
105   expected = 1000.0 * limit_data.chunk_bytes / opt.limit_rate;
106
107   if (expected > delta_t)
108     {
109       double slp = expected - delta_t + limit_data.sleep_adjust;
110       double t0, t1;
111       if (slp < 200)
112         {
113           DEBUGP (("deferring a %.2f ms sleep (%s/%.2f).\n",
114                    slp, number_to_static_string (limit_data.chunk_bytes),
115                    delta_t));
116           return;
117         }
118       DEBUGP (("\nsleeping %.2f ms for %s bytes, adjust %.2f ms\n",
119                slp, number_to_static_string (limit_data.chunk_bytes),
120                limit_data.sleep_adjust));
121
122       t0 = wtimer_read (timer);
123       xsleep (slp / 1000);
124       wtimer_update (timer);
125       t1 = wtimer_read (timer);
126
127       /* Due to scheduling, we probably slept slightly longer (or
128          shorter) than desired.  Calculate the difference between the
129          desired and the actual sleep, and adjust the next sleep by
130          that amount.  */
131       limit_data.sleep_adjust = slp - (t1 - t0);
132     }
133
134   limit_data.chunk_bytes = 0;
135   limit_data.chunk_start = wtimer_read (timer);
136 }
137
138 #ifndef MIN
139 # define MIN(i, j) ((i) <= (j) ? (i) : (j))
140 #endif
141
142 /* Write data in BUF to OUT.  However, if *SKIP is non-zero, skip that
143    amount of data and decrease SKIP.  Increment *TOTAL by the amount
144    of data written.  */
145
146 static int
147 write_data (FILE *out, const char *buf, int bufsize, wgint *skip,
148             wgint *written)
149 {
150   if (!out)
151     return 1;
152   if (*skip > bufsize)
153     {
154       *skip -= bufsize;
155       return 1;
156     }
157   if (*skip)
158     {
159       buf += *skip;
160       bufsize -= *skip;
161       *skip = 0;
162       if (bufsize == 0)
163         return 1;
164     }
165
166   fwrite (buf, 1, bufsize, out);
167   *written += bufsize;
168
169   /* Immediately flush the downloaded data.  This should not hinder
170      performance: fast downloads will arrive in large 16K chunks
171      (which stdio would write out immediately anyway), and slow
172      downloads wouldn't be limited by disk speed.  */
173   fflush (out);
174   return !ferror (out);
175 }
176
177 /* Read the contents of file descriptor FD until it the connection
178    terminates or a read error occurs.  The data is read in portions of
179    up to 16K and written to OUT as it arrives.  If opt.verbose is set,
180    the progress is shown.
181
182    TOREAD is the amount of data expected to arrive, normally only used
183    by the progress gauge.
184
185    STARTPOS is the position from which the download starts, used by
186    the progress gauge.  If QTYREAD is non-NULL, the value it points to
187    is incremented by the amount of data read from the network.  If
188    QTYWRITTEN is non-NULL, the value it points to is incremented by
189    the amount of data written to disk.  The time it took to download
190    the data (in milliseconds) is stored to ELAPSED.
191
192    The function exits and returns the amount of data read.  In case of
193    error while reading data, -1 is returned.  In case of error while
194    writing data, -2 is returned.  */
195
196 int
197 fd_read_body (int fd, FILE *out, wgint toread, wgint startpos,
198               wgint *qtyread, wgint *qtywritten, double *elapsed, int flags)
199 {
200   int ret = 0;
201
202   static char dlbuf[16384];
203   int dlbufsize = sizeof (dlbuf);
204
205   struct wget_timer *timer = NULL;
206   double last_successful_read_tm = 0;
207
208   /* The progress gauge, set according to the user preferences. */
209   void *progress = NULL;
210
211   /* Non-zero if the progress gauge is interactive, i.e. if it can
212      continually update the display.  When true, smaller timeout
213      values are used so that the gauge can update the display when
214      data arrives slowly. */
215   int progress_interactive = 0;
216
217   int exact = flags & rb_read_exactly;
218   wgint skip = 0;
219
220   /* How much data we've read/written.  */
221   wgint sum_read = 0;
222   wgint sum_written = 0;
223
224   if (flags & rb_skip_startpos)
225     skip = startpos;
226
227   if (opt.verbose)
228     {
229       /* If we're skipping STARTPOS bytes, pass 0 as the INITIAL
230          argument to progress_create because the indicator doesn't
231          (yet) know about "skipping" data.  */
232       progress = progress_create (skip ? 0 : startpos, startpos + toread);
233       progress_interactive = progress_interactive_p (progress);
234     }
235
236   if (opt.limit_rate)
237     limit_bandwidth_reset ();
238
239   /* A timer is needed for tracking progress, for throttling, and for
240      tracking elapsed time.  If either of these are requested, start
241      the timer.  */
242   if (progress || opt.limit_rate || elapsed)
243     {
244       timer = wtimer_new ();
245       last_successful_read_tm = 0;
246     }
247
248   /* Use a smaller buffer for low requested bandwidths.  For example,
249      with --limit-rate=2k, it doesn't make sense to slurp in 16K of
250      data and then sleep for 8s.  With buffer size equal to the limit,
251      we never have to sleep for more than one second.  */
252   if (opt.limit_rate && opt.limit_rate < dlbufsize)
253     dlbufsize = opt.limit_rate;
254
255   /* Read from FD while there is data to read.  Normally toread==0
256      means that it is unknown how much data is to arrive.  However, if
257      EXACT is set, then toread==0 means what it says: that no data
258      should be read.  */
259   while (!exact || (sum_read < toread))
260     {
261       int rdsize = exact ? MIN (toread - sum_read, dlbufsize) : dlbufsize;
262       double tmout = opt.read_timeout;
263       if (progress_interactive)
264         {
265           /* For interactive progress gauges, always specify a ~1s
266              timeout, so that the gauge can be updated regularly even
267              when the data arrives very slowly or stalls.  */
268           tmout = 0.95;
269           if (opt.read_timeout)
270             {
271               double waittm;
272               waittm = (wtimer_read (timer) - last_successful_read_tm) / 1000;
273               if (waittm + tmout > opt.read_timeout)
274                 {
275                   /* Don't let total idle time exceed read timeout. */
276                   tmout = opt.read_timeout - waittm;
277                   if (tmout < 0)
278                     {
279                       /* We've already exceeded the timeout. */
280                       ret = -1, errno = ETIMEDOUT;
281                       break;
282                     }
283                 }
284             }
285         }
286       ret = fd_read (fd, dlbuf, rdsize, tmout);
287
288       /* when retrieving from http-proxy wget sometimes does not trust the 
289        * file length reported by server.
290        * this check is to tell wget not to stubbornly try to read again and 
291        * again until another errno code was received. */
292       if ( ret == -1 && errno == ETIMEDOUT && sum_read == toread && toread > 0 )
293         break;
294
295       if (ret == 0 || (ret < 0 && errno != ETIMEDOUT))
296         break;                  /* read error */
297       else if (ret < 0)
298         ret = 0;                /* read timeout */
299
300       if (progress || opt.limit_rate)
301         {
302           wtimer_update (timer);
303           if (ret > 0)
304             last_successful_read_tm = wtimer_read (timer);
305         }
306
307       if (ret > 0)
308         {
309           sum_read += ret;
310           if (!write_data (out, dlbuf, ret, &skip, &sum_written))
311             {
312               ret = -2;
313               goto out;
314             }
315         }
316
317       if (opt.limit_rate)
318         limit_bandwidth (ret, timer);
319
320       if (progress)
321         progress_update (progress, ret, wtimer_read (timer));
322 #ifdef WINDOWS
323       if (toread > 0 && !opt.quiet)
324         ws_percenttitle (100.0 *
325                          (startpos + sum_read) / (startpos + toread));
326 #endif
327     }
328   if (ret < -1)
329     ret = -1;
330
331  out:
332   if (progress)
333     progress_finish (progress, wtimer_read (timer));
334
335   if (elapsed)
336     *elapsed = wtimer_read (timer);
337   if (timer)
338     wtimer_delete (timer);
339
340   if (qtyread)
341     *qtyread += sum_read;
342   if (qtywritten)
343     *qtywritten += sum_written;
344
345   return ret;
346 }
347 \f
348 /* Read a hunk of data from FD, up until a terminator.  The terminator
349    is whatever the TERMINATOR function determines it to be; for
350    example, it can be a line of data, or the head of an HTTP response.
351    The function returns the data read allocated with malloc.
352
353    In case of error, NULL is returned.  In case of EOF and no data
354    read, NULL is returned and errno set to 0.  In case of EOF with
355    data having been read, the data is returned, but it will
356    (obviously) not contain the terminator.
357
358    The idea is to be able to read a line of input, or otherwise a hunk
359    of text, such as the head of an HTTP request, without crossing the
360    boundary, so that the next call to fd_read etc. reads the data
361    after the hunk.  To achieve that, this function does the following:
362
363    1. Peek at available data.
364
365    2. Determine whether the peeked data, along with the previously
366       read data, includes the terminator.
367
368       2a. If yes, read the data until the end of the terminator, and
369           exit.
370
371       2b. If no, read the peeked data and goto 1.
372
373    The function is careful to assume as little as possible about the
374    implementation of peeking.  For example, every peek is followed by
375    a read.  If the read returns a different amount of data, the
376    process is retried until all data arrives safely.
377
378    SIZEHINT is the buffer size sufficient to hold all the data in the
379    typical case (it is used as the initial buffer size).  MAXSIZE is
380    the maximum amount of memory this function is allowed to allocate,
381    or 0 if no upper limit is to be enforced.
382
383    This function should be used as a building block for other
384    functions -- see fd_read_line as a simple example.  */
385
386 char *
387 fd_read_hunk (int fd, hunk_terminator_t terminator, long sizehint, long maxsize)
388 {
389   long bufsize = sizehint;
390   char *hunk = xmalloc (bufsize);
391   int tail = 0;                 /* tail position in HUNK */
392
393   assert (maxsize >= bufsize);
394
395   while (1)
396     {
397       const char *end;
398       int pklen, rdlen, remain;
399
400       /* First, peek at the available data. */
401
402       pklen = fd_peek (fd, hunk + tail, bufsize - 1 - tail, -1);
403       if (pklen < 0)
404         {
405           xfree (hunk);
406           return NULL;
407         }
408       end = terminator (hunk, tail, pklen);
409       if (end)
410         {
411           /* The data contains the terminator: we'll drain the data up
412              to the end of the terminator.  */
413           remain = end - (hunk + tail);
414           if (remain == 0)
415             {
416               /* No more data needs to be read. */
417               hunk[tail] = '\0';
418               return hunk;
419             }
420           if (bufsize - 1 < tail + remain)
421             {
422               bufsize = tail + remain + 1;
423               hunk = xrealloc (hunk, bufsize);
424             }
425         }
426       else
427         /* No terminator: simply read the data we know is (or should
428            be) available.  */
429         remain = pklen;
430
431       /* Now, read the data.  Note that we make no assumptions about
432          how much data we'll get.  (Some TCP stacks are notorious for
433          read returning less data than the previous MSG_PEEK.)  */
434
435       rdlen = fd_read (fd, hunk + tail, remain, 0);
436       if (rdlen < 0)
437         {
438           xfree_null (hunk);
439           return NULL;
440         }
441       tail += rdlen;
442       hunk[tail] = '\0';
443
444       if (rdlen == 0)
445         {
446           if (tail == 0)
447             {
448               /* EOF without anything having been read */
449               xfree (hunk);
450               errno = 0;
451               return NULL;
452             }
453           else
454             /* EOF seen: return the data we've read. */
455             return hunk;
456         }
457       if (end && rdlen == remain)
458         /* The terminator was seen and the remaining data drained --
459            we got what we came for.  */
460         return hunk;
461
462       /* Keep looping until all the data arrives. */
463
464       if (tail == bufsize - 1)
465         {
466           /* Double the buffer size, but refuse to allocate more than
467              MAXSIZE bytes.  */
468           if (maxsize && bufsize >= maxsize)
469             {
470               xfree (hunk);
471               errno = ENOMEM;
472               return NULL;
473             }
474           bufsize <<= 1;
475           if (maxsize && bufsize > maxsize)
476             bufsize = maxsize;
477           hunk = xrealloc (hunk, bufsize);
478         }
479     }
480 }
481
482 static const char *
483 line_terminator (const char *hunk, int oldlen, int peeklen)
484 {
485   const char *p = memchr (hunk + oldlen, '\n', peeklen);
486   if (p)
487     /* p+1 because we want the line to include '\n' */
488     return p + 1;
489   return NULL;
490 }
491
492 /* The maximum size of the single line we agree to accept.  This is
493    not meant to impose an arbitrary limit, but to protect the user
494    from Wget slurping up available memory upon encountering malicious
495    or buggy server output.  Define it to 0 to remove the limit.  */
496 #define FD_READ_LINE_MAX 4096
497
498 /* Read one line from FD and return it.  The line is allocated using
499    malloc, but is never larger than FD_READ_LINE_MAX.
500
501    If an error occurs, or if no data can be read, NULL is returned.
502    In the former case errno indicates the error condition, and in the
503    latter case, errno is NULL.  */
504
505 char *
506 fd_read_line (int fd)
507 {
508   return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
509 }
510 \f
511 /* Return a printed representation of the download rate, as
512    appropriate for the speed.  If PAD is non-zero, strings will be
513    padded to the width of 7 characters (xxxx.xx).  */
514 char *
515 retr_rate (wgint bytes, double msecs, int pad)
516 {
517   static char res[20];
518   static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
519   int units = 0;
520
521   double dlrate = calc_rate (bytes, msecs, &units);
522   sprintf (res, pad ? "%7.2f %s" : "%.2f %s", dlrate, rate_names[units]);
523
524   return res;
525 }
526
527 /* Calculate the download rate and trim it as appropriate for the
528    speed.  Appropriate means that if rate is greater than 1K/s,
529    kilobytes are used, and if rate is greater than 1MB/s, megabytes
530    are used.
531
532    UNITS is zero for B/s, one for KB/s, two for MB/s, and three for
533    GB/s.  */
534 double
535 calc_rate (wgint bytes, double msecs, int *units)
536 {
537   double dlrate;
538
539   assert (msecs >= 0);
540   assert (bytes >= 0);
541
542   if (msecs == 0)
543     /* If elapsed time is exactly zero, it means we're under the
544        granularity of the timer.  This often happens on systems that
545        use time() for the timer.  */
546     msecs = wtimer_granularity ();
547
548   dlrate = (double)1000 * bytes / msecs;
549   if (dlrate < 1024.0)
550     *units = 0;
551   else if (dlrate < 1024.0 * 1024.0)
552     *units = 1, dlrate /= 1024.0;
553   else if (dlrate < 1024.0 * 1024.0 * 1024.0)
554     *units = 2, dlrate /= (1024.0 * 1024.0);
555   else
556     /* Maybe someone will need this, one day. */
557     *units = 3, dlrate /= (1024.0 * 1024.0 * 1024.0);
558
559   return dlrate;
560 }
561 \f
562 /* Maximum number of allowed redirections.  20 was chosen as a
563    "reasonable" value, which is low enough to not cause havoc, yet
564    high enough to guarantee that normal retrievals will not be hurt by
565    the check.  */
566
567 #define MAX_REDIRECTIONS 20
568
569 #define SUSPEND_POST_DATA do {                  \
570   post_data_suspended = 1;                      \
571   saved_post_data = opt.post_data;              \
572   saved_post_file_name = opt.post_file_name;    \
573   opt.post_data = NULL;                         \
574   opt.post_file_name = NULL;                    \
575 } while (0)
576
577 #define RESTORE_POST_DATA do {                          \
578   if (post_data_suspended)                              \
579     {                                                   \
580       opt.post_data = saved_post_data;                  \
581       opt.post_file_name = saved_post_file_name;        \
582       post_data_suspended = 0;                          \
583     }                                                   \
584 } while (0)
585
586 static char *getproxy PARAMS ((struct url *));
587
588 /* Retrieve the given URL.  Decides which loop to call -- HTTP, FTP,
589    FTP, proxy, etc.  */
590
591 /* #### This function should be rewritten so it doesn't return from
592    multiple points. */
593
594 uerr_t
595 retrieve_url (const char *origurl, char **file, char **newloc,
596               const char *refurl, int *dt)
597 {
598   uerr_t result;
599   char *url;
600   int location_changed, dummy;
601   char *mynewloc, *proxy;
602   struct url *u, *proxy_url;
603   int up_error_code;            /* url parse error code */
604   char *local_file;
605   int redirection_count = 0;
606
607   int post_data_suspended = 0;
608   char *saved_post_data = NULL;
609   char *saved_post_file_name = NULL;
610
611   /* If dt is NULL, use local storage.  */
612   if (!dt)
613     {
614       dt = &dummy;
615       dummy = 0;
616     }
617   url = xstrdup (origurl);
618   if (newloc)
619     *newloc = NULL;
620   if (file)
621     *file = NULL;
622
623   u = url_parse (url, &up_error_code);
624   if (!u)
625     {
626       logprintf (LOG_NOTQUIET, "%s: %s.\n", url, url_error (up_error_code));
627       xfree (url);
628       return URLERROR;
629     }
630
631   if (!refurl)
632     refurl = opt.referer;
633
634  redirected:
635
636   result = NOCONERROR;
637   mynewloc = NULL;
638   local_file = NULL;
639   proxy_url = NULL;
640
641   proxy = getproxy (u);
642   if (proxy)
643     {
644       /* Parse the proxy URL.  */
645       proxy_url = url_parse (proxy, &up_error_code);
646       if (!proxy_url)
647         {
648           logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
649                      proxy, url_error (up_error_code));
650           xfree (url);
651           RESTORE_POST_DATA;
652           return PROXERR;
653         }
654       if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
655         {
656           logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
657           url_free (proxy_url);
658           xfree (url);
659           RESTORE_POST_DATA;
660           return PROXERR;
661         }
662     }
663
664   if (u->scheme == SCHEME_HTTP
665 #ifdef HAVE_SSL
666       || u->scheme == SCHEME_HTTPS
667 #endif
668       || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
669     {
670       result = http_loop (u, &mynewloc, &local_file, refurl, dt, proxy_url);
671     }
672   else if (u->scheme == SCHEME_FTP)
673     {
674       /* If this is a redirection, we must not allow recursive FTP
675          retrieval, so we save recursion to oldrec, and restore it
676          later.  */
677       int oldrec = opt.recursive;
678       if (redirection_count)
679         opt.recursive = 0;
680       result = ftp_loop (u, dt, proxy_url);
681       opt.recursive = oldrec;
682
683       /* There is a possibility of having HTTP being redirected to
684          FTP.  In these cases we must decide whether the text is HTML
685          according to the suffix.  The HTML suffixes are `.html',
686          `.htm' and a few others, case-insensitive.  */
687       if (redirection_count && local_file && u->scheme == SCHEME_FTP)
688         {
689           if (has_html_suffix_p (local_file))
690             *dt |= TEXTHTML;
691         }
692     }
693
694   if (proxy_url)
695     {
696       url_free (proxy_url);
697       proxy_url = NULL;
698     }
699
700   location_changed = (result == NEWLOCATION);
701   if (location_changed)
702     {
703       char *construced_newloc;
704       struct url *newloc_parsed;
705
706       assert (mynewloc != NULL);
707
708       if (local_file)
709         xfree (local_file);
710
711       /* The HTTP specs only allow absolute URLs to appear in
712          redirects, but a ton of boneheaded webservers and CGIs out
713          there break the rules and use relative URLs, and popular
714          browsers are lenient about this, so wget should be too. */
715       construced_newloc = uri_merge (url, mynewloc);
716       xfree (mynewloc);
717       mynewloc = construced_newloc;
718
719       /* Now, see if this new location makes sense. */
720       newloc_parsed = url_parse (mynewloc, &up_error_code);
721       if (!newloc_parsed)
722         {
723           logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
724                      url_error (up_error_code));
725           url_free (u);
726           xfree (url);
727           xfree (mynewloc);
728           RESTORE_POST_DATA;
729           return result;
730         }
731
732       /* Now mynewloc will become newloc_parsed->url, because if the
733          Location contained relative paths like .././something, we
734          don't want that propagating as url.  */
735       xfree (mynewloc);
736       mynewloc = xstrdup (newloc_parsed->url);
737
738       /* Check for max. number of redirections.  */
739       if (++redirection_count > MAX_REDIRECTIONS)
740         {
741           logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
742                      MAX_REDIRECTIONS);
743           url_free (newloc_parsed);
744           url_free (u);
745           xfree (url);
746           xfree (mynewloc);
747           RESTORE_POST_DATA;
748           return WRONGCODE;
749         }
750
751       xfree (url);
752       url = mynewloc;
753       url_free (u);
754       u = newloc_parsed;
755
756       /* If we're being redirected from POST, we don't want to POST
757          again.  Many requests answer POST with a redirection to an
758          index page; that redirection is clearly a GET.  We "suspend"
759          POST data for the duration of the redirections, and restore
760          it when we're done. */
761       if (!post_data_suspended)
762         SUSPEND_POST_DATA;
763
764       goto redirected;
765     }
766
767   if (local_file)
768     {
769       if (*dt & RETROKF)
770         {
771           register_download (u->url, local_file);
772           if (redirection_count && 0 != strcmp (origurl, u->url))
773             register_redirection (origurl, u->url);
774           if (*dt & TEXTHTML)
775             register_html (u->url, local_file);
776         }
777     }
778
779   if (file)
780     *file = local_file ? local_file : NULL;
781   else
782     xfree_null (local_file);
783
784   url_free (u);
785
786   if (redirection_count)
787     {
788       if (newloc)
789         *newloc = url;
790       else
791         xfree (url);
792     }
793   else
794     {
795       if (newloc)
796         *newloc = NULL;
797       xfree (url);
798     }
799
800   RESTORE_POST_DATA;
801
802   return result;
803 }
804
805 /* Find the URLs in the file and call retrieve_url() for each of
806    them.  If HTML is non-zero, treat the file as HTML, and construct
807    the URLs accordingly.
808
809    If opt.recursive is set, call retrieve_tree() for each file.  */
810
811 uerr_t
812 retrieve_from_file (const char *file, int html, int *count)
813 {
814   uerr_t status;
815   struct urlpos *url_list, *cur_url;
816
817   url_list = (html ? get_urls_html (file, NULL, NULL)
818               : get_urls_file (file));
819   status = RETROK;             /* Suppose everything is OK.  */
820   *count = 0;                  /* Reset the URL count.  */
821
822   for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
823     {
824       char *filename = NULL, *new_file = NULL;
825       int dt;
826
827       if (cur_url->ignore_when_downloading)
828         continue;
829
830       if (opt.quota && total_downloaded_bytes > opt.quota)
831         {
832           status = QUOTEXC;
833           break;
834         }
835       if ((opt.recursive || opt.page_requisites)
836           && cur_url->url->scheme != SCHEME_FTP)
837         status = retrieve_tree (cur_url->url->url);
838       else
839         status = retrieve_url (cur_url->url->url, &filename, &new_file, NULL, &dt);
840
841       if (filename && opt.delete_after && file_exists_p (filename))
842         {
843           DEBUGP (("Removing file due to --delete-after in"
844                    " retrieve_from_file():\n"));
845           logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
846           if (unlink (filename))
847             logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
848           dt &= ~RETROKF;
849         }
850
851       xfree_null (new_file);
852       xfree_null (filename);
853     }
854
855   /* Free the linked list of URL-s.  */
856   free_urlpos (url_list);
857
858   return status;
859 }
860
861 /* Print `giving up', or `retrying', depending on the impending
862    action.  N1 and N2 are the attempt number and the attempt limit.  */
863 void
864 printwhat (int n1, int n2)
865 {
866   logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
867 }
868
869 /* If opt.wait or opt.waitretry are specified, and if certain
870    conditions are met, sleep the appropriate number of seconds.  See
871    the documentation of --wait and --waitretry for more information.
872
873    COUNT is the count of current retrieval, beginning with 1. */
874
875 void
876 sleep_between_retrievals (int count)
877 {
878   static int first_retrieval = 1;
879
880   if (first_retrieval)
881     {
882       /* Don't sleep before the very first retrieval. */
883       first_retrieval = 0;
884       return;
885     }
886
887   if (opt.waitretry && count > 1)
888     {
889       /* If opt.waitretry is specified and this is a retry, wait for
890          COUNT-1 number of seconds, or for opt.waitretry seconds.  */
891       if (count <= opt.waitretry)
892         xsleep (count - 1);
893       else
894         xsleep (opt.waitretry);
895     }
896   else if (opt.wait)
897     {
898       if (!opt.random_wait || count > 1)
899         /* If random-wait is not specified, or if we are sleeping
900            between retries of the same download, sleep the fixed
901            interval.  */
902         xsleep (opt.wait);
903       else
904         {
905           /* Sleep a random amount of time averaging in opt.wait
906              seconds.  The sleeping amount ranges from 0 to
907              opt.wait*2, inclusive.  */
908           double waitsecs = 2 * opt.wait * random_float ();
909           DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
910                    opt.wait, waitsecs));
911           xsleep (waitsecs);
912         }
913     }
914 }
915
916 /* Free the linked list of urlpos.  */
917 void
918 free_urlpos (struct urlpos *l)
919 {
920   while (l)
921     {
922       struct urlpos *next = l->next;
923       if (l->url)
924         url_free (l->url);
925       xfree_null (l->local_name);
926       xfree (l);
927       l = next;
928     }
929 }
930
931 /* Rotate FNAME opt.backups times */
932 void
933 rotate_backups(const char *fname)
934 {
935   int maxlen = strlen (fname) + 1 + numdigit (opt.backups) + 1;
936   char *from = (char *)alloca (maxlen);
937   char *to = (char *)alloca (maxlen);
938   struct_stat sb;
939   int i;
940
941   if (stat (fname, &sb) == 0)
942     if (S_ISREG (sb.st_mode) == 0)
943       return;
944
945   for (i = opt.backups; i > 1; i--)
946     {
947       sprintf (from, "%s.%d", fname, i - 1);
948       sprintf (to, "%s.%d", fname, i);
949       rename (from, to);
950     }
951
952   sprintf (to, "%s.%d", fname, 1);
953   rename(fname, to);
954 }
955
956 static int no_proxy_match PARAMS ((const char *, const char **));
957
958 /* Return the URL of the proxy appropriate for url U.  */
959
960 static char *
961 getproxy (struct url *u)
962 {
963   char *proxy = NULL;
964   char *rewritten_url;
965   static char rewritten_storage[1024];
966
967   if (!opt.use_proxy)
968     return NULL;
969   if (!no_proxy_match (u->host, (const char **)opt.no_proxy))
970     return NULL;
971
972   switch (u->scheme)
973     {
974     case SCHEME_HTTP:
975       proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
976       break;
977 #ifdef HAVE_SSL
978     case SCHEME_HTTPS:
979       proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
980       break;
981 #endif
982     case SCHEME_FTP:
983       proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
984       break;
985     case SCHEME_INVALID:
986       break;
987     }
988   if (!proxy || !*proxy)
989     return NULL;
990
991   /* Handle shorthands.  `rewritten_storage' is a kludge to allow
992      getproxy() to return static storage. */
993   rewritten_url = rewrite_shorthand_url (proxy);
994   if (rewritten_url)
995     {
996       strncpy (rewritten_storage, rewritten_url, sizeof (rewritten_storage));
997       rewritten_storage[sizeof (rewritten_storage) - 1] = '\0';
998       proxy = rewritten_storage;
999     }
1000
1001   return proxy;
1002 }
1003
1004 /* Should a host be accessed through proxy, concerning no_proxy?  */
1005 int
1006 no_proxy_match (const char *host, const char **no_proxy)
1007 {
1008   if (!no_proxy)
1009     return 1;
1010   else
1011     return !sufmatch (no_proxy, host);
1012 }