[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++;
}