:: commit 8be6ea8a3d57aba87ddb91a9f29d68891099bcec

mintsuki <mintsuki@protonmail.com> — 2020-04-23 20:23

parents: 2fc3b21295

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(&current_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) {
tab: 248 wrap: offon