boa是比較老的HTTP的本地Server,本文是針對0.94.13版本的編譯過程做出記錄
1.下載boa的程序包,本文的編譯是針對misp平臺的交叉編譯
2.在編譯之前,需要針對產品的文件系統和修改編譯時可能遇到的錯誤,修改相關的文件。
(1)src/boa.c ?注釋掉可引起編譯錯誤的語句
line209開始注釋如下語句
#if 0
? ? ? ? passwdbuf = getpwuid(server_uid);
? ? ? ? if (passwdbuf == NULL) {
? ? ? ? ? ? DIE("getpwuid");
? ? ? ? }
? ? ? ? if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
? ? ? ? ? ? DIE("initgroups");
? ? ? ? }
#endif
line 227開始,注釋如下語句
#if 0
? ? ? ? if (setuid(0) != -1) {
? ? ? ? ? ? DIE("icky Linux kernel bug!");
? ? ? ? }
#endif
(2)src/compat.h ? line120
修改前 ?#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改后 ?#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
(3)src/log.c ? line 72開始注釋如下語句
? ? ? ? /*if (dup2(error_log, STDERR_FILENO) == -1) {? ? ? ? ? ? DIE("unable to dup2 the error log");
? ? ? ? }*/
(4)src/config.c ? line255
該處打開的是boa的配置文件,可以根據自己的文件系統修改該配置文件位置,如:
yyin = fopen("/system/boa.conf", "r");
line 289 該目錄需要與上述的boa.conf配置文件的目錄一致
? ? ? ? tempdir = "/system";
(5)src/defines.h ?line30
該目錄信息,是boa的應用所處于的位置
#define SERVER_ROOT "/usr/boa"
3.編譯注意事項:
(1)直接按照交叉編譯,傳遞參數給configure,會出現如下錯誤:
configure: error: can not run test program while cross compiling
解決方案如下:
在當前PC下,只執行./configure而不傳遞任何的參數
注:此時生成的Makefile中,CC環境變量還是gcc,需要制定為你使用的交叉編譯鏈中的gcc。如:
CC = /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/bin/mips-linux-gnu-gcc?
CPP環境變量修改為交叉編譯鏈中的cpp,如:
CPP = /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/bin/mips-linux-gnu-cpp
然后運行make進行編譯,得到的可執行程序為boa,將調試信息剝去,得到的最后程序只有約73KB大小。
/home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/bin/mips-linux-gnu-strip boa
(2)配置boa.conf
在boa的源碼包中提供了一個boa.conf的初始樣例,可以基于這個文件進行修改。其中幾個關鍵的參數如下:
Port 80 ? ---------boa服務器所在端口信息
DocumentRoot /system/www ?-----HTML文檔的主目錄
ScriptAlias /cgi-bin/ /system/www/cgi-bin/ ?-----指明CGI腳本的虛擬路徑對應的實際路徑
4.編譯hello.cgi
紅色部分是共享資源對應的目錄
int main(void)
{
char *data;
char name[30] = {0};
char tr_name[50] = {0};
? ? ? ? printf("Content-type: text/html\n\n");
? ? ? ? printf("<html>\n");
? ? ? ? printf("<head><title>CGI Output</title></head>\n");
? ? ? ? printf("<body>\n");
data=getenv("QUERY_STRING");
if(data != NULL){
sscanf(data,"name=%s",name);
? ? ? ? sscanf(name,"%[^&]",name);//正則表達式,遇到&就結束
memset(tr_name,'\0',50);
sprintf(tr_name,"/system/www/SDPath/%s",name);
read_dir(tr_name);
}else{
memset(tr_name,'\0',50);
sprintf(tr_name,"/system/www/SDPath");
read_dir(tr_name);
}
? ? ? ? printf("<body>\n");
? ? ? ? printf("</html>\n");
? ? ? ? exit(0);
}
5.拷貝文件
(1)拷貝boa、boa.conf、mime.types到/usr/boa目錄中
(2)拷貝hello.cgi到 /usr/www/cgi-bin目錄中