Goahead webServer在vxworks上的移植

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。然后将这两个文件夹粘贴到工程文件夹下,把主目录源文件导入工程。

Goahead webServer在vxworks上的移植_第1张图片

       话说Tornado2.2工程中不能新建文件夹,工程管理方面比较混乱,导进来一团糟,不过还是先忍忍吧,以后换成workbench就会好很多。点击添加依赖属性自动导入依赖头文件。添加如下宏定义。发现将添加到makefile文件中,根本不起作用。而在tornado里又没有找到可以直接包含宏定义的选项,就自己新建一个头文件,将其包含进来:


在uemf.h添加这个头文件即可。在uemf.h 中找到UNICODE 程序段,在后面的define 语句中添加

#definegstrspn strspn

#definegstrcspn strcspn  //add by lining

         编译如下:

Goahead webServer在vxworks上的移植_第2张图片

         (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函数中有一些标示符没有定义

Goahead webServer在vxworks上的移植_第3张图片

         网上查这个一个网页白名单的支持,应该和安全相关,可以不对其支持,在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函数中找不到一大堆函数

Goahead webServer在vxworks上的移植_第4张图片

         同样在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 webServer在vxworks上的移植_第5张图片

         这样,Goahead就在vxworks中就运行起来了,其实还是很方便的,稍后研究其特性、运行过程以及与底层的通信方法。


你可能感兴趣的:(Goahead webServer在vxworks上的移植)