荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: jjk (~热带雨林~), 信区: InstallBBS
标 题: innbbsd+FreeBSD-HOWTO(v0.3)
发信站: 荔园晨风BBS站 (Thu Aug 22 10:25:06 2002), 转信
innbbsd+FreeBSD-HOWTO (v0.3)
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
Revision v0.3 22, 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()里面的一个定义
int
standaloneinit(port)
const char *port;
{
int ndescriptors;
FILE *pf;
char pidfile[24];
// ^^这里只有24, 我一直没怎么留意到这个,今天再看时,
// 突然发现定义得不够大 :p
/*#ifndef NOFORK*/
if (!inetdstart)
if (fork())
exit(0);
/*#endif*/
sprintf(pidfile,"/usr/tmp/innbbsd-%s.pid", port);
// ^^^^^^^^^^^^^^^^^^^^^^^这里按照默认的应该有25个字符。
// 为了保险起见, 应作如下修改
int
standaloneinit(port)
const char *port;
{
int ndescriptors;
FILE *pf;
- char pidfile[24];
+ char pidfile[30]; /* Modified by jjk, 改成30应该够了 :p */
ndescriptors = getdtablesize();
/*#ifndef NOFORK*/
if (!inetdstart)
if (fork())
exit(0);
/*#endif*/
- sprintf(pidfile,"/usr/tmp/innbbsd-%s.pid", port);
+ snprintf(pidfile, sizeof(pidfile), "/usr/tmp/innbbsd-%s.pid", port);
/* 为安全起见,仍然按照smth的Soaris给出的方法修改这里 */
if (!inetdstart)
fprintf(stderr, "PID file is in %s\n", pidfile);
{
...
可见导致overflow的根本原因是pidfile定义得太小了。
这里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.
Revision v0.1 tahnks: 感谢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软件 网络书店