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目录中