荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (2 years), 信区: InstallBBS
标  题: innbbsd+FreeBSD-HOWTO(v0.2)
发信站: 荔园晨风BBS站 (Thu Aug  8 01:22:18 2002), 转信


innbbsd+FreeBSD-HOWTO

jjk,
<antispam.jjk.bbs@antispam.bbs.szu.edu.cn(remove both "antispam.")>

v0.1, 03, August 2002

Revision History

Revision V0.2 07, August 2002

==========================================================================
此文档将会告诉你如何在FreeBSD安装innbbsd。注:此文档不包括所有的安装说明
希望这份文档能对其他人有用。欢迎有其他意见,
==========================================================================
<1>. 要使 innbbsd 在 FreeBSD下运行需要怎样做。
     1. 错误诊断。
     2. 修改 dbzserver.c 和 inndchannel.c
<2>. 怎样解决在FreeBSD下被动转信时不能跨站砍信的问题。
     1. 错误诊断。
     2. 修改his.c
<3>. 结束。
==========================================================================
<1>. 要使 innbbsd 在 FreeBSD下运行需要怎样做。
--------------------------------------------------------------------------
   先参考innbbsd自带的README, 在了解innbbsd之后,就开始做跟FreeBSD相关的
   东西。
   1. 错误诊断。
      以下面版本的innbbsd为例,说明如何诊断innbbsd的错误。如果不想知道为
      什么要改的话就跳过这里直接看第2部分吧。
      innbbsd版本如下:
      VERSION         = 0.50beta-5F
      NCMVERSION      = NoCeM_0.66
      按照README所说的安装好innbbsd之后,

接着设置好bbsname.bbs newsfeeds.bbs nodelist.bbs

# su bbs
$ /home/bbs/innd/innbbsd
su-2.04$ /home/bbs/innd/innbbsd
su-2.04$ PID file is in /usr/tmp/innbbsd-7777.pid
Try to listen in port (null) and path (null)
Trying to listen in port 1904
Trying to listen in port .innbbsd1
bind: Address already in use
.innbbsd1: Address already in use
Trying to listen in port .innbbsd2
.innbbsd2/tcp: Unknown service.
local pmain, existing: Address already in use
if no other innbbsd running, try to remove (null)

或者出现跟这个类似的信息

%PID file is in /usr/tmp/innbbsd-7777.pid
Try to listen in port (null) and path (null)
Trying to listen in port 1904
Trying to listen in port .innbbsd1
bind: Permission denied
.innbbsd1: Permission denied
Trying to listen in port .innbbsd2
.innbbsd2/tcp: Unknown service.
local pmain, existing: Permission denied
if no other innbbsd running, try to remove (null)

但是在Redhat 6.2下面编译后运行就没问题。

[bbs@fly innd]$ PID file is in /usr/tmp/innbbsd-7777.pid
Try to listen in port 7777 and path /home/bbs/innd/.innbbsd

[bbs@jjk innbbsd]$ telnet localhost 7777
Trying 127.0.0.1...
Connected to jjk.szu.edu.cn.
Escape character is '^]'.
200 flyBBS InterNetNews INNBBSD server 0.50beta-5F_NoCeM_0.63

(bbs@jjk.szu.edu.cn).

quit
[bbs@jjk innd]$

说明是freebsd自己的问题。
再继续追查原因。用暴力法把那个端口也改了,还是不行。

分析下面这段错误信息:
su-2.04$ /home/bbs/innd/innbbsd
su-2.04$ PID file is in /usr/tmp/innbbsd-7777.pid
                                         ~~~~这里表明port还是用默认的7777
Try to listen in port (null) and path (null)
                      ~~~~~~~          ~~~~~~但这两个就变了。
Trying to listen in port 1904
怎样解决这个问题呢?请看下面的解决方法。

      2. 分别修改 dbzserver.c 和 inndchannel.c

在standaloneinit()里面,作如下修改:

-sprintf(pidfile,"/usr/tmp/innbbsd-%s.pid", port);
+snprintf(pidfile,sizeof(pidfile),"/usr/tmp/innbbsd-%s.pid", port);

sprintf有overflow.调试时用-g编译没问题,用-O编译port就变null了,
建议linux下也这样修改,sprintf一定是溢出的,只不过没有冲掉port的symbol而已
FreeBSD下用-O编译时这个溢出是罪魁,加static只是改变了port的存储位置, 溢出
还是发生了的。


到此为止修改完毕,接着:

重新make && make install
#su bbs
$~bbs/innd/innbbsd
PID file is in /usr/tmp/innbbsd-7777.pid
Try to listen in port 7777 and path /home/bbs/innd/.innbbsd

Oh!!! 终于行了!!!
$telnet localhost 7777
Trying 127.0.0.1...
Connected to localhost.szu.edu.cn.
Escape character is '^]'.
502 You are not in my access file. (unknown@localhost.szu.edu.cn)
Connection closed by foreign host.


感谢:此innbbsd问题的解决要感谢Czz跟ELM两位的指点。
Revision V0.2 thanks: 感谢smth的Soaris给了一个比原来的更好的解决方法。可以
说是找到了根本原因。

--------------------------------------------------------------------------
<2>. 怎样解决在FreeBSD下被动转信时不能跨站砍信的问题。
--------------------------------------------------------------------------

      1. 错误诊断。
         同<1>: 如果不想知道为什么要改的话就跳过这里直接看第2部分吧。:)
         此bug表现为在其他站发出砍信信息之后,本站也收到cancel信息,但是
         不会砍信。
         正常的bbslog在收到cancel msg之后出现如下信息:
Aug 03 22:25:58 [32289] Control: cancel <41YhPd$YC1@smth.org>
Aug 03 22:25:58 [32289] **** try to cancel 1028384758  Art/M.1028384757.A
*****
Aug 03 22:25:58 [32289] **** Get file  ****
Aug 03 22:25:58 [32289] cancel post /home/bbs/boards/Art/M.1028384757.A

不正常的就只是出现
Aug 03 22:25:58 [32289] Control: cancel <41YhPd$YC1@smth.org>
然后就没有cancel动作了。


      2. 修改his.c
         经过debug知道收到cancel信息后,程序在his.c里面的HISfilesfor函数
         出错了.
char   *
HISfilesfor(key, output)
datum  *key;
datum  *output;
{
        char   *dest;
        datum   val;
        off_t   offset;
        register char *p;
        register int i;
        int     Used;
        /* Get the seek value into the history file. */
        val = dbzfetch(*key);
        if (val.dptr == NULL || val.dsize != sizeof offset) {
                              // ^^^^^^^^^^^^^^something wrong here!!
                /* printf("fail here val.dptr %d\n",val.dptr); */
                return NULL;
        }

........................................................................

是什么造成上面的问题呢?
原来FreeBSD的off_t的size是8, 而Linux下面的是4. 这样的话不出问题才怪。:)
off_t是在sys/types.h中定义的.

FreeBSD中的定义如下:
typedef _BSD_OFF_T_     off_t;          /* file offset */

FreeBSD:
sizeof(off_t) == 8

Linux(好像这个是glibc里面的定义):
#ifndef off_t
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define off_t off_t
#endif

Linux:
sizeof(off_t) == 4

而且在myHISwrite函数中的offset是long型的。
有下面的语句:
long    offset;

        val.dptr = (char *) &offset;
        val.dsize = sizeof offset;
所以,把HISfilesfor的 off_t offset; 改成 long offset; 就可以解决这个问题了。
最后不要忘了更新一下innbbsd, 还有重新启动innbbsd,当然,你也可以在改完这些
东西后, 再make && make install

感谢:此砍信问题的解决要感谢Czz的帮助。

<3>. 结束。
   如果你发现这份文件里有任何醒目的打字错误,或过时的信息,欢迎通知我。谢谢!


--
         ╱▉ ____ ____ ● ●       ╱▉     __▃_
       ╱__▉ ▉__ ▉   ▉ ▉     ╱__▉ ▉╱  ▉
   __╱    ▉ __▉_▉___▉_▉___╱    ▉_▉    ▉_
 ─────────────────────────

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.234]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店