mirror of
https://github.com/jarun/nnn.git
synced 2024-11-24 11:51:27 +00:00
Use open(2)/fstat(2) and don't bother with links at all
This commit is contained in:
parent
3459f6a5e7
commit
6b51ec4585
69
noice.c
69
noice.c
|
@ -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) {
|
||||
/* Get path info */
|
||||
fd = open(pathnew, O_RDONLY | O_NONBLOCK);
|
||||
if (fd == -1) {
|
||||
printwarn();
|
||||
free(pathnew);
|
||||
goto nochange;
|
||||
} else {
|
||||
r = stat(pathtmp, &sb);
|
||||
free(pathtmp);
|
||||
}
|
||||
r = fstat(fd, &sb);
|
||||
close(fd);
|
||||
DPRINTF_U(sb.st_mode);
|
||||
if (r == -1) {
|
||||
printwarn();
|
||||
free(pathnew);
|
||||
goto nochange;
|
||||
}
|
||||
/* Directory or file */
|
||||
/* Directory */
|
||||
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;
|
||||
}
|
||||
/* Regular file */
|
||||
if (S_ISREG(sb.st_mode)) {
|
||||
/* Open with */
|
||||
bin = openwith(name);
|
||||
if (bin == NULL) {
|
||||
|
@ -429,13 +388,13 @@ again:
|
|||
|
||||
free(pathnew);
|
||||
goto redraw;
|
||||
default:
|
||||
}
|
||||
/* All the rest */
|
||||
printmsg("Unsupported file");
|
||||
free(pathnew);
|
||||
goto nochange;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
free(dents);
|
||||
|
|
Loading…
Reference in a new issue