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
1 changed files with 29 additions and 70 deletions

99
noice.c
View File

@ -192,20 +192,6 @@ nextsel(int *cur, int max)
return 0;
}
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)
{
@ -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;
}
}