Advanced C Code
webfs/request.c:
h = filename -1 +sprintf(filename,"%s%s%s%s", do_chroot ? "" : doc_root, virtualhosts ? "/" : "", virtualhosts ? req->hostname : "", req->path);
RobotNik kapiert das ueberhaupt nicht. Please help!
Wo ist das Problem?
- sprintf baut einen neuen filename zusammen und gibt die Länge des strings zurück (int). Zu beachten: '\0' wird mitgezählt!.
(Beispiel: filename = "ha\0": sprintf gibt 3 zurück) - filename muss reserviert sein, bevor es an sprintf übergeben wird. Es ist also ein char* mit fester Adresse. h ist wohl auch ein char*.
- Addiert man nun die Adresse von filename (char*) mit der Länge von filename (int), nachdem dieser von sprintf gefüllt wurde, zieht 1 ab, so erhält man den String h. Dieser ist ein Pointer auf das Ende des Strings filename. Er zeigt genau auf den Terminator ('\0') von filename. (Beispiel: filename zeigt auf den String "ha\0" und hat die Adresse 2. Dann: h = 2(filename) -1 + 3(länge von filename,sprintf) = 4 = '\0' (oder filename[2])
Wozu man h nun brauch, weiss ich auch nicht. Es gibt schliesslich strcat. Hoffe man kann das jetzt verstehen. Glaube irgendwie, dass es noch ziemlich verwirrend ist. --MichaelRKoellejan
In einer lesbaren Sprache:
filename = if not do_chroot: filename += doc_root if virtualhosts: filename += '/' + req.hostname filename += req.path # naja, nicht wirklich vergleichbar: h = filename[-1]
--DoobeeRTzeck
ARGH! Ja, es ist absolut klar. Wer lesen kann ist klar im Vorteil. Ich habe seltsamerweise gestern in der .{0,2}printf manpage gelesen, dass sprintf() ein char * liefert. *Was* es machte war mir klar, gdb ist mein Freund :) --RobotNik