]> Sergey Matveev's repositories - nnn.git/commitdiff
Place symlinks to dirs along with dirs
authorArun Prakash Jana <engineerarun@gmail.com>
Tue, 29 Jan 2019 15:52:28 +0000 (21:22 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Tue, 29 Jan 2019 15:52:28 +0000 (21:22 +0530)
src/nnn.c

index cbe40fd68f0351472c6cd16e7d71313ee273bd22..2b8eafcbbed42de31ead3a89a53b109221b32f85 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -182,7 +182,7 @@ disabledbg()
 #define DESCRIPTOR_LEN 32
 #define _ALIGNMENT 0x10 /* 16-byte alignment */
 #define _ALIGNMENT_MASK 0xF
-#define SYMLINK_TO_DIR 0x1
+#define DIR_OR_LINK_TO_DIR 0x1
 #define HOME_LEN_MAX 64
 #define CTX_MAX 4
 #define DOT_FILTER_LEN 7
@@ -1199,12 +1199,12 @@ static int entrycmp(const void *va, const void *vb)
        pa = (pEntry)va;
        pb = (pEntry)vb;
 
-       /* Sort directories first */
-       if (S_ISDIR(pb->mode) && !S_ISDIR(pa->mode))
-               return 1;
+       if ((pb->flags & DIR_OR_LINK_TO_DIR) != (pa->flags & DIR_OR_LINK_TO_DIR)) {
+               if (pb->flags & DIR_OR_LINK_TO_DIR)
+                       return 1;
 
-       if (S_ISDIR(pa->mode) && !S_ISDIR(pb->mode))
                return -1;
+       }
 
        /* Do the actual sorting */
        if (cfg.mtimeorder)
@@ -1897,7 +1897,7 @@ static void printent_long(struct entry *ent, int sel, uint namecols)
                        printw(" %-16.16s        /  %s/\n", buf, pname);
                break;
        case S_IFLNK:
-               if (ent->flags & SYMLINK_TO_DIR)
+               if (ent->flags & DIR_OR_LINK_TO_DIR)
                        printw(" %-16.16s       @/  %s@\n", buf, pname);
                else
                        printw(" %-16.16s        @  %s@\n", buf, pname);
@@ -2516,14 +2516,19 @@ static int dentfill(char *path, struct entry **dents)
                        }
                }
 
-               /* Flag if this is a symlink to a dir */
-               if (S_ISLNK(sb.st_mode))
+               /* Flag if this is a dir or symlink to a dir */
+               if (S_ISDIR(sb.st_mode))
+                       dentp->flags |= DIR_OR_LINK_TO_DIR;
+               else if (!S_ISLNK(sb.st_mode))
+                       dentp->flags &= ~DIR_OR_LINK_TO_DIR;
+               else {
                        if (!fstatat(fd, namep, &sb, 0)) {
                                if (S_ISDIR(sb.st_mode))
-                                       dentp->flags |= SYMLINK_TO_DIR;
+                                       dentp->flags |= DIR_OR_LINK_TO_DIR;
                                else
-                                       dentp->flags &= ~SYMLINK_TO_DIR;
+                                       dentp->flags &= ~DIR_OR_LINK_TO_DIR;
                        }
+               }
 
                ++n;
        }