]> sjero.net Git - wget/blobdiff - src/ftp-ls.c
[mq]: cfg-mk
[wget] / src / ftp-ls.c
index 17a4f5117281fdf21f722de8b035df6ad9d03e34..2115922074659b4f898c4532fef7c93e96fc6e59 100644 (file)
@@ -1,6 +1,6 @@
 /* Parsing FTP `ls' output.
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. 
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 This file is part of GNU Wget.
 
@@ -72,12 +72,13 @@ static int
 clean_line(char *line)
 {
   int len = strlen (line);
-  if (!len) return 0; 
+  if (!len) return 0;
   if (line[len - 1] == '\n')
     line[--len] = '\0';
+  if (!len) return 0;
   if (line[len - 1] == '\r')
     line[--len] = '\0';
-  for ( ; *line ; line++ ) if (*line == '\t') *line = ' '; 
+  for ( ; *line ; line++ ) if (*line == '\t') *line = ' ';
   return len;
 }
 
@@ -486,9 +487,9 @@ ftp_parse_winnt_ls (const char *file)
       if (hour == 12)  hour  = 0;
       if (*tok == 'P') hour += 12;
 
-      DEBUGP(("YYYY/MM/DD HH:MM - %d/%02d/%02d %02d:%02d\n", 
+      DEBUGP(("YYYY/MM/DD HH:MM - %d/%02d/%02d %02d:%02d\n",
               year+1900, month, day, hour, min));
-      
+
       /* Build the time-stamp (copy & paste from above) */
       timestruct.tm_sec   = 0;
       timestruct.tm_min   = min;
@@ -566,7 +567,7 @@ ftp_parse_winnt_ls (const char *file)
    more or less.  (Different VMS FTP servers may have different headers,
    and may not supply the same data, but all should be subsets of this.)
 
-   VMS normally provides local (server) time and date information. 
+   VMS normally provides local (server) time and date information.
    Define the logical name or environment variable
    "WGET_TIMEZONE_DIFFERENTIAL" (seconds) to adjust the receiving local
    times if different from the remote local times.
@@ -674,7 +675,7 @@ ftp_parse_vms_ls (const char *file)
   int dt, i, j, len;
   int perms;
   time_t timenow;
-  struct tm timestruct;
+  struct tm *timestruct;
   char date_str[ 32];
 
   char *line, *tok;             /* tokenizer */
@@ -769,7 +770,7 @@ ftp_parse_vms_ls (const char *file)
 #endif /* (!defined( __VMS) && !defined( PRESERVE_VMS_VERSIONS)) */
 
       /* 2005-02-23 SMS.
-         Eliminate "^" escape characters from ODS5 extended file name. 
+         Eliminate "^" escape characters from ODS5 extended file name.
          (A caret is invalid in an ODS2 name, so this is always safe.)
       */
       eat_carets( tok);
@@ -823,7 +824,7 @@ ftp_parse_vms_ls (const char *file)
       */
 
       tok = strtok(NULL, " ");
-      if (tok == NULL) 
+      if (tok == NULL)
         {
           DEBUGP(("Getting additional line.\n"));
           xfree (line);
@@ -943,7 +944,7 @@ ftp_parse_vms_ls (const char *file)
            }
          else
            {
-             /* Nondescript.  Probably size(s), probably in blocks. 
+             /* Nondescript.  Probably size(s), probably in blocks.
                  Could be "No privilege ..." message.  (Ignore.)
               */
              DEBUGP (("Ignored (size?).\n"));
@@ -960,11 +961,11 @@ ftp_parse_vms_ls (const char *file)
          fails.
       */
       timenow = time( NULL);
-      localtime_r( &timenow, &timestruct);
-      strptime( date_str, "%d-%b-%Y %H:%M:%S", &timestruct);
+      timestruct = localtime( &timenow );
+      strptime( date_str, "%d-%b-%Y %H:%M:%S", timestruct);
 
       /* Convert struct tm local time to time_t local time. */
-      timenow = mktime (&timestruct);
+      timenow = mktime (timestruct);
       /* Offset local time according to environment variable (seconds). */
       if ((tok = getenv( "WGET_TIMEZONE_DIFFERENTIAL")) != NULL)
         {
@@ -1077,7 +1078,9 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
 {
   FILE *fp;
   char *upwd;
+  char *htcldir;                /* HTML-clean dir name */
   char *htclfile;               /* HTML-clean file name */
+  char *urlclfile;              /* URL-clean file name */
 
   if (!output_stream)
     {
@@ -1105,12 +1108,16 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
     }
   else
     upwd = xstrdup ("");
+
+  htcldir = html_quote_string (u->dir);
+
   fprintf (fp, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n");
   fprintf (fp, "<html>\n<head>\n<title>");
-  fprintf (fp, _("Index of /%s on %s:%d"), u->dir, u->host, u->port);
+  fprintf (fp, _("Index of /%s on %s:%d"), htcldir, u->host, u->port);
   fprintf (fp, "</title>\n</head>\n<body>\n<h1>");
-  fprintf (fp, _("Index of /%s on %s:%d"), u->dir, u->host, u->port);
+  fprintf (fp, _("Index of /%s on %s:%d"), htcldir, u->host, u->port);
   fprintf (fp, "</h1>\n<hr>\n<pre>\n");
+
   while (f)
     {
       fprintf (fp, "  ");
@@ -1122,7 +1129,8 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
             "Jan", "Feb", "Mar", "Apr", "May", "Jun",
             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
           };
-          struct tm *ptm = localtime ((time_t *)&f->tstamp);
+          time_t tstamp = f->tstamp;
+          struct tm *ptm = localtime (&tstamp);
 
           fprintf (fp, "%d %s %02d ", ptm->tm_year + 1900, months[ptm->tm_mon],
                   ptm->tm_mday);
@@ -1149,13 +1157,18 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
           break;
         }
       htclfile = html_quote_string (f->name);
+      urlclfile = url_escape_unsafe_and_reserved (f->name);
       fprintf (fp, "<a href=\"ftp://%s%s:%d", upwd, u->host, u->port);
       if (*u->dir != '/')
         putc ('/', fp);
-      fprintf (fp, "%s", u->dir);
+      /* XXX: Should probably URL-escape dir components here, rather
+       * than just HTML-escape, for consistency with the next bit where
+       * we use urlclfile for the file component. Anyway, this is safer
+       * than what we had... */
+      fprintf (fp, "%s", htcldir);
       if (*u->dir)
         putc ('/', fp);
-      fprintf (fp, "%s", htclfile);
+      fprintf (fp, "%s", urlclfile);
       if (f->type == FT_DIRECTORY)
         putc ('/', fp);
       fprintf (fp, "\">%s", htclfile);
@@ -1168,9 +1181,11 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
         fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)");
       putc ('\n', fp);
       xfree (htclfile);
+      xfree (urlclfile);
       f = f->next;
     }
   fprintf (fp, "</pre>\n</body>\n</html>\n");
+  xfree (htcldir);
   xfree (upwd);
   if (!output_stream)
     fclose (fp);