这个错误对初学者来说很容易犯的,就是编译完以后不小心敲了make installl
或是系统升级的时候没有备份>OARDS文件
现象就是讨论区都在硬盘里,但是从版面上看不到。
发信人: qyb (搞笑为主灌水为辅), 信区: BBSAdmin
标 题: Re: 救命呀,qyb...
发信站: 我爱南开站 (Sun Apr 11 19:28:51 1999), 站内信件
忙了一个多小时, 总算把这个问题搞定 :(
其实只要对照源程序来做, 看看程序里面是怎样增加, 修改一个讨论区的..
等到你看完了maintain.c, record.c中的相关几个函数, 就会发现我这个程序实在
不怎么样, 完全是照抄的
一开始, 我打算用vi直接编辑.BOARDS, (记住, 在改动任何事情之前一定要先
作好备份, 并且注意文件的属性, owner, group), 结果发现改换后的文件根本不能用,
于是我对照了原文件的大小, 发现我增加讨论区记录后的.BOARDS文件居然变小了, faint
原文件大小是3584, 我的.BOARDS文件里原来是设了14个讨论区, 3584/14=256, 西西,
明白了, 看来要作一个程序来增加记录
.......我就不多废话了, 下面是程序, 把它放在bbsadm/bbs_src/local_utl目录里
//filename addboard.c
//put it in your bbsadm/bbs_src/local_utl
//add a board to .BOARDS from command line
#include "../bbs.h"
int
flock(fd, op)
int fd, op;
{
switch (op) {
case LOCK_EX:
return lockf( fd, F_LOCK, 0 );
case LOCK_UN:
return lockf( fd, F_ULOCK, 0 );
default:
return -1;
}
}
int
safewrite(fd, buf, size)
int fd;
char *buf;
int size;
{
int cc, sz = size, origsz = size;
char *bp = buf;
do {
cc = write(fd,bp,sz);
if ((cc < 0) && (errno != EINTR)) {
printf("safewrite err!\n");
return -1;
}
if (cc > 0) {
bp += cc;
sz -= cc;
}
} while (sz > 0);
return origsz;
}
int
substitute_record(filename,rptr,size,id)
char *filename ;
char *rptr ;
int size, id ;
{
int fd ;
if((fd = open(filename,O_WRONLY|O_CREAT,0644)) == -1)
return -1 ;
flock(fd,LOCK_EX) ;
if (lseek(fd,size*(id-1),SEEK_SET) == -1)
{
printf("subrec seek err\n");
exit(1);
}
if (safewrite(fd,rptr,size) != size)
{
printf("subrec write err\n");
exit(1);
}
flock(fd,LOCK_UN) ;
close(fd) ;
return 0 ;
}
main()
{
struct boardheader newboard ;
int bid;
memset(&newboard, 0, sizeof(newboard));
printf("input the boards name:\n");
//输入你要增加的版的英文名字,比如football
scanf("%s", &(newboard.filename));
newboard.flag=0;
printf("input the title:\n");
//就是输入你的版的中文名字,还有别的什么选项
//例如:o[体育] ○ 绿茵世界
//具体这里要参照你在开设新版时系统给你的提示
scanf("%s", &(newboard.title));
if(strstr(newboard.title,"●")||strstr(newboard.title,"⊙"))
newboard.flag |= OUT_FLAG;
else if(strstr(newboard.title,"○"))
newboard.flag &= ~OUT_FLAG;
printf("input the master's id:\n");
//就是斑竹的ID啦
scanf("%s", &(newboard.BM));
newboard.level = 0;
printf("input the number:\n");
//这个地方就是你添加的新版是你的BBS上的第几个版
//比如,我原来.BOARDS的大小是3584字节,3584/256=14
//于是我这里就填15, 记住,这里千万不要搞错
scanf("%d", &bid);
newboard.flag &= ~ANONY_FLAG;
substitute_record( BOARDS, &newboard, sizeof( newboard ), bid );
return;
}
//file end
接下来运行
gcc addboard.c -o addboard
编译完了将产生addboard这个可执行文件
把.BOARDS也拷到local_utl目录下面来
运行: ./addboard
...
运行完以后就可以看到.BOARDS文件增加了256字节,这就没有问题了
然后就把增加后的.BOARDS拷进bbs目录里
chmod 644 .BOARDS
chown bbs:bbs .BOARDS
现在就一切OK了
以后要升级BBS一定要用tar来备份数据呀,这样连所有文件的属性什么的都能原本
保存下来
--
FROM 202.113.18.2