mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 05:41:31 +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;
|
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);
|
||||||
|
|
Loading…
Reference in a new issue