回精華區
作者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);
+ }
}

--
□ 本文章由 itocpc512-2.EE.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻