Quellcode durchsuchen

feat: check O_DIRECTORY flag

greatbridf vor 2 Jahren
Ursprung
Commit
183ed5166f
4 geänderte Dateien mit 18 neuen und 10 gelöschten Zeilen
  1. 8 0
      gblibc/include/fcntl.h
  2. 1 1
      gblibc/src/dirent.c
  3. 9 8
      include/kernel/process.hpp
  4. 0 1
      src/kernel/syscall.cpp

+ 8 - 0
gblibc/include/fcntl.h

@@ -3,6 +3,14 @@
 
 #include <stdint.h>
 
+#define O_CREAT (1 << 0)
+#define O_RDONLY (1 << 1)
+#define O_WRONLY (1 << 2)
+#define O_RDWR (1 << 3)
+#define O_DIRECTORY (1 << 4)
+#define O_APPEND (1 << 5)
+#define O_TRUNC (1 << 6)
+
 #ifdef __cplusplus
 extern "C" {
 #endif

+ 1 - 1
gblibc/src/dirent.c

@@ -6,7 +6,7 @@
 DIR* opendir(const char* name)
 {
     // TODO: set flags
-    int fd = open(name, 0);
+    int fd = open(name, O_DIRECTORY);
 
     if (fd < 0)
         return NULL;

+ 9 - 8
include/kernel/process.hpp

@@ -1,5 +1,6 @@
 #pragma once
 
+#include <fcntl.h>
 #include <kernel/errno.h>
 #include <kernel/event/evtqueue.hpp>
 #include <kernel/interrupt.h>
@@ -207,8 +208,8 @@ public:
                 return &iter->value;
         }
 
-        // TODO: file opening flags (permissions etc.)
-        int open(const char* filename, uint32_t)
+        // TODO: file opening permissions check
+        int open(const char* filename, uint32_t flags)
         {
             auto* dentry = fs::vfs_open(filename);
 
@@ -217,12 +218,6 @@ public:
                 return -1;
             }
 
-            // TODO: check whether dentry is a file if O_DIRECTORY is set
-            // if (!(dentry->ind->flags.in.file || dentry->ind->flags.in.special_node)) {
-            //     errno = EISDIR;
-            //     return -1;
-            // }
-
             // TODO: unify file, inode, dentry TYPE
             fs::file::types type = fs::file::types::regular_file;
             if (dentry->ind->flags.in.directory)
@@ -230,6 +225,12 @@ public:
             if (dentry->ind->flags.in.special_node)
                 type = fs::file::types::block_dev;
 
+            // check whether dentry is a file if O_DIRECTORY is set
+            if ((flags & O_DIRECTORY) && type != fs::file::types::directory) {
+                errno = ENOTDIR;
+                return -1;
+            }
+
             auto iter = files->emplace_back(fs::file {
                 type,
                 dentry->ind,

+ 0 - 1
src/kernel/syscall.cpp

@@ -276,7 +276,6 @@ void _syscall_getdents(interrupt_stack* data)
 void _syscall_open(interrupt_stack* data)
 {
     auto* path = (const char*)data->s_regs.edi;
-    // flags are ignored for now
     uint32_t flags = data->s_regs.esi;
     data->s_regs.eax = current_process->files.open(path, flags);
 }