上次以来,停了好几天,现在捡起来
上次说到发现了一个新问题,发现编译出来的bbsd,可以用cygwin下的telnet连
也可以用windows的telnet连,但就是不能用sterm连
后来琢磨了一下,想通了
应该是因为sterm不支持ipv6
按理来说,ustcbbsd在linux下运行时,是可以支持ipv4/ipv6无差别访问的
可是大概是cygwin的ipv6补丁不完善吧,总之支持了ipv6以后就不支持ipv4了
那么我们就回过头来考虑,我们原来是用给cygwin装ipv6补丁的方法解决ipv6问题的
但是其最好的办法是让bbsd在不支持ipv6的cygwin上也可以编译
就是说让bbsd不依赖ipv6环境
这个就要依赖于__CYGWIN__宏,作条件编译了
仔细分析了一下目前依赖ipv6的地方,主要有两个:
lib/ip.c
主要相关内容是字符串ip地址和数字ip地址互相转换
这个主要是为了处理.DIR中的ip地址,用于保存和显示
这个东西好改(这个文件就是我写的-_-)
bbsd.c
主要相关内容是端口的绑定和监听
这个就比较复杂了,幸好以前的代码是ipv4的,只不过删了
所以去svn里找历史版本,虽然看不懂,照葫芦画瓢把代码恢复了就可以了
这个过程还有一个插曲,后面讲
然后开始呜喳bbswww
上次说了,bbsfind.c会调用getloadavg(),这个函数ms cygwin不支持
google了一下,全是英文结果,随便看了一个,官网上的
大意似乎是说,这玩意现在不支持,能不能想个办法让他支持
算了,看上去很复杂的样子,屏蔽了算了
这东西的主要用途就是在系统负荷较高时禁用全站文章搜索
其实cygwin下,再怎么搞性能也好不了,这个地方干脆禁用
加个条件编译,cygwin下直接返回不繁忙
然后是lib/file.c有一个warning(奇怪上次记得没有)
看了一下,说的是把uid_t赋值给int
这个问题在linux下没有,可能是linux下和windows下类型定义不同
不管了,直接加一个强制类型转换,反正错不了
最后是lib/ip.c,前面fb2k已经改了,这里基本上相同
编译成功,不过因为没装lighttpd,所以暂时没有测
总之,还是很有成就感的
然后,把代码提交,从此USTCBBSD算是正式支持CYGWIN平台了,呵呵。
==============================================
附:菜鸟调查bug记
话说,我把ipv4代码恢复以后,编译,通过,运行,成功
但是,telnet一下,连不上,ps一下,发现进程已经退出了
为什么呢?想不通,没办法只好加printf语句调试
结果没反应,大概是服务程序不能输出信息吧
那么咱们用文件输出,自己打开文件输出未免太麻烦了,用report函数代替
另外,再开一个cygwin窗口tail -f trace
然而,结果很诡异
trace文件一直没变化,即使我把report函数写在main刚开始也不行
回头想一想,main刚开的地方应该还没有chdir(BBSHOME)
这个时候输出的trace文件应该在当前目录中
看了一下,果然。
好,一步一步定位,把report函数逐渐往后移
最后,在start_daemon函数的结尾,又发现了诡异现象
start_daemon的后半部分的report函数都没效果
难道是这里的问题吗?
但是看上去不像,因为这个地方怎么看也不像会异常退出的样子
只有一段: while(n) close(n--);
这个东西看不懂,这里的n是什么呢?
看前面n = getdtablesize();
这个函数啥意思呢?
google
原来是获得打开的符号表
这种用法属于daemon程序的定式,用于关闭标准输入标准输出之类的
看来是因为这个report没有效果
干脆再往后走,终于我们来到了bind_port4函数
yi!这个可是我加的代码,这个最可疑
在函数前面加一个report,后面再加一个report
结果发现前面的report输出了,后面的没输出,基本定位了
进入函数体,在函数开头加report,OK的
把report函数往后挪,结果在这个过程中发现了一个bbsd_log函数
嗨,原来如此,原来bbsd用的log函数在这呢
看了一下这个函数的输出路径 /home/bbs/reclog/bbsd.log
这回就不用report函数了,只要tail -f 这个文件就行了
这回连改代码都不用了,直接就可以看到之前的出错信息
error in bind port 23
...
err...
原来如此,看来确实是bind port的时候出错了
那么,是什么原因呢?
这个时候,我想起此前有一句被封掉的代码// xsin.xxx = AF_INET
这玩意看上去很可疑,把它解开,ok,这回ok了。
bbsd启动成功
telnet it,shm错误,这个难不倒我
根据上次的经验export CYGWIN=server
结果,终于登陆进去了
over
【 在 jackfnx (9907.玄之又玄) 的大作中提到: 】
: 说是日记,其实是昨天和今天两天,主要是讨个好彩头,希望明天还能有点进展
: 系统是cygwin1.5.25-15,其实就是最新的cygwin正式版,没特意选什么包
: 除了默认的包,好像就选了编译器和vim,记不太清了
: bbs代码是ustc当前的代码,base是fb2000,改了不少东西,不过应该对移植性
: 影响不大
: 第一天
: 刚刚开始就遇到了拦路虎
: ./configure的时候,提示编译测试程序失败
: 提示说ld 没有-export参数
: 在cn.bbs.admin.install发帖问,没人理,没办法只好自己研究
: .................(以下省略)