aboutsummaryrefslogtreecommitdiffstats
path: root/noice.c
diff options
context:
space:
mode:
authorlostd <lostd@2f30.org>2014-10-08 10:52:44 +0300
committerlostd <lostd@2f30.org>2014-10-08 10:52:44 +0300
commit0deba427a92c654253d66cf84ba88f56ccd7b589 (patch)
tree72dc2562db0b4c3b947c706f3cea446d983f87f7 /noice.c
parentc5e5a19d0f3a8a2180f924beedcbb272073de218 (diff)
downloadnoice-0deba427a92c654253d66cf84ba88f56ccd7b589.tar.gz
Support symbolic links and fix message reporting
Diffstat (limited to 'noice.c')
-rw-r--r--noice.c74
1 files changed, 56 insertions, 18 deletions
diff --git a/noice.c b/noice.c
index 90680d1..4289300 100644
--- 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;
}
}
}
Un proyecto texto-plano.xyz