[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [Patch] LostIO - io_split_dirname
Kevin Wolf wrote:
> Toni Kaufmann schrieb:
>
>> Dieser Patch ergänzt unsere Pfadfunktionen um eine Funktion, die das
>> letzte Glied vom Pfad abtrennt und nur den Anfang zurückgibt.
>>
>
> Ist es Absicht, daß du keine relativen Pfade auflöst und nicht
> ./..-bereinigst? Das hätte ich in so einer Funktion schon erwartet.
>
>
Okay okay, hier die korrigierte Variante. ;-)
>> + size_t size = calc_path_length(element_stack);
>> + if ((result = malloc(size + 1))) {
>> + // Wenn das geklappt hat, wird der Pfad jetzt wieder in einen String
>> + // umgewandelt
>> + create_path_string(element_stack, result, TRUE);
>> + } else {
>> + // Falls ein Fehler beim anlegen des Puffers aufgetreten ist, wurden
>> + // die Elemente nich freigegeben. Dann geschieht das jetzt manuell.
>> + struct path_element* element;
>> + while ((element = list_pop(element_stack))) {
>> + free(element);
>> + }
>> + }
>>
>
> Diese Überprüfung und den else-Zweig gibt es in io_get_absolute_path()
> nicht. Eins von beidem ist also falsch, vermutlich die ältere Funktion.
> Kommt dazu noch ein Patch?
>
Ja, werde ich mir gleich genauer anschauen.
Index: lib/lost_path.c
===================================================================
--- lib/lost_path.c (Revision 610)
+++ lib/lost_path.c (Arbeitskopie)
@@ -499,3 +499,29 @@
return NULL;
}
}
+
+/**
+ * Trennt aus einem Pfad den Pfad zum Verzeichnis ab, in dem das oberste
+ * Element liegt. (d.h. das letzte Pfadelement wird abgeschnitten) und wandelt
+ * ihn gegebenenfalls in einen absoluten Pfad um.
+ * Es wird keine Ueberpruefung vorgenommen, ob die Datei existiert.
+ *
+ * @param path Zu splittender Pfad
+ *
+ * @return Pfad zur angegebenen Datei
+ */
+char* io_split_dirname(const char* path)
+{
+ // An den Pfad wird einfach /.. angehaengt, dafuer wird jetzt ein Puffer
+ // erstellt
+ size_t path_len = strlen(path);
+ char new_path[path_len + 4];
+
+ // Zuerst den Pfad, danach das /.. reinkopieren
+ memcpy(new_path, path, path_len);
+ memcpy(new_path + path_len, "/..", 4);
+
+ // Jetzt wird der relative Pfad bereinigt
+ return io_get_absolute_path(new_path);
+}
+