]> sjero.net Git - wget/blobdiff - src/ftp-ls.c
[svn] Extract timers to a separate file.
[wget] / src / ftp-ls.c
index d42a9ae7dfb88f0919012b5f39d04fb944a0186f..dd703dfd193d9e3773fd8745959028de9b2d8554 100644 (file)
@@ -47,6 +47,7 @@ so, delete this exception statement from your version.  */
 #include "utils.h"
 #include "ftp.h"
 #include "url.h"
+#include "convert.h"           /* for html_quote_string prototype */
 
 extern FILE *output_stream;
 
@@ -121,7 +122,7 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
   dir = l = NULL;
 
   /* Line loop to end of file: */
-  while ((line = read_whole_line (fp)))
+  while ((line = read_whole_line (fp)) != NULL)
     {
       len = clean_line (line);
       /* Skip if total...  */
@@ -200,7 +201,7 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
         This tactic is quite dubious when it comes to
         internationalization issues (non-English month names), but it
         works for now.  */
-      while ((tok = strtok (NULL, " ")))
+      while ((tok = strtok (NULL, " ")) != NULL)
        {
          --next;
          if (next < 0)         /* a month name was not encountered */
@@ -212,17 +213,28 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
                 size, and the filename is three tokens away.  */
              if (i != 12)
                {
-                 char *t = tok - 2;
-                 long mul = 1;
+                 wgint size;
 
-                 for (cur.size = 0; t > line && ISDIGIT (*t); mul *= 10, t--)
-                   cur.size += mul * (*t - '0');
+                 /* Back up to the beginning of the previous token
+                    and parse it with str_to_wgint.  */
+                 char *t = tok - 2;
+                 while (t > line && ISDIGIT (*t))
+                   --t;
                  if (t == line)
                    {
-                     /* Something is seriously wrong.  */
+                     /* Something has gone wrong during parsing. */
                      error = 1;
                      break;
                    }
+                 errno = 0;
+                 size = str_to_wgint (t, NULL, 10);
+                 if (size == WGINT_MAX && errno == ERANGE)
+                   /* Out of range -- ignore the size.  #### Should
+                      we refuse to start the download.  */
+                   cur.size = 0;
+                 else
+                   cur.size = size;
+
                  month = i;
                  next = 5;
                  DEBUGP (("month: %s; ", months[month]));
@@ -368,14 +380,14 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
 
       if (!dir)
        {
-         l = dir = (struct fileinfo *)xmalloc (sizeof (struct fileinfo));
+         l = dir = xnew (struct fileinfo);
          memcpy (l, &cur, sizeof (cur));
          l->prev = l->next = NULL;
        }
       else
        {
          cur.prev = l;
-         l->next = (struct fileinfo *)xmalloc (sizeof (struct fileinfo));
+         l->next = xnew (struct fileinfo);
          l = l->next;
          memcpy (l, &cur, sizeof (cur));
          l->next = NULL;
@@ -438,7 +450,7 @@ ftp_parse_winnt_ls (const char *file)
   dir = l = NULL;
 
   /* Line loop to end of file: */
-  while ((line = read_whole_line (fp)))
+  while ((line = read_whole_line (fp)) != NULL)
     {
       len = clean_line (line);
 
@@ -516,10 +528,16 @@ ftp_parse_winnt_ls (const char *file)
        }
       else
        {
+         wgint size;
          cur.type  = FT_PLAINFILE;
-         cur.size  = atoi(tok);
+         errno = 0;
+         size = str_to_wgint (tok, NULL, 10);
+         if (size == WGINT_MAX && errno == ERANGE)
+           cur.size = 0;       /* overflow */
+         else
+           cur.size = size;
          cur.perms = 0644;
-         DEBUGP(("File, size %ld bytes\n", cur.size));
+         DEBUGP(("File, size %s bytes\n", number_to_static_string (cur.size)));
        }
 
       cur.linkto = NULL;
@@ -527,20 +545,20 @@ ftp_parse_winnt_ls (const char *file)
       /* And put everything into the linked list */
       if (!dir)
        {
-         l = dir = (struct fileinfo *)xmalloc (sizeof (struct fileinfo));
+         l = dir = xnew (struct fileinfo);
          memcpy (l, &cur, sizeof (cur));
          l->prev = l->next = NULL;
        }
       else
        {
          cur.prev = l;
-         l->next = (struct fileinfo *)xmalloc (sizeof (struct fileinfo));
+         l->next = xnew (struct fileinfo);
          l = l->next;
          memcpy (l, &cur, sizeof (cur));
          l->next = NULL;
        }
 
-      xfree(line);
+      xfree (line);
     }
 
   fclose(fp);
@@ -598,21 +616,18 @@ ftp_parse_vms_ls (const char *file)
 
   /* Skip empty line. */
   line = read_whole_line (fp);
-  if (line)
-    xfree (line);
+  xfree_null (line);
 
   /* Skip "Directory PUB$DEVICE[PUB]" */
   line = read_whole_line (fp);
-  if (line)
-    xfree (line);
+  xfree_null (line);
 
   /* Skip empty line. */
   line = read_whole_line (fp);
-  if (line)
-    xfree (line);
+  xfree_null (line);
 
   /* Line loop to end of file: */
-  while ((line = read_whole_line (fp)))
+  while ((line = read_whole_line (fp)) != NULL)
     {
       char *p;
       i = clean_line (line);
@@ -712,7 +727,7 @@ ftp_parse_vms_ls (const char *file)
       /* Fourth/Third column: Time hh:mm[:ss] */
       tok = strtok (NULL, " ");
       if (tok == NULL) continue;
-      hour = min = sec = 0;
+      min = sec = 0;
       p = tok;
       hour = atoi (p);
       for (; *p && *p != ':'; ++p);
@@ -858,9 +873,10 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
 
       tmpu = url_escape (u->user);
       tmpp = u->passwd ? url_escape (u->passwd) : NULL;
-      upwd = (char *)xmalloc (strlen (tmpu)
-                            + (tmpp ? (1 + strlen (tmpp)) : 0) + 2);
-      sprintf (upwd, "%s%s%s@", tmpu, tmpp ? ":" : "", tmpp ? tmpp : "");
+      if (tmpp)
+       upwd = concat_strings (tmpu, ":", tmpp, "@", (char *) 0);
+      else
+       upwd = concat_strings (tmpu, "@", (char *) 0);
       xfree (tmpu);
       xfree_null (tmpp);
     }
@@ -924,7 +940,7 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
        putc ('/', fp);
       fprintf (fp, "</a> ");
       if (f->type == FT_PLAINFILE)
-       fprintf (fp, _(" (%s bytes)"), legible (f->size));
+       fprintf (fp, _(" (%s bytes)"), with_thousand_seps (f->size));
       else if (f->type == FT_SYMLINK)
        fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)");
       putc ('\n', fp);