Mehere Zeilen von stdin



  • Hallo Zusammen

    Ich bin gerade für syslog-ng ein Output Programm am schreiben in C. Mein kleines Problem ist, dass der syslog-ng das Output-Programm beim Start von syslog-ng einmal startet und dann die Ausgaben jeweils immer per stdin dem Programm übergibt. Das Programm modifiziert den per stdin übergebenen String und schreibt die Ausgabe in eine Datei. Das funktioniert perfekt wenn ich immer nur eine einzelne Zeile übergebe und dann das Programm neustarte, nur sollte eben die Eingabe über mehrere Zeilen möglich sein. Kann mir jemand sagen wie das funktioniert?

    Mein Programm für eine einzelne Zeile sieht so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(void)
    {
            char line[1024];
            char tempvar[4];
            char *date = NULL;
            char *time = NULL;
            char *ip = NULL;
            char *full_message = NULL;
            char *severity = NULL;
            char *name = NULL;
            char *message_number = NULL;
            char *message_text = NULL;
            char *tempvariable = NULL;
            FILE *fp2;
            fp2 = fopen("/var/log/syslogdb", "a+");
            fgets(line,1024,stdin);
                    if (strlen(line)!=1) {
                            date = strtok(line,";");
                            time = strtok(NULL,";");
                            ip = strtok(NULL,";");
                            full_message = strtok(NULL,";");
                            message_text = (char *) malloc(strlen(full_message));
                            strncat (tempvar,full_message,4);
                            if (tempvar == "%ASA") {
                                    strncat (message_text, full_message+15,strlen(full_message)-15);
                            } else {
                                    strncat (message_text, full_message+16,strlen(full_message)-16);
                            }
                            name = strtok(full_message,"-");
                            severity = strtok(NULL,"-");
                            tempvariable = strtok(NULL,"-");
                            message_number = (char *) malloc(6);
                            strncpy(message_number,  tempvariable, 6);
                            fprintf(fp2,"INSERT INTO `syslogdb`.`syslogdb` (`id`,`date`,`time`,`ip`,`severity`,`message_number`,`text`) VALUES (NULL,'%s','%s','%s','%s','%s','%s');\n",date,time,ip,severity,message_number,message_text);
                    }
            fclose(fp2);
            return 0;
    }
    

    Ich habe es versucht in dem ich die "fgets" zeile mit einem While versehen habe:

    while(fgets(line,1024,stdin))
    

    Doch dann funktioniert gar keine übergabe mehr...

    Kann mir jemand bei meinem Problem helfen?

    Habe leider nicht sehr viel C Ahnung, bin da eher der PHP Programmierer 🙂

    Danke für euere Hilfe



  • Vermutlich mußt du nicht nur den fgets()-Befehl in die while-Schleife packen, sondern den gesamten Verarbeitungsblock.

    PS: Außerdem fällt mir auf Anhieb ein Speicherleck ( message_number = (char *) malloc(6); wird nie freigegeben) und ein potentieller Zugriffsfehler (der in message_number reinkopierte String ist nicht notwendigerweise Null-ternimiert) auf. Und auf den zweiten Blick bringt auch der Vergleich if(tempvar=="%ASA") nicht das, was du im Sinn hast 😉



  • mhh ja klar ich hatte den gesamten Block in einer While Schleife:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(void)
    {
            char line[1024];
            char tempvar[4];
            char *date = NULL;
            char *time = NULL;
            char *ip = NULL;
            char *full_message = NULL;
            char *severity = NULL;
            char *name = NULL;
            char *message_number = NULL;
            char *message_text = NULL;
            char *tempvariable = NULL;
            FILE *fp2;
            fp2 = fopen("/var/log/syslogdb", "a+");
            while(fgets(line,1024,stdin))
            {
                    if (strlen(line)!=1) {
                            date = strtok(line,";");
                            time = strtok(NULL,";");
                            ip = strtok(NULL,";");
                            full_message = strtok(NULL,";");
                            message_text = (char *) malloc(strlen(full_message));
                            strncat (tempvar,full_message,4);
                            if (tempvar == "%ASA") {
                                    strncat (message_text, full_message+15,strlen(full_message)-15);
                            } else {
                                    strncat (message_text, full_message+16,strlen(full_message)-16);
                            }
                            name = strtok(full_message,"-");
                            severity = strtok(NULL,"-");
                            tempvariable = strtok(NULL,"-");
                            message_number = (char *) malloc(6);
                            strncpy(message_number,  tempvariable, 6);
                            fprintf(fp2,"INSERT INTO `syslogdb`.`syslogdb` (`id`,`date`,`time`,`ip`,`severity`,`message_number`,`text`) VALUES (NULL,'%s','%s','%s','%s','%s','%s');\n",date,time,ip,severity,message_number,message_text);
                    }
            }
            fclose(fp2);
            return 0;
    }
    

    Nur bringen tuts nicht viel 😞

    Wegen dem anderen:
    Ja die message_number, könnte ich auch direkt oben auf 6 Zeichen deklarieren.

    Und wie verhindere ich dann den Zugriffsfehler mit der message_number?

    Und ja, die if Abfrage mit "%ASA" geht schief, warum? Interpretiert er das '%A' ??

    Dankö



  • Schnitzel86 schrieb:

    Wegen dem anderen:
    Ja die message_number, könnte ich auch direkt oben auf 6 Zeichen deklarieren.

    Und wie verhindere ich dann den Zugriffsfehler mit der message_number?

    Indem du das Array mit 7 Zeichen anlegst (und in message_number[6] eine \0 reinpackst). Strings in C werden dargestellt durch ein null-terminiertes char-Array - und im Ernstfall mußt du daran denken, daß dieser Terminator auch Platz benötigt.

    Und ja, die if Abfrage mit "%ASA" geht schief, warum? Interpretiert er das '%A' ??

    Nein, der vergleicht die übergebenen Zeiger - temp_var (hat übrigens auch keinen Platz für den Null-Terminator) liegt auf dem Stack, "%ASA" ist ein String-Literal und liegt im Daten-Segment, also liefert der Vergleich mit Sicherheit false. Wenn du die Inhalte vergleichen willst, nimm strcmp().


Anmelden zum Antworten