noice

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

commit 0deba427a92c654253d66cf84ba88f56ccd7b589
parent c5e5a19d0f3a8a2180f924beedcbb272073de218
Author: lostd <lostd@2f30.org>
Date:   Wed,  8 Oct 2014 10:52:44 +0300

Support symbolic links and fix message reporting

Diffstat:
Mnoice.c | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 56 insertions(+), 18 deletions(-)

diff --git a/noice.c b/noice.c @@ -1,3 +1,4 @@ +#include <sys/stat.h> #include <sys/types.h> #include <errno.h> @@ -337,37 +338,73 @@ nochange: } } if (ret == 3) { - char *name, *file = NULL; - char *newpath; + char *pathnew, *pathtmp; + char *name; + u_int8_t type; char *bin; pid_t pid; + struct stat sb; /* Cannot descend in empty directories */ if (n == 0) goto nochange; name = dents[cur]->d_name; - - switch (dents[cur]->d_type) { + type = dents[cur]->d_type; + + pathnew = malloc(strlen(path) + 1 + + strlen(name) + 1); + sprintf(pathnew, "%s/%s", path, name); + 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: - newpath = malloc(strlen(path) + 1 - + strlen(name) + 1); - sprintf(newpath, "%s/%s", path, name); - if (testopen(newpath)) { + /* Change to new path */ + if (testopen(pathnew)) { free(path); - path = newpath; + path = pathnew; goto out; } else { printwarn(); - free(newpath); + free(pathnew); goto nochange; } case DT_REG: - file = malloc(strlen(path) + 1 - + strlen(name) + 1); - sprintf(file, "%s/%s", path, name); - DPRINTF_S(file); - + if (!testopen(pathnew)) { + printwarn(); + free(pathnew); + goto nochange; + } /* Open with */ bin = openwith(name); if (bin == NULL) { @@ -380,17 +417,18 @@ nochange: /* Run program */ pid = fork(); if (pid == 0) - execlp(bin, bin, file, NULL); + execlp(bin, bin, pathnew, NULL); else waitpid(pid, NULL, 0); initcurses(); - free(file); - + free(pathnew); goto redraw; default: DPRINTF_D(dents[cur]->d_type); + printmsg("Unsupported file"); + goto nochange; } } }