]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Encore un peu de réflexion sur l'API des fichiers
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Thu, 21 Dec 2023 03:25:45 +0000 (04:25 +0100)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Thu, 21 Dec 2023 03:25:45 +0000 (04:25 +0100)
doc.txt
kernel/src/ring3.cpp

diff --git a/doc.txt b/doc.txt
index 5bfd000ae5370a956ff6dcf6d01b39b3e42843e9..59ef402450f53ee5a3d2962137ff0846deb8c74e 100644 (file)
--- a/doc.txt
+++ b/doc.txt
@@ -37,6 +37,14 @@ avec un slash après le nom des répertoires, et un retour à la ligne après ch
 Quand un fichier est ouvert, un descripteur lui est assigné.
 Ce descripteur stocke un indice qui correspond à la position courante dans le fichier.
 
+// Note à moi même:
+// Contextes de permissions: peut modifier /proc uniquement pour son contexte et ses contextes enfants
+
+---------------------------
+
+Systèmes de fichiers noyaux:
+'s' (serial): Un système de fichiers composé d'un seul fichier, /serial, ouvrable en lecture et en écriture, qui correspond au port série de l'ordinateur.
+
 ---------------------------
 
 Types de données:
@@ -54,17 +62,28 @@ Si l'appel réussi, %rax contient le résultat (≥ 0). Sinon, %rax contient -1.
 Tous les registres sont préservés, sauf %rcx, %r11 et (évidemment) %rax.
 
 enum open_options {
-       MODE_READ = 0x1
-       MODE_WRITE = 0x2
-       MODE_DIRECTORY = 0x4
-       OPTION_INPLACE = 0x8
+       MODE_READ = 0x1,
+       MODE_WRITE = 0x2,
+       MODE_DIRECTORY = 0x4,
+       OPTION_INPLACE = 0x8,
+};
+
+enum mount_type {
+       MOUNT_REPLACE = 0,
+       MOUNT_BEFORE = 1,
+       MOUNT_AFTER = 2,
 };
 
-ssize_t mount_kernel_device(fd_t wd, char device, char const path[path_len], ssize_t path_len);
+ssize_t mount_kernel_device(fd_t wd, char device, char const path[path_len], ssize_t path_len, mount_type mount_type);
        %rax = 0
        Essaye de monter le système de fichiers noyau au chemin path.
-       Désormais, "<wd>/<path>" ne se réfère plus a son hypothétique ancien fichier, mais à la racine du système de fichiers monté.
-       Retourne -1 si wd n'existe pas et que le chemin est relatif, ou si device n'existe pas.
+       "<wd>/<path>" doit se référer à un répertoire.
+       Si mount_type est MOUNT_REPLACE, "<wd>/<path>" ne se réfère plus a son ancien répertoire, mais à la racine du système de fichiers monté.
+       Si mount_type est MOUNT_BEFORE, "<wd>/<path>/fic" cherche d'abord le fichier dans le système de fichiers monté, et dans le répertoire pré-existant s'il n'est pas trouvé.
+               Il est désormais impossible de créer un fichier dans <wd>/<path>.
+       Si mount_type est MOUNT_AFTER, "<wd>/<path>/fic" cherche d'abord le fichier dans le répertoire pré-existant, et dans le système de fichiers monté s'il n'est pas trouvé.
+               Il est désormais impossible de créer un fichier dans <wd>/<path>.
+       Retourne -1 si <wd>/<path> (ou <path> si absolu) n'existe pas et que le chemin est relatif, ou si device n'existe pas.
                Alors l'arbre de fichiers du processus n'est pas modifié.
        Sinon, retourne 0.
                Alors l'arbre de fichiers du processus est modifié comme spécifié.
index 2c458a8722faffd1e11f2a6bb1a9c2048cb8f4fe..0073e07c512d6d94bd8d98299ffc8c6369f1295f 100644 (file)
@@ -49,8 +49,8 @@ void schedule_next_process() {
        os::paging::load_pml4t(os::processes.get(os::current_pid).PML4T);
 }
 
-// extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t wd, char device, char const* path, std::int64_t path_len) {
-extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t, char, char const*, std::int64_t) {
+// extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t wd, char device, char const* path, std::int64_t path_len, int mount_type) {
+extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t, char, char const*, std::int64_t, int) {
        os::assert(false, "mount_kernel_device not implemented yet.");
        __builtin_unreachable();
 }