2009年9月17日木曜日

CによるCGI作成

※この説明はRedhatLinuxV8.0を元にしている。


サーバ側:受信データの取得(環境変数取得)
    これが受信文字列取得&変数代入。
    書式と変数を増やすだけで、引数の増加に対応可能。 '&%*[^=]=%[^&]' が追加単位。
    書式が入力されるデータの数より多い場合、あまった書式指定は無視されるので、大らかに行きましょう。

    sscanf( getenv("QUERY_STRING"),
        "%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]",
        strP1r, strP2, strP3, strP4, strP5, strP6
    );


サーバ側:特定プロセスの状態(StartOrStop)確認
    (例はntpサーバデーモン)
    popen( )を使用することで、grep結果を仮想ファイルに吐き出して、それを読み込んで処理する。

    if( (pFile = popen( "ps -ef |grep ^ntp", "r" ) ) == NULL ){
        fprintf( stderr, "error!\n" );
        exit( -1 );
    }
    sprintf( statusNtp, "dead" );
    while( fgets( strLine, 128, pFile ) ){
        if( 0 == strncmp( strLine, "ntp", 3 ) ){ /* ntpd is Alive */
            sprintf( statusNtp, "alive" );
            break;
        }
    }
    pclose( pFile );


サーバ側:管理者権限コマンドの実行
    ntpサーバのリブート

    1.一般ユーザにて、シェルにリブートコマンドを渡すプログラム作成。
        suNtpReboot.c
            main(){
                setuid( 0 );
                setgid( 0 );
                system( "/etc/rc.d/init.d/ntpd restart" );
            }

    2.rootに切り替え

    3.コンパイル結果のオーナーを変更
        chown root suNtpReboot.o

    4.パーミッション変更
        chmod +s suNtpReboot.o

    5.CGIから実行
        system( "/var/www/cgi-bin/suNtpReboot.o" );


クライアント側:JavaScript-特定画面のリロード

    puts( "\n"
        "
        -->\n\n"
    );



クライアント側:JavaScript-よくある、うるう年チェック

    printf("// 2(Feb.) Proc\n");
    printf("if( document.form.dateMonth.value == 2 ){\n");
    printf("    // LeapYear Check\n");
    printf("    if( ( (( document.form.dateYear.value % 4 ) == 0 )\n");
    printf("      &&(( document.form.dateYear.value % 100 ) != 0 ) )\n");
    printf("              ||\n");
    printf("        ( ( document.form.dateYear.value % 400 ) == 0 )\n");
    printf("    ) { // LeapYear Proc\n");
    printf("        if( document.form.dateDay.value > 29 ){\n");
    printf("            alert(\"指定された月の日数は29日までです\");\n");
    printf("            return false;\n");
    printf("        }\n");
    printf("    } // End of LeapYear Proc\n");
    printf("else{ // Non-LeapYear Proc\n");
    printf("    if( document.form.dateDay.value > 28 ){\n");
    printf("        alert(\"指定された月の日数は28日までです\");\n");
    printf("        return false;\n");
    printf("    }\n");
    printf("    } // End of Non-LeapYear Proc\n");
    printf("} // End of 2(Feb.) Proc\n");

-eod-