QUERY_STRING aus Datei auslesen
-
Evilmachine schrieb:
Funktionen deklarieren in c hatte ich noch nicht^^
Vermute aber das es ähnlich funzt wie bei PHP.
Dann wird es aber höchste Zeit.
Und lies es dir vorher durch. Trial & Error kommt da nicht so gut.sizeof(tmp) funktioniert aber nur wenn das Array auch in der selben Funktion definiert ist.
Evilmachine schrieb:
Jetzt muss ich nur noch rausfinden wie ich einzelne Werte aus den String raus suche. Weil da werden später die ganzen Formular Variablen drin stehen.
Warum nimmst du dann überhaupt C dafür.
-
Weil es leider die Vorgabe ist.
Wenn es nach mir gegangen wäre würde ich das komplett in PHP realisieren.
Dann wäre ich vermutlich schon fertig^^
Das Webinterface nimmt Module jedoch nur als binäre Dateien entgegen und wrappt dann halt einfach alles über stdout ins Webinterface.
-
So jetzt sitze ich an ner funktion. Auch wenn sich mir deren sinn nicht ganz erschließt, weil eigentlich soll man doch funktionen schreiben wenn man bestimmte Routinen öfter benutzt. Und den Query String will ich doch nur einmal einlesen. Oder habe ich da jetzt nen Gedanken Fehler??
Im Moment hänge ich mal wieder daran die Werte in Variablen zu speichern.
Ich habe auf jeden Fall den String erfolgreich gesplittet.
Aktueller Stand:
while(env!=NULL && fgets(tmp, sizeof(tmp),env)!=NULL) { if (strstr(tmp, "QUERY_STRING=")) str_ptr = strtok(tmp, "&'"); for(i=0; str_ptr != NULL ;i++){ //fprintf(stdout, "%s\n", str_ptr); values[i] = str_ptr; str_ptr = strtok(NULL, "&'"); } } i=0; while(values != NULL) { printf("%s\n", values[i]); i++; }
Ausgabe ist jetzt folgende:
E='LANTIME'
0&callexternalcgi=fdmmodul'
i=fdmmodul'
fdm.FDM+Analog+Wert+2=500
fdm.Monitoring=1
fdm.Upper+Limit=50.500
fdm.Lower+Limit=49.500
fdm.Display=172.16.25.66
submit=SaveConfigAber irgendwie ist der Anfang total versaut. Das LANTIME dürfte er zum Beispiel gar nicht haben weil es ganz am Ende der Datei steht.
Und jetzt bricht er nach der Ausgabe auch mit Segfault ab.
-
Habe jetzt die Ausgabe sprich die zweite while Schleife auskommentiert.
Anscheinend funzt das nicht so ganz wie ich es mir vorstelle.
Segfault ist nun zumindest weg.
-
Da fehlen leider die Definitionen def Variablen.
Und wenn es eine Funktion ist, auch deren Kopf.Dein Problem scheint ja nicht ganz trivial zu sein, sonnst hättest du keine Probleme. Schon deshalb sollte es in eine Funktion ausgelagert werden.
Das Problem mit der 2. while schleife ist ganz einfach: Sie läuft ewig, da du an
values
nichts änderst.
-
Ja die Variablen und so sind schon definiert.
habe nur nicht alles hier rein kopiert.
Mache ich jetzt mal damit du nen Überblick hast über das Programm.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LAENGE 100 //länger der einzelnen Zeilen #define ANZAHL 10 //Anzahl der Zeilen enum { CONFIG_FREQUENZ, CONFIG_FDMANALOG1, CONFIG_FDMANALOG2, CONFIG_UPPER_LIMIT, CONFIG_LOWER_LIMIT, CONFIG_MONITOR, CONFIG_DISPLAY, N_CONFIG_OPTIONS }; #define CONFIG_FDMANALOG1_NAME "FDM Analog Wert 1" #define CONFIG_FDMANALOG2_NAME "FDM Analog Wert 2" #define CONFIG_FREQUENZ_NAME "Frequenz" #define CONFIG_UPPER_LIMIT_NAME "Upper Limit" #define CONFIG_LOWER_LIMIT_NAME "Lower Limit" #define CONFIG_MONITOR_NAME "Monitoring" #define CONFIG_DISPLAY_NAME "Display" #define CONFIG_FREQUENZ_VARNAME "fdm powerline frequency" #define CONFIG_FDMANALOG1_VARNAME "fdm analog 1" #define CONFIG_FDMANALOG2_VARNAME "fdm analog 2" #define CONFIG_UPPER_LIMIT_VARNAME "upper limit" #define CONFIG_LOWER_LIMIT_VARNAME "lower limit" #define CONFIG_MONITOR_VARNAME "monitor" #define CONFIG_DISPLAY_VARNAME "display" #define DEFAULT_CONFIG_NAMES \ { \ CONFIG_FREQUENZ_NAME, \ CONFIG_FDMANALOG1_NAME, \ CONFIG_FDMANALOG2_NAME, \ CONFIG_UPPER_LIMIT_NAME, \ CONFIG_LOWER_LIMIT_NAME, \ CONFIG_MONITOR_NAME, \ CONFIG_DISPLAY_NAME, \ } #define DEFAULT_CONFIG_VARNAMES \ { \ CONFIG_FREQUENZ_VARNAME, \ CONFIG_FDMANALOG1_VARNAME, \ CONFIG_FDMANALOG2_VARNAME, \ CONFIG_UPPER_LIMIT_VARNAME, \ CONFIG_LOWER_LIMIT_VARNAME, \ CONFIG_MONITOR_VARNAME, \ CONFIG_DISPLAY_VARNAME, \ } #define ToHex(Y) (Y>='0'&&Y<='9'?Y-'0':Y-'A'+10) char *str_ptr; char *values[4096]; char InputData[4096]; char tmp[256]; FILE* env; int i; char *config_names[N_CONFIG_OPTIONS]= DEFAULT_CONFIG_NAMES; char *config_varnames[N_CONFIG_OPTIONS]= DEFAULT_CONFIG_VARNAMES; void getParam(const char *Name, char *Value) { char *pos1 = strstr(InputData, Name); if (pos1) { pos1 += strlen(Name); if (*pos1 == '=') { // Make sure there is an '=' where we expect it pos1++; while (*pos1 && *pos1 != '&') { if (*pos1 == '%') { // Convert it to a single ASCII character and store at our Valueination *Value++ = (char)ToHex(pos1[1]) * 16 + ToHex(pos1[2]); pos1 += 3; } else if( *pos1=='+' ) { // If it's a '+', store a space at our Valueination *Value++ = ' '; pos1++; } else { *Value++ = *pos1++; // Otherwise, just store the character at our Valueination } } *Value++ = '\0'; return; } } strcpy(Value, "undefine"); // If param not found, then use default parameter return; } void getAllParams() { // QUERY String holen env = fopen("/www/cgi-bin/temp/current_environment", "r"); //Inhalt der Environment Datei lesen while(env!=NULL && fgets(tmp, sizeof(tmp),env)!=NULL) { if (strstr(tmp, "QUERY_STRING='")) str_ptr = strtok(tmp, "&'"); for(i=0; str_ptr != NULL ;i++){ //fprintf(stdout, "%s\n", str_ptr); values[i] = str_ptr; str_ptr = strtok(NULL, "&'"); } } strcpy(InputData, values); } int main(int argc, char** argv) { //Variablen setzen FILE* fdmfile; FILE* fdmconfig; char data[80]; char* fdminfo; double f, fd,td; char ref[20] ="", plt[20] = ""; char query[255]; char line[256]; int linenum=0; char myName[100] = ""; char myAddress[100] = ""; getAllParams(); getParam("value", myName); getParam("externalcgi", myAddress); printf("QueryString: %s", InputData); printf("<br>"); printf("Name: %s", myName); printf("<br>"); printf("Address: %s", myAddress); //fdm_info Datei öffnen fdmfile = fopen("/fdm_info", "r"); //checken ob fdm_info geöffnet werden konnte if(fdmfile == NULL) goto done; //Inhalt der fdm_info holen und ausgeben if( fgets(data,80, fdmfile)) //fdm_info String aufsplitten sscanf(data,"F:%lf FD:%lf REF:%s PLT:%s TD:%lf", &f, &fd, ref, plt, &td); //hier beginnt das HTML gefrickel printf("<div class=confhead>\n"); printf("<a href='#10' onMouseUp = \"java\1:showHideInfo('id10','img_10');\">\n"); printf("<img class=opener src='/images/open.gif' alt='Open Box' border = 0 id=img_10 title = 'Aktuelle FDM Daten'>\n"); printf("Aktuelle FDM Daten</a></div>\n"); printf("<div style = 'display:none' id=id10>\n"); printf("<div class=cfgform><div class=cl-left></div><div class=cfgsubconfhead>FDM Daten</div><div class=cfgborders style='height:50px';><div class=cfginput>\n"); //Tabelle mit den Aktuellen Daten generieren printf("<span class=cfglabel style=\"width:100px;\">Frequenz: %f Hz </span>", f); printf("<span class=cfglabel style=\"width:150px;\">Frequenz Differenz: %f Hz </span>", fd); printf("<span class=cfglabel style=\"width:100px;\">Referenzzeit: %s </span>",ref); printf("<span class=cfglabel style=\"width:100px;\">Powerlinetime: %s </span>",plt); printf("<span class=cfglabel style=\"width:100px;\">Zeit Differenz: %fs </span>",td); printf("</div></div></div></div><br /><br />"); //fdm_info schließen fclose(fdmfile); //HTML Gefrickel Teil 2 printf("<form action = 'mainv2' method=GET>\n"); printf("<div class=confhead>\n"); printf("<a href='#10' onMouseUp = \"java\1:showHideInfo('id11','img_11');\">\n"); printf("<img class=opener src='/images/open.gif' alt='Open Box' border = 0 id=img_11 title = 'FDM Konfiguration'>\n"); printf("FDM Konfiguration</a></div>\n"); printf("<div style = 'display:none' id=id11>\n"); printf("<div class=cfgform><div class=cl-left></div><div class=cfgsubconfhead>FDM Konfiguration</div><div class=cfgborders style='height:auto;';><div class=cfginput>\n"); //FDM Konfiguration holen fdmconfig = fopen("/etc/fdm_monitor.conf", "r"); //Konnte FDM Config gelesen werden? if(fdmconfig == NULL) { printf("Couldn't open fdm_monitor.conf\n"); exit(22); } char key[256], value[256]; //Inhalt der FDM Config lesen und HTML Formular generieren while(fgets(line, sizeof(line), fdmconfig) != NULL) { //Feste Config Werte deklarieren linenum++; if(line[0] == '#') continue; if(sscanf(line, "%255[^=]= %255s", key, value) != 2) { fprintf(stderr, "Syntax error, line %d\n", linenum); continue; } for(i=0;i<N_CONFIG_OPTIONS;i++) { //printf("%s=%s\n<br>", key, config_varnames[i]); if(strncmp(key, config_varnames[i], strlen(config_varnames[i])) == 0) { printf("<span class=cfglabel style=\"width:120px;\">%s: </span><input type=text name = 'fdm.%s' value = '%s' size='30' id='fdm.%s' maxlength='100'><br />", config_names[i], config_varnames[i], value, config_varnames[i]); } } } //fdm_info schließen fclose(fdmconfig); //HTML abschließen printf("<input type=submit name=submit value=SaveConfig></div></div></div></div><br style=\"clear:both\" /><br /></form>"); done: return 0; }
Aktuelles Problem ist folgendes. Ausgabe ist QueryString: ������$;Rk}<br>Name: undefine<br>Address: undefine Was Vermutlich daran liegt das ich noch eine Fehlermeldung rauskriege. Entweder beim strcpy oder beim values[i] = str_ptr;
strcpy meckert das es char* erwartet und char** bekommt. Mache ich das Sternchen weg meckert er in der anderen Zeile das er ein char** erwartet.
Strange^^
EDIT: Ich htte eine Erleuchtung
Habe die getallaparams Funktion etwas umgeschrieben und nun geht es
void getAllParams() { // Determing if it is a POST or GET method env = fopen("/www/cgi-bin/temp/current_environment", "r"); //Inhalt der Environment Datei lesen while(env!=NULL && fgets(tmp, sizeof(tmp),env)!=NULL) { if (strstr(tmp, "QUERY_STRING='")) strcpy(InputData, tmp); str_ptr = strtok(tmp, "&'"); } }
-
char *values[4096]; bedeutet: declare values as array 4096 of pointer to char
Also ein Array aus 4096 Zeigern auf char.Durch das
strcpy(InputData, values);
wird jetzt das Array der Zeiger kopiert. Das willst du nicht.Nimm statt
#define ToHex(Y) (Y>='0'&&Y<='9'?Y-'0':Y-'A'+10)
strtol
mit basis 16 oder sscanf(...,"%2x",...).void getParam(const char *Name, char *Value) {
ist beschissen formatiert und es fehlt als Parameter die max. Platzangabe für Value.void getAllParams() {
eine Funktion ohne jegliche Parameter bzw. über globale Variablen ist wie C64-Basic.Du steigst nach einer Woche Pause selber nicht mehr durch das Programm durch.
Du brauchst eine bessere Struktur und bessere Variablennamen.
-
Ich werde deine Anregungen umsetzen.
In der Zwischenzeit habe ich das nächste Problem.
Aktueller Code unter http://pastebin.com/mW0rUnmm
Wird mittlerweile etwas lang zum hier posten^^
Ich versuche jetzt zu überprüfen ob das Formular abgesendet wurde.
Dazu mache ich eine If Abfrage. Vorher lasse ich mir zum überprüfen den Wert ausgeben.
Zur Info schonmal. Natürlich soll der wenn undefine da steht nicht ausgeben das das Formular abgeschickt wurde, weil undefine heißen soll das es genau das nicht ist. Aber ich will mit if (submit != "undefine") abfragen ob es das ist und selbst das funktioniert schon nicht.
getParam("submit", submit); printf("Wert von Submit: %s" , submit); if (submit == "undefine") { printf("Das Formular wurde abgeschickt"); }
Ausgabe ist Wert von Submit: undefine
Sprich er sollte ausgeben Das das Formular abgeschickt wurde. Und genau das macht er nicht.
-
Vielleicht hast du ja mittlerweile mitbekommen, das Strings in C anders behandelt werden als integrale Typen.
Da Strings aber so wichtig sind, gibt es extra dafür ein paar Funktionen in der Standardlibrary. Guckst du hier: http://www.cplusplus.com/reference/clibrary/
Die ist zwar für C++. Auf die meisten Unterschiede wird aber hingewiesen.Der Vergleich von Strings erfolgt über
strcmp()
Beachte den Rückgabewert.C ist nicht PHP oder Java.
-
Immer diese Umdenkerei^^
mit einem if(strcmp(submit, "undefine') != 0) gehts jetzt^^
-
Der Compiler kennt aber die meisten Fallstricke und warnt auch davor.
Setze den Warninglevel vom Compiler auf die höchste Stufe (alle Warnungen anzeigen)
Betrachte Warnungen wie Fehler und behebe sie.Eine erfolgreich erzeugte exe sagt nicht aus, dass das Programm fehlerfrei ist.