summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Novotny <michal@allpeers.com>2009-08-10 12:21:27 +0200
committerBenjamin Otte <otte@gnome.org>2009-08-10 13:37:04 +0200
commitd59c121f60ec98f8241dcd611124510ceddaadfa (patch)
treeb9b919c6af614fd1f860e2aeae3dbcdf89a9279b
parent12c9c9ae561f9c572ec137d78c6da3bf9ba520bf (diff)
downloadgvfs-d59c121f60ec98f8241dcd611124510ceddaadfa.tar.gz
"The FTP folder won't open!" (upstream)
- space and tab at the end of filename in Unix and DOS style listings - date in DOS listing, short variants of year 00-80 were badly converted to 100-180, years 81+ weren't changed at all - enhanced logic when searching for symlink name in Unix style listing - regular files with sequence " -> " in name aren't now incorrectly detected as symlinks (DOS and Unix style listing only) upstream references: http://bugzilla.mozilla.org/show_bug.cgi?id=365133 http://hg.mozilla.org/mozilla-central/rev/b79bc71c6832
-rw-r--r--daemon/ParseFTPList.c50
1 files changed, 37 insertions, 13 deletions
diff --git a/daemon/ParseFTPList.c b/daemon/ParseFTPList.c
index 3b261a29..577840c7 100644
--- a/daemon/ParseFTPList.c
+++ b/daemon/ParseFTPList.c
@@ -782,7 +782,7 @@ int ParseFTPList(const char *line, struct list_state *state,
state->parsed_one = 1;
state->lstyle = lstyle;
- p = &(line[linelen_sans_wsp]); /* line end sans wsp */
+ p = &(line[linelen]); /* line end */
result->fe_cinfs = 1;
result->fe_fname = tokens[3];
result->fe_fnlen = p - tokens[3];
@@ -811,7 +811,7 @@ int ParseFTPList(const char *line, struct list_state *state,
result->fe_type = 'l';
result->fe_fnlen = p - result->fe_fname;
result->fe_lname = p + 4;
- result->fe_lnlen = &(line[linelen_sans_wsp])
+ result->fe_lnlen = &(line[linelen])
- result->fe_lname;
break;
}
@@ -826,8 +826,13 @@ int ParseFTPList(const char *line, struct list_state *state,
result->fe_time.tm_mon--;
result->fe_time.tm_mday = atoi(tokens[0]+3);
result->fe_time.tm_year = atoi(tokens[0]+6);
+ /* if year has only two digits then assume that
+ 00-79 is 2000-2079
+ 80-99 is 1980-1999 */
if (result->fe_time.tm_year < 80)
- result->fe_time.tm_year += 100;
+ result->fe_time.tm_year += 2000;
+ else if (result->fe_time.tm_year < 100)
+ result->fe_time.tm_year += 1900;
}
result->fe_time.tm_hour = atoi(tokens[1]+0);
@@ -1156,23 +1161,42 @@ int ParseFTPList(const char *line, struct list_state *state,
} /* time/year */
result->fe_fname = tokens[tokmarker+4];
- result->fe_fnlen = (&(line[linelen_sans_wsp]))
+ result->fe_fnlen = (&(line[linelen]))
- (result->fe_fname);
if (result->fe_type == 'l' && result->fe_fnlen > 4)
{
- p = result->fe_fname + 1;
- for (pos = 1; pos < (result->fe_fnlen - 4); pos++)
+ /* First try to use result->fe_size to find " -> " sequence.
+ This can give proper result for cases like "aaa -> bbb -> ccc". */
+ guint32 fe_size = atoi(result->fe_size);
+
+ if (result->fe_fnlen > (fe_size + 4) &&
+ g_strncmp(result->fe_fname + result->fe_fnlen - fe_size - 4 , " -> ", 4) == 0)
+ {
+ result->fe_lname = result->fe_fname + (result->fe_fnlen - fe_size);
+ result->fe_lnlen = (&(line[linelen])) - (result->fe_lname);
+ result->fe_fnlen -= fe_size + 4;
+ }
+ else
{
- if (*p == ' ' && p[1] == '-' && p[2] == '>' && p[3] == ' ')
+ /* Search for sequence " -> " from the end for case when there are
+ more occurrences. F.e. if ftpd returns "a -> b -> c" assume
+ "a -> b" as a name. Powerusers can remove unnecessary parts
+ manually but there is no way to follow the link when some
+ essential part is missing. */
+ p = result->fe_fname + (result->fe_fnlen - 5);
+ for (pos = (result->fe_fnlen - 5); pos > 0; pos--)
{
- result->fe_lname = p + 4;
- result->fe_lnlen = (&(line[linelen_sans_wsp]))
- - (result->fe_lname);
- result->fe_fnlen = pos;
- break;
+ if (p && g_str_has_prefix(p, " -> "))
+ {
+ result->fe_lname = p + 4;
+ result->fe_lnlen = (&(line[linelen]))
+ - (result->fe_lname);
+ result->fe_fnlen = pos;
+ break;
+ }
+ p--;
}
- p++;
}
}