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\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);