QUERY_STRING aus Datei auslesen



  • Manchmal braucht man Montags morgens nur nen Fingerzeig

    while(env!=NULL && fgets(tmp, sizeof(tmp),env)!=NULL)
            {
            if (strstr(tmp, "QUERY_STRING="))
            printf("%s", tmp);
            }
    

    So hab ich es gelöst.

    Funktionen deklarieren in c hatte ich noch nicht^^

    Vermute aber das es ähnlich funzt wie bei PHP.

    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.



  • 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=SaveConfig

    Aber 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&nbsp;&nbsp;</span>", f);
        printf("<span class=cfglabel style=\"width:150px;\">Frequenz Differenz: %f Hz&nbsp;&nbsp;</span>", fd);
        printf("<span class=cfglabel style=\"width:100px;\">Referenzzeit: %s&nbsp;&nbsp;</span>",ref);
        printf("<span class=cfglabel style=\"width:100px;\">Powerlinetime: %s&nbsp;&nbsp;</span>",plt);
        printf("<span class=cfglabel style=\"width:100px;\">Zeit Differenz: %fs&nbsp;&nbsp;</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: &nbsp;</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.


Anmelden zum Antworten