修改自hightman大之前寫的trandotbrd.c
適用於從Firebird的3.1-20020908的.BOARDS
轉換為MapleBBS-3.10-20031227 (itoc) 的.BRD
編譯的時候要蓋掉MapleBBS裡的src/util/tran/fb2dotbrd.c
原先想參照hightman大的寫法,但在做權限轉移的時候失敗了,
因此只好用土法煉鋼的方法‥
/*----------------------------------------------------------*/
/* util/fb/fb2dotbrd.c */
/*----------------------------------------------------------*/
/* target : firebird 3.0 轉 Maple 3.x .BRD */
/* .BOARDS => .BRD */
/* create : 00/11/22 */
/* update : / / */
/* */
/* author : hightman@263.net */
/* modify : klt.bbs@bbs.mis.nkfust.edu.tw */
/*----------------------------------------------------------*/
/* syntax : fb2dotbrd */
/*----------------------------------------------------------*/
#include "fb.h"
BRD allbrd[MAXBOARD];
typedef struct boardheader
{ /* This structure is used to hold data i n */
char filename[STRLEN+20]; /* the BOARDS files */
char BM[BM_LEN - 1];
char flag;
char title[STRLEN];
unsigned level;
unsigned char accessed[12];
} boardheader;
typedef struct _PERM
{
int old;
int new;
} PERM;
static PERM flag[] =
{
{0x8, BRD_ANONYMOUS},
{0x4, BRD_NOTRAN}
};
int
board_cmp(a, b)
BRD *a, *b;
{
return (strcasecmp(a->brdname, b->brdname));
}
main()
{
int inf, outf, i, count;
int j;
char buf[256], *str;
char *bm;
boardheader mybh;
PERM *p;
sprintf(buf, "%s/.BOARDS", FB);
inf = open(buf, O_RDONLY);
sprintf(buf, ".BRD");
outf = open(buf, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (inf == -1 || outf == -1)
{
printf("error open file\n");
exit(1);
}
/* read in all boards */
i = 0;
memset(allbrd, 0, MAXBOARD * sizeof(BRD));
while (read(inf, &mybh, sizeof(mybh)) == sizeof(mybh))
{
str = mybh.title;
if (mybh.filename[0])
{
strcpy(allbrd[i].brdname, mybh.filename);
strncpy(allbrd[i].class,mybh.title+2,4); /* klt.040113:讀出類別 */
str+=11;
sprintf(allbrd[i].title, "%s", str);
if (mybh.BM[0] > ' ')
{
bm = mybh.BM;
for (j = 0; bm[j] != '\0'; j++)
if (bm[j] == ',')
bm[j] = '/';
strcpy(allbrd[i].BM, bm);
}
for (p = flag; p->old; p++)
{
if (mybh.flag & p->old)
{
mybh.flag &= 0xe; /* klt.040113: 把VOTE_FLAG拿掉 */
allbrd[i].battr |= p->new;
}
}
if (mybh.level & 0x080000)
allbrd[i].battr |= BRD_NOZAP; /* klt.040113: 把NOZAP_FLAG加回去 */
if (!strcmp(mybh.filename, "Test") || !strcmp(mybh.filename, "test"))
allbrd[i].battr |= BRD_NOCOUNT;
if (!strcmp(mybh.filename, "Test") || !strcmp(mybh.filename, "test"))
allbrd[i].battr |= BRD_NOSTAT;
/* klt.040113: 用很爛的方法做權限轉移,本來想用hightman大的方法但失敗 */
mybh.level &= 0x004dff;
if(mybh.level & 0x1)
allbrd[i].readlevel |= PERM_BASIC;
if(mybh.level & 0x2)
allbrd[i].readlevel |= PERM_CHAT;
if(mybh.level & 0x4)
allbrd[i].readlevel |= PERM_PAGE;
if(mybh.level & 0x8)
allbrd[i].readlevel |= PERM_POST;
if(mybh.level & 0x10)
allbrd[i].readlevel |= PERM_VALID;
if(mybh.level & 0x20)
allbrd[i].readlevel |= PERM_DENYPOST;
if(mybh.level & 0x40)
allbrd[i].readlevel |= PERM_CLOAK;
if(mybh.level & 0x80)
allbrd[i].readlevel |= PERM_SEECLOAK;
if(mybh.level & 0x100)
allbrd[i].readlevel |= PERM_XEMPT;
if(mybh.level & 0x400)
allbrd[i].readlevel |= PERM_BM;
if(mybh.level & 0x800)
allbrd[i].readlevel |= PERM_ACCOUNTS;
if(mybh.level & 0x4000)
allbrd[i].readlevel |= PERM_SYSOP;
allbrd[i].postlevel = allbrd[i].readlevel;
i++;
}
}
close(inf);
/* sort them by name */
count = i;
qsort(allbrd, count, sizeof(BRD), board_cmp);
/* write out the target file */
printf("----------------------------------------------------------------------\n");
for(i = 0; i < count; i++)
{
write(outf, &allbrd[i], sizeof(BRD));
printf("%-13s%-5s%-25.25s%s\n", allbrd[i].brdname, allbrd[i].class,allbrd[i].BM, allbrd[i].title);
/* 這一行很長要注意 */
}
close(outf);
exit(0);
}
--
--
▂ 高科大資管明日資星 ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
▇ infostar.twbbs.org ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇
★ m145-185.dialup.seed.net.tw