回精華區
作者itoc, 信區: itoc
標題[功能] 利用 BBSNet 來達成連一個 IP 可以選多個站
時間05/12/10
作者: itoc (核心動力) 看板: itoc
標題: Re: [問題] 關於 BBSNET.C
時間: 2005/12/08 Thu 20:47:10                           Updated: 2005/12/09

※ 引述《roga (任性)》之銘言:
> 小弟要在同一台機器上面架兩個 BBS ,
> 想讓使用者透過 port 23 連上後,
> 再讓他選擇他要連這台機器上的哪個 BBS 。
> 所以有辦法把這個功能做在主 BBS 的開頭畫面,然後讓使用者自由選擇
> 要連到 第二個 BBS 或者是直接進入主 BBS 。

  要在同一台主機上,架二個 BBS 站,請參考精華區
  [安裝] 一台主機架二個 BBS 站

  以下,所謂
  「本站」指的是開在 port 23 的那個站
  「二號站」、「三號站」指的是架在同一台機器上,但開在不同 port 的那些站

: 本站要加入 BBSNet 的功能

  請參考精華區
  [網路] bbsnet.c BBS-Net

: 改本站的 bbsnet.c

  新增一個 x_bbsnet2() 在 x_bbsnet() 後面
  內容照抄 x_bbsnet()

: 改本站的 bbsnet.c:x_bbsnet2()

int
x_bbsnet2()
{
  int fd, i, j;
- char buf[80];
+ char buf[256];

  ...
  ...

- cutmp->status |= STATUS_REJECT;       /* bbsnet 時不收熱訊 */

- while (1)
- {
    ...
    ...

    else
    {
-     break;
+     return 0;
    }

    vs_bar("環島旅行");

    ...
    ...

    vget(b_lines, 0, "請選擇一個連線站台:[Q] ", buf, 3, DOECHO);
    i = atoi(buf) - 1;
-   if (i >= 0 && i < j)
+   if (i == 0)
+   {
+     return 0;
+   }
+   else if (i >= 1 && i < j)
    {
-     sprintf(buf, "%s %s enter %s", cuser.userid, Now(), connlist[i].name);
+     sprintf(buf, "%s %s enter %s", fromhost, Now(), connlist[i].name);
      blog("BBSNET", buf);
      telnet(connlist[i].host, connlist[i].port);
-     sprintf(buf, "%s %s leave %s", cuser.userid, Now(), connlist[i].name);
+     sprintf(buf, "%s %s leave %s", fromhost, Now(), connlist[i].name);
      blog("BBSNET", buf);
    }
-   else
-   {
-     break;
-   }
- }

- cutmp->status ^= STATUS_REJECT;
- return 0;
+ abort_bbs();
}

: 改本站的 bbsd.c:tn_main()

static inline void
tn_main()
{
  clear();

#ifdef HAVE_LOGIN_DENIED
  if (acl_has(BBS_ACLFILE, "", fromhost))
    login_abort("\n貴機器於不被敝站接受");
#endif

+ DL_func("bin/bbsnet.so:x_bbsnet2");

: 改本站的 etc/connlist
: 第一行寫本站
: 第二行寫二號站
: 第二行寫三號站 (如果有的話)
: 範例

xx.yy.zz:23:本站的站名
xx.yy.zz:3456:二號站的站名
xx.yy.zz:4567:三號站的站名

> 然後,使用者的 IP 還是一樣是原本上站的 IP
> 不會變成提供 bbsnet 的主機的 IP ,這樣有辦法達成嗎?

  以上作法
  連本站會是使用者來源 IP
  連二號站、三號站的來源都會變成主機 IP

  若希望連二號站、三號站的來源都是使用者來源 IP 的話
  則還要做以下  (以下這方法是賤招 :p)

  使用以下這方法,必須要二號站、三號站和本站在同一台機器上

: 改本站的 bbsnet.c:x_bbsnet2()

    else if (i >= 1 && i < j)
    {
+     while (1)
+     {
+       if (dashf("/tmp/bbsnet"))
+       {
+         usleep(500000);
+         continue;
+       }
+       if ((fd = open("/tmp/bbsnet",
+         O_WRONLY | O_CREAT | O_APPEND, 0666)) >= 0)
+       {
+         write(fd, fromhost, strlen(fromhost));
+         close(fd);
+       }
+     }
      sprintf(buf, "%s %s enter %s", fromhost, Now(), connlist[i].name);
      blog("BBSNET", buf);
      telnet(connlist[i].host, connlist[i].port);
      sprintf(buf, "%s %s leave %s", fromhost, Now(), connlist[i].name);
      blog("BBSNET", buf);
    }

: 改 二號站、三號站的 bbsd.c:main()

    dns_name((char *) &sin.sin_addr, fromhost);
+   if (!strcmp(fromhost, "xx.yy.zz"))      /* 其中 xx.yy.zz 是本站的 fqdn */
+   {
+     if (dashf("/tmp/bbsnet"))
+     {
+       FILE *fp;
+       if (fp = fopen("/tmp/bbsnet", "r"))
+       {
+         char buf[128];
+         if (fgets(buf, sizeof(buf), fp))
+           str_ncpy(fromhost, buf, sizeof(fromhost));
+         fclose(fp);
+       }
+       unlink("/tmp/bbsnet");
+     }
+   }

--
=[:摃�◣�:Origin ]|[  O�cpu.tfcis.org  ]|[�搟說:]=
=[:摃�╱�:Author ]|[  pc512-1.ee.nctu.edu.tw  ]|[�:]=
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻