Zum Inhalt springen

Hilfe bei Fehlersuche - falscher Seitenaufruf


Empfohlene Beiträge

Geschrieben

Hallo!

Ich habe erst vor kurzem mit C angefangen und Teile eines Programms übernommen. Inzwischen habe ich einiges verändert und habe jetzt eben einen Fehler den ich mir nicht erklären kann.

Ich habe 2 HTML Seiten die jeweils in der Variablen "site" ihren Namen (also "test" und "setup") übergeben.

Anhand von dieser Variablen soll mein CGI Programm in C die Werte verarbeiten, und anschließend die gesetzten Werte auf der jeweiligen Seite wieder ausgeben.

Allerdings gibt er mir bei if (site=="test") anschließend setup.html aus (bei (site=="setup") gibt er auch setup.html aus, setzt aber die Werte nicht ...

 if (site=="test")
{
param = fopen("/home/httpd/ohne_frames/test.html", "r");
if (!param) return 0;

dynp = fopen("/home/httpd/test.html", "w");
if (!dynp) return 0;

/*
Kopieren des Templates als neues html file
*/

while (!feof(param))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, param);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{
/*
Einfuegen einer Funktion, welche die neu eingestellten Werte setzt
*/

fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par);
if (prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n");
else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n");
else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n");
fprintf(dynp, "}</script>\n");
}

fputs(line, dynp);
}
fclose(dynp);

dynp_in = fopen("/home/httpd/test.html", "r");

while (!feof(dynp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, dynp_in);
fwrite(buf, 1, len, stdout);
}
fclose(dynp_in);
}

else if (site=="setup")
{
setup = fopen("/home/httpd/ohne_frames/setup.html", "r");
if (!setup) return 0;

s_temp = fopen("/home/httpd/setup.html", "w");
if (!s_temp) return 0;

while (!feof(setup))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, setup);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{

fprintf(s_temp, "<script> function loaded(){\n");
if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n");
else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n");

if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n");
else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n");
else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n");
else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n");
else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n");
else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n");

fprintf(s_temp, "}</script>\n");
}
fputs(line, s_temp);
}

fclose(s_temp);

s_temp_in = fopen("/home/httpd/setup.html", "r");

while (!feof(s_temp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, s_temp_in);
fwrite(buf, 1, len, stdout);
}
fclose(s_temp_in);
}
[/PHP]

Wo liegt denn der Fehler?

Geschrieben

okay:

int main(int argc, char *argv[])
{
int prog;
int par;
int lang;
int unit;
char site[20];
FILE * param;
FILE * test;
FILE * dynp;
FILE * dynp_in;
FILE * setup;
FILE * s_temp;
FILE * s_temp_in;

int kom_handle;

/* Lesen der Umgebungsparameter */

const char * rm = GetEnv("REQUEST_METHOD");
const char * cl = GetEnv("CONTENT_LENGTH");

int len = atoi(cl);
char * buffer = malloc(len+1);

if (strcmp(rm, "POST") == 0)
{
fread(buffer,1, len, 0);
buffer[len+1] = 0;
} else if (strcmp(rm,"GET")==0)
{
buffer = getenv("QUERY_STRING");
}
/* Lesen aller Form Parameter */

ParseFormParameters(buffer);

/* Zugriff auf ausgewaehlte Parameter */

prog = atoi(FindParameterValue("program"));
par = atoi(FindParameterValue("parameter"));
lang = atoi(FindParameterValue("language"));
unit = atoi(FindParameterValue("torqueunit"));
strcpy (site, "site");

/* Ablage der Daten in einer "Parameterdatei" */

test = fopen("test.dat", "w");

fprintf(test, "%i\n", prog);
fprintf(test, "%i\n", par);
fprintf(test, "%i\n", lang);
fprintf(test, "%i\n", unit);

/* Erzeugen der Antwort an den Browser */

printf("content-type: text/html\n\n");

/* Oeffnen des Templates */

if(0 == strcmp(site, "test"))
{
param = fopen("/home/httpd/ohne_frames/test.html", "r");
if (!param) return 0;

dynp = fopen("/home/httpd/test.html", "w");
if (!dynp) return 0;

/* Kopieren des Templates als neues html file */

while (!feof(param))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, param);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{
/* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */

fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par);
if (prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n");
else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n");
else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n");
fprintf(dynp, "}</script>\n");
}

fputs(line, dynp);
}
fclose(dynp);

dynp_in = fopen("/home/httpd/test.html", "r");

while (!feof(dynp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, dynp_in);
fwrite(buf, 1, len, stdout);
}
fclose(dynp_in);
}

else
{
setup = fopen("/home/httpd/ohne_frames/setup.html", "r");
if (!setup) return 0;

s_temp = fopen("/home/httpd/setup.html", "w");
if (!s_temp) return 0;

while (!feof(setup))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, setup);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{

fprintf(s_temp, "<script> function loaded(){\n");
if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n");
else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n");

if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n");
else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n");
else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n");
else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n");
else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n");
else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n");

fprintf(s_temp, "}</script>\n");
}
fputs(line, s_temp);
}

fclose(s_temp);

s_temp_in = fopen("/home/httpd/setup.html", "r");

while (!feof(s_temp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, s_temp_in);
fwrite(buf, 1, len, stdout);
}
fclose(s_temp_in);
}[/PHP]

Geschrieben


strcpy (site, "site");
...
if(0 == strcmp(site, "test"))
[/PHP]

Du setzt site auf "site" und vergleichst dann mit "test"?

[PHP]
if(prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n");
else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n");
else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n");

Machs doch so:


fprintf(dynp, "document.forms[0].program[%d].checked=true;\n", prog-1);
[/PHP]

Mit deinen anderen if-if/else-Kaskaden kannst du das gleiche machen.

[PHP]
getline(&line,&l, setup);

Wie sieht getline aus? Ich vermute da ein massives Speicherleck.

if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n");
else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n");

if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n");
else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n");
else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n");
else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n");
else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n");
else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n");
[/PHP]

Auch hier reicht je eine Zeile:

[PHP]
fprintf(setup, "document.SetupForm.language[%d].checked=true;\n", lang - 1);
fprintf(setup, "document.SetupForm.torqueunit[%d].checked=true;\n", unit - 1);

Geschrieben

strcpy (site, "site");
...
if(0 == strcmp(site, "test"))
[/PHP]

Du setzt site auf "site" und vergleichst dann mit "test"?

Hast Recht - ist üflü - strcpy ist gelöscht ...

[PHP]
getline(&line,&l, setup);

Wie sieht getline aus? Ich vermute da ein massives Speicherleck.

Das sind die einzigen 2 Vorkommen von getline ...

Geschrieben

getline(&line,&l, setup);
[/PHP]

Wie sieht getline aus? Ich vermute da ein massives Speicherleck.

So wie ich es verstehe, sind die Parameter falsch. Gibt er dir keine Fehlermeldung dazu aus? Der 3. Parameter (so wie ich es weiss), muss immer angeben, bis zu welchem Zeichen er die Zeile einlesen soll.

Ich kenne getline nur in Verbindung mit ifstream.

Du könntest es doch auch mit

[PHP]
char *gets(char *buffer);

versuchen.

Wenn du aber bei getline bleiben magst, kann ich dir nur das hier vorschlagen

(es gibt vielleicht noch andere, aber ich kenne halt nur diese):



#include <fstream.h> //muss vorhanden sein

//...

ifstream read_in;
char *text[100];
string text2;

//Datei öffnen
read_in.open("Pfad", ios::in);

//erste Möglichkeit
getline(read_in, text2, '\n'); //liest bis ersten '\n' Zeichen alles ein

//zweite Möglichkeit
read_in.getline(text, 100, '\n'); //liest bis erstes '\n' Zeichen alles ein
[/PHP]

bei der zweiten Möglichkeit, solltest du darauf achten, dass das Feld groß genug ist, daher ziehe ich die erste Möglichkeit vor.

Gruß Kitty

=============================

Sorry, hatte es überlesen, dass er in C progammiert ... :floet:

Aber der Wille, ihm zu helfen, zählt ;)

Geschrieben

"sie" wäre mir lieber als "er" ;)

es kommt noch einmal in der main.c vor - wobei ich mir auch nicht sicher bin, wozu die Datei gut ist ... ist praktisch das selbe wie die cgiread.c an der ich jetzt arbeite - nur auf einem älteren Stand.

Ansonsten sind das die einzigen 3x wo "getline" vorkommt im header file stehen nur ein Paar Zeilen aber nichts von "getline" habe das ganze Projekt danach durchsuchen lassen ...

Geschrieben
"sie" wäre mir lieber als "er" ;)

Ich bitte vielmals um Entschuldigung :floet:

Gehört die Datei main.c auch zu diesem Programm? Falls ja, gibt es da drin auch eine main-Funktion?

Stellt sich der Fehler noch so dar, wie du ihn zu Anfang beschrieben hast?

Geschrieben

kein Problem :D

main.c ist auch in dem Projekt-Ordner wird aber nicht aufgerufen - ist wie gesagt die "Ursprungs-Version" von der cgiread.c an der ich jetzt arbeite - und da es praktisch eine alte Kopie ist, ist auch ne main-Funktion drin ...

ja, der Fehler ist immer noch der selbe ... Daten werden übermittelt und verarbeitet (in test.dat geschrieben, ...), aber die erneute Anzeige im Browser ist immer noch falsch bei test.html kommt setup.html und bei setup.html eben auch, aber ohne die gesetzten Werte ...

Geschrieben

Also, habe gerade rausgefunden, dass wenn ich die if-Anweisung weglasse und den 2. Teil (also die Seite setup.html und deren Auswertung) auskommentiere, dann klappt test.html einwandfrei. :rolleyes:

Also ist da der Wurm drin ... nur wo? :confused:

Geschrieben
Aber im ursprünglichen Code doch, oder?

Wie soll diese Abfrage funktionieren, wenn site nie mit Daten gefüllt wird?

Versteh deine Frage nicht ganz - die Variable "site" speichert doch bloß WELCHE Seite jetzt gerade Daten übertragen hat.

Was im Moment übrig ist und funktioniert sieht so aus:


/*#define _GNU_SOURCE*/

#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <kommun.h>
#include <sys/types.h>
#include <sys/stat.h>

char translateHex(char hex);
void ParseFormParameters(char * inp);
const char * FindParameterValue(const char * name);
const char * GetEnv(const char * what);

struct Parameter_s
{
char * name;
char * value;
};

typedef struct Parameter_s Parameter;

static Parameter * FormParameters = 0;
static int NumFormParameters = 0;

char translateHex(char hex)
{
if(hex >= 'A')
return (hex & 0xdf) - 'A' + 10;
else
return hex - '0';
}

void ParseFormParameters(char * inp)
{
static char * result;
int tp,i;
int num_par = 1;
char * rp, * gp;

int len = strlen(inp);
if (len == 0)
{
NumFormParameters = 0;
}
result = 0;

if (result != 0) free(result);
result = (char *) malloc(len);

tp=0;
for(i = 0; i < len; i++)
{
if(inp[i] == '+')
result[tp++] = ' ';
else if(inp[i] == '%')
{
result[tp++] =
translateHex(inp[i + 1]) * 16 +
translateHex(inp[i + 2]);
i += 2; /* Move past hex code */
} else /* An ordinary character */
result[tp++] = inp[i];
}
len = tp;

for (i = 0; i<len; i++)
{
if (result[i] == '&') num_par++;
}
if (FormParameters != 0) free(FormParameters);
FormParameters = (Parameter *) malloc(sizeof(Parameter) * num_par);
NumFormParameters = num_par;

rp = result;
for (i=0; i< num_par; i++)
{
FormParameters[i].name = "";

gp = strchr(rp, '=');
if (gp == 0) break; /* error missing assignment */

*gp = 0;
FormParameters[i].name = rp;
gp++;
rp = gp;

gp = strchr(rp, '&');
if (gp != 0) *gp = 0;
FormParameters[i].value = rp;
if (gp!=0) rp = gp+1; else break;
}
}

const char * FindParameterValue(const char * name)
{
int i;
for (i=0; i< NumFormParameters; i++)
{
if (strcmp(name, FormParameters[i].name) == 0)
{
return FormParameters[i].value;
break;
}
}
return "";
}

const char * GetEnv(const char * what)
{
char * r = getenv(what);
if (!r) return "";
else return r;
}

int main(int argc, char *argv[])
{
int prog;
int par;
int lang;
int unit;
char site[20];
FILE * param;
FILE * test;
FILE * dynp;
FILE * dynp_in;
FILE * setup;
FILE * s_temp;
FILE * s_temp_in;

int kom_handle;

/* Lesen der Umgebungsparameter */

const char * rm = GetEnv("REQUEST_METHOD");
const char * cl = GetEnv("CONTENT_LENGTH");

int len = atoi(cl);
char * buffer = malloc(len+1);

if (strcmp(rm, "POST") == 0)
{
fread(buffer,1, len, 0);
buffer[len+1] = 0;
} else if (strcmp(rm,"GET")==0)
{
buffer = getenv("QUERY_STRING");
}

/* Lesen aller Form Parameter */
ParseFormParameters(buffer);

/* Zugriff auf ausgewaehlte Parameter */
prog = atoi(FindParameterValue("program"));
par = atoi(FindParameterValue("parameter"));
lang = atoi(FindParameterValue("language"));
unit = atoi(FindParameterValue("torqueunit"));

/* Ablage der Daten in einer "Parameterdatei" */
test = fopen("test.dat", "w");

fprintf(test, "%i\n", prog);
fprintf(test, "%i\n", par);
fprintf(test, "%i\n", lang);
fprintf(test, "%i\n", unit);

/* Erzeugen der Antwort an den Browser */

printf("content-type: text/html\n\n");

/* Oeffnen des Templates */

param = fopen("/home/httpd/ohne_frames/test.html", "r");
if (!param) return 0;

dynp = fopen("/home/httpd/test.html", "w");
if (!dynp) return 0;

/* Kopieren des Templates als neues index file */

while (!feof(param))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, param);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{
/* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */

fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par);
fprintf(dynp, "document.forms[0].program[%d].checked=true;\n", prog-1);
fprintf(dynp, "}</script>\n");
}

fputs(line, dynp);
}
fclose(dynp);

dynp_in = fopen("/home/httpd/test.html", "r");

while (!feof(dynp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, dynp_in);
fwrite(buf, 1, len, stdout);
}
fclose(dynp_in);

umask(~0666);

/* Erzeugen einer benannten Fifo Datei */

mknod("/tmp/deprag_simul_cgicom.pipe", 0666 | S_IFIFO, 0);

kom_handle = open("/tmp/deprag_simul_cgicom.pipe", O_RDWR | O_NONBLOCK);
if (kom_handle != -1)
{
KommunikationsStruktur ks;

ks.ProgrammNummer = prog;
ks.Parameter = par;
ks.Sprache = lang;
ks.Momenteinheit = unit;

write(kom_handle, &ks, sizeof(ks));
close(kom_handle);
}

return 0;
}
[/PHP]

Geschrieben
Versteh deine Frage nicht ganz - die Variable "site" speichert doch bloß WELCHE Seite jetzt gerade Daten übertragen hat.

Wie kommt diese Information in site rein? In dem Code auf Seite 1 dieses Threads ist site ein Array von 20 char, das nicht initialisiert wird. site kann nichts speichern, weil nirgendwo im Code irgendein Inhalt in site abgelegt wird.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...