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

[tyndur-devel] [PATCH 2/3] libc: io_split_filename() mit nicht-kanonischen Pfaden



! libc: io_split_filename() kommt jetzt auch mit Pfaden zurecht, die
  mehrfache Schrägstriche, überflüssige Schrägstriche am Ende, ./ und
  ../ enthalten.

  Das bedeutet unter anderem, dass 'cp -r apps/ tmp/' jetzt korrekt ein
  neues Verzeichnis tmp/apps/ anlegt und rekursiv dorthin kopiert
  (vorher wurde ein leerer Dateiname als Quelle erkannt, und deswegen
  alles direkt nach tmp/ kopiert)

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/lib/lost_path.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/modules/lib/lost_path.c b/src/modules/lib/lost_path.c
index 10f052f..5272f87 100644
--- a/src/modules/lib/lost_path.c
+++ b/src/modules/lib/lost_path.c
@@ -475,8 +475,18 @@ char* io_split_filename(const char* path)
     list_t* element_stack = list_create();
     get_path_elements(path, element_stack, 0);
     
-    // Das letzte Element des Pfads (erstes in der Liste) herausgreifen
+    // Dot und Dotdot Elemente eliminieren
+    eliminate_dot_elements(element_stack);
+
+    // Das letzte nichleere Element des Pfads (erstes in der Liste)
+    // herausgreifen
     element = list_get_element_at(element_stack, 0);
+    while (element && !*element->text && element->left_sep == PATH_SEP) {
+        element = list_pop(element_stack);
+        free(element);
+        element = list_get_element_at(element_stack, 0);
+    }
+
     if (element != NULL) {
         char* result;
         size_t length;
@@ -497,7 +507,7 @@ char* io_split_filename(const char* path)
         return result;
     } else {
         list_destroy(element_stack);
-        return NULL;
+        return strdup("");
     }
 }
 
-- 
1.7.7