Spurious warning message when entering symlink directory

Christopher Gautier krys at idm.fr
Tue Aug 23 14:28:46 UTC 2005


I finally decided to crush a bug that has been annoying me for some time.

How to reproduce it:
- mkdir foo
- ln -s foo bar
- go to bar within mc
- the message 'Warning: Cannot change to %s' appears (subshell.c, line
  810)
- the chdir actually works

This is a problem when paths get too long because the message causes a
scroll that destroys the window content.

I include a naive patch (over mc 4.6.1) for this. 

Regards,

Christopher
-------------- next part --------------
diff -u -r mc-4.6.1/src/subshell.c my_mc/src/subshell.c
--- mc-4.6.1/src/subshell.c	2005-06-07 11:19:19.000000000 +0200
+++ my_mc/src/subshell.c	2005-08-23 11:03:23.000000000 +0200
@@ -807,7 +807,17 @@
 
 	if (bPathNotEq && strcmp (current_panel->cwd, ".")) {
 	    char *cwd = strip_password (g_strdup (current_panel->cwd), 1);
-	    fprintf (stderr, _("Warning: Cannot change to %s.\n"), cwd);
+        
+        /* Maybe we have a symlink */
+        char *sym = resolve_symlinks(cwd);
+        int err = 1;
+        if (sym) {
+            if (!strcmp(subshell_cwd, sym))
+                err = 0;
+            g_free(sym);
+        }
+        if (err)
+            fprintf (stderr, _("Warning: Cannot change to %s.\n"), cwd);
 	    g_free (cwd);
 	}
     }
diff -u -r mc-4.6.1/src/util.c my_mc/src/util.c
--- mc-4.6.1/src/util.c	2005-05-27 16:19:18.000000000 +0200
+++ my_mc/src/util.c	2005-08-23 10:45:27.000000000 +0200
@@ -1072,7 +1072,7 @@
     return valcopy;
 }
 
-static char *resolve_symlinks (const char *path)
+char *resolve_symlinks (const char *path)
 {
     char *buf, *buf2, *q, *r, c;
     int len;
diff -u -r mc-4.6.1/src/util.h my_mc/src/util.h
--- mc-4.6.1/src/util.h	2005-01-13 20:20:47.000000000 +0100
+++ my_mc/src/util.h	2005-08-23 10:59:19.000000000 +0200
@@ -133,6 +133,7 @@
 
 /* Pathname canonicalization */
 void canonicalize_pathname (char *);
+char *resolve_symlinks (const char *path);
 
 /* Misc Unix functions */
 char *get_current_wd (char *buffer, int size);


More information about the mc-devel mailing list