发信人: TurboZV (while(1) fork();), 信区: BBSDev
标 题: 重新更新了一下killpost.c
发信站: 一网深情 (2002年05月11日22:41:28 星期六), 转信
/*
用于:
1)删除cancel的信
2)过滤掉某些发信站
ftp://bbs.uestc.edu.cn/killpost.c
boards.txt文件:
board:Hardware usefilter:1 bbssite:一网深情
board:Software usefilter:0 bbssite:一网深情
表示Hardware 过滤来自一网深情的文章
Software不
*/
#include "/root/bbssrc/include/bbs.h"
int main(int argc, char **argv)
{
struct fileheader info;
FILE *fpout, *fpc, *fplog, *fpboard;
char dir[256], dir2[256], lockfile[256], filename[256],
firstline[256], nf[256];
int count = 0, fd, i, isdelete = 0, j;
char boards[MAXBOARD][32]; // 版名
char bbssite[MAXBOARD][256];
int usefilter[MAXBOARD];
char buf[100], site[100];
int num, modified;
if ((fpboard=fopen("boards.txt", "rb")) == NULL) {
perror("boards.txt");
return -1;
} //end if
while (!feof(fpboard)) { //获得要处理的版名, 是否过滤发信站(1-过滤
),
发信站名
fscanf(fpboard, "board:%s usefilter:%d bbssite:%s\n",
boards[count], &usefilter[count], bbssite[count]);
if (boards[count][0] == 0) break;
count++;
} //end while
fclose(fpboard);
for (i=0; i<count; i++) {
printf("Processing board[%s], from site:%s\n", boards[i],
bbssite[i]);
modified = num = 0;
sprintf(dir, BBSHOME"/boards/%s/.DIR", boards[i]);
if ((fd = open(dir, O_RDWR | O_CREAT, 0644)) == -1) {
perror(dir);
continue;
}
printf("Locked\n");
flock(fd, LOCK_EX); // lock file while processing
sprintf(dir2, BBSHOME"/boards/%s/.DIR.tmp", boards[i]);
if ((fpout = fopen(dir2, "w")) == NULL) {
perror(dir2);
continue;
} //end if
while ((read(fd, &info, sizeof(info)) == sizeof(info))) {
sprintf(filename, BBSHOME"/boards/%s/%s", boards[i], info.
filename);
isdelete = 0;
if (info.owner[0] == '-') isdelete = 1;
else if ((usefilter[i] == 1) &&
!(info.accessed[0]&FILE_MARKED) && // m, g, b的文章
不删
!(info.accessed[0]&FILE_DIGEST)) { // 使用匹配规则
if ((fpc=fopen(filename, "rb")) == NULL) { //打开文章正
文
perror(filename);
} //end if
sprintf(site, "发信站: %s", bbssite[i]);
for (j=0; j<4; j++) { // read the first 4 lines
fgets(buf, 100, fpc);
buf[strlen(site)] = 0;
if (strcmp(buf, site) == 0) { // 如果来自xxxxx, 则删
除
isdelete = 1;
break;
}
}
fclose(fpc);
}
if (isdelete) { //需要删除
modified = 1;
sprintf(nf, "%s.old", filename);
printf("[%d]<%s>[%s][%s]\n", ++num, info.filename, nf,
info.owne
r,
info.title);
if (rename(filename, nf) == -1) {
perror("backup file");
printf("\n");
} //end if
} else {
fwrite(&info, sizeof(info), 1, fpout);
}
} //end while, 完成整个版面
fclose(fpout);
flock(fd, LOCK_UN);
close(fd);
printf("Unlocked\n");
if (modified) {
if (rename(dir2, dir) == -1)
perror(boards[i]);
}
} //完成所有版面
printf("Finished all!\n");
return 0;
}
--
FROM AfterDark