作者itoc, 信區: itoc
標題[功能] bbslink.c bbslib.c 多重轉信
時間04/04/29
作者: itoc (cygreadline4.dll) 看板: plan
標題: [功能] 多重轉信
時間: 2004/04/29 Thu 16:27:21 Updated: 2005/04/24
多重轉信,設定方法如下
其中 bbsroute1 和 bbsroute2 可以是相同或不同站台
1) Example: tw.bbs.campus.nctu + nctu.talk -> [nctu]
tw.bbs.campus.nctu + nctu.talk <- [nctu]
bbsroute1 tw.bbs.campus.nctu <-> nctu big5
bbsroute2 nctu.talk <-> nctu big5
2) Example: tw.bbs.test + csie.test -> [test]
csie.test <- [test]
bbsroute1 tw.bbs.test -> test big5
bbsroute2 csie.test <-> test big5
3) Example: tw.bbs.sci.law -> [law1] + [law2]
tw.bbs.sci.law <- [law1] + [law2]
bbsroute tw.bbs.sci.law <-> law1 big5
bbsroute tw.bbs.sci.law <-> law2 big5
4) Example: tw.bbs.literal.book -> [book1]
tw.bbs.literal.book <- [book2]
bbsroute tw.bbs.literal.book -> book1 big5
bbsroute tw.bbs.literal.book <- book2 big5
其餘類似,反正就是在 newsfeeds.bbs 裡寫很多行
──────────────────────────────────────
因為看板屬性的 BRD_NOTRAN 會對所有 newsgroup 做改變
所以要新增一個不轉出的屬性,對單一 newsgroup 做控制
: struct.h
#define INN_NOINCOME 0x0001
+ #define INN_NOOUTGO 0x0002
: innbbs.c:nf_item()
brd = bshm->bcache + bno;
- outgo = brd->battr & BRD_NOTRAN ? ' ' : '<';
+ outgo = brd->battr & BRD_NOTRAN || nf->xmode & INN_NOOUTGO ? ' ' : '<';
income = nf->xmode & INN_NOINCOME ? ' ': '>';
: innbbs.c:nf_query()
brd = bshm->bcache + rc;
- outgo = brd->battr & BRD_NOTRAN ? "\033[1;33m不轉出\033[m" : "轉出";
+ outgo = brd->battr & BRD_NOTRAN || nf->xmode & INN_NOOUTGO ?
+ "\033[1;33m不轉出\033[m" : "轉出";
income = nf->xmode & INN_NOINCOME ? "且\033[1;33m不轉進\033[m" : "且轉進";
: innbbs.c:nf_add()
nf.xmode = (vans("是否轉進(Y/N)?[Y] ") == 'n') ? INN_NOINCOME : 0;
+ nf.xmode |= (vans("是否轉出(Y/N)?[Y] ") == 'n') ? INN_NOOUTGO : 0;
──────────────────────────────────────
拿掉 NEWSFEEDS2
NEWSFEEDS 也不需要排序
: bbslib.h
/* bbslib.c */
extern int NFCOUNT;
extern newsfeeds_t *NEWSFEEDS;
- extern newsfeeds_t *NEWSFEEDS_B;
- extern newsfeeds_t *NEWSFEEDS_G;
- extern int nf_bygroupcmp();
- extern int nf_byboardcmp();
: bbslib.c:readnffile()
int NFCOUNT;
newsfeeds_t *NEWSFEEDS = NULL;
- newsfeeds_t *NEWSFEEDS_B = NULL;
- newsfeeds_t *NEWSFEEDS_G = NULL;
- int
- nf_bygroupcmp(a, b)
- newsfeeds_t *a, *b;
-{
- return str_cmp(a->newsgroup, b->newsgroup);
-}
- int
- nf_byboardcmp(a, b)
- newsfeeds_t *a, *b;
-{
- return str_cmp(a->board, b->board);
-}
static int /* 0:success -1:fail */
readnffile()
{
...
...
- /* 另外準備二份相同的資訊,但是排序方法不同 */
- NEWSFEEDS_B = !NEWSFEEDS_B ? (newsfeeds_t *) malloc(size) :
- (newsfeeds_t *) realloc(NEWSFEEDS_B, size);
- memcpy(NEWSFEEDS_B, NEWSFEEDS, size);
- NEWSFEEDS_G = !NEWSFEEDS_G ? (newsfeeds_t *) malloc(size) : (newsfeeds_t *) realloc(NEWSFEEDS_G, size);
- memcpy(NEWSFEEDS_G, NEWSFEEDS, size);
NFCOUNT = size / sizeof(newsfeeds_t);
- if (NFCOUNT > 1)
- {
- /* NEWSFEEDS[] 不變動,預設依站台名稱排序 */
- /* 將 NEWSFEEDS_B[] 依 board 排序,那麼在 search_newsfeeds_byboard() ... */
- qsort(NEWSFEEDS_B, NFCOUNT, sizeof(newsfeeds_t), nf_byboardcmp);
- /* 將 NEWSFEEDS_G[] 依 group 排序,那麼在 search_newsfeeds_bygroup() ... */
- qsort(NEWSFEEDS_G, NFCOUNT, sizeof(newsfeeds_t), nf_bygroupcmp);
- }
return 0;
}
──────────────────────────────────────
允許一個 newsgroup 轉進很多板
: rec_article.c:search_newsfeeds_bygroup() 改成這樣
#ifndef _NoCeM_
static
#endif
newsfeeds_t *
search_newsfeeds_bygroup(newsgroup, pos)
char *newsgroup;
int *pos; /* 從第 pos 筆開始往下找 */
{
newsfeeds_t *find;
int i;
for (i = *pos; i < NFCOUNT; i++)
{
find = NEWSFEEDS + i;
if (!strcmp(find->newsgroup, newsgroup) && !(find->xmode & INN_NOINCOME))
{
*pos = i + 1;
return find;
}
}
return NULL;
}
: nocem.c:readNCMbody()
static int
readNCMbody(line)
char *line;
{
char buf[LINELEN], *group;
+ int pos = 0;
...
...
- if (search_newsfeeds_bygroup(group))
+ if (search_newsfeeds_bygroup(group, &pos)) /* nocem 只會清轉入的第一個板 */
strcpy(SPAMMID[num_spammid++], SPAMMID_NOW);
: rec_article.c:receive_article()
: 此處有個假設是當 newsfeeds.bbs 要求同一個 newsgroup 要轉進多個板時
: 這些板都是用同樣的 charset
newsfeeds_t *nf;
char myaddr[128], mynick[128], mysubject[128], myfrom[128], mydate[80];
char poolx[256];
char *group;
int firstboard = 1;
+ int pos;
/* try to split newsgroups into separate group */
for (group = strtok(GROUP, ","); group; group = strtok(NULL, ","))
{
- if (!(nf = search_newsfeeds_bygroup(group)))
- continue;
+ pos = 0;
+ while (nf = search_newsfeeds_bygroup(group, &pos))
+ {
if (firstboard) /* opus: 第一個板才需要處理 */
{
...
...
if (is_spam(myaddr, mynick))
{
#ifdef _KEEP_CANCEL_
bbspost_add(BN_DELETED, myaddr, mynick);
#endif
- break;
+ return 0;
}
firstboard = 0;
}
bbspost_add(nf->board, myaddr, mynick);
+ } /* while nf1,nf2,... */
} /* for board1,board2,... */
──────────────────────────────────────
允許一個板轉出很多 newsgroup
: bbslink.c:search_newsfeeds_byboard() 改成這樣
static newsfeeds_t *
search_newsfeeds_byboard(board, pos)
char *board;
int *pos;
{
newsfeeds_t *find;
int i;
for (i = *pos; i < NFCOUNT; i++)
{
find = NEWSFEEDS + i;
if (!strcmp(find->board, board) && !(find->xmode & INN_NOOUTGO))
{
*pos = i + 1;
return find;
}
}
return NULL;
}
: bbslink.c:deal_sover()
newsfeeds_t *nf;
nodelist_t *nl;
soverview_t sover;
struct stat st;
time_t mtime;
char buf[80];
char *board, *filename;
+ int pos;
board = sover->board;
- if (!(nf = search_newsfeeds_byboard(board)))
- {
- bbslog("<bbslink> :Warn: %s 此板不在 newsfeeds.bbs 中\n", board);
- DEBUG(("─→:Warn: %s 此板不在 newsfeeds.bbs 中\n", board));
- return;
- }
+ pos = 0;
+ while (nf = search_newsfeeds_byboard(board, &pos))
+ {
if (!(nl = search_nodelist_bynode(nf->path)))
- return;
+ continue;
filename = bntp->xname;
memset(&sover, 0, sizeof(soverview_t));
...
...
- sprintf(sover.msgid, "%s$%s@" MYHOSTNAME, filename, board);
+ /* 不同的 newsgroup 要有不同的 msgid */
+ sprintf(sover.msgid, "%d%s$%s@" MYHOSTNAME, pos, filename, board);
...
...
- sprintf(buf, "%s$%s@" MYHOSTNAME, filename, board);
+ /* 不同的 newsgroup 要有不同的 msgid */
+ sprintf(buf, "%d%s$%s@" MYHOSTNAME, pos, filename, board);
...
...
queuefeed(nl, textline);
+ }
}
--
□ 本文章由 itoc 從 pc512-2.EE.NCTU.edu.tw 發表