ラッパー作ってみた。
rlwrapに感動して、gaucheでcgiを行う為のラッパーを作ってみた。
標準エラー出力を標準出力にマージし、先頭にhtmlヘッダが無いときに付加する。(本当は標準入力と環境変数を出力しようとしたが力尽きた。)
とりあえず終了。
それ以前に、schemeでcgi書くだけの能力がないことを思い出した(笑
execlにargv[1]以降を渡す方法もできたら調べようね。(もうすっかりCは素人以下) -> ++argv でOK (K&R rel2 P140)
ポインタを渡す場合にはexecvでよい。
argv[0]を書き換えてないので自身の名前を利用するプログラムでは何か起こるかも。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define CMD "/usr/bin/gosh" #define HEADER "Content-type: text/html" int main(int argc,char **argv){ char buf[256],*addr; int i,flg,fds[2]; FILE *ptr; pipe(fds); flg=0; i=0; if(fork()){ close(fds[1]); ptr = fdopen(fds[0],"r"); while(fgets(buf,sizeof(buf),ptr)){ if (flg==0) { if (strncmp(buf,HEADER,sizeof(HEADER)-1)!=0) { fputs("Content-type: text/plain\n\n",stdout); } flg=1; } fputs(buf,stdout); } fclose(ptr); }else{ dup2(fds[1],1); dup2(fds[1],2); execv(CMD,argv); perror("execl"); exit(1); } }