]> sjero.net Git - wget/blobdiff - src/http.c
[svn] Don't cast return type of malloc/realloc. Assume ANSI C signal handlers.
[wget] / src / http.c
index 3170d77e56228c6567b4c7c86ce22a975a64b0f6..06c3c5bdafcab564cde2d60d0b088b36e41b68f3 100644 (file)
@@ -31,30 +31,13 @@ so, delete this exception statement from your version.  */
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <sys/types.h>
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
+#include <string.h>
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 #include <assert.h>
 #include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#ifndef errno
-extern int errno;
-#endif
+#include <time.h>
 
 #include "wget.h"
 #include "utils.h"
@@ -368,7 +351,7 @@ request_send (const struct request *req, int fd)
 
   /* Send the request to the server. */
 
-  write_error = fd_write (fd, request_string, size - 1, -1.0);
+  write_error = fd_write (fd, request_string, size - 1, -1);
   if (write_error < 0)
     logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
               strerror (errno));
@@ -412,7 +395,7 @@ post_file (int sock, const char *file_name, wgint promised_size)
       if (length == 0)
        break;
       towrite = MIN (promised_size - written, length);
-      write_error = fd_write (sock, chunk, towrite, -1.0);
+      write_error = fd_write (sock, chunk, towrite, -1);
       if (write_error < 0)
        {
          fclose (fp);
@@ -840,7 +823,7 @@ skip_short_body (int fd, wgint contlen)
 
   while (contlen > 0)
     {
-      int ret = fd_read (fd, dlbuf, MIN (contlen, SKIP_SIZE), -1.0);
+      int ret = fd_read (fd, dlbuf, MIN (contlen, SKIP_SIZE), -1);
       if (ret <= 0)
        {
          /* Don't normally report the error since this is an
@@ -1100,13 +1083,13 @@ free_hstat (struct http_stat *hs)
   hs->error = NULL;
 }
 
-static char *create_authorization_line PARAMS ((const char *, const char *,
-                                               const char *, const char *,
-                                               const char *, int *));
-static char *basic_authentication_encode PARAMS ((const char *, const char *));
-static int known_authentication_scheme_p PARAMS ((const char *, const char *));
+static char *create_authorization_line (const char *, const char *,
+                                       const char *, const char *,
+                                       const char *, int *);
+static char *basic_authentication_encode (const char *, const char *);
+static int known_authentication_scheme_p (const char *, const char *);
 
-time_t http_atotm PARAMS ((const char *));
+time_t http_atotm (const char *);
 
 #define BEGINS_WITH(line, string_constant)                             \
   (!strncasecmp (line, string_constant, sizeof (string_constant) - 1)  \
@@ -1121,6 +1104,12 @@ time_t http_atotm PARAMS ((const char *));
     request_set_header (req, "User-Agent", opt.useragent, rel_none);   \
 } while (0)
 
+/* The flags that allow clobbering the file (opening with "wb").
+   Defined here to avoid repetition later.  #### This will require
+   rework.  */
+#define ALLOW_CLOBBER (opt.noclobber || opt.always_rest || opt.timestamping \
+                      || opt.dirstruct || opt.output_document)
+
 /* Retrieve a document through HTTP protocol.  It recognizes status
    code, and correctly handles redirections.  It closes the network
    socket.  If it receives an error from the functions below it, it
@@ -1538,7 +1527,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
       if (opt.post_data)
        {
          DEBUGP (("[POST data: %s]\n", opt.post_data));
-         write_error = fd_write (sock, opt.post_data, post_data_size, -1.0);
+         write_error = fd_write (sock, opt.post_data, post_data_size, -1);
        }
       else if (opt.post_file_name && post_data_size != 0)
        write_error = post_file (sock, opt.post_file_name, post_data_size);
@@ -1747,7 +1736,6 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
        contrange = first_byte_pos;
     }
   resp_free (resp);
-  xfree (head);
 
   /* 20x responses are counted among successful by default.  */
   if (H_20X (statcode))
@@ -1793,18 +1781,28 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
        text/html file.  If some case-insensitive variation on ".htm[l]" isn't
        already the file's suffix, tack on ".html". */
     {
-      char*  last_period_in_local_filename = strrchr(*hs->local_file, '.');
+      char *last_period_in_local_filename = strrchr (*hs->local_file, '.');
 
       if (last_period_in_local_filename == NULL
          || !(0 == strcasecmp (last_period_in_local_filename, ".htm")
               || 0 == strcasecmp (last_period_in_local_filename, ".html")))
        {
-         size_t  local_filename_len = strlen(*hs->local_file);
-         
-         *hs->local_file = xrealloc(*hs->local_file,
-                                    local_filename_len + sizeof(".html"));
+         int local_filename_len = strlen (*hs->local_file);
+         /* Resize the local file, allowing for ".html" preceded by
+            optional ".NUMBER".  */
+         *hs->local_file = xrealloc (*hs->local_file,
+                                     local_filename_len + 24 + sizeof (".html"));
          strcpy(*hs->local_file + local_filename_len, ".html");
-
+         /* If clobbering is not allowed and the file, as named,
+            exists, tack on ".NUMBER.html" instead. */
+         if (!ALLOW_CLOBBER)
+           {
+             int ext_num = 1;
+             do
+               sprintf (*hs->local_file + local_filename_len,
+                        ".%d.html", ext_num++);
+             while (file_exists_p (*hs->local_file));
+           }
          *dt |= ADDED_HTML_EXTENSION;
        }
     }
@@ -1897,8 +1895,7 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
        rotate_backups (*hs->local_file);
       if (hs->restval)
        fp = fopen (*hs->local_file, "ab");
-      else if (opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct
-              || opt.output_document)
+      else if (ALLOW_CLOBBER)
        fp = fopen (*hs->local_file, "wb");
       else
        {
@@ -1931,6 +1928,9 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
   if (opt.save_headers)
     fwrite (head, 1, strlen (head), fp);
 
+  /* Now we no longer need to store the response header. */
+  xfree (head);
+
   /* Download the request body.  */
   flags = 0;
   if (keep_alive)
@@ -2870,14 +2870,14 @@ digest_authentication_encode (const char *au, const char *user,
     gen_md5_finish (ctx, hash);
     dump_hash (response_digest, hash);
 
-    res = (char*) xmalloc (strlen (user)
-                          + strlen (user)
-                          + strlen (realm)
-                          + strlen (nonce)
-                          + strlen (path)
-                          + 2 * MD5_HASHLEN /*strlen (response_digest)*/
-                          + (opaque ? strlen (opaque) : 0)
-                          + 128);
+    res = xmalloc (strlen (user)
+                  + strlen (user)
+                  + strlen (realm)
+                  + strlen (nonce)
+                  + strlen (path)
+                  + 2 * MD5_HASHLEN /*strlen (response_digest)*/
+                  + (opaque ? strlen (opaque) : 0)
+                  + 128);
     sprintf (res, "Digest \
 username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
             user, realm, nonce, path, response_digest);