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

This commit is contained in:
lostd 2014-10-08 18:30:39 +03:00
parent 3459f6a5e7
commit 6b51ec4585

69
noice.c
View file

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