[syslinux] [PATCH] Fix COM32 fstat() and core open_file()

Gene Cumm gene.cumm at gmail.com
Wed Jun 23 21:02:41 PDT 2010


From: Gene Cumm <gene.cumm at gmail.com>

Fix COM32 fstat() and core open_file();  This allows open() to open
directories and fstat() to recognize directories.  It also extends
com32_filedata to include d_type.

Signed-off-by: Gene Cumm <gene.cumm at gmail.com>

---

diff --git a/com32/include/syslinux/pmapi.h b/com32/include/syslinux/pmapi.h
index f583dea..4bc141f 100644
--- a/com32/include/syslinux/pmapi.h
+++ b/com32/include/syslinux/pmapi.h
@@ -49,6 +49,7 @@ struct com32_filedata {
     size_t size;		/* File size */
     int blocklg2;		/* log2(block size) */
     uint16_t handle;		/* File handle */
+    unsigned char d_type;
 };

 struct com32_pmapi {
diff --git a/com32/lib/sys/fstat.c b/com32/lib/sys/fstat.c
index 0ce8cad..0d62d71 100644
--- a/com32/lib/sys/fstat.c
+++ b/com32/lib/sys/fstat.c
@@ -32,12 +32,14 @@
  */

 #include <sys/stat.h>
+#include <dirent.h>
 #include <errno.h>
 #include "file.h"

 int fstat(int fd, struct stat *buf)
 {
     struct file_info *fp = &__file_info[fd];
+    unsigned char d_type;

     if (fd >= NFILES || !fp->iop) {
 	errno = EBADF;
@@ -51,8 +53,18 @@ int fstat(int fd, struct stat *buf)
 	    buf->st_mode = S_IFSOCK | 0444;
 	    buf->st_size = 0;
 	} else {
-	    buf->st_mode = S_IFREG | 0444;
 	    buf->st_size = fp->i.fd.size;
+	    d_type = fp->i.fd.d_type;
+	    switch (d_type) {
+	    case DT_DIR:
+		buf->st_mode = S_IFDIR | 0555;
+		break;
+	    case DT_REG:
+		buf->st_mode = S_IFREG | 0444;
+		break;
+	    default:
+		buf->st_mode = 0;	/* Unknown; no access */
+	    }
 	}
     } else {
 	buf->st_mode = S_IFCHR | 0666;
diff --git a/core/fs/fs.c b/core/fs/fs.c
index c16f955..61b760c 100644
--- a/core/fs/fs.c
+++ b/core/fs/fs.c
@@ -330,20 +330,13 @@ int open_file(const char *name, struct
com32_filedata *filedata)
     mangle_name(mangled_name, name);
     rv = searchdir(mangled_name);

-    if (rv < 0)
-	return rv;
-
-    file = handle_to_file(rv);
-
-    if (file->inode->mode != DT_REG) {
-	_close_file(file);
-	return -1;
+    if (rv >= 0) {
+	file = handle_to_file(rv);
+	filedata->size		= file->inode->size;
+	filedata->blocklg2	= SECTOR_SHIFT(file->fs);
+	filedata->handle	= rv;
+	filedata->d_type	= (unsigned char) file->inode->mode;
     }
-
-    filedata->size	= file->inode->size;
-    filedata->blocklg2	= SECTOR_SHIFT(file->fs);
-    filedata->handle	= rv;
-
     return rv;
 }




More information about the Syslinux mailing list