Sven Wagener: Übergabe der Umgebungsvariablen in C Funktioniert nicht

Hallo Forumler!

Ich habe eine EXE Datei geschrieben, welche die Funktion einer CGI haben soll. Diese erzeugt ein Antwortdokument. Ich kann die Umgebungsvariablen, die mit GET übermittelt wurden nicht in eine andere Variable einfügen, da ich immer eine Fehlermeldung wegen des Speichers erhalte. Kann mir jemand da helfen?
Hier das Programm:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char name[15], vorname[15], email[35], homepage[60], kommentar[500], send[30];
char content[1000];
char var[500];
char* string;

int z1,z3; //Zaehlervariablen  

int translate();  
int ausgabe();  

int main()
{
string = getenv("QUERY_STRING"); // Mit dieser Übergabe habe ich Speicherprobleme
// strcpy(string, getenv("QUERY_STRING")); // Daten aus den Umgebungsvariablen werden gelesen
content[0]='\0';

strcpy(content,string); //Konvertierung von Zeiger Char auf Char  
  
translate();  
strcpy(name,var);  
translate();  
strcpy(vorname,var);  
translate();  
strcpy(email,var);  
translate();  
strcpy(homepage,var);  
translate();  
strcpy(kommentar,var);  
translate();  
strcpy(send,var);  

  
ausgabe();  

return 0;    

}

int translate()
{
z1 = 0;
z3 = 0;
var[0] = '\0';
while ( content[z1] != 0 )
{
  while ( content[z1] != '=' )
  {
   z1++;
  }
  while ( content[z1] != '&' )
  {
   var[z3] = content [z1];
   z3++;
   z1++;
  }
  z3 = 0;
}
return 0;
}

int ausgabe()
{
printf("<html><head><title>Temporärest Gaestebuch</title></head>");
printf("<body>");
printf("%s\n",name);
printf("%s\n",vorname);
printf("%s\n",email);
printf("%s\n",homepage);
printf("%s\n",kommentar);
printf("</body></html>");
return 0;
}

  1. Hallo Sven!

    Ich habe eine EXE Datei geschrieben, welche die Funktion einer CGI haben soll. Diese erzeugt ein Antwortdokument. Ich kann die Umgebungsvariablen, die mit GET übermittelt wurden nicht in eine andere Variable einfügen, da ich immer eine Fehlermeldung wegen des Speichers erhalte. Kann mir jemand da helfen?

    Nur unter einer Bedingung: Du sagst uns, wie die Fehlermeldung lautet und von wem sie erzeugt wird (Compiler? Betriebssystem?). Das Hellsehen faellt mir heute ziemlich schwer, weil ich gestern zuviel getrunken habe.

    Einstweilen helfen Dir hoffentlich folgende Anmerkungen an Deinem Code.

    Bye, Calocybe

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    char name[15], vorname[15], email[35], homepage[60], kommentar[500], send[30];
    char content[1000];
    char var[500];
    char* string;

    int z1,z3; //Zaehlervariablen
    int cgi_header_printed = 0;

    int translate();
    int ausgabe();
    void PrintCGIHeader();

    int main() {
        string = getenv("QUERY_STRING"); // Mit dieser Übergabe habe ich Speicherprobleme
        /* Was genau heisst "Speicherprobleme" ? */
        // strcpy(string, getenv("QUERY_STRING")); // Daten aus den Umgebungsvariablen werden gelesen

    /* Erst pruefen, ob QUERY_STRING ueberhaupt vorhanden! */
        if (!string) {
            PrintCGIHeader();
            printf("<HTML><BODY><H4>QUERY_STRING variable not available!</H4></BODY></HTML>\n");
            return -1;
        }

    /* content[0]='\0';        ueberfluessig, weil gleich strcpy folgt */
        strcpy(content, string); //Konvertierung von Zeiger Char auf Char   /* Haeh? */

    translate();
        strcpy(name,var);
        translate();
        strcpy(vorname,var);
        translate();
        strcpy(email,var);
        translate();
        strcpy(homepage,var);
        translate();
        strcpy(kommentar,var);
        translate();
        strcpy(send,var);

    ausgabe();

    return 0;  
    }

    int translate() {
        z1 = 0;
        z3 = 0;
        
        var[0] = '\0';
        
        while (content[z1] != 0) {
            while (content[z1] != '=') {        /* ACHTUNG! Geht ueber Stringende falls kein '=' vorhanden! */
                z1++;
            }
            
            while (content[z1] != '&') {        /* ACHTUNG! Geht ueber Stringende falls kein '&' vorhanden! */
                var[z3] = content[z1];
                z3++; z1++;
            }
            
            z3 = 0;
            
            /* Hier muss erst die Ausgabe erfolgen, da sonst der eben in var[] gesicherte Wert ueberschrieben wird. */
        }
        return 0;
    }

    int ausgabe() {
        PrintCGIHeader();       /* Erst ordentlichen CGI Header schreiben! */
        
        printf("<html><head><title>Temporärest Gaestebuch</title></head>");
        printf("<body>");
        printf("%s\n",name);
        printf("%s\n",vorname);
        printf("%s\n",email);
        printf("%s\n",homepage);
        printf("%s\n",kommentar);
        printf("</body></html>");
        return 0;
    }

    void PrintCGIHeader() {
        if (!cgi_header_printed) {
            printf("Content-Type: text/html");
            cgi_header_printed = 1;
        }
    }

    1. Hallo Sven!

      Ich habe eine EXE Datei geschrieben, welche die Funktion einer CGI haben soll. Diese erzeugt ein Antwortdokument. Ich kann die Umgebungsvariablen, die mit GET übermittelt wurden nicht in eine andere Variable einfügen, da ich immer eine Fehlermeldung wegen des Speichers erhalte. Kann mir jemand da helfen?

      Nur unter einer Bedingung: Du sagst uns, wie die Fehlermeldung lautet und von wem sie erzeugt wird (Compiler? Betriebssystem?). Das Hellsehen faellt mir heute ziemlich schwer, weil ich gestern zuviel getrunken habe.

      Einstweilen helfen Dir hoffentlich folgende Anmerkungen an Deinem Code.

      Bye, Calocybe

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      char name[15], vorname[15], email[35], homepage[60], kommentar[500], send[30];
      char content[1000];
      char var[500];
      char* string;

      int z1,z3; //Zaehlervariablen
      int cgi_header_printed = 0;

      int translate();
      int ausgabe();
      void PrintCGIHeader();

      int main() {
          string = getenv("QUERY_STRING"); // Mit dieser Übergabe habe ich Speicherprobleme
          /* Was genau heisst "Speicherprobleme" ? */
          // strcpy(string, getenv("QUERY_STRING")); // Daten aus den Umgebungsvariablen werden gelesen

      /* Erst pruefen, ob QUERY_STRING ueberhaupt vorhanden! */
          if (!string) {
              PrintCGIHeader();
              printf("<HTML><BODY><H4>QUERY_STRING variable not available!</H4></BODY></HTML>\n");
              return -1;
          }

      /* content[0]='\0';        ueberfluessig, weil gleich strcpy folgt */
          strcpy(content, string); //Konvertierung von Zeiger Char auf Char   /* Haeh? */

      translate();
          strcpy(name,var);
          translate();
          strcpy(vorname,var);
          translate();
          strcpy(email,var);
          translate();
          strcpy(homepage,var);
          translate();
          strcpy(kommentar,var);
          translate();
          strcpy(send,var);

      ausgabe();

      return 0;  
      }

      int translate() {
          z1 = 0;
          z3 = 0;
          
          var[0] = '\0';
          
          while (content[z1] != 0) {
              while (content[z1] != '=') {        /* ACHTUNG! Geht ueber Stringende falls kein '=' vorhanden! */
                  z1++;
              }
              
              while (content[z1] != '&') {        /* ACHTUNG! Geht ueber Stringende falls kein '&' vorhanden! */
                  var[z3] = content[z1];
                  z3++; z1++;
              }
              
              z3 = 0;
              
              /* Hier muss erst die Ausgabe erfolgen, da sonst der eben in var[] gesicherte Wert ueberschrieben wird. */
          }
          return 0;
      }

      int ausgabe() {
          PrintCGIHeader();       /* Erst ordentlichen CGI Header schreiben! */
          
          printf("<html><head><title>Temporärest Gaestebuch</title></head>");
          printf("<body>");
          printf("%s\n",name);
          printf("%s\n",vorname);
          printf("%s\n",email);
          printf("%s\n",homepage);
          printf("%s\n",kommentar);
          printf("</body></html>");
          return 0;
      }

      void PrintCGIHeader() {
          if (!cgi_header_printed) {
              printf("Content-Type: text/html");
              cgi_header_printed = 1;
          }
      }

      Danke Schonmal!
      Ich habe Keine Probleme mit dem Compiler, der Übersetzt wie wild. dafür aber Probleme mit dem Betriebsystem:

      GUESTBOOK verursachte einen Fehler durch eine ungültige Seite
      in Modul GUESTBOOK.EXE bei 015f:0040133b.
      Register:
      EAX=00000000 CS=015f EIP=0040133b EFLGS=00010246
      EBX=00540000 SS=0167 ESP=0064fde8 EBP=0064fdf8
      ECX=00000000 DS=0167 ESI=81659d50 FS=4ccf
      EDX=7efefeff ES=0167 EDI=00415d48 GS=0000
      Bytes bei CS:EIP:
      8b 01 03 d0 83 f0 ff 33 c2 8b 11 83 c1 04 a9 00
      Stapelwerte:
      00000000 0040105e 00415d48 00000000 0064fe38 00403465 00000001 00770390 007703f0 00000000 81659d50 00540000 c0000005 0064ff68 0064fe0c 0064fc18

      Ich denke, dass diess an der Übergabe des Wertes der  Variable liegt. Der Debugger hält nähmlich Dort an!

      1. Hi again!

        Nicht ganz soviel quoten, bitte.

        GUESTBOOK verursachte einen Fehler durch eine ungültige Seite
        in Modul GUESTBOOK.EXE bei 015f:0040133b.
        [...]

        Mmh naja, sagt mir dann leider auch nichts weiter als dass da was schief laeuft. ;-) Interessant waere, an welcher Stelle der Fehler auftritt. Damit meine ich nicht die Angabe von CS:EIP, sondern bei welcher Anweisung im Sourcecode. Mit dem Debugger sollte das eigentlich ohne Probleme herauszufinden sein.

        Jedenfalls kann so eine harte Meldung von Code wie diesem verursacht werden:

        while (content[z1] != '=') {        /* ACHTUNG! Geht ueber Stringende falls kein '=' vorhanden! */

        Korrekt muesste es heissen:
            while ((content[z1] != '\0') && (content[z1] != '=')) {

        Im Moment habe ich keine Zeit, aber ich werde spaeter mal etwas schreiben, was funktionieren sollte. (Das ist kein Versprechen! *g*)

        Ich denke, dass diess an der Übergabe des Wertes der  Variable liegt. Der Debugger hält nähmlich Dort an!

        Welches Wertes an welche Variable? Werde bitte etwas genauer. Ohne Informationen kann man keine Fehler finden.

        Bis dann, Calocybe

        1. »»     string = getenv("QUERY_STRING");
          Mit dieser Übergabe habe ich Speicherprobleme. Dort bekomme ich immer die Meldung mit dem Speicherfehler. Der Debugger hält dort.
          Hier wird der Wert der Umgebungsvariablen an die Variable string übergeben. Zumindest sollte das Programm das tun.

          Der Debugger (MS-Visual C++) schreibt immer:

          Unbehandelte Ausnahme in guestbook.exe 0xC000005: Access Violation.

          Am besten man fürhrt das komplette Programm mal aus, dann sieht man den Fehler.

          1. Hallo Sven!

            »»     string = getenv("QUERY_STRING");
            Mit dieser Übergabe habe ich Speicherprobleme. Dort bekomme ich immer die Meldung mit dem Speicherfehler. Der Debugger hält dort.

            Das finde ich sehr seltsam, denn hier wird einfach ein Pointer nach 'string' geschrieben, da sollte eigentlich nichts schief gehen koennen. Nur falls der Pointer ungueltig ist (NULL) und spaeter darauf zugegriffen wird, waere die Schutzverletzung nachvollziehbar.

            Hier wird der Wert der Umgebungsvariablen an die Variable string übergeben. Zumindest sollte das Programm das tun.

            Bei C/C++ sollte man das etwas genauer nehmen: Es wird der von getenv() gelieferte Pointer in die Variable 'string' geschrieben. Solange nichts damit getan wird und der Pointer einfach in der Variable herumlungert, sollte nichts schlimmes passieren koennen.

            Am besten man fürhrt das komplette Programm mal aus, dann sieht man den Fehler.

            *g* Ich kenne diese Meldung sehr gut. ;-) Sie tritt eigentlich bei jedem C-Programm irgendwann mal auf, solange man in der Entwicklungsphase ist.

            Na, wie auch immer, habe jetzt mal ein bisschen gecoded und folgende kleine Programme laufen auf meiner Windose ganz gut. Hab sie nur von der Kommandozeile aus gestartet, aber wenn der Webserver ordentlich konfiguriert ist, sollte es als CGI auch einfach laufen.

            listenv.c listet Dir zu Testzwecken alle Environmentvariablen auf.
            dumpqs.cpp analysiert den Query string und gibt die einzelnen Teile aus.
            Dort wo in dumpqs.cpp die Ausgabe von *name und *value gemacht wird, muesstest Du nun einfach mit strdup() bzw. strcpy() die Strings in Deine Variablen zur Weiterverarbeitung kopieren. Dazu muesstest Du vielleicht einen Stringvergleich durchfuehren, so in der Art:
                if (strcmp(name, "email") == 0) strcpy(email, name);
                else if (strcmp(name, "homepage") == 0) strcpy(homepage, name);
            Meine Variable 'name' bedeutet aber was anderes als Deine; benenne sie einfach um.

            Falls Du Fragen hast, musst Du sie stellen. ;-)

            Bye, Calocybe

            listenv.c >>>

            #include <stdio.h>

            int main(int argc, char ** argv, char ** envv) {
                char ** envp;

            printf("Content-Type: text/plain\n\n");

            envp = envv;
                while (*envp) {
                    printf("%s\n", *envp);
                    envp++;
                }

            return 0;
            }

            <<<<<<<<<<<<<<<<<

            dumpqs.cpp >>>

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>

            char * qs;

            int cgiargc;
            char ** cgiargv;

            char * strdup(char * src) {
                return src ? strcpy((char *) malloc((strlen(src) + 1) * sizeof(char)), src) : NULL;
            }

            int split_by_char(char *** psectionv, char * s, char splitchar, int maxsections = 0) {
                char *c, *c2, *section;
                char ** sectionv;
                int pieces, i, j;

            /* first count the elements in s */
                c = s; pieces = 0;
                while (*c)
                    if (*c++ == splitchar) pieces++;

            if (c != s) pieces++;       /* pieces is 1 more than # of splitchars, except strlen(s)==0 */
                if (maxsections && (pieces > maxsections)) pieces = maxsections;

            /* abort if s is empty */
                if (!pieces) {
                    *psectionv = NULL;
                    return 0;
                }

            /* alloc mem for the several sections */
                *psectionv = sectionv = (char **) malloc(pieces * sizeof(char *));
                if (!sectionv) return 0;                        /* out of memory? */
                for (i=0; i<pieces; i++) sectionv[i] = NULL;    /* init all strings to NULL for safety */

            /* extract the several sections */
                c = s;
                for (i=0; i<pieces; i++) {
                    if (i == pieces-1)                          /* if this is the last section */
                        c2 = strchr(c, '\0');                   /* copy all upto the terminating zero */
                    else c2 = strchr(c, splitchar);

            sectionv[i] = section = (char *) malloc((size_t) c2 - (size_t) c + (size_t) 1);
                    if (!section) return pieces;                /* out of memory? */

            /* copy the piece to *section */
                    j = 0;
                    while (c < c2) section[j++] = *c++;
                    section[j] = '\0';

            /* go on with the next section */
                    c++;
                }

            return pieces;
            }

            int main(int argc, char ** argv, char ** envv) {
                int i;
                char *name, *value;

            printf("Content-Type: text/plain\n\n");

            /* get and output the query string */
                qs = getenv("QUERY_STRING");
                if (!qs) {
                    printf("QUERY_STRING not here!\n");
                    return 0;
                }

            printf("QUERY_STRING is >>%s<<\n", qs);

            /* get and output the several sections within the query string */
                cgiargc = split_by_char(&cgiargv, qs, '&');
                printf("# of pieces in QS: %d\n", cgiargc);
                for (i=0; i<cgiargc; i++)
                    printf("piece[%d] is >>%s<<\n", i, cgiargv[i]);

            /* get and output the two pieces of each section */
                for (i=0; i<cgiargc; i++) {
                    name = strdup(cgiargv[i]);
                    if (!name) continue;

            value = strchr(name, '=');
                    if (value) {
                        *value++ = '\0';
                        printf("parameter '%s' has the value '%s'\n", name, value);
                    } else printf("parameter '%s' has no value\n");

            free((void *) name);
                }

            /* release the memory of cgiargv */
                for (i=0; i<cgiargc; i++) free((void *) cgiargv[i]);
                free((void *) cgiargv);

            return 0;
            }

            <<<<<<<<<<<<<<<<<<

            1. Danke an Alle!

              Es Klappt nun alles! Hier ist meine entgültige Lösung:

              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>
              #include <malloc.h>

              char name[15], vorname[15], email[35], homepage[60], kommentar[500], send[30];
              char content[1000];
              char var[500];
              char* string;

              int z1,z3; //Zaehlervariablen

              int translate();
              int ausgabe();

              int main()
              {
                  string = (char*) (malloc( 255 ));
              string[0] = '\0';
              content[0]= '\0';
                  string = getenv("QUERY_STRING");

              if (!string)  
              {  
              

              printf ("Content-Type: text/html\n\n");//header
                printf ("<html><body>Bitte geben sie die Daten erneut ein!</body></html>");
                return 0;
              }

              translate();  
              strcpy(name,var);  
              translate();  
              strcpy(vorname,var);  
              translate();  
              strcpy(email,var);  
              translate();  
              strcpy(homepage,var);  
              translate();  
              strcpy(kommentar,var);  
              ausgabe();  
              
                
              return 0;    
              

              }

              int translate()
              {
              z3 = 0;
              var[0] = '\0';
              while ( string[z1] != '=' )
              {
                z1++;
              }
              z1++;
              while ( string[z1] != '&' && string[z1] != '\0' )
              {
                 var[z3] = string[z1];
                 z3++;
                 z1++;
              }
              return 0;
              }

              int ausgabe()
              {
              printf ("Content-Type: text/html\n\n");//header
              printf("<html><head><title>Temporärest Gaestebuch</title></head>");
              printf("<body>");
              printf("Name: %s<br>",name);
              printf("Vorname: %s<br>",vorname);
              printf("E-Mail: <a href=mailto:%s>%s</a><br>",email, email);
              printf("Homepage: %s<br>",homepage);
              printf("Kommentar: %s<br>",kommentar);
              printf("</body></html>");
              return 0;
              }

              DANKE!

              1. Hallo mal wieder

                Offen gesagt, finde ich Deine Loesung nich besonders toll.

                Von der Logik her kommt das Programm nicht damit zurecht, wenn die Parameter im Query string in einer anderen als der erwarteten Reihenfolge uebergeben werden. Wenn die Daten von einem Formular aus abgeschickt werden, ist das vom Browser abhaengig.

                Da z1 nirgendswo initialisiert wird, hat es beim ersten Durchlauf von translate() einen zufaelligen Wert. Der Zugriff
                    »»  while ( string[z1] != '=' )
                kann daher eine der von Dir so geliebten Schutzverletzungen hervorrufen.

                Wenn der Querystring kein = enthaelt, wird an eben dieser Stelle endlos weitergesucht -> Schutzverletzung.

                In translate() wird von string[z1] nach var[z3] kopiert, aber keine abschliessende Null geschrieben. Der darauffolgende strcpy()-Aufruf wird dann bis irgendwohin kopieren, wo zufaellig wieder eine Null steht. Wenn nicht zufaellig irgendwann eine kommt (sehr unwahrscheinlich), gibt es eine Schutzverletzung. Wenn doch irgendwann eine kommt, hast Du bis dahin wahrscheinlich schon die Haelfte Deiner Variablen ueberschrieben. Daher immer die abschliessende Null am Stringende schreiben.

                Wenn die Daten die Laengen Deiner vordefinierten Arrays uebersteigen, werden im besten Falle andere Variablen ueberschrieben (z.B. wenn einer bei Name 20 Zeichen eingibt).

                Die Arrays send[] und content[] werden nirgendwo (sinnvoll) benutzt.

                Am Anfang ziehst Du Speicher fuer 'string', schmeisst den Pointer auf den erhaltenen Speicher aber gleich danach wieder weg, wenn Du das Ergebnis von getenv() zuweist. Du wirst diesen Speicher nie wieder freigeben koennen (was Du ohnehin versaeumt hast) und hast damit ein Memory leak. Du kannst das als Kleinigkeit abtun, aber Tatsache ist, dass viele grosse Programme (z.B. der Netscape Navigator) aus genau diesem Grund Unmengen von Speicher vom System beanspruchen, ohne ihn zu brauchen.

                Anbei eine korrigierte Version. Hab's nicht komplett getestet, sollte aber so ungefaehr laufen. Das Problem mit der Reihenfolge der Parameter ist da jedoch nicht geloest.

                Calocybe

                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                #include <malloc.h>

                char name[15], vorname[15], email[35], homepage[60], kommentar[500];
                char var[500];
                char* string;

                int z1, z3; //Zaehlervariablen

                void translate();
                int ausgabe();

                int main() {
                    string = getenv("QUERY_STRING");

                if (!string) {
                      printf ("Content-Type: text/html\n\n");//header
                      printf ("<html><body>Bitte geben sie die Daten erneut ein!</body></html>");
                      return 0;
                    }

                z1 = 0;

                translate(15);
                    strcpy(name,var);

                translate(15);
                    strcpy(vorname,var);

                translate(35);
                    strcpy(email,var);

                translate(60);
                    strcpy(homepage,var);

                translate();
                    strcpy(kommentar,var);

                ausgabe();

                return 0;
                }

                /* maxlength ist die Groesse des Zielarrays, in das hinterher mit strcpy() hineinkopiert wird */
                void translate(int maxlength) {
                    var[0] = '\0';
                    while ((string[z1] != '=') && (string[z1] != '\0'))
                        z1++;

                if (!string[z1]) return;            /* falls kein = mehr da war, wegen '\0' rausgeflogen */
                    z1++;

                if (maxlength > 500)
                        maxlength = 500;   /* darf natuerlich auch die Laenge von var[] nicht ueberschreiten */

                z3 = 0;
                    while ((string[z1] != '&') && (string[z1] != '\0') && (z3 < maxlength-1))
                       var[z3++] = string[z1++];

                var[z3] = '\0';     /* String muss abgeschlossen werden, sonst macht strcpy() Mist */

                /* falls wegen maxlength-ueberschreitung rausgeflogen, noch bis zum naechsten '&' aufschliessen */
                    while ((string[z1] != '&') && (string[z1] != '\0')) z1++;
                }

                int ausgabe() {
                    printf ("Content-Type: text/html\n\n");//header
                    printf("<html><head><title>Temporärest Gaestebuch</title></head>");
                    printf("<body>");
                    printf("Name: %s<br>",name);
                    printf("Vorname: %s<br>",vorname);
                    printf("E-Mail: <a href=mailto:%s>%s</a><br>",email, email);
                    printf("Homepage: %s<br>",homepage);
                    printf("Kommentar: %s<br>",kommentar);
                    printf("</body></html>");
                    return 0;
                }

  2. Moin Sven,

    andere Variable einfügen, da ich immer eine Fehlermeldung wegen des Speichers erhalte. Kann mir jemand da helfen?

    »»  string = getenv("QUERY_STRING"); // Mit dieser Übergabe habe ich Speicherprobleme
    »»  content[0]='\0';

    »»  strcpy(content,string); //Konvertierung von Zeiger Char auf Char

    Dies hat bei mir dann einen Speicherfehler verursacht, wenn die Umgebungsvariable QUERY_STRING nicht gesetzt war. Grund: get_env("KEY") liefert einen Nullpointer zurück, wenn "KEY" als Umgebungsvariable nicht bekannt ist. Darauf folgend versucht das Programm dann, den char-"Inhalt" ab Adresse 0 in content zu kopieren, was das Betriebssystem wohl nicht unbedingt mag.

    int translate()
    {

    »»  z1 = 0;
    »»  z3 = 0;
    »»  var[0] = '\0';
    »»  while ( content[z1] != 0 )
    »»  {
    »»   while ( content[z1] != '=' )
    »»   {
    »»    z1++;
    »»   }

    hier fehlt die Abfrage, ob content nicht schon längst zu Ende ist. Wenn also QUERY_STRING definiert ist, aber kein '=' enthält, gibt es hier die nächsten Speicherzugriffsprobleme. Besser also Konstrukte wie

    for(z1=0; (content[z1]!=0) (content[z1] != '='); ++z1);

    verwenden. Das gleiche gilt auch fuer die folgenden Schleifen in translate()...

    int ausgabe()
    {

    »»  printf("<html><head><title>Temporärest Gaestebuch</title></head>");

    Wie schon von Calocybe angedeutet, fehlt hier ein CGI-Header, also sowas wie

    printf("Content-Type: text/html\n\n");

    Das waren erstmal soweit meine ersten "Beobachtungen" ;-) Falls es danach immer noch Probleme gibt, kannst Du ja einfach nochmal posten...

    Bis dannundwann

    Andreas

    1. Remoin nochmal....

      »»  while ( content[z1] != 0 )
      »»  {
      »»   while ( content[z1] != '=' )
      »»   {
      »»    z1++;
      »»   }

      hier fehlt die Abfrage, ob content nicht schon längst zu Ende ist. Wenn also QUERY_STRING definiert ist, aber kein '=' enthält, gibt es hier die nächsten Speicherzugriffsprobleme. Besser also Konstrukte wie

      for(z1=0; (content[z1]!=0) (content[z1] != '='); ++z1);

      hier hat natürlich gleich der Fehlerteufel zugeschlagen, es muß '&&' statt '' heißen.  Mir fiel ansonsten noch auf, daß Du oben auch schon content[z1]!=0 abgefragt hast, aber in einer äußeren Schleife. Die innere Schleife mit while(content[z1]!='=') läuft davon allerdings unbeeindruckt durch, auch über das Ende von content hinweg. Viel Spaß erstmal bei der weiteren Fehlersuche und...

      ... bis dannundwann!

      Andreas