[gvfs] "The FTP folder won't open!" (upstream)



commit d59c121f60ec98f8241dcd611124510ceddaadfa
Author: Michal Novotny <michal allpeers com>
Date:   Mon Aug 10 12:21:27 2009 +0200

    "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

 daemon/ParseFTPList.c |   50 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 37 insertions(+), 13 deletions(-)
---
diff --git a/daemon/ParseFTPList.c b/daemon/ParseFTPList.c
index 3b261a2..577840c 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++;
           }
         }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]