]> Sergey Matveev's repositories - nnn.git/commitdiff
Fix mode check
authorArun Prakash Jana <engineerarun@gmail.com>
Mon, 21 Jan 2019 14:07:00 +0000 (19:37 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Mon, 21 Jan 2019 14:07:00 +0000 (19:37 +0530)
README.md
src/nnn.c

index 6f7f8e18e54bad7725ec5763a3f67f8880a49a99..672a0f59a67fb91cd15e81c3e99cd6813bc5761b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -343,6 +343,7 @@ The following indicators are used in the detail view:
 | `@/` | Symbolic Link to directory |
 | `b` | Block Device |
 | `c` | Character Device |
+| `?` | Unknown |
 
 #### Utility dependencies
 
index cad01743572ee6fb6841cbcbc429f1a9f111502b..8ae25c80a0a04b81eeffecf59959bdca4440d739 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -1775,16 +1775,30 @@ static char *get_file_sym(mode_t mode)
 {
        static char ind[2] = "\0\0";
 
-       if (S_ISDIR(mode))
+       switch (mode & S_IFMT) {
+       case S_IFREG:
+               if (mode & 0100)
+                       ind[0] = '*';
+               break;
+       case S_IFDIR:
                ind[0] = '/';
-       else if (S_ISLNK(mode))
+               break;
+       case S_IFLNK:
                ind[0] = '@';
-       else if (S_ISSOCK(mode))
+               break;
+       case S_IFSOCK:
                ind[0] = '=';
-       else if (S_ISFIFO(mode))
+               break;
+       case S_IFIFO:
                ind[0] = '|';
-       else if (mode & 0100)
-               ind[0] = '*';
+               break;
+       case S_IFBLK: // fallthrough
+       case S_IFCHR:
+               break;
+       default:
+               ind[0] = '?';
+               break;
+       }
 
        return ind;
 }
@@ -1814,31 +1828,44 @@ static void printent_long(struct entry *ent, int sel, uint namecols)
        if (sel)
                attron(A_REVERSE);
 
-       if (S_ISDIR(ent->mode)) {
+       switch (ent->mode & S_IFMT) {
+       case S_IFREG:
+               if (ent->mode & 0100)
+                       printw(" %-16.16s %8.8s* %s*\n", buf,
+                              coolsize(cfg.blkorder ? ent->blocks << BLK_SHIFT : ent->size), pname);
+               else
+                       printw(" %-16.16s %8.8s  %s\n", buf,
+                              coolsize(cfg.blkorder ? ent->blocks << BLK_SHIFT : ent->size), pname);
+               break;
+       case S_IFDIR:
                if (cfg.blkorder)
                        printw(" %-16.16s %8.8s/ %s/\n",
                               buf, coolsize(ent->blocks << BLK_SHIFT), pname);
                else
                        printw(" %-16.16s        /  %s/\n", buf, pname);
-       } else if (S_ISLNK(ent->mode)) {
+               break;
+       case S_IFLNK:
                if (ent->flags & SYMLINK_TO_DIR)
                        printw(" %-16.16s       @/  %s@\n", buf, pname);
                else
                        printw(" %-16.16s        @  %s@\n", buf, pname);
-       } else if (S_ISSOCK(ent->mode))
+               break;
+       case S_IFSOCK:
                printw(" %-16.16s        =  %s=\n", buf, pname);
-       else if (S_ISFIFO(ent->mode))
+               break;
+       case S_IFIFO:
                printw(" %-16.16s        |  %s|\n", buf, pname);
-       else if (S_ISBLK(ent->mode))
+               break;
+       case S_IFBLK:
                printw(" %-16.16s        b  %s\n", buf, pname);
-       else if (S_ISCHR(ent->mode))
+               break;
+       case S_IFCHR:
                printw(" %-16.16s        c  %s\n", buf, pname);
-       else if (ent->mode & 0100) {
-               printw(" %-16.16s %8.8s* %s*\n", buf,
-                      coolsize(cfg.blkorder ? ent->blocks << BLK_SHIFT : ent->size), pname);
-       } else {
-               printw(" %-16.16s %8.8s  %s\n", buf,
+               break;
+       default:
+               printw(" %-16.16s %8.8s? %s?\n", buf,
                       coolsize(cfg.blkorder ? ent->blocks << BLK_SHIFT : ent->size), pname);
+               break;
        }
 
        if (sel)
@@ -1851,46 +1878,43 @@ static char get_fileind(mode_t mode, char *desc)
 {
        static char c;
 
-       if (S_ISREG(mode)) {
+       switch (mode & S_IFMT) {
+       case S_IFREG:
                c = '-';
                xstrlcpy(desc, "regular file", DESCRIPTOR_LEN);
                if (mode & 0100)
                        /* Length of string "regular file" is 12 */
                        xstrlcpy(desc + 12, ", executable", DESCRIPTOR_LEN - 12);
-       } else if (S_ISDIR(mode)) {
+               break;
+       case S_IFDIR:
                c = 'd';
                xstrlcpy(desc, "directory", DESCRIPTOR_LEN);
-       } else if (S_ISBLK(mode)) {
-               c = 'b';
-               xstrlcpy(desc, "block special device", DESCRIPTOR_LEN);
-       } else if (S_ISCHR(mode)) {
-               c = 'c';
-               xstrlcpy(desc, "character special device", DESCRIPTOR_LEN);
-#ifdef S_ISFIFO
-       } else if (S_ISFIFO(mode)) {
-               c = 'p';
-               xstrlcpy(desc, "FIFO", DESCRIPTOR_LEN);
-#endif  /* S_ISFIFO */
-#ifdef S_ISLNK
-       } else if (S_ISLNK(mode)) {
+               break;
+       case S_IFLNK:
                c = 'l';
                xstrlcpy(desc, "symbolic link", DESCRIPTOR_LEN);
-#endif  /* S_ISLNK */
-#ifdef S_ISSOCK
-       } else if (S_ISSOCK(mode)) {
+               break;
+       case S_IFSOCK:
                c = 's';
                xstrlcpy(desc, "socket", DESCRIPTOR_LEN);
-#endif  /* S_ISSOCK */
-#ifdef S_ISDOOR
-    /* Solaris 2.6, etc. */
-       } else if (S_ISDOOR(mode)) {
-               c = 'D';
-               desc[0] = '\0';
-#endif  /* S_ISDOOR */
-       } else {
+               break;
+       case S_IFIFO:
+               c = 'p';
+               xstrlcpy(desc, "FIFO", DESCRIPTOR_LEN);
+               break;
+       case S_IFBLK:
+               c = 'b';
+               xstrlcpy(desc, "block special device", DESCRIPTOR_LEN);
+               break;
+       case S_IFCHR:
+               c = 'c';
+               xstrlcpy(desc, "character special device", DESCRIPTOR_LEN);
+               break;
+       default:
                /* Unknown type -- possibly a regular file? */
                c = '?';
                desc[0] = '\0';
+               break;
        }
 
        return c;