发信人: zhch (zhch), 信区: BBSDev
标 题: 点对点简便BBS站间转信程序(for FB)
发信站: 南京大学小百合站 (Sat May 5 16:59:04 2001), 站内信件
基本使用方法: 下载bbsinnd.c. 修改iconfs[]设置转信版面. make bbsinnd. 运行.
介绍:
与fb自带的转信程序相比,这个转信程序十分简单,由转入和转出2个程序构成,可实现
版面-版面的转信,比较适合小范围的转信。
下载地址:
http://bbs.nju.edu.cn/download1, bbsinnd.c
文章转入服务,做为一个daemon在后台运行,缺省时每小时取信一次。
编译: 先在程序中设置好参数,然后make bbsinnd
主要参数:
PORT: 转信服务端口10111,建议不要改动。
iconfs[]数组: 格式: 转信站地址, 对方版面, 转入版面,
最后以NULL结束。
black_user[]数组: 转信黑名单, 不转入名单中id的文章.
最后以NULL结束。
2, bbsoutd.c
文章转出服务,做为一个daemon在后台运行。监听PORT端口。
编译: 先在程序中设置好参数,然后make bbsoutd
主要参数:
PORT: 转信服务端口10111,建议不要改动。
oboards[]数组: 转信版面的设置,最后以NULL结束。
allow_hosts[]数组: 允许访问本站转信服务的地址, '*'代表所有。
只能用数字IP, NULL结束。
deny_hosts[]数组: 禁止访问本站转信服务的地址, 不支持通配符.
只能用数字IP, 和allow_hosts[]联合使用,NULL
结束。
发信人: zhch (zhch), 信区: BBSDev
标 题: bbsinnd.c的程序说明.
发信站: 南京大学小百合站 (Sat May 5 17:20:00 2001), 站内信件
bbsinnd.c: 负责信件转入.
PORT为转信server的端口. 缺省为10111, 建议不要改动.
servernow指向当前访问的server名称, 供do_log()记录时使用.
iconf是转信的配置,由它控制到哪里取信以及转到哪个版。
black_users是转信作者黑名单,不接受这些人的文章。
valid_user(user)函数检查user是否在黑名单中, 在返回0, 不在返回1.
do_log()是一个记录用的函数, 参数可变,和printf()一样. 写~/bbsinnd.log,
格式为 时间, 转信server, 记录内容.
全局变量last记录上次取信时间, 同时存放在~/etc/bbsinnd.last中, 以防止
重复取信,首次使用时last值为1天前。
main()函数首先fork()驻留退出,然后进入bbshome, 关闭所有fd, 屏蔽所有signal.
读入上次取信时间, 然后进入主循环. 用sscanf从iconf中读出转信配置, 然后用
getmail函数取信。完成后休息3600秒,再开始下一轮工作。
getmail()函数三个参数分别为转信server地址, 转信版面和本地版面.
先连接服务器, 然后把socket映射到stdin, stdout. 然后从server读出分隔符.
然后向server发出取信指令.
指令格式与一般的数据库操作类似,为:
select * from xxxx where dt < yyyy
其中xxxx为版面名称,yyyy为多少时间限制,表示只读取yyyy秒以内的新文章.
server端还有限制,缺省为最大不超过(7*86440)。
然后依次从server读取资料, 数据格式为:
文章
分隔符
文章
分隔符
....
文章的格式为:
标题
作者
文章内容
得到数据后, 检查标题和作者中是否含有非法字符并过滤。
检查作者是否在黑名单以内。
然后把文章发到相应版面。
每篇文章后sleep一秒。防止文件名冲突严重。
f_exist()函数检查文件是否存在,供发文章时选择文件名用。
check_str()函数检查并过滤作者,标题中的非法字符。
bbsoutd.c, 负责信件转出.
PORT 为转信服务的端口, 缺省为10111, 建议不要修改.
oboards[]为参与转信的版面。做为转信时的判断用.
allow_hosts和deny_hosts控制允许访问本站转信服务的ip, 需要数字ip形式,
前者支持'*', 后者不支持.
valid_board()函数通过oboard[]判断一个版面是否参与了转信.
valid_host()函数判断对方是否有权限访问本站转信服务.
do_log()向~/bbsoutd.log写log, 参数可变, 与printf()类似.
main()函数首先进入BBSHOME, fork()驻留, 关闭所有fd很屏蔽所有signal.
注意这里没有考虑SIGCHLD, 因此在非linux系统下需要加上reapchild()才行, 否则有
zombie.
然后监听PORT端口. 有了请求fork一个进程去处理.
把socket映射到0和1, 用do_send()函数处理用户请求.
do_send()函数先判断用户ip是否允许访问转信服务, 如果禁止直接退出.
然后向client发送分隔符, 然后接受客户端的命令.
命令有2种,
一个是select * from xxx where dt < yyy,
还一个是select * from oboard_ctl where dt < zzz.
前者为正常命令, 后者列出所有参与转信的讨论区.
然后判断client要求的版面是否参与了转信.
并检查dt参数是否太大, 缺省最大不超过7天.
然后把版面中dt时间段以内的文章全部发送出去. 发送时修改文章的第1行, 把作者改成
usierid.bbs@xxx.xxx.xxx.xxx的形式.
同时判断如果owner中含有'@'则不转. 因为这肯定是非站内信件.
发信人: icyrain (冰雨), 信区: BBSDev
标 题: 目前明珠开放测试的bbsoutd版区
发信站: 南京大学小百合站 (Tue May 8 16:58:32 2001), 站内信件
"InstallBBS",
"Linux",
"VB",
"VC",
"test",
"NewBBSDev",
"HHUNews",
发信人: zhch (zhch), 信区: BBSDev
标 题: 本站bbsout的版面
发信站: 南京大学小百合站 (Tue May 8 19:52:48 2001), 站内信件
目前bbsoutd开放BBSDev, LinuxUnix, VB, Aboard, test, GRE_TOEFL
过几天还会再开放一些.
判断一个bbsoutd开放有哪些版面.
可以telnet host 10111, 然后用select * from oboard_ctl where dt < 111
来看.
修改bbsinnd后,要killall -9 bbsinnd, 然后重新运行即可.
控制转信时间的文件的~/etc/目录下, 一般不用改动.
发信人: west (平水西流), 信区: BBSDev
标 题: Re: 本站bbsout的版面
发信站: 南京大学小百合站 (Tue May 8 20:17:51 2001), 站内信件
good,石头城目前开放的版面有:
BBsDev,Test,Linux,VisualBasic
石头城地址:sesa.nju.edu.cn
--
修改:zhch FROM 202.119.32.102
FROM 202.119.32.102