apacheprogramm



  • hi

    ich bin noch relativ neu in C und würde gerne mal aus spaß ein kleines programm für den apache webserver schreiben (sowas wie php, nur eben in kleineren ausmaßen 🙂 ).

    meine frage ist jetzt:

    wenn ich in die httpd.conf so etwas reinschreibe wie

    ScriptAlias /bla/ "c:/bla/"
    AddType application/x-httpd-bla .bla
    Action application/x-httpd-bla "/bla/bla.exe"
    

    dann wird beim aufruf von z.B. "http://localhost/test.bla" mein programm bla.exe aufgerufen. aber welche variablen bekommt die bla.exe dann eigentlich? und welche variablen muss ich zurückliefern?

    ich hoffe es war einigermaßen verständlich!

    danke, Herr-Vorragend



  • noch nicht probiert.. (wäre auch ne schöne weekend beschäftigung.. )

    also: ich denke, es kommt über kommandozeile rein (php kann man ja auch einfach starten mit übergabe einer datei..)

    ausgabe: du musst es mit html header zurückgeben, so wie es php auf konsole auch fabriziert.. ohen ordentlichen header wirds schwer.

    ich probiers am weekend mal..





  • @andreas: das bezieht sich ja glaub ich alles auf cgi und nicht c

    @elise: da bin ich ja mal gespannt 🙂



  • AndreasW liegt im grunde richtig.

    du musst die umgebungsvaribalen auslesen, um die datei zu bekommen, die die angeforderte html seite war.

    gemacht habe ich folgendes:

    meine skriptaliase 😉

    ScriptAlias /cgi-bin/ "D:/Apache/cgi-bin/"
        ScriptAlias /php3/ "d:/php3/"
        ScriptAlias /php4/ "d:/php4/"
        ScriptAlias /php5/ "d:/php5/"
        ScriptAlias /bla/ "d:/cApache/"
    

    einfach einen ordner mit alias 'bla' gesetzt.
    unter meiner cgi erlaubnis braucht der ordner ausführungsrechte...

    <Directory "D:/Apache/cgi-bin">  
            AllowOverride None
    	Options ExecCGI
    	Order deny,allow
    	Deny from all
    	Allow from 127.0.0.1
    
        </Directory>
         <Directory "d:/cApache">
                AllowOverride None
        	Options ExecCGI
        	Order deny,allow
        	Deny from all
        	Allow from 127.0.0.1
    
        </Directory>
    

    dann die types..

    AddType application/x-httpd-php .php
        AddType application/x-httpd-php-source .phps
        AddType application/x-tar .tgz    
        AddType application/x-httpd-eruby .rhtml
        AddType application/x-httpd-php5 .php5
        AddType application/x-httpd-bla .bla
    

    und die action

    Action application/x-httpd-php3 /php3/php.exe
        Action application/x-httpd-php /php4/php.exe
        Action application/x-httpd-php5 /php5/php.exe
        Action application/x-httpd-eruby /cgi-bin/eruby
        Action application/x-httpd-bla /bla/bla.exe
    

    dann musste ich mich ein wenig verenken, um die umgebungsvariablen zu erhaschen..

    int main(int argc, char **argv, char **argenv)
    { 
         char *content_type = NULL;
         unsigned long content_length = 0;
         unsigned long offset = 0;
         char **aptr;
    
         puts("Content-type: text/html\n\n");
    
         fflush(stdout);
          puts("Werte der Umgebungsvariablen:\n<br>");
         aptr = argenv;
    
         int i=0;
         while (*aptr){
             puts(*(aptr++));
             puts("\n<br>");
             i++;
         }
    
         fflush(stdout);
    
         puts("Path:\n<br>");
         puts(*(argenv+(i-1)));
         fflush(stdout);
    }
    

    man braucht ja die angeforderte datei, um sie später dann durchlaufen zu können nach <?bla ... ?> zum einsetzen von code..
    wichtig: die html ankündigung.. ohne interpretiert der apache die seite nicht.
    die error logs verkünden fehler.

    in der zeile

    puts(*(argenv+(i-1)));
    

    gebe ich nochmal explizit den statischen pfad der aufrufenden datei aus.. da kann man dann file öffnen und weiterverarbeiten draus bauen.

    im grunde ist es aber cgi..

    viel spaß 🙂



  • das ist ja mal höchst interessant. mal sehn was sich draus machen lässt.

    tausend dank, Herr-Vorragend



  • boah, super, funktioniert wunderbar! nochmals danke!



  • noch 3 fragen *spam*

    1. was bedeuten die 3 argumente der funktion main()?
    2. weil ich mich in c kaum auskenne weiß ich noch nicht einmal, wie ich zu einem string einen weiteren string hinzufügen kann (in php: $bla .= "Hallo";)
    3. weil ich mich in c kaum auskenne weiß ich noch nicht einmal, wie ich den inhalt einer datei (in diesem fall der inhalt des eigentlichen scripts) auslesen kann. die wiederholung von fgetc ist mir zu umständlich.

    danke



  • das dritte argument gibt die umgebungsvariablen.. nur zur ansicht..

    wir wollen zum beispiel REQUEST_URI, dann kriegen wir den wert über
    getenv("REQUEST_URI");

    dann kannst du eine datei öffnen .. und auslesen.

    so long



  • @vorragend
    Zum Auslesen der Datei würde ich dir anstatt fgetc() (->liest ein Zeichen) fgets() (-> liest eine Zeile, also bis zum \n oder Dateiende) empfehlen.

    Zum Anhängen kannst du strcat() verwenden. Besser ist aber strncat(), weil du da die maximale Länge angeben kannst, die du noch zur Verfügung hast.

    Beispiel:

    ...
    char text[10] = "hallo ";
    
    strcat(text, "du"); //Passt noch rein
    strcat(text, " da draußen"); //Passt nicht mehr rein und schreibt irgendwo im Speicher rum!
    
    //Besser!
    strncat(text, sizeof(text)-strlen(text)-1, "leute"); //hängt nur die noch zur verfügung
    //stehende Anzahl an Zeichen an; die abschließende \0 nicht vergessen ;)
    text[sizeof(text)-1]=0;
    ...
    

    Edit: Da fehlte ein wichtiger Buchstabe 😃



  • danke, und wie ist die syntax von fgets?

    also bei php war's so: bla=fgets(bla = fgets(fp, 1024);



  • nu wirds zeit für ein gutes buch oder tutorial..

    http://www.pronix.de/index.php?site=C/standard_C/c_programmierung_19_3#16

    😉



  • Ja würd ich auch sagen...



  • Man kann sich zur Übung auch noch mal den PHP Quellcode 'runterladen! 😉



  • @flying
    Und was hilft ihm php, wenn er C programmieren will??



  • @AJ
    weil php in c programmiert ist, und man da einige sachen nachschauen kann (so nach dem motto: wie haben die das gelöst... 😉 )

    @flying
    dagegen steht, daß er es wohl aus übungsgründen einfach mal selber machen wollte...



  • @elise
    Ach so. Ich hab das anders verstanden und zwar, dass er sich Quellcode in PHP runterladen soll. Aber jetzt ist mir das klarer. Danke!



  • elise schrieb:

    @flying
    dagegen steht, daß er es wohl aus übungsgründen einfach mal selber machen wollte...

    War ja auch nur als Anregung gedacht 😉 (Ich habe mir den Quelltext auch mal heruntergeladen --- alleine die Dateigröße ist erschreckend (zudem gezipt).)

    MfG, the flyingCoder.


Anmelden zum Antworten