aboutsummaryrefslogtreecommitdiffstats
path: root/noice.c
diff options
context:
space:
mode:
authorsin <sin@2f30.org>2014-10-22 16:50:30 +0100
committersin <sin@2f30.org>2014-10-22 16:50:30 +0100
commit05957936f5a7e452f4b8cda5bf50e92e745c4187 (patch)
tree6b165551dacd346805f90fec99387a267beb385e /noice.c
parentb06a4d4eeb7d95af4f0b0b02a5cfe21b3e9de69d (diff)
downloadnoice-05957936f5a7e452f4b8cda5bf50e92e745c4187.tar.gz
Use fstatat() wherever possible
Diffstat (limited to 'noice.c')
-rw-r--r--noice.c32
1 files changed, 9 insertions, 23 deletions
diff --git a/noice.c b/noice.c
index 48ee105..a0a8f17 100644
--- a/noice.c
+++ b/noice.c
@@ -525,7 +525,6 @@ begin:
for (;;) {
int nlines;
int odd;
- char *pathnew;
char *name;
char *bin;
char *dir;
@@ -605,27 +604,19 @@ nochange:
name = dents[cur].name;
- /* Handle root case */
- if (strcmp(path, "/") == 0)
- asprintf(&pathnew, "/%s", name);
- else
- asprintf(&pathnew, "%s/%s", path, name);
-
DPRINTF_S(name);
- DPRINTF_S(pathnew);
/* Get path info */
- r = stat(pathnew, &sb);
+ r = fstatat(dirfd(dirp), name, &sb, 0);
if (r == -1) {
printwarn();
- free(pathnew);
goto nochange;
}
DPRINTF_U(sb.st_mode);
- /* Directory */
- if (S_ISDIR(sb.st_mode)) {
+ switch (sb.st_mode & S_IFMT) {
+ case S_IFDIR:
free(path);
- path = pathnew;
+ path = xrealpath(name);
free(filter);
filter = xstrdup(ifilter); /* Reset filter */
/* Save history */
@@ -634,26 +625,21 @@ nochange:
SLIST_INSERT_HEAD(&histhead, hist, entry);
cur = 0;
goto out;
- }
- /* Regular file */
- if (S_ISREG(sb.st_mode)) {
+ case S_IFREG:
/* Open with */
bin = openwith(name);
if (bin == NULL) {
printmsg("No association");
- free(pathnew);
goto nochange;
}
exitcurses();
- spawn(bin, pathnew);
+ spawn(bin, name);
initcurses();
- free(pathnew);
goto redraw;
+ default:
+ printmsg("Unsupported file");
+ goto nochange;
}
- /* All the rest */
- printmsg("Unsupported file");
- free(pathnew);
- goto nochange;
case SEL_FLTR:
/* Read filter */
printprompt("filter: ");
Un proyecto texto-plano.xyz