[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