noice

small file browser
git clone git://git.2f30.org/noice
Log | Files | Refs | README | LICENSE

commit 6b51ec45854bea03a344e77a2cedff9df062cb78
parent 3459f6a5e79b1cd248185a7562565a851cea57ab
Author: lostd <lostd@2f30.org>
Date:   Wed,  8 Oct 2014 18:30:39 +0300

Use open(2)/fstat(2) and don't bother with links at all

Diffstat:
Mnoice.c | 99+++++++++++++++++++++++--------------------------------------------------------
1 file changed, 29 insertions(+), 70 deletions(-)

diff --git a/noice.c b/noice.c @@ -193,20 +193,6 @@ nextsel(int *cur, int max) } int -testopen(char *path) -{ - int fd; - - fd = open(path, O_RDONLY); - if (fd == -1) { - return 0; - } else { - close(fd); - return 1; - } -} - -int testopendir(char *path) { DIR *dirp; @@ -340,11 +326,11 @@ nochange: } } if (ret == 3) { - char *pathnew, *pathtmp; + char *pathnew; char *name; - u_int8_t type; char *bin; pid_t pid; + int fd; struct stat sb; /* Cannot descend in empty directories */ @@ -352,62 +338,35 @@ nochange: goto nochange; name = dents[cur].d_name; - type = dents[cur].d_type; asprintf(&pathnew, "%s/%s", path, name); DPRINTF_S(name); - DPRINTF_U(type); DPRINTF_S(pathnew); -again: - switch (type) { - case DT_LNK: - /* Resolve link */ - pathtmp = realpath(pathnew, NULL); - if (pathtmp == NULL) { - printwarn(); - free(pathnew); - goto nochange; - } else { - r = stat(pathtmp, &sb); - free(pathtmp); - if (r == -1) { - printwarn(); - free(pathnew); - goto nochange; - } - /* Directory or file */ - if (S_ISDIR(sb.st_mode)) { - type = DT_DIR; - goto again; - } - if (S_ISREG(sb.st_mode)) { - type = DT_REG; - goto again; - } - /* All the rest */ - printmsg("Unsupported file"); - free(pathnew); - goto nochange; - } - case DT_DIR: - /* Change to new path */ - if (testopen(pathnew)) { - free(path); - path = pathnew; - goto out; - } else { - printwarn(); - free(pathnew); - goto nochange; - } - case DT_REG: - if (!testopen(pathnew)) { - printwarn(); - free(pathnew); - goto nochange; - } + /* Get path info */ + fd = open(pathnew, O_RDONLY | O_NONBLOCK); + if (fd == -1) { + printwarn(); + free(pathnew); + goto nochange; + } + r = fstat(fd, &sb); + close(fd); + DPRINTF_U(sb.st_mode); + if (r == -1) { + printwarn(); + free(pathnew); + goto nochange; + } + /* Directory */ + if (S_ISDIR(sb.st_mode)) { + free(path); + path = pathnew; + goto out; + } + /* Regular file */ + if (S_ISREG(sb.st_mode)) { /* Open with */ bin = openwith(name); if (bin == NULL) { @@ -429,11 +388,11 @@ again: free(pathnew); goto redraw; - default: - printmsg("Unsupported file"); - free(pathnew); - goto nochange; } + /* All the rest */ + printmsg("Unsupported file"); + free(pathnew); + goto nochange; } }