タグ別アーカイブ: cgi

C言語でCGIしてみましょう!!

タグ: | 投稿日: 投稿者:

まいど。いかおです

今やraspberry piなんかでperlが使えるご時世にあえてC言語でCGIの例を・・・

・ヘッダーの情報はgetenv()で取得できる

・FORMの情報はPOSTならstdinからCONTENT_LENGTH分読み込んだもの、GETならヘッダ情報のQUERY_STRINGの内容である

・responceは基本的にstdoutへ書き出す

ヘッダ情報の取り出し例

/* Enviroment element */
const char      *c_list[] = {"SERVER_SOFTWARE", "SERVER_NAME", "GATEWAY_INTERFACE", "SERVER_PROTOCOL",
                        "SERVER_PORT", "REQUEST_METHOD", "PATH_INFO", "PATH_TARNSRATED", "SCRIPT_NAME",
                        "QUERY_STRING", "REMOTE_HOST", "REMOTE_ADDR", "AUTH_TYPE", "REMOTE_USER",
                        "REMOTE_IDENT", "CONTENT_TYPE", "CONTENT_LENGTH", "HTTP_ACCEPT", "HTTP_USER_AGENT", ""};

 for (i=0;c_list[i][0] != 0x00;i++) {
    if ((p=getenv (c_list[i])) != NULL) {
         p; // これをなんとかする
    }
}

FORM情報の取得(POST)

#define MAX_PARALEN 4096
char    buff[MAX_PARALEN]

memset (buff, 0x00, MAX_PARALEN);
int pos=0;
int remain=length;
while (remain > 0) {
    if ((len=fread (&(buff[pos]), 1, remain, stdin)) > 0) {
        remain = remain - len;
        pos = pos + len;
    }
}

ここで取得したbuffを'&'でセパレートしてやれば

name=valueが取り出せます

pos=0; pcnt=0;
for (i=0;i < length ;i++) {
    if (buff[i]=='&') {
       // ここがname=valueの先頭アドレス
        &(buff[pos]);
        // ここがname=valueの長さ
        (i - pos));
    }
}

responceの例

printf()とかでstdoutに吐き出していきます

static  const   char    *index_html[] = {"&lt;!DOCTYPE html&gt;\n",
                                                           "&lt;html&gt;\n",
                                                           "&lt;body&gt;\n",
                                                           "&lt;h1&gt;Hello world&lt;/h1&gt;\n",
                                                           "&lt;/body&gt;\n",
                                                           "&lt;/html&gt;\n",
                                                           ""
};
.
.
for(int i=0;index_html[i] != "";i++){
    printf(index_html[i]);
}
.
.

※本気でやりたい人がいますかね。。。。