[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lost] [PATCH] ! cdi/fs: In Verzeichnissen Dot- und Dotdot-Eintraege anlegen, damit auch taljeth gluecklich ist.



---
 src/modules/cdi/lib/fs/lostio_if.c |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/modules/cdi/lib/fs/lostio_if.c b/src/modules/cdi/lib/fs/lostio_if.c
index f402776..030cded 100644
--- a/src/modules/cdi/lib/fs/lostio_if.c
+++ b/src/modules/cdi/lib/fs/lostio_if.c
@@ -158,6 +158,17 @@ static bool fs_fill_dir(vfstree_node_t* node)
         for (i = 0; (cres = cdi_list_get(children, i)); i++) {
             handle_dirent(cres, node);
         }
+
+        // Dot- und Dotdot-Eintraege erstellen
+        vfstree_create_child(node, ".", LOSTIO_TYPES_DIRECTORY, 0, stream,
+            LOSTIO_FLAG_BROWSABLE);
+        if (node->parent->data) {
+            // Nur wenn es sich nicht um das Root-Verzeichnis handelt wollen wir
+            // einen Dotdot-Eintrag
+            vfstree_create_child(node, "..", LOSTIO_TYPES_DIRECTORY, 0,
+                node->parent->data, LOSTIO_FLAG_BROWSABLE);
+        }
+
     }
 
     return TRUE;
@@ -518,6 +529,12 @@ int lostio_unlink_handler(lostio_filehandle_t* fh, const char* name)
 
     p();
 
+    // Dot- und Dotdot-Eintraege koennen nicht geloescht werden
+    if (!strcmp(name, ".") || !strcmp(name, "..")) {
+        result = -1;
+        goto out;
+    }
+
     // Passender Kindknoten finden
     for (i = 0; (node = list_get_element_at(fh->node->children, i)); i++) {
         if (!strcmp(node->name, name)) {
@@ -533,15 +550,23 @@ found:
 
     // Spezialfall: Es handelt sich um ein Verzeichnis. Das heisst es darf
     // nur geloescht werden wenn es keine Kind-Eintraege mehr hat.
-    if (stream->res->dir && list_size(node->children)) {
+    if (stream->res->dir && (list_size(node->children) > 2)) {
         result = -1;
         goto out;
     }
 
     // Sonst kann die Ressource geloescht werden.
-    if (cdi_remove_res(stream) || !vfstree_delete_child(fh->node, name)) {
+    if (cdi_remove_res(stream)) {
         result = -1;
+        goto out;
+    }
+
+    // Dot- und Dotdot-Eintraege in einem Verzeichnis loeschen
+    if (list_size(node->children)) {
+        vfstree_delete_child(node, ".");
+        vfstree_delete_child(node, "..");
     }
+    vfstree_delete_child(fh->node, name);
 
 out:
     v();
-- 
1.5.6.4