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

[Lost] [Patch] [1/3] Fixes für io_get_absolute_path



Dieser Patch ist der erste von dreien, die LOST endlich ein halbwegs herzeigbares cd verpassen soll. Der Patch vereinigt auf engstem Raum drei Fixes in io_get_absolute_path:

* Servicerelative Pfade haben nicht funktioniert, weil das erste Element nie einen anderen left_sep als NO_SEP haben konnte

* cd .. in floppy:/devices/fd0|fat:/ bedeutet nicht einen Verzeichniswechsel nach floppy:/devices/fd0| - die Pipe als Separator rauszuwerfen geht aber auch nicht, weil sonst absolute nicht mehr von relativen Pfaden unterschieden werden können. Daher jetzt Sonderbehandlung beim Verarbeiten von ..

* Auf oberster Ebene darf kein .. mehr ausgeführt werden. Ein cd .. in floppy:/ hat bisher zu einem PF geführt
Index: lost_path.c
===================================================================
--- lost_path.c	(Revision 602)
+++ lost_path.c	(Arbeitskopie)
@@ -149,8 +149,16 @@
                     break;
 
                 case '/':
-                    element = create_path_element(last_element, cur_size,
-                        left_sep, PATH_SEP);
+                    // Wenn ganz am Anfang ein Schraegstrich steht, soll kein
+                    // leeres Pfadelement erstellt werden, sondern nur der
+                    // linke Separator des folgenden Elements gesetzt werden.
+                    if (cur_size != 0) {
+                        element = create_path_element(last_element, cur_size,
+                            left_sep, PATH_SEP);
+                    } else {
+                        left_sep = PATH_SEP;
+                        last_element = pos + 1;
+                    }
                     break;
 
                 case '|':
@@ -222,11 +230,15 @@
         // Alles andere bleibt gleich
         else {
             // Wenn Dotdot-Elemente da waren, muss das Element geloescht werden
-            // und dotdot dekrementiert
-            if (dotdot != 0) {
+            // und dotdot dekrementiert. Das erste Pfadelement (der Service)
+            // darf dabei nie geloescht werden. Eine Pipe ist nicht das Ziel
+            // von einem .. - in dem Fall muss man noch eins weiter gehen
+            if ((dotdot != 0) && (i < list_size(list) - 1)) {
                 list_remove(list, i);
+                if (element->left_sep != PIPE_SEP) {
+                    dotdot--;
+                }
                 free(element);
-                dotdot--;
             } else {
                 i++;
             }