GetLongPathName rewrite.

diff --git a/files/dos_fs.c b/files/dos_fs.c
index 313db95..792663a 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -1001,27 +1001,52 @@
                                   DWORD longlen )
 {
     DOS_FULL_NAME full_name;
-    char *p;
-    char *longfilename;
-    DWORD shortpathlen;
+    char *p, *r, *ll, *ss;
     
     if (!DOSFS_GetFullName( shortpath, TRUE, &full_name )) return 0;
     lstrcpynA( longpath, full_name.short_name, longlen );
-    /* Do some hackery to get the long filename.
-     * FIXME: Would be better if it returned the
-     * long version of the directories too
-     */
-    longfilename = strrchr(full_name.long_name, '/')+1;
-    if (longpath != NULL) {
-      if ((p = strrchr( longpath, '\\' )) != NULL) {
-	p++;
-	longlen -= (p-longpath);
-	lstrcpynA( p, longfilename , longlen);
-      }
+
+    /* Do some hackery to get the long filename. */
+
+    if (longpath) {
+     ss=longpath+strlen(longpath);
+     ll=full_name.long_name+strlen(full_name.long_name);
+     p=NULL;
+     while (ss>=longpath)
+     {
+       /* FIXME: aren't we more paranoid, than needed? */
+       while ((ss[0]=='\\') && (ss>=longpath)) ss--;
+       p=ss;
+       while ((ss[0]!='\\') && (ss>=longpath)) ss--;
+       if (ss>=longpath) 
+         {
+         /* FIXME: aren't we more paranoid, than needed? */
+         while ((ll[0]=='/') && (ll>=full_name.long_name)) ll--;
+         while ((ll[0]!='/') && (ll>=full_name.long_name)) ll--;
+         if (ll<full_name.long_name) 
+              { 
+              ERR("Bad longname! (ss=%s ll=%s)\n This should never happen !\n"
+		  ,ss ,ll ); 
+              return 0;
+              }
+         }
+     }
+
+   /* FIXME: fix for names like "C:\\" (ie. with more '\'s) */
+      if (p && p[2]) 
+        {
+	p+=1;
+	if ((p-longpath)>0) longlen -= (p-longpath);
+	lstrcpynA( p, ll , longlen);
+
+        /* Now, change all '/' to '\' */
+        for (r=p; r<(p+longlen); r++ ) 
+          if (r[0]=='/') r[0]='\\';
+        return strlen(longpath) - strlen(p) + longlen;
+        }
     }
-    shortpathlen =
-      ((strrchr( full_name.short_name, '\\' ) - full_name.short_name) + 1);
-    return shortpathlen + strlen( longfilename );
+
+    return strlen(longpath);
 }