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)
{
}
}
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 */
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) {
free(pathnew);
goto redraw;
- default:
- printmsg("Unsupported file");
- free(pathnew);
- goto nochange;
}
+ /* All the rest */
+ printmsg("Unsupported file");
+ free(pathnew);
+ goto nochange;
}
}