Goahead webServer在vxworks上的移植
DanielLee_USTB [email protected]
2013-8-29
今天开始移植念了很长时间的webServer, 选定的为Goahead开源web服务器,支持多种操作系统,应用非常广泛。我使用的vxworks5.5的版本比较老,开发环境为tornado2.2,在升级之前还算能用,关于webServer的移植部分可以参考的文章很多,写此博文只想记录期间遇到的问题和解决方法。
一、移植
由于Goahead已被oracle收购,最新版本的Goahead2.5已经不能在其官网上下载,可以在其他网站上下载,要保证是没有改动过的源码。我下载到两个压缩包,一个是webs-2-5,一个是他的补丁wsUpload-2.1.1。解压webs-2-5,删除其中的文件夹CE、ECOS、LINUX、LYNX、NW、MACOSX、QNX4、WIN 及文件websSSL.c、websSSL.h。然后将这两个文件夹粘贴到工程文件夹下,把主目录源文件导入工程。
话说Tornado2.2工程中不能新建文件夹,工程管理方面比较混乱,导进来一团糟,不过还是先忍忍吧,以后换成workbench就会好很多。点击添加依赖属性自动导入依赖头文件。添加如下宏定义。发现将添加到makefile文件中,根本不起作用。而在tornado里又没有找到可以直接包含宏定义的选项,就自己新建一个头文件,将其包含进来:
在uemf.h添加这个头文件即可。在uemf.h 中找到UNICODE 程序段,在后面的define 语句中添加
#definegstrspn strspn
#definegstrcspn strcspn //add by lining
编译如下:
(1)发现还是有一些有些宏定义找不到,因为头文件可能没有包含进来。提示:\webs-2-5\webs-2-5\cgi.c:691: `SYM_TYPE' undeclared
添加以下头文件可以解决这个问题。
#include "symLib.h"
#include "sysSymTbl.h"
#include "loadLib.h"
(2)又出现以下错误:提示default.c中websBuildWhitelistRecursive函数中有一些标示符没有定义
网上查这个一个网页白名单的支持,应该和安全相关,可以不对其支持,在web.h 中把#define WEBS_WHITELIST_SUPPORT 1注释掉即可Default就可以编译通过了。
(3)接着看下一个编译错误。下一个错误出现在sockGen.c:358:`socklen_t' undeclared,其实socklen_t应该在<sys/socket.h>中有定义,在sockGen.c中添加这一库文件,其实socklen_t应该是int型,所以添加#define socklen_t int 即可。
(4)websOpenServer中使用的fd没有定义。这个fd是从哪来的呢?很显然lseek(fd,0, SEEK_END)中fd是放进来没有改正的,应该为打开的log和trace的文件句柄,改为:
//lseek(fd, 0, SEEK_END);
lseek(websLogFd, 0, SEEK_END);
//lseek(fd, 0, SEEK_END);
lseek(websTraceFd,0, SEEK_END);
这个文件就可以编译通过了。
(5)webs.c:1906:structure has no member named `tm_gmtoff'是说tm这个结构体中没有tm_gmtoff这个成员。
大家都知道tm这个结构体的定义为
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
这是标准的posix定义,是没有tm_gmtoff成员的,这是 libc BSD拓展版本。websLog的主要功能就是弹出一个登陆界面,输入必要信息才能进入界面,无疑增强了系统的安全性。
在测试阶段先把这个功能注释掉,等通过能登陆web再回来研究
在web.h 中注释掉#define WEBS_LOG_SUPPORT 1
(6)在websCgiHandler函数中找不到一大堆函数
同样在cgi.c 中增加 #undef WEBS_WHITELIST_SUPPORT
In function `websCgiHandler': undefined reference to`vxchdir'
原来这个函数是在main.c中定义的,而之前没有导入main.c导入之后再编译即可解决这一问题。
In function `websMD5binary':
undefined reference to `psMd5Init'
undefinedreference to `psMd5Update'
undefinedreference to `psMd5Final'
这个函数在websda.c函数中引用了md5.h中声明的函数,在md5c.c中定义,然而为什么没有引用到它们呢?原因是没有引用#include"mydefine.h",因而没有编译到md5c.c,所以引用不到。加入之前定义的宏定义#include "mydefine.h"就可以编译通过了。
二、配置
(1)新建main.c 函数声明文件mainfunc.h用来声明websvxmain函数
#ifndef _MIANFUNC_H
#define _MIANFUNC_H
extern int websvxmain(int argc, char **argv);
#endif
在main.c中加入这一引用,在usrAppInit.c中添加 #include "./webs-2-5/webs-2-5/VXWORKS/mainfunc.h"
taskSpawn("webserver",90,0,1024*100,(FUNCPTR)websvxmain,0,0,0,0,0,0,0,0,0);
这里要说一点就是在包含有多层文件夹内的头文件的引用问题,进入上层文件夹到底为“../”还是“./”呢?原来“./”为本级文件,“../”为上一级菜单,一定要分清楚。
(2)配置main.c
#define ROOT_DIR T("/C ")
static char_t *rootWeb= T("/webs/www");
static char_t *demoWeb= T("/webs/wwwdemo");
static char_t *password= T("");
static int port= 80;
将所需的网页文件夹拷贝到文件系统内,在浏览器中输入http://192.168.253.123:80显示:
问题出现在default.c中的 websDefaultHandler中的
/*
* Open the document. Stat for later use.
*/
if(websPageOpen(wp, lpath, path, O_RDONLY | O_BINARY,
0666) < 0){
websError(wp,404, T("Cannot open URL,lining2"));
websBuildWhitelist();
return 1;}
提示找不到所用网页,可是为什么打开的是默认网页为home.asp而WWW文件夹中的网页为home.htm,一定是这里的问题。
在staticint initWebs(int demo)中调用了websUrlHandlerDefine(T("/"),NULL, 0, websHomePageHandler, 0);
修改其中的websHomePageHandler中定义的默认网页websRedirect(wp, T("home.asp")); 为websRedirect(wp,T("home.htm"));
测试结果如下:
这样,Goahead就在vxworks中就运行起来了,其实还是很方便的,稍后研究其特性、运行过程以及与底层的通信方法。