Fix ext2fs bug
diff --git a/qloader2.bin b/qloader2.bin
index f9610435..a20ea0fc 100644
Binary files a/qloader2.bin and b/qloader2.bin differ
diff --git a/src/fs/ext2fs.c b/src/fs/ext2fs.c
index 6d0a1541..a44bbc25 100644
--- a/src/fs/ext2fs.c
+++ b/src/fs/ext2fs.c
@@ -210,7 +210,8 @@ static int ext2fs_parse_dirent(struct ext2fs_dir_entry *dir, struct ext2fs_file_
if (*path == '/')
path++;
- struct ext2fs_inode current_inode = fd->root_inode;
+ struct ext2fs_inode *current_inode = balloc(sizeof(struct ext2fs_inode));
+ *current_inode = fd->root_inode;
bool escape = false;
@@ -225,14 +226,15 @@ next:
else
path++;
- uint64_t offset = current_inode.i_blocks[0] * fd->block_size;
+ uint64_t offset = current_inode->i_blocks[0] * fd->block_size;
- while (offset < current_inode.i_size + offset) {
+ uint64_t stop = current_inode->i_size + offset;
+ while (offset < stop) {
// preliminary read
read_partition(fd->drive, &fd->part, dir, offset, sizeof(struct ext2fs_dir_entry));
// name read
- char* name = balloc(dir->name_len);
+ char *name = balloc(dir->name_len);
read_partition(fd->drive, &fd->part, name, offset + sizeof(struct ext2fs_dir_entry), dir->name_len);
int r = strncmp(token, name, dir->name_len);
@@ -241,10 +243,11 @@ next:
if (!r) {
if (escape) {
+ brewind(sizeof(struct ext2fs_inode));
return 0;
} else {
// update the current inode
- ext2fs_get_inode(¤t_inode, fd->drive, &fd->part, dir->inode, sb);
+ ext2fs_get_inode(current_inode, fd->drive, &fd->part, dir->inode, sb);
goto next;
}
}
@@ -252,6 +255,7 @@ next:
offset += dir->rec_len;
}
+ brewind(sizeof(struct ext2fs_inode));
return -1;
}
@@ -268,7 +272,11 @@ int ext2fs_open(struct ext2fs_file_handle *ret, int drive, int partition, const
ext2fs_get_inode(&ret->root_inode, drive, &ret->part, 2, &sb);
struct ext2fs_dir_entry entry;
- ext2fs_parse_dirent(&entry, ret, &sb, path);
+ int r = ext2fs_parse_dirent(&entry, ret, &sb, path);
+
+ if (r)
+ return r;
+
ext2fs_get_inode(&ret->inode, drive, &ret->part, entry.inode, &sb);
ret->size = ret->inode.i_size;
diff --git a/src/fs/file.c b/src/fs/file.c
index a02ba2b3..38528c15 100644
--- a/src/fs/file.c
+++ b/src/fs/file.c
@@ -38,9 +38,6 @@ int fopen(struct file_handle *ret, int disk, int partition, const char *filename
return 0;
}
- print("fs: Could not determine the file system of disk %u partition %u\n",
- disk, partition);
-
return -1;
}
diff --git a/src/lib/blib.c b/src/lib/blib.c
index 94fe4a1f..47873593 100644
--- a/src/lib/blib.c
+++ b/src/lib/blib.c
@@ -334,5 +334,10 @@ out:
va_end(args);
text_write(print_buf, print_buf_i);
+#ifdef E9_OUTPUT
+ for (size_t i = 0; i < print_buf_i; i++)
+ port_out_b(0xe9, print_buf[i]);
+#endif
+
return;
}
diff --git a/src/lib/config.c b/src/lib/config.c
index 26a33ac9..70068596 100644
--- a/src/lib/config.c
+++ b/src/lib/config.c
@@ -5,7 +5,6 @@
#include <fs/file.h>
#define SEPARATOR '\n'
-#define CONFIG_NAME "qloader2.cfg"
#define MAX_CONFIG_SIZE 4096
static char *config_addr;
@@ -13,8 +12,10 @@ static char *config_addr;
int init_config(int drive, int part) {
struct file_handle f;
- if (fopen(&f, drive, part, CONFIG_NAME)) {
- return -1;
+ if (fopen(&f, drive, part, "/qloader2.cfg")) {
+ if (fopen(&f, drive, part, "/boot/qloader2.cfg")) {
+ return -1;
+ }
}
if (f.size >= MAX_CONFIG_SIZE) {
