Hallo,
Ich habe beim unten angegebenem Link nur eine Version in Perl gefunden?
Unter "Versionen" haettest du einen Link auf
gefunden ;-)
Huppsala!
Tja, mit Brille wär das nicht passiert ;-)
Dankeschön
Na, dann schau ich mal.
Zeile 0: bitte noch ein #include <unistd.h> einbauen (für getpid(), unlink() und close())
Zeile 42 [ sic! ;-) ] : Bitte englische Orthographie beachten, macht einen besseren Eindruck.
Sieht aber auf jeden Fall lustig aus ;-)
(Zeile 44 ff: der alte Macteiler ist IMHO ':', wenn's gebraucht werden sollte)
Zeilen 86, 89 und Funktionen: Bitte alle globalen Variablen vermeiden. Auch hier.Auch die Funktionen selber!
Zeile 102: Der Name 'log(const char *format, ...)' der Funktion beißt sich mit log(double) aus der math.h. Würde ich zu vermeiden suchen.
Zeile 204: mkdir() kann auch in die Hose gehen, fehlt Überprüfung.
Zeile 233: getpid() gibt pid_t zurück, das muß nicht zwingend ein int sein.
Lieber so:
rd = sprintf(buff, "%d", (int)(getpid()));
Zeile 234: malloc() ohne Überprüfung? Ganz böse Falle, aber wirklich _ganz_ böse!
Zeile 235,236: fehlt beide Male die Überprüfung und weder strcpy() noch strcat() sind eigentlich zu empfehlen. Geht aber hier.
Zeile 253: Überprüfung von fclose() fehlt.
Zeile 271: Memory Leak! gz ist noch nicht freigegeben vor dem return!
Zeile 281: bitte size_t und int nicht mischen. size_t kann durchaus ein long int sein.
(folgt noch einiges Ignorieren der Rückgaben der Funktionen, keine Lust mehr zum Listen ;-)
Zeile 294: siehe 271
(folgt noch einiges Ignorieren der Rückgaben der Funktionen, keine Lust mehr zum Listen ;-)
Zeile 315: siehe 271, 294
Zeile 343: sowas geht nicht gut. Hau lieber noch ein paar Klammern drumherum.
if ((gzip = strstr(gzip, "gzip"))) {
Zeile 348: *gzip != 0 passt nicht. Die Stelle auf die der Pointer zeigt ist Type char, 0 ist Type int.
Zeile 390, 403: getenv("PATH_INFO") kann NULL zurückgeben, das kollidiert dann mit Deiner log() Funktion.
Zeile 443, 450, 458, 525, 532, 540: tptr kann NULL sein, verträgt sich mit strftime() nicht.
Zeile 563: fwrite() will als drittes Argument ein size_t, rd ist aber int.
Zeile 585: malloc() nicht überprüft!
Zeile 597: Typen passen nicht rlen = strlen(CACHE_PATH) rlen ist int, strlen() gibt size_t zurück.
Zeile 599: close() will als erstes Argument ein int, bekommt aber eine FILE*
Beschwert sich übrigens auch der GCC drüber!
Aber hast Du wahrscheinlich nicht verstanden, oder?
Gut, zugegeben ist ein wenig kryptisch die Meldung ;-)
gzip_cncc.c:599: warning: passing arg 1 of `close' makes integer from pointer without a cast
Wolltest Du evt fclose()? Hast zumindest fopen() genommen.
Typo?
Zeile 601: unpassender Vergleich *CACHE_PATH == 0, *CACHE_PATH ist char, 0 ist int.
Zeile 632: may_gzip() ist weder bool noch int.
Zeile 636: malloc() nicht überprüft!
Nach Reparatur von 343 und 599 hat gcc -Wall -pedantic -ansi gzip\_cncc.c -lz
gar keine Beschwerden mehr.
Nur die malloc() Angelegenheiten sollten unbedingt repariert werden. Den Rest kannst Du auch erstmal lassen.
Ich habe hier zu Hause kein CGI eingerichtet, deshalb kann ich das nicht ausprobieren. Sonst hätte ich Dir einfach einen Patch geschickt.
So faul bin ich ja auch wieder nicht ;-)
so short
Christoph Zurnieden