From: Laurent Mazet Date: Sat, 18 Jan 2025 22:20:27 +0000 (+0100) Subject: follow directory symbolic link X-Git-Tag: v1.0~24 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=ffd26037587214a6a3adb8b9de30384c1ff64812;p=fm.git follow directory symbolic link --- diff --git a/display.c b/display.c index 88ef5dd..d4d4d47 100644 --- 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 730ef0e..2c9776f 100644 --- 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 */ diff --git a/function.c b/function.c index e1723f7..5b490e0 100644 --- a/function.c +++ b/function.c @@ -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 41bb2d3..0f8d0b0 100644 --- 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 {