回精華區
作者itoc, 信區: itoc
標題[修正] bmtad.c 用轉寄信來 mirror 其他站的板
時間04/01/14
作者: itoc (League) 看板: plan
標題: [修正] 改 bmtad 用轉寄信來 mirror 板
時間: 2004/01/14 Wed 09:48:49                           Updated: 2005/05/14

  甲站不提供打包看板/精華區的功能
  而且甲站長也不願意提供看板/精華區的壓縮檔
  這時候可以稍微改一下 bmtad 把該板整個 mirror 回來自己站

  或者是即使你拿到甲站的壓縮檔
  但是因為版本不合,又不知道如何轉換的話

: bmtad.c:change_hdr() 新增此函式於 bbs_brd() 的前面

static void
change_hdr(hdr, fpath)  /* 由文章的第三列來找出原始發文日期 */
  HDR *hdr;
  char *fpath;
{
  char months[12][4] =
  {
    "jan", "feb", "mar", "apr", "may", "jun",
    "jul", "aug", "sep", "oct", "nov", "dec"
  };
  time_t datevalue;
  struct tm ptime;
  char buf[ANSILINELEN], *ptr, *str;
  FILE *fp;
  int i;

  if (fp = fopen(fpath, "r"))
  {
    if (fgets(buf, sizeof(buf), fp))
    {
      if (ptr1 = strchr(buf, '\n'))
        ptr1 = '\0';

      if (!strncmp(buf, STR_AUTHOR1 " ", LEN_AUTHOR1 + 1))
        ptr1 = buf + LEN_AUTHOR1 + 1;
      else if (!strncmp(buf, STR_AUTHOR2 " ", LEN_AUTHOR2 + 1))
        ptr1 = buf + LEN_AUTHOR2 + 1;
      else
        ptr1 = NULL;

      if (ptr1 && *ptr1)
      {
        ptr2 = strchr(ptr1 + 1, '@');
        ptr3 = strchr(ptr1 + 1, '(');

        if (ptr2 && (!ptr3 || ptr2 < ptr3))   /* 在暱稱裡面的 @ 不算是 email */
        {
          str_from(ptr1, hdr->owner, hdr->nick);
          hdr->xmode |= POST_INCOME;     /* also MAIL_INCOME */
        }
        else if (ptr3)
        {
          ptr3[-1] = '\0';
          str_ncpy(hdr->owner, ptr1, sizeof(hdr->owner));
          if (ptr2 = strchr(ptr3 + 1, ')'))
          {
            *ptr2 = '\0';
            str_ncpy(hdr->nick, ptr3 + 1, sizeof(hdr->nick));
          }
        }
      }

      if (fgets(buf, sizeof(buf), fp) &&
        fgets(buf, sizeof(buf), fp) &&
        strlen(buf) > 30 &&
        (ptr = strchr(buf, ':')))
      {
        /* 若甲站文章格式不是這樣,要另外改 */
        /* 時間: Sun Apr 24 18:21:52 2005 */

        ptr[9] = ptr[12] = ptr[15] = ptr[18] = ptr[21] = ptr[26] = '\0';

        for (i = 0; i < 12; i++)
        {
          if (!str_ncmp(ptr + 6, months[i], 3))
            break;
        }

        ptime.tm_sec = atoi(ptr + 19);
        ptime.tm_min = atoi(ptr + 16);
        ptime.tm_hour = atoi(ptr + 13);
        ptime.tm_mday = atoi(ptr + 10);
        ptime.tm_mon = i;
        ptime.tm_year = atoi(ptr + 22) - 1900;
        ptime.tm_isdst = 0;
#ifndef CYGWIN
        ptime.tm_zone = "CST";
        ptime.tm_gmtoff = 0;
#endif

        datevalue = mktime(&ptime);
        str_stamp(hdr->date, &datevalue);
      }
    }

    fclose(fp);
  }
}

: bmtad.c:bbs_brd() 不要加入轉寄的檔頭

  if (method == 'A')
  {
    if (!*title)
      sprintf(title, "來自 %.64s", author);

-   sprintf(buf, "發信人: %.50s 看板: %s\n標  題: %.72s\n發信站: %s\n\n",
-     from, brdname, title, Btime(&hdr.chrono));

-   write(fd, buf, strlen(buf));
    write(fd, data, ap->data + ap->used - data);
    close(fd);
  }

- hdr.xmode = POST_INCOME;
  str_ncpy(hdr.owner, author, sizeof(hdr.owner));
  str_ncpy(hdr.title, title, sizeof(hdr.title));
+ hdr_fpath(buf, folder, &hdr);
+ change_hdr(&hdr, buf);
  rec_bot(folder, &hdr, sizeof(HDR));

: bmtad.c

  然後做這篇 patch
  [修正] bmtad.c 寄信給精華區

: bmtad.c:bbs_gem() 不要加入轉寄的檔頭

  if (method == 'A')
  {
    if (!*title)
      sprintf(title, "來自 %.64s", author);

-   sprintf(buf, "發信人: %.50s 看板: %s\n標  題: %.72s\n發信站: %s\n\n",
-     from, brdname, title, Btime(&hdr.chrono));

-   write(fd, buf, strlen(buf));
    write(fd, data, ap->data + ap->used - data);
    close(fd);
  }

: bmtad.c:mta_mailer() 跳過 anti-spam 檢查,避免一次轉寄太多被 ban 了

  /* --------------------------------------------------- */
  /* check E-mail address for anti-spam first            */
  /* --------------------------------------------------- */

+ #if 0

  uptime = ap->uptime;

  ...
  ...

+ #endif

  /* --------------------------------------------------- */
  /* mail post                                           */
  /* --------------------------------------------------- */

> ──────────────────────────────────── <

  1. 改完 bmtad.c 以後,0Admin→BBSreset→指名及擋信 重開 bmtad

  2. mirror 看板文章

     登入甲站,進入該板,用 tag 一次把所有文章 F 轉寄到
     brdname.brd@my.domain.name
     (如果該站不提供 tag,那就只好一篇一篇轉)

  3. mirror 精華區文章

     登入甲站,進入該板精華區,用 tag 一次把所有文章 F 轉寄到
     brdname.gem@my.domain.name
     (巢狀結構要自己一層一層進去轉寄)

     精華區 mirror 回來時,巢狀結構會消失
     所以可以在每 mirror 一個目錄,就回自己的站收錄一個目錄

  4. 這樣就可以整個 mirror 回來了
     mirror 完以後,記得把 bmtad.c 改回原來的樣子,再重開 bmtad


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