X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fftp-ls.c;h=748bd788a9df591e3388ef49d77bfca09aada6bf;hb=4d7c5e087b2bc82c9f503dff003916d1047903ce;hp=148c79bfd0fd4e3f070d3d0e71cca8ed462559cf;hpb=ef22bf610a448f198419122fec79130d43667d33;p=wget
diff --git a/src/ftp-ls.c b/src/ftp-ls.c
index 148c79bf..748bd788 100644
--- a/src/ftp-ls.c
+++ b/src/ftp-ls.c
@@ -1,12 +1,11 @@
/* Parsing FTP `ls' output.
- Copyright (C) 1995, 1996, 1997, 2000, 2001
- Free Software Foundation, Inc.
+ Copyright (C) 1996-2004 Free Software Foundation, Inc.
This file is part of GNU Wget.
GNU Wget is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
GNU Wget is distributed in the hope that it will be useful,
@@ -15,8 +14,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with Wget; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+along with Wget. If not, see .
In addition, as a special exception, the Free Software Foundation
gives permission to link the code of its release of Wget with the
@@ -32,23 +30,19 @@ so, delete this exception statement from your version. */
#include
#include
-#ifdef HAVE_STRING_H
-# include
-#else
-# include
-#endif
+#include
#ifdef HAVE_UNISTD_H
# include
#endif
-#include
#include
+#include
#include "wget.h"
#include "utils.h"
#include "ftp.h"
#include "url.h"
-
-extern FILE *output_stream;
+#include "convert.h" /* for html_quote_string prototype */
+#include "retr.h" /* for output_stream */
/* Converts symbolic permissions to number-style ones, e.g. string
rwxr-xr-x to 755. For now, it knows nothing of
@@ -109,7 +103,7 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
struct tm timestruct, *tnow;
time_t timenow;
- char *line, *tok; /* tokenizer */
+ char *line, *tok, *ptok; /* tokenizer */
struct fileinfo *dir, *l, cur; /* list creation */
fp = fopen (file, "rb");
@@ -121,7 +115,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 +194,9 @@ 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, " ")))
+ tok = line;
+ while (ptok = tok,
+ (tok = strtok (NULL, " ")) != NULL)
{
--next;
if (next < 0) /* a month name was not encountered */
@@ -214,25 +210,22 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
{
wgint size;
- /* 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)
+ /* Parse the previous token with str_to_wgint. */
+ if (ptok == line)
{
/* Something has gone wrong during parsing. */
error = 1;
break;
}
errno = 0;
- size = str_to_wgint (t, NULL, 10);
+ size = str_to_wgint (ptok, 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;
+ DEBUGP (("size: %s; ", number_to_static_string(cur.size)));
month = i;
next = 5;
@@ -333,7 +326,7 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
default -F output. I believe these cases are very
rare. */
fnlen = strlen (tok); /* re-calculate `fnlen' */
- cur.name = (char *)xmalloc (fnlen + 1);
+ cur.name = xmalloc (fnlen + 1);
memcpy (cur.name, tok, fnlen + 1);
if (fnlen)
{
@@ -366,7 +359,7 @@ ftp_parse_unix_ls (const char *file, int ignore_perms)
if (!cur.name || (cur.type == FT_SYMLINK && !cur.linkto))
error = 1;
- DEBUGP (("\n"));
+ DEBUGP (("%s\n", cur.name ? cur.name : ""));
if (error || ignore)
{
@@ -449,7 +442,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);
@@ -557,7 +550,7 @@ ftp_parse_winnt_ls (const char *file)
l->next = NULL;
}
- xfree(line);
+ xfree (line);
}
fclose(fp);
@@ -615,21 +608,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);
@@ -650,7 +640,8 @@ ftp_parse_vms_ls (const char *file)
tok = strtok(line, " ");
if (tok == NULL) tok = line;
DEBUGP(("file name: '%s'\n", tok));
- for (p = tok ; *p && *p != ';' ; p++);
+ for (p = tok ; *p && *p != ';' ; p++)
+ ;
if (*p == ';') *p = '\0';
p = tok + strlen(tok) - 4;
if (!strcmp(p, ".DIR")) *p = '\0';
@@ -729,13 +720,15 @@ 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);
+ for (; *p && *p != ':'; ++p)
+ ;
if (*p)
min = atoi (++p);
- for (; *p && *p != ':'; ++p);
+ for (; *p && *p != ':'; ++p)
+ ;
if (*p)
sec = atoi (++p);
@@ -781,14 +774,14 @@ ftp_parse_vms_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;
@@ -875,9 +868,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);
}
@@ -927,7 +921,7 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
break;
}
htclfile = html_quote_string (f->name);
- fprintf (fp, "host, u->port);
+ fprintf (fp, "host, u->port);
if (*u->dir != '/')
putc ('/', fp);
fprintf (fp, "%s", u->dir);
@@ -941,7 +935,7 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f)
putc ('/', fp);
fprintf (fp, " ");
if (f->type == FT_PLAINFILE)
- fprintf (fp, _(" (%s bytes)"), legible (f->size));
+ fprintf (fp, _(" (%s bytes)"), number_to_static_string (f->size));
else if (f->type == FT_SYMLINK)
fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)");
putc ('\n', fp);