* 多行讯息 *
本文可能只对 fb2k 系列有效.
fb2k 的讯息部分主要在文件 sendmsg.c 中的, 具体实现大概是
,把讯息写到某文件中,这个文件是 home/?/id/msgfile
然后向要发送的用户传送信号 SIGUSR2 ,(函数do_sendmsg())
一旦有信号 SIGUSR2 ,就会触发函数 r_msg() ,
另外的 r_msg2() 用来查看历史讯息的, 就是按 Ctrl+Z 啦.
可以到
http://goon.wox.org 下载代码来参考.下面说的只是改动的地方:
1. bbs.h 增加下面两行
#define MAX_MSG_SIZE 1024
#define MSGDIR ".msgdir"
2. struct.h 增加
struct msgdir {
char userid[IDLEN + 2];
time_t tt;
pid_t pid;
char msg[MAX_MSG_SIZE];
};
用来暂时保存信息的,就是文件 home/?/userid/.msgdir 的结构
这个文件在用户每次登录后就会删掉, 代码是 main.c 中的 user_login() 里的
{
int tuid=0;
struct user_info uin;
extern int t_cmpuids(int , struct user_info);
tuid = getuser(currentuser.userid);
if(t_search_ulist(&uin, t_cmpuids, tuid, NA, NA) < 2){
setuserfile(fname,MSGDIR);
unlink(fname);
}
}
其实这个文件也可以不用删除的, 如果你想保留的话, :)
3. io.c 中增加
函数 int multi_getdata() ,这个函数是从 smthbbs 的代码中获取的,略加了些修改.
注意,还要在些函数前加上
#define LINELEN 132
int ingetdata = 0;
int UPDOWN = 0;
extern int scr_cols, scr_lns;
函数 multi_getdata() 只用在三个地方:
sendmsg.c 中的 get_msg() , r_msg() , r_msg2()
另外, 函数 multi_getdata() 会用到 saveline2() (在 screen.c 中)
注: saveline2() 是把 smthbbs 中 saveline() 改名而得的.
3. sendmsg.c
新增两个函数:
append_msg() 写讯息到 home/?/userid/.msgdir
这个函数用在 do_sendmsg() 中.
count_msgline() 计算某字符有多少个'\n'
该函数用在 r_msg() 和 r_msg2() 中
主要修改的有 r_msg() 和 r_msg2() , 这两个函数最好仔细的看.
注意,当中的 saveline() 已经被修改的了,见 screen.c .
--