follow directory symbolic link
authorLaurent Mazet <mazet@softndesign.org>
Sat, 18 Jan 2025 22:20:27 +0000 (23:20 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 18 Jan 2025 22:57:23 +0000 (23:57 +0100)
display.c
fm.c
function.c
type.h

index 88ef5dd190f1d660aa408d16dd8233727b83956c..d4d4d471a78f924ab335f1c3475f464ed1e5bc06 100644 (file)
--- a/display.c
+++ b/display.c
@@ -248,6 +248,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
                 set_color ((j == index) ? bred : red);
                 break;
             case type_symb_e:
+            case type_ldir_e:
                 set_color ((j == index) ? bcyan : cyan);
                 break;
             case type_reg_e:
@@ -260,6 +261,9 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
             case type_socket_e:
                 set_color ((j == index) ? bred : red);
                 break;
+            case type_erlk_e:
+                set_color ((j == index) ? bred : red);
+                break;
             }
             if (elem->selected) {
                 attron (A_BOLD);
diff --git a/fm.c b/fm.c
index 730ef0e59511696f763561dc746b21ff5d8b81d0..2c9776fe1f0109c482482e61ca5930aea30af594 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -235,9 +235,9 @@ int main (int argc, char *argv[])
         switch (ch) {
         case '\n':
         case '\r':
-            if ((list[panel]->tab + windir[panel]->index)->type == type_dir_e) {
-                elem_t *elem = list[panel]->tab + windir[panel]->index;
-                char *_dirname = newfilename (dirname[panel], elem->name);
+            current = list[panel]->tab + windir[panel]->index;
+            if ((current->type == type_dir_e) || (current->type == type_ldir_e)) {
+                char *_dirname = newfilename (dirname[panel], current->name);
                 free (dirname[panel]);
                 dirname[panel] = _dirname;
                 index_x[panel] = 0;
@@ -506,6 +506,7 @@ int main (int argc, char *argv[])
 
 /* Basic 2 panels view and quit */
 /* test: mkfifo .a && { sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. -v 1 && rm .a */
+/* test: mkdir .b && ln -s .b .a && { sleep 1; echo -e '\tk'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d .. -d /dev -d . -v 1 && rm .a && rmdir .b */
 /* test: { sleep 1; echo -en '\eq'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo; } | fm.exe */
 
 /* Help */
index e1723f73a746c7377a3a7e76d30d225c9f1eb4ca..5b490e0a432b5602b5be8ea156045f2695c8b6f8 100644 (file)
@@ -106,7 +106,6 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
         VERBOSE (ERROR, fprintf (stderr, "can't stat file '%s'\n", name));
         exit (1);
     }
-    free (name);
 
     size_t size = 0;
     if (type == type_reg_e) {
@@ -133,7 +132,18 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
     elem->mode = 0777 & sb.st_mode;
     elem->name = strdup (filename);
     elem->size = size;
+#ifndef WIN32
+    if (type == type_symb_e) {
+        struct stat sb;
+        if (stat (name, &sb) == -1) {
+            type = type_erlk_e;
+        } else if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+            type = type_ldir_e;
+        }
+    }
+#endif
     elem->type = type;
+    free (name);
 
     int width = strlen (filename);
     if (width > list->width) {
@@ -294,6 +304,12 @@ void createstatus (char *status, elem_t *elem)
     case type_socket_e:
         strcat (status, "socket");
         break;
+    case type_ldir_e:
+        strcat (status, "dir.link");
+        break;
+    case type_erlk_e:
+        strcat (status, "error.link");
+        break;
     }
 
     if (elem->uid && *elem->uid) {
diff --git a/type.h b/type.h
index 41bb2d3a581bda37290b1c46d15807ce79279022..0f8d0b06bf40500f38a89ade7625592404d48450 100644 (file)
--- a/type.h
+++ b/type.h
@@ -9,7 +9,9 @@ typedef enum {
     type_pipe_e,
     type_symb_e,
     type_reg_e,
-    type_socket_e
+    type_socket_e,
+    type_ldir_e,
+    type_erlk_e
 } type_t;
 
 typedef struct {