作者itoc.bbs@bbs.cs.nthu.edu.tw, 信區: plan
標題Re: 請教一下如何重建 .BRD
時間Sun Oct 20 17:34:53 2002 Updated: 2005/05/19
※ 引述《rojer》之銘言:
> 若 .BRD 爛掉
> 有辦法用程式去重新建立嗎?!
執行此程式以後,再將 .BRD_new 覆蓋 .BRD 即可
板主要手動重建
特殊看板權限(秘密/好友/站務板)要手動重設
分類要手動改
: src/util/Makefile
EXE = ..... rebrd
: src/util/rebrd.c 新增這程式
/*-------------------------------------------------------*/
/* util/rebrd.c ( NTHU CS MapleBBS Ver 3.10 ) */
/*-------------------------------------------------------*/
/* target : 重建 .BRD */
/* create : 02/10/20 */
/* update : / / */
/* author : itoc.bbs@bbs.tnfsh.tn.edu.tw */
/*-------------------------------------------------------*/
/*
英文板名去 brd/* 抓
中文板名去 gem/@/@Class 抓
看板屬性去 innd/newsfeeds.bbs 抓
板主要手動重建
特殊看板權限(秘密/好友/站務板)要手動重設
分類要手動改
*/
#include "bbs.h"
static int /* 1:此看板轉信 0:此看板不轉信 */
board_outgo(brdname)
char *brdname;
{
newsfeeds_t nf;
int fd;
int rc = 0;
/* 若 newsfeeds 裡面有資料,就代表要轉信 */
if ((fd = open("innd/newsfeeds.bbs", O_RDONLY)) >= 0)
{
while (read(fd, &nf, sizeof(newsfeeds_t)) == sizeof(newsfeeds_t))
{
if (!str_cmp(brdname, nf.board))
{
rc = 1;
break;
}
}
close(fd);
}
return rc;
}
static void
board_title(folder, brdname, title) /* 去 gem/@/@Class 找 brd.title */
char *folder;
char *brdname;
char *title;
{
int xmode;
char fpath[64];
HDR hdr;
FILE *fp;
if (*title) /* 已經找到 */
return;
if (fp = fopen(folder, "r"))
{
while (fread(&hdr, sizeof(HDR), 1, fp) == 1)
{
xmode = hdr.xmode & (GEM_BOARD | GEM_FOLDER);
if (xmode == (GEM_BOARD | GEM_FOLDER)) /* 看板精華區捷徑 */
{
if (!strcmp(hdr.xname, brdname))
{
/* 參考 gem.c:brd2gem() 的格式 */
str_ncpy(title, hdr.title + BNLEN + 1 + BCLEN + 1, BTLEN + 1);
break;
}
}
else if (xmode == GEM_FOLDER) /* 卷宗 recursive 進去找 */
{
hdr_fpath(fpath, folder, &hdr);
board_title(fpath, brdname, title);
}
}
fclose(fp);
}
}
static void
transbrd(brdname)
char *brdname;
{
static int chrono = 1000;
BRD brd;
int outgo;
char title[BTLEN + 1];
memset(&brd, 0, sizeof(BRD));
outgo = board_outgo(brdname);
str_ncpy(brd.brdname, brdname, sizeof(brd.brdname));
title[0] = '\0';
board_title("gem/@/@"CLASS_INIFILE, brdname, title);
sprintf(brd.title, "分類 %s", title); /* 分類手動改 */
/* brd.BM 留白,手動恢復 */
brd.bvote = 0; /* 投票會流失 */
brd.bstamp = ++chrono;
brd.readlevel = 0; /* 特殊板權限手動改 */
brd.postlevel = PERM_POST;
brd.battr = outgo ? 0 : BRD_NOTRAN;
/* 這些會自動更新 */
brd.btime = 0;
brd.bpost = 0;
brd.blast = 0;
/* 新檔案建在 .BRD_new 再覆蓋 .BRD 即可 */
rec_add(".BRD_new", &brd, sizeof(BRD));
}
int
main()
{
DIR *dirp;
struct dirent *de;
char *str;
chdir(BBSHOME);
if (!(dirp = opendir("brd")))
exit(-1);
unlink(".BRD_new");
while (de = readdir(dirp))
{
str = de->d_name;
if (*str <= ' ' || *str == '.')
continue;
transbrd(str);
}
closedir(dirp);
exit(0);
}
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: itoc.Dorm-GD2.NCTU.edu.tw