X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fftp-ls.c;h=2115922074659b4f898c4532fef7c93e96fc6e59;hb=4a08094db88011153adadbf995103770b20d2a31;hp=95a8b3df2feb5e8c6a0df59cd63b02b54498794e;hpb=714ccdcd844314cc3902fa4fd1b48757d9db9296;p=wget diff --git a/src/ftp-ls.c b/src/ftp-ls.c index 95a8b3df..21159220 100644 --- a/src/ftp-ls.c +++ b/src/ftp-ls.c @@ -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 */ @@ -761,7 +762,7 @@ ftp_parse_vms_ls (const char *file) */ #if (!defined( __VMS) && !defined( PRESERVE_VMS_VERSIONS)) - for (p = tok+ strlen( tok); (--p > tok) && ISDIGIT( *p); ); + for (p = tok+ strlen( tok); (--p > tok) && c_isdigit( *p); ); if ((*p == ';') && (*(p- 1) != '^')) { *p = '\0'; @@ -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, ×truct); - strptime( date_str, "%d-%b-%Y %H:%M:%S", ×truct); + 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 (×truct); + 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, "\n"); fprintf (fp, "\n\n"); - 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, "\n\n\n

"); - 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, "

\n
\n
\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, "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, "
\n\n\n"); + xfree (htcldir); xfree (upwd); if (!output_stream) fclose (fp);