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