荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (frozen), 信区: InstallBBS
标  题: innbbsd-patch.0.50beta-4-0.50beta-5F(转寄)
发信站: 荔园晨风BBS站 (Wed Jan  9 11:29:41 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjksam@smth.org 所发表 】
发信人: yuhuan.bbs@ytht.net (玻璃罩子~~楔形文字~~阿卡德统治苏美尔), 信区:
BBSMan_Dev
标  题: innbbsd-patch.0.50beta-4-0.50beta-5F(转寄)
发信站: YTHT (Fri Jan  4 22:27:36 2002)
转信站: SMTH!thunews.dhs.org!news.happynet.org!YTHT

diff -rcs innbbsd-0.50beta-4/CHANGES innbbsd-0.50beta-5F/CHANGES
*** innbbsd-0.50beta-4/CHANGES  Sat Sep  2 19:07:52 1995
--- innbbsd-0.50beta-5F/CHANGES Sun Sep 17 20:59:41 1995
***************
*** 106,108 ****
--- 106,123 ----
       add -k option
       fix PalmBBS bug for bbslink.c, not include utime.h

+ 0.50beta-5
+      bbslink broken for organization with "(".
+      bbslink may lose posts when connections broken
+      process disk write failed in received_article
+      add ctlinnbbsd pause, go command to pause/resume innbbsd.
+      add extra meaning for bbsnnrp -g option:
+       stdin: -g to specify and override newsgroups name
+       nntp:  -g to specify the newsgroup name to process in the active
file
+      add more options for innbbs.conf
+      add -f innbbs.conf -D /home/bbs to use another innbbs.conf or
+         change BBSHOME
+      add filter.ctl
+      remove ~{, ~} for HZ->GB conversion
+      can't remove for PalmBBS
+      incorrect date information for bbslink
diff -rcs innbbsd-0.50beta-4/FEATURES innbbsd-0.50beta-5F/FEATURES
*** innbbsd-0.50beta-4/FEATURES Sat Sep  2 19:07:52 1995
--- innbbsd-0.50beta-5F/FEATURES        Sun Sep 17 20:59:41 1995
***************
*** 1,6 ****
  innbbsd 简介

! * 支援 client/server news gateway.
  * 可同时接收多个 news server (多个 link) 喂送, 或主动从多个 news
server
    收取相同或不同讨论区.
  * 可同时 feed 多个 server (BBS or News). 不靠 news server 也能使 BBS
--- 1,6 ----
  innbbsd 简介

! * 支援 client(active)/server(passive) news gateway.
  * 可同时接收多个 news server (多个 link) 喂送, 或主动从多个 news
server
    收取相同或不同讨论区.
  * 可同时 feed 多个 server (BBS or News). 不靠 news server 也能使 BBS
***************
*** 19,21 ****
--- 19,22 ----
  * 可用 inetd 启动或跑成 standalone server. 两种方式不管多少
connections
    都只用一个 process 处理, 不会有 fork process 的负担.
  * 利用 "ctlinnbbsd" 命令控制 server, 可随时检查 server 状态.
+ * 不同中文码转码 gateway
diff -rcs innbbsd-0.50beta-4/Makefile innbbsd-0.50beta-5F/Makefile
*** innbbsd-0.50beta-4/Makefile Sat Sep  2 19:07:56 1995
--- innbbsd-0.50beta-5F/Makefile        Sun Sep 17 20:59:44 1995
***************
*** 1,13 ****
  ####################################################
  # this is a bbs <--> news gateway
! #####################################################
! VERSION=0.50beta-4
! LASTVERSION=0.50beta-3
  ADMINUSER= bbsroot@your.host.domain
  #BBSHOME = /tmp/innbbsd-$(VERSION)
  BBSHOME = /home/bbs/innbbsd/home
  #BBS_SRC = /u/staff/bbsroot/csie_util/bntpd/bbs_src
  BBS_SRC = /u/staff/bbsroot/bbs_src
  #######################
  # if you want to make a "bbsnnrp" only,
  # change TARGET=$(BBSNNRP)
--- 1,34 ----
  ####################################################
  # this is a bbs <--> news gateway
! ####################################################
! # Don't change them
! VERSION=0.50beta-5F
! LASTVERSION=0.50beta-4
! ####################################################
! # this will show up in the greeting message of innbbsd
  ADMINUSER= bbsroot@your.host.domain
+ #
+ ####################################################
  #BBSHOME = /tmp/innbbsd-$(VERSION)
  BBSHOME = /home/bbs/innbbsd/home
  #BBS_SRC = /u/staff/bbsroot/csie_util/bntpd/bbs_src
  BBS_SRC = /u/staff/bbsroot/bbs_src
+ LANG=BIG5
+ #LANG=GB
+ #LANG=ENGLISH
+
+ ######################################################
+ # if you want to do gb <--> big5 converstion on the fly
+ # You should install HC or WORDGB before adding this line
+ #FILTER=-DFILTER -DBIG2GB -DGB2BIG -DHZ2GB
+ #FILTER=-DFILTER -DBIG2GB -DGB2BIG -DHZ2GB -DBIG2JIS -DJIS2BIG
+ #FILTER=WORDG2B
+ #FILTEROBJ= filter.o wildmat.o \
+ #          convert/hztty/io.o convert/hztty/b2g.o \
+ #          convert/hztty/b2g_tables.o \
+ #       convert/hztty/hz2gb.o \
+ #          convert/hztty/log.o \
+
  #######################
  # if you want to make a "bbsnnrp" only,
  # change TARGET=$(BBSNNRP)
***************
*** 23,32 ****
  OPT= -g

  # You must choose at least one: PhoenixBBS, PalmBBS, PivotBBS,
SecretBBS
! # or PowerBBS
  #
! # only Phoenix and Power BBS are supported and others haven't been
tested

########################################################################

  BBS_DEP = PhoenixBBS
  BBS_REC = $(BBS_SRC)/record.o r_port.o
  BBS_POST = innd/bbspost
--- 44,54 ----
  OPT= -g

  # You must choose at least one: PhoenixBBS, PalmBBS, PivotBBS,
SecretBBS
! # ,PowerBBS, or MapleBBS
  #
! # For PalmBBS, PowerBBS, MapleBBS, Please read README.xxx

########################################################################

+ # For PhoenixBBS,
  BBS_DEP = PhoenixBBS
  BBS_REC = $(BBS_SRC)/record.o r_port.o
  BBS_POST = innd/bbspost
***************
*** 39,50 ****
  # For PalmBBS
  #BBS_DEP = PalmBBS
  #BBS_REC = r_port.o $(BBS_SRC)/libbbs.a
! #BBS_POST =
  ################################################
  # For Secret BBS,
  #BBS_DEP = SecretBBS
  #BBS_REC = $(BBS_SRC)/record.o r_port.o
  #BBS_POST = innd/bbspost
  ###############################################3
  # For Pivot BBS,
  #BBS_DEP = PivotBBS
--- 61,81 ----
  # For PalmBBS
  #BBS_DEP = PalmBBS
  #BBS_REC = r_port.o $(BBS_SRC)/libbbs.a
! #BBS_POST =
! #INND_ROOT= $(BBS_SRC)/
! #BBS_POST = $(INND_ROOT)innd/bbspost
  ################################################
  # For Secret BBS,
  #BBS_DEP = SecretBBS
  #BBS_REC = $(BBS_SRC)/record.o r_port.o
  #BBS_POST = innd/bbspost
+ ################################################
+ # For Maple BBS,

+ #BBS_DEP = MapleBBS
+ #BBS_REC = $(BBS_SRC)/record.o r_port.o
+ #INND_ROOT= $(BBS_SRC)/
+ #BBS_POST =
+ #BBS_POST = $(INND_ROOT)innd/bbspost
  ###############################################3
  # For Pivot BBS,
  #BBS_DEP = PivotBBS
***************
*** 56,83 ****
  #
  ###############
  DEBUGOBJ = /usr/lib/debug/mallocmap.o
! CFLAGS= -c -I. -I$(BBS_SRC) -D$(BBS_DEP) $(EXTRAFLAGS) -DDBZDEBUG
-D_PATH_BBSHOME=\"$(BBSHOME)\" -DVERSION=\"$(VERSION)\"
-DADMINUSER=\"$(ADMINUSER)\"
  #
  ####################################################

  OBJS = inndchannel.o innbbsd.o connectsock.o rfc931.o \
         daemon.o file.o pmain.o parsdate.o his.o dbz.o \
         closeonexec.o dbztool.o inntobbs.o echobbslib.o
receive_article.o \
!        $(BBS_REC)
  SRCS = inndchannel.c innbbsd.c connectsock.c rfc931.c \
         daemon.c file.c pmain.c parsdate.y his.c dbz.c \
         closeonexec.c dbztool.c inntobbs.c bbslib.c receive_article.c
\
!        port.c

  MOBJS    = makedbz.o bbslib.o file.o dbz.o closeonexec.o
  HOBJS    = mkhistory.o bbslib.o file.o his.o dbz.o port.o
closeonexec.o
  DBZOBJS  = dbzserver.o dbzinnbbsd.o pmain.o connectsock.o bbslib.o
his.o \
           daemon.o file.o dbz.o dbztool.o rfc931.o port.o closeonexec.o
  NNRPOBJS = bbsnnrp.o pmain.o bbslib.o connectsock.o file.o
! LINKOBJS = bbslink.o pmain.o inntobbs.o echobbslib.o connectsock.o
file.o port.o
  CTLOBJS  = ctlinnbbsd.o pmain.o bbslib.o connectsock.o file.o
  INNBBSD  = innbbsd makedbz mkhistory dbzserver bbsnnrp \
!          ctlinnbbsd $(BBS_POST) dbz_query_sample $(BBSLINK)
  BBSNNRP  = bbsnnrp
  BBSLINK  = bbslink
  #BBSLINK  =
--- 87,120 ----
  #
  ###############
  DEBUGOBJ = /usr/lib/debug/mallocmap.o
! CFLAGS= -c -I. -I$(BBS_SRC) -D$(BBS_DEP) $(EXTRAFLAGS) -DDBZDEBUG \
!       -D_PATH_BBSHOME=\"$(BBSHOME)\" -DVERSION=\"$(VERSION)\" \
!       -DADMINUSER=\"$(ADMINUSER)\" $(FILTER) \
!       -DLANG=\"$(LANG)\"
  #
  ####################################################

  OBJS = inndchannel.o innbbsd.o connectsock.o rfc931.o \
         daemon.o file.o pmain.o parsdate.o his.o dbz.o \
         closeonexec.o dbztool.o inntobbs.o echobbslib.o
receive_article.o \
!        lang.o \
!        $(BBS_REC) $(FILTEROBJ)
  SRCS = inndchannel.c innbbsd.c connectsock.c rfc931.c \
         daemon.c file.c pmain.c parsdate.y his.c dbz.c \
         closeonexec.c dbztool.c inntobbs.c bbslib.c receive_article.c
\
!        lang.c \
!        port.c filter.c wildmat.c

  MOBJS    = makedbz.o bbslib.o file.o dbz.o closeonexec.o
  HOBJS    = mkhistory.o bbslib.o file.o his.o dbz.o port.o
closeonexec.o
  DBZOBJS  = dbzserver.o dbzinnbbsd.o pmain.o connectsock.o bbslib.o
his.o \
           daemon.o file.o dbz.o dbztool.o rfc931.o port.o closeonexec.o
  NNRPOBJS = bbsnnrp.o pmain.o bbslib.o connectsock.o file.o
! LINKOBJS = bbslink.o pmain.o inntobbs.o echobbslib.o connectsock.o
file.o \
!          port.o  parsdate.o lang.o $(FILTEROBJ)
  CTLOBJS  = ctlinnbbsd.o pmain.o bbslib.o connectsock.o file.o
  INNBBSD  = innbbsd makedbz mkhistory dbzserver bbsnnrp \
!          ctlinnbbsd $(BBS_POST) dbz_query_sample $(BBSLINK)
  BBSNNRP  = bbsnnrp
  BBSLINK  = bbslink
  #BBSLINK  =
***************
*** 148,155 ****
  echobbslib.o: echobbslib.c
        $(CC) $(OPT) $(CFLAGS) -DWITH_ECHOMAIL echobbslib.c

! innd/bbspost: innd/bbspost.c
!       (cd innd; $(MAKE) CC=$(CC) BBS_SRC=$(BBS_SRC))

  tar:
        test -d innbbsd-$(VERSION) || mkdir innbbsd-$(VERSION)
--- 185,192 ----
  echobbslib.o: echobbslib.c
        $(CC) $(OPT) $(CFLAGS) -DWITH_ECHOMAIL echobbslib.c

! $(BBS_POST): $(BBS_POST).c
!       (cd $(INND_ROOT)innd; $(MAKE) CC=$(CC) BBS_SRC=$(BBS_SRC))

  tar:
        test -d innbbsd-$(VERSION) || mkdir innbbsd-$(VERSION)
***************
*** 157,163 ****
        tar zcf innbbsd-$(VERSION).tar.gz innbbsd-$(VERSION)
        cp innbbsd-$(VERSION).tar.gz /net/ftphome/CSIE/innbbsd

! patch:
        rm -rf /tmp/innbbsd-$(LASTVERSION)
        zcat /net/ftphome/ftp-data/bbs/misc/innbbsd/innbbsd-$(LASTVERSION).
tar.gz | (cd /tmp; tar xf -)
        (cd /tmp/innbbsd-$(VERSION); make clean; rm -f r_port.c dbzserver.c
dbzinnbbsd.c  echobbslib.c )
--- 194,200 ----
        tar zcf innbbsd-$(VERSION).tar.gz innbbsd-$(VERSION)
        cp innbbsd-$(VERSION).tar.gz /net/ftphome/CSIE/innbbsd

! innbbsd-patch:
        rm -rf /tmp/innbbsd-$(LASTVERSION)
        zcat /net/ftphome/ftp-data/bbs/misc/innbbsd/innbbsd-$(LASTVERSION).
tar.gz | (cd /tmp; tar xf -)
        (cd /tmp/innbbsd-$(VERSION); make clean; rm -f r_port.c dbzserver.c
dbzinnbbsd.c  echobbslib.c )
***************
*** 182,188 ****
        (cd /tmp/innbbsd-$(VERSION); ln -s inndchannel.c dbzserver.c)
        (cd /tmp/innbbsd-$(VERSION); ln -s innbbsd.c dbzinnbbsd.c)
        (cd /tmp/innbbsd-$(VERSION); ln -s bbslib.c echobbslib.c)
!       (cd innd ; cp -r Makefile README innbbs.conf in.bntpd mailpost *.pl
bntplink bntplink.palmbbs *.active* *.c *.y *.bbs src
/tmp/innbbsd-$(VERSION)/innd)
        (cd /tmp/innbbsd-$(VERSION); make clean)
        (cd /tmp; tar zcf innbbsd-$(VERSION).tar.gz innbbsd-$(VERSION) )
        ln -s port.c r_port.c
--- 219,226 ----
        (cd /tmp/innbbsd-$(VERSION); ln -s inndchannel.c dbzserver.c)
        (cd /tmp/innbbsd-$(VERSION); ln -s innbbsd.c dbzinnbbsd.c)
        (cd /tmp/innbbsd-$(VERSION); ln -s bbslib.c echobbslib.c)
!       (cd innd ; cp -r Makefile README innbbs.conf filter.ctl *.pl bntplink
 bntplink.palmbbs *.active* *.c *.y *.bbs src
/tmp/innbbsd-$(VERSION)/innd)
!       cp -r convert /tmp/innbbsd-$(VERSION)
        (cd /tmp/innbbsd-$(VERSION); make clean)
        (cd /tmp; tar zcf innbbsd-$(VERSION).tar.gz innbbsd-$(VERSION) )
        ln -s port.c r_port.c
***************
*** 199,205 ****
        mv /u/staff/skhuang/skhuang.tcshrc /u/staff/skhuang/.tcshrc
        rcp /tmp/innbbsd-$(VERSION).tar.gz bbs_src.tar.gz cciris3:/tmp

! ftp: distribution patch
        rsh ccsun42 mv /home8/ftp/pub/bbs/misc/innbbsd/innbbsd-$(VERSION).
tar.gz /home8/ftp/pub/bbs/misc/innbbsd/.innbbsd-$(VERSION).tar.gz
        rcp /tmp/innbbsd-$(VERSION).tar.gz ccsun42:
/home8/ftp/pub/bbs/misc/innbbsd
        rcp README* ccsun42:/home8/ftp/pub/bbs/misc/innbbsd
--- 237,243 ----
        mv /u/staff/skhuang/skhuang.tcshrc /u/staff/skhuang/.tcshrc
        rcp /tmp/innbbsd-$(VERSION).tar.gz bbs_src.tar.gz cciris3:/tmp

! ftp: distribution innbbsd-patch
        rsh ccsun42 mv /home8/ftp/pub/bbs/misc/innbbsd/innbbsd-$(VERSION).
tar.gz /home8/ftp/pub/bbs/misc/innbbsd/.innbbsd-$(VERSION).tar.gz
        rcp /tmp/innbbsd-$(VERSION).tar.gz ccsun42:
/home8/ftp/pub/bbs/misc/innbbsd
        rcp README* ccsun42:/home8/ftp/pub/bbs/misc/innbbsd
***************
*** 253,259 ****
        -mv -f $(BBSHOME)/innd/ctlinnbbsd $(BBSHOME)/innd/ctlinnbbsd.OLD
        $(INSTALL) ctlinnbbsd $(BBSHOME)/innd/ctlinnbbsd
        -mv -f $(BBSHOME)/innd/bbspost $(BBSHOME)/innd/bbspost.OLD
!       $(INSTALL) innd/bbspost $(BBSHOME)/innd/bbspost
        -mv -f $(BBSHOME)/innd/bntplink $(BBSHOME)/innd/bntplink.OLD
        $(INSTALL) innd/bntplink $(BBSHOME)/innd/bntplink
        -mv -f $(BBSHOME)/innd/mkhistory $(BBSHOME)/innd/mkhistory.OLD
--- 291,297 ----
        -mv -f $(BBSHOME)/innd/ctlinnbbsd $(BBSHOME)/innd/ctlinnbbsd.OLD
        $(INSTALL) ctlinnbbsd $(BBSHOME)/innd/ctlinnbbsd
        -mv -f $(BBSHOME)/innd/bbspost $(BBSHOME)/innd/bbspost.OLD
!       $(INSTALL) $(BBS_POST) $(BBSHOME)/innd/bbspost
        -mv -f $(BBSHOME)/innd/bntplink $(BBSHOME)/innd/bntplink.OLD
        $(INSTALL) innd/bntplink $(BBSHOME)/innd/bntplink
        -mv -f $(BBSHOME)/innd/mkhistory $(BBSHOME)/innd/mkhistory.OLD
***************
*** 269,274 ****
--- 307,313 ----

  clean:
        rm -f *.o $(EXES) core innd/src/*.o
+       cd convert/hztty; make clean

  depend:
         makedepend -- $(CFLAGS) -- $(SRCS)
diff -rcs innbbsd-0.50beta-4/README innbbsd-0.50beta-5F/README
*** innbbsd-0.50beta-4/README   Sat Sep  2 19:07:52 1995
--- innbbsd-0.50beta-5F/README  Sun Sep 17 20:59:41 1995
***************
*** 200,206 ****
        bbsnnrp news.csie.nctu.edu.tw ~bbs/innd/news.csie.nctu.edu.tw.
active

     4. 若要跨站砍信, news server 有 control.cancel 则加入
!       control.cancel 0000000000 000000001
        若无 control.cancel 则用
        control 0000000000 000000001 y

--- 200,206 ----
        bbsnnrp news.csie.nctu.edu.tw ~bbs/innd/news.csie.nctu.edu.tw.
active

     4. 若要跨站砍信, news server 有 control.cancel 则加入
!       control.cancel 0000000000 000000001 y
        若无 control.cancel 则用
        control 0000000000 000000001 y

Only in innbbsd-0.50beta-5F: README.-0.50beta-5F
Only in innbbsd-0.50beta-5F: README.MapleBBS
Files innbbsd-0.50beta-4/README.PalmBBS and innbbsd-0.50beta-5F/README.
PalmBBS are identical
diff -rcs innbbsd-0.50beta-4/README.PowerBBS innbbsd-0.
50beta-5F/README.PowerBBS
*** innbbsd-0.50beta-4/README.PowerBBS  Sat Sep  2 19:07:53 1995
--- innbbsd-0.50beta-5F/README.PowerBBS Sun Sep 17 20:59:41 1995
***************
*** 1,4 ****
--- 1,5 ----
  .....................................................................
..
+ 本文件针对 innbbsd-0.50.tar.gz 所设...

  由於 PowerBBS 只用到 innbbsd 对 Message-ID 的处理, 因此 Make 的步骤如
下:

***************
*** 8,18 ****
        2. 执行 make <sys-type>
           <sys-type> 请参照原 make 的列表

!       3. 由於 PowerBBS 不需 innbbsd 提供的 bbspost 因此 make 到 bbspost
!          时会因错误而停止, 没有关系, innbbsd 只与 ctlinnbbsd 已 make 出来
!          了

!       4. 将 innbbsd 与 ctlinnbbsd 考到 PowerBBS 的 SYSTEM_PATH 里

        5. 在 SYSTEM_PATH 下再 mkdir innd

--- 9,18 ----
        2. 执行 make <sys-type>
           <sys-type> 请参照原 make 的列表

!       3. 将 innbbsd 与 ctlinnbbsd 考到 PowerBBS 的 SYSTEM_PATH 里

!       4. 另外有个 bbsnnrp 是 Client Gateway 的转信程式, 若您要使用
!          Client Gateway 方式转信, 一并考过去. 底下有更详细的说明.

        5. 在 SYSTEM_PATH 下再 mkdir innd

***************
*** 53,63 ****

        3. 若要停止 innbbsd 请用 ctlinnbbsd shutdown

!       4. 本版与原 innbbsd-0.41 有一处差异, 在 inndchannel.c 中对
           connect from 的 log 若以 -DPowerBBS 去 make 的将不会被
           log, 由於 PowerBBS 所使用的 innbbsd 只能以 localuser 去
           connect 并且 pbbsnnrpd 使用频繁, 因此 log 此项已无意义,
           在此跳过.


  From Samson
--- 53,144 ----

        3. 若要停止 innbbsd 请用 ctlinnbbsd shutdown

!       4. 本版与原 innbbsd-0.50 有一处差异, 在 inndchannel.c 中对
           connect from 的 log 若以 -DPowerBBS 去 make 的将不会被
           log, 由於 PowerBBS 所使用的 innbbsd 只能以 localuser 去
           connect 并且 pbbsnnrpd 使用频繁, 因此 log 此项已无意义,
           在此跳过.

+ .................................................................
+ 有关 Client Gateway 的设定
+
+     所谓 Client Gateway 就是让 PowerBBS 的转信不必等上游站送, 直接去
+ News Server 里抓, 就好像用 tin 去把信全部抓回来一样, 使用 Client
+ Gateway 的方式转信, 与 Server Gateway (上游主动送) 其功能上完全相同,
+ 包括连线砍信都有支援, 唯独对机器的负担较 Server Gateway 方式重很多,
+ 因此除非您只接少数的信区, 不然建议使用 Server Gateway. 详细的差异
+ 请参考 innbbsd-0.50 中的 README.
+
+       首先需要有 bbsnnrp 的程式, 在上半部有说明如何 make 出 bbsnnrp
+
+ 1. 设定 group.nntp
+
+ #index  IP               port  Link_level  Station_id
alt feed IP
+ #....................................................................
........
+ cgate   140.113.214.200  119   *           news.csie.nctu.edu.tw
140.126.3.111
+
+       index   是一个代号, 不要取太长...
+       IP      要转信的 News Server 的 IP
+       port    他的 port (NNTP 是 119)
+       Link_level      * 表以 POST 去送信, + 用 IHAVE
+                       一般来说, 除非是特别设定的 News Server, 不然
+                       请用 * 以 POST 出去, + 大多是给 Server Gateway
+                       转信在用的.
+       Station_id      News Server 的 Path: 栏代号.
+       alt feed IP     这要填执行 bbsnnrp 所在机器的 IP
+
+ 接著信区设定与原来的相同, 如:
+
+ tw.bbs.test   bbstest         cgate
+
+
+ 2. 在 innd/ 内设入两种档案:
+
+       active  设您要接的信区, 格式如下:
+
+ tw.bbs.test 000000000 000000001 y
+ tw.bbs.csbbs.pbbs 000000000 000000001 y
+ (依此类推)
+
+       active.cmsg 为连线砍信用, 固定如下:
+
+ control.cancel 0000000000 0000000001 y
+ control 000000000 000000001 y
+
+
+ 3. 第一次执行时, 请先重设抓信指标
+ (假设抓信的 server 是 news.csie.nctu.edu.tw)
+
+ bbsnnrp -c news.csie.nctu.edu.tw active
+ bbsnnrp -c news.csie.nctu.edu.tw active.cmsg
+
+ 注意: 这个步骤非常重要, 不然收 control message 时你就知道什麽叫惨了
!!!
+
+
+ 4. 接下就定时去执行底下的程式
+
+ bbsnnrp -r (pbbsnnrp 的 IP) -p (pbbsnnrp 的 port no) news.csie.nctu.
edu.tw active
+ bbsnnrp -r (pbbsnnrp 的 IP) -p (pbbsnnrp 的 port no) news.csie.nctu.
edu.tw active.cmsg
+
+ 可以用 crontab 的方式去设, 详细的说明请见 innbbsd-0.50 中 README 第
<3>
+ 项的 Client Gateway 中的第 <6> 点.
+
+
+ 5. 记得定期去处理 innd/ 底下的 bbsnnrp.log
+
+ 6. 多重 News Server 的抓取也请见原文件的 README 说明
+
+ 7. PowerBBS 可以将 Client Gateway 与 Server Gateway 同时并用, 也就是您

+ 将用 Client Gateway 方式抓来的信, 再以 Server Gateway 的方式转给你的下
游站,
+ 直接混合设定即可.
+
+ 8. 在 Client Gateway 中是否要支援连线砍信请深思熟虑, 砍信的 Control
Message
+ 可能会比所有要抓的信还要更多
+
+ 9. 其他的说明请见原始的 README 文件, 但本说明应已足以应付一般的使用了
..
+
+ .....................................................................
..
+ 最後还是要感谢 skhuang 先生的 innbbsd 及其大力协助...

  From Samson
+ Sep 5, 1995
Files innbbsd-0.50beta-4/TODO and innbbsd-0.50beta-5F/TODO are
identical
diff -rcs innbbsd-0.50beta-4/bbslib.c innbbsd-0.50beta-5F/bbslib.c
*** innbbsd-0.50beta-4/bbslib.c Sat Sep  2 19:07:53 1995
--- innbbsd-0.50beta-5F/bbslib.c        Sun Sep 17 20:59:41 1995
***************
*** 16,21 ****
--- 16,22 ----
  char ECHOMAIL[MAXPATHLEN];
  char BBSFEEDS[MAXPATHLEN];
  char LOCALDAEMON[MAXPATHLEN];
+ char FILTERCTL[MAXPATHLEN];

  int His_Maint_Min= HIS_MAINT_MIN;
  int His_Maint_Hour= HIS_MAINT_HOUR;
***************
*** 23,30 ****

  nodelist_t *NODELIST=NULL, **NODELIST_BYNODE=NULL;
  newsfeeds_t *NEWSFEEDS=NULL, **NEWSFEEDS_BYBOARD=NULL;
  static char *NODELIST_BUF, *NEWSFEEDS_BUF;
! int NFCOUNT, NLCOUNT;
  int LOCALNODELIST=0, NONENEWSFEEDS=0;

  #ifndef _PATH_BBSHOME
--- 24,38 ----

  nodelist_t *NODELIST=NULL, **NODELIST_BYNODE=NULL;
  newsfeeds_t *NEWSFEEDS=NULL, **NEWSFEEDS_BYBOARD=NULL;
+
+ #if  defined(FILTER) && defined(WITH_ECHOMAIL)
+ filter_t   *FILTERLIST=NULL;
+ static char *FILTER_BUF;
+ int FILTERCOUNT;
+ #endif
+
  static char *NODELIST_BUF, *NEWSFEEDS_BUF;
! int NFCOUNT, NLCOUNT;
  int LOCALNODELIST=0, NONENEWSFEEDS=0;

  #ifndef _PATH_BBSHOME
***************
*** 162,167 ****
--- 170,179 ----
     sprintf(INNBBSCONF,"%s/innbbs.conf",INNDHOME);
     sprintf(BBSFEEDS,"%s/bbsfeeds.log",INNDHOME);

+ #if  defined(FILTER) && defined(WITH_ECHOMAIL)
+    sprintf(FILTERCTL,"%s/filter.ctl",INNDHOME);
+ #endif
+
     if (isfile(INNBBSCONF)) {
       FILE *conf;
       char buffer[MAXPATHLEN];
***************
*** 240,247 ****
     if( ! isdir(fileglue("%s/out.going",BBSHOME)) ) {
        mkdir( (char*)fileglue("%s/out.going",BBSHOME), 0750 );
     }
!    if (NONENEWSFEEDS == 0)
       readnffile(INNDHOME);
     if (LOCALNODELIST == 0) {
       if (readnlfile(INNDHOME, outgoing) != 0) return 0;
     }
--- 252,263 ----
     if( ! isdir(fileglue("%s/out.going",BBSHOME)) ) {
        mkdir( (char*)fileglue("%s/out.going",BBSHOME), 0750 );
     }
!    if (NONENEWSFEEDS == 0) {
! #if  defined(FILTER) && defined(WITH_ECHOMAIL)
!      readfilterfile(INNDHOME);
! #endif
       readnffile(INNDHOME);
+    }
     if (LOCALNODELIST == 0) {
       if (readnlfile(INNDHOME, outgoing) != 0) return 0;
     }
***************
*** 322,327 ****
--- 338,344 ----
        NODELIST_BUF = (char*) myrealloc( NODELIST_BUF, st.st_size +1);
      }
      i = 0, count =0;
+     *NODELIST_BUF = '\0';
      while (fgets(buff, sizeof buff, fp) != NULL) {
         if (buff[0] == '#') continue;
         if (buff[0] == '\n') continue;
***************
*** 406,411 ****
--- 423,505 ----
      return 0;
  }

+ #if  defined(FILTER) && defined(WITH_ECHOMAIL)
+ readfilterfile(inndhome)
+ char *inndhome;
+ {
+
+     FILE *fp;
+     char buff[1024];
+     struct stat st;
+     int i, count;
+     char *ptr, *filterptr;
+
+     sprintf(buff,"%s/filter.ctl", inndhome);
+     fp = fopen(buff,"r");
+     if (fp == NULL) {
+        fprintf(stderr,"open fail %s",buff);
+        return -1;
+     }
+     if (fstat(fileno(fp),&st) != 0) {
+       fprintf(stderr,"stat fail %s", buff);
+         return -1;
+     }
+     if (FILTER_BUF == NULL) {
+       FILTER_BUF = (char*) mymalloc( st.st_size +1);
+     } else {
+       FILTER_BUF = (char*) myrealloc( FILTER_BUF, st.st_size +1);
+     }
+     *FILTER_BUF = '\0';
+     i = 0, count =0;
+     while (fgets(buff, sizeof buff, fp) != NULL) {
+        if (buff[0] == '#') continue;
+        if (buff[0] == '\n') continue;
+        strcpy(FILTER_BUF+i, buff);
+        i += strlen(buff);
+        count ++;
+     }
+     fclose(fp);
+     if (FILTERLIST == NULL) {
+        FILTERLIST = (filter_t*) mymalloc(sizeof(filter_t) *
(count+1));
+     } else {
+        FILTERLIST = (filter_t*) myrealloc(FILTERLIST, sizeof(filter_t)
 * (count+1));
+     }
+     FILTERCOUNT = 0;
+     for (ptr = FILTER_BUF; (filterptr = (char*)strchr(ptr,'\n')) !=
NULL; ptr = filterptr +1, FILTERCOUNT++) {
+       char *nptr , *bptr, *pptr;
+       *filterptr = '\0';
+       FILTERLIST[FILTERCOUNT].group = "";
+       FILTERLIST[FILTERCOUNT].rcmdfilter = "";
+       FILTERLIST[FILTERCOUNT].scmdfilter = "";
+         for (nptr= ptr ;*nptr && isspace(*nptr); ) nptr++;
+       if (*nptr == '\0') continue;
+         FILTERLIST[FILTERCOUNT].group = nptr;
+       nptr = strchr(nptr+1,':');
+       if (*nptr == '\0') continue;
+         *nptr = '\0';
+         for (nptr= nptr+1 ;*nptr && isspace(*nptr); ) nptr++;
+         FILTERLIST[FILTERCOUNT].rcmdfilter = nptr;
+       nptr = strchr(nptr,':');
+       if (*nptr == '\0') continue;
+         *nptr = '\0';
+         for (nptr= nptr+1 ;*nptr && isspace(*nptr); ) nptr++;
+         FILTERLIST[FILTERCOUNT].scmdfilter = nptr;
+     }
+ }
+
+ filter_t *search_filter(group)
+ char *group;
+ {
+     int i;
+     for (i=0; i< FILTERCOUNT; ++i) {
+        if (filtermatch(0, group, FILTERLIST[i].group))
+        return FILTERLIST+i;
+     }
+     return NULL;
+ }
+
+ #endif
+
  readnffile(inndhome)
  char *inndhome;
  {
***************
*** 430,435 ****
--- 524,530 ----
      } else {
        NEWSFEEDS_BUF = (char*) myrealloc( NEWSFEEDS_BUF, st.st_size +1);
      }
+     *NEWSFEEDS_BUF = '\0';
      i = 0, count =0;
      while (fgets(buff, sizeof buff, fp) != NULL) {
         if (buff[0] == '#') continue;
***************
*** 473,478 ****
--- 568,605 ----
        /*if (*nptr == '\0') continue;*/
          *nptr = '\0';
      }
+
+
+ #if  defined(FILTER) && defined(WITH_ECHOMAIL)
+     for (i=0; i< NFCOUNT; i++) {
+        newsfeeds_t *nfptr;
+        filter_t *fptr;
+        char *ngptr, *ptr;
+        int found;
+        nfptr = NEWSFEEDS+i;
+        for (found = 0, ngptr = nfptr->newsgroups, ptr = strchr(ngptr,
',');
+           ngptr && *ngptr && !found; ptr = strchr(ngptr,',')) {
+           if (ptr) *ptr = '\0';
+           fptr = (filter_t *) search_filter(ngptr);
+           if (fptr) {
+                 nfptr->rcmdfilter = fptr->rcmdfilter;
+                 nfptr->scmdfilter = fptr->scmdfilter;
+                 nfptr->rfilter = (FuncPtr)search_filtercmd(fptr->rcmdfilter);
+                 nfptr->sfilter = (FuncPtr)search_filtercmd(fptr->scmdfilter);
+                 found = 1;
+           } else {
+                 nfptr->rcmdfilter =  nfptr->scmdfilter = NULL;
+                 nfptr->rfilter = nfptr->sfilter = NULL;
+           }
+           if (ptr) {
+              *ptr = ',';
+              ngptr = ptr+1;
+           } else {
+              break;
+           }
+        }
+     }
+ #endif
      qsort(NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp);
      qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t*),
nf_byboardcmp);
  }
***************
*** 703,708 ****
--- 830,849 ----
        }
        return joinbuf;
  }
+
+ char *
+ parselocaltime(date_buf)
+ char *date_buf;
+ {
+    static char buffer[40];
+    char week[30], mon[30], day[30], time[30], year[30];
+    /* add null to prevent from long string */
+    if (strlen(date_buf) > 30) date_buf[30]= '\0';
+    sscanf(date_buf,"%s %s %s %s %s", week, mon, day, time, year);
+    sprintf(buffer,"%.4s %.4s %.4s %.10s",day, mon, year, time);
+    return buffer;
+ }
+

  #ifdef BBSLIB
  main()
diff -rcs innbbsd-0.50beta-4/bbslib.h innbbsd-0.50beta-5F/bbslib.h
*** innbbsd-0.50beta-4/bbslib.h Sat Sep  2 19:07:55 1995
--- innbbsd-0.50beta-5F/bbslib.h        Sun Sep 17 20:59:43 1995
***************
*** 11,20 ****
--- 11,34 ----
    FILE *feedfp;
  } nodelist_t;

+ #ifdef FILTER
+ typedef struct filter_t {
+   char *group;
+   char *rcmdfilter, *scmdfilter;
+ } filter_t;
+
+ typedef char *(*FuncPtr)();
+
+ #endif
+
  typedef struct newsfeeds_t {
    char *newsgroups;
    char *board;
    char *path;
+ #ifdef FILTER
+   FuncPtr rfilter, sfilter;
+   char *rcmdfilter, *scmdfilter;
+ #endif
  } newsfeeds_t;

  typedef struct overview_t {
***************
*** 32,37 ****
--- 46,52 ----
  extern char HISTORY[];
  extern char LOGFILE[];
  extern char INNBBSCONF[];
+ extern char FILTERCTL[];
  extern nodelist_t *NODELIST;
  extern nodelist_t **NODELIST_BYNODE;
  extern newsfeeds_t *NEWSFEEDS, **NEWSFEEDS_BYBOARD;
diff -rcs innbbsd-0.50beta-4/bbslink.c innbbsd-0.50beta-5F/bbslink.c
*** innbbsd-0.50beta-4/bbslink.c        Sat Sep  2 19:07:53 1995
--- innbbsd-0.50beta-5F/bbslink.c       Sun Sep 17 20:59:41 1995
***************
*** 21,26 ****
--- 21,27 ----
  #include "daemon.h"
  #include "nntp.h"
  #include "externs.h"
+ #include "lang.h"

  /* TODO
     1. read newsfeeds.bbs, read nodelist.bbs, read bbsname.bbs
***************
*** 87,92 ****
--- 88,95 ----

  char MYADDR[MAXBUFLEN];
  char MYSITE[MAXBUFLEN];
+ char SITE_BUF[MAXBUFLEN];
+ char *SITE_PTR = MYSITE;

  char SUBJECT_BUF[MAXBUFLEN];
  extern char* SUBJECT;
***************
*** 123,131 ****
  static char *LOCAL="LOCAL";

  static    int  FD, FD_SIZE;
! static    char *FD_BUF;
  static    char *FD_END;

  char *fileglue();

  bbslink_un_lock(file)
--- 126,135 ----
  static char *LOCAL="LOCAL";

  static    int  FD, FD_SIZE;
! static    char *FD_BUF=NULL, *FD_BUF_FILTER=NULL;
  static    char *FD_END;

+
  char *fileglue();

  bbslink_un_lock(file)
***************
*** 261,268 ****
               }
             } else if( strncmp( buffer, "Date:      ", 11 ) == 0 ) {
               strcpy(lover->date, buffer+11);
!            } else if( strncmp( buffer , "发信站: ", 8 ) == 0 ) {
!              m = strchr(buffer,'(');
               n = strrchr(buffer,')');
               strncpy(lover->date, m+1, n-m-1);
               lover->date[n-m-1] = '\0';
--- 265,276 ----
               }
             } else if( strncmp( buffer, "Date:      ", 11 ) == 0 ) {
               strcpy(lover->date, buffer+11);
! #ifndef FILTER
!            } else if( strncmp(buffer , OrganizationTxt, 8 ) == 0 ) {
! #else
!            } else if(isMsgTxt(OrganizationTxtClass, buffer)) {
! #endif
!              m = strrchr(buffer,'(');
               n = strrchr(buffer,')');
               strncpy(lover->date, m+1, n-m-1);
               lover->date[n-m-1] = '\0';
***************
*** 364,373 ****
        return 0;
      }
      flock(fileno(FN),LOCK_EX);
!     fprintf(FN,"发信人: %s, 信区: %s\n", POSTER, sover->board);
!     fprintf(FN,"标  题: %s\n", sover->subject);
!     fprintf(FN,"发信站: %s (%s)\n", MYSITE, sover->date);
!     fprintf(FN,"转信站: %s\n", sover->path);
      fprintf(FN,"\n");
      fputs(BODY, FN);
      flock(fileno(FN), LOCK_UN);
--- 372,381 ----
        return 0;
      }
      flock(fileno(FN),LOCK_EX);
!     fprintf(FN,"%s%s, %s%s\n", FromTxt, POSTER, BoardTxt,
sover->board);
!     fprintf(FN,"%s%s\n", SubjectTxt, sover->subject);
!     fprintf(FN,"%s%s (%s)\n", OrganizationTxt, SITE_PTR,
sover->date);
!     fprintf(FN,"%s%s\n", PathTxt, sover->path);
      fprintf(FN,"\n");
      fputs(BODY, FN);
      flock(fileno(FN), LOCK_UN);
***************
*** 378,383 ****
--- 386,392 ----
         times.actime = sover->mtime; times.modtime = sover->mtime;
         utime(fileglue("%s/boards/%s/%s", BBSHOME, board, filename),
&times);
         utime(fileglue("%s/.bcache/%s", BBSHOME,board), NULL);
+        chmod(fileglue("%s/boards/%s/%s", BBSHOME, board, filename),
0644);
      }
  #endif
  }
***************
*** 488,493 ****
--- 497,504 ----
      char *hash;
      char times[MAXBUFLEN];
      time_t mtime;
+     char *indata, *fd_buf;
+     int fd_size;

      board= sover->board; filename= sover->filename;
      group= sover->group; mtime= sover->mtime;
***************
*** 534,540 ****
            *CONTROL = '\0';
            sprintf(DATE, "%s",ascii_date( (mtime) ));
            if( NEWSFEED == LOCAL && !NoAction) {
!            SITE = MYSITE;
             PATH = MYBBSID;
             GROUPS = group;
             echomaillog();
--- 545,551 ----
            *CONTROL = '\0';
            sprintf(DATE, "%s",ascii_date( (mtime) ));
            if( NEWSFEED == LOCAL && !NoAction) {
!            SITE = SITE_PTR;
             PATH = MYBBSID;
             GROUPS = group;
             echomaillog();
***************
*** 550,567 ****
          }

          FD_SIZE = filesize(fileglue("%s/boards/%s/%s", BBSHOME, board,
filename));
          if (FD_BUF == NULL) {
!           FD_BUF = (char*)mymalloc(FD_SIZE+1);
          } else {
!           FD_BUF = (char*)myrealloc(FD_BUF, FD_SIZE+1);
          }
!         FD_END = FD_BUF + FD_SIZE;
          *FD_END = '\0';

!           read(FD, FD_BUF, FD_SIZE);
          if (Verbose) {
             printf("<read in> %s/boards/%s/%s\n", BBSHOME, board,
filename);
          }

          *ORGANIZATION = '\0';
          *NEWSCONTROL  = '\0';
--- 561,618 ----
          }

          FD_SIZE = filesize(fileglue("%s/boards/%s/%s", BBSHOME, board,
filename));
+         fd_size = FD_SIZE;
+
+ #ifdef  FILTER
+           fd_size += 266 * 3;
+ #endif
          if (FD_BUF == NULL) {
!           FD_BUF = (char*)mymalloc(fd_size+1);
          } else {
!           FD_BUF = (char*)myrealloc(FD_BUF, fd_size+1);
          }
!         fd_buf = FD_BUF;
! #ifdef FILTER
!           if (sover->from && *sover->from) {
!            sprintf(fd_buf,"From: %.256s\n", sover->from);
!            fd_buf += strlen(fd_buf);
!           }
!           if (sover->subject && *sover->subject) {
!            sprintf(fd_buf,"Subject: %.256s\n", sover->subject);
!            fd_buf += strlen(fd_buf);
!           }
!         if (NEWSFEED == LOCAL && MYSITE && *MYSITE) {
!            sprintf(fd_buf,"Organization: %.256s\n", MYSITE);
!            fd_buf += strlen(fd_buf);
!         }
! #endif
!
!         FD_END = fd_buf + FD_SIZE;
          *FD_END = '\0';

!           read(FD, fd_buf, FD_SIZE);
          if (Verbose) {
             printf("<read in> %s/boards/%s/%s\n", BBSHOME, board,
filename);

          }
+         indata = FD_BUF;
+
+ #ifdef FILTER
+           {
+ /* print Subject, From, Organization to FD_BUF,
+    filter,
+    parse out again
+ */
+           newsfeeds_t *nf;
+           char *outdata;
+           outdata = NULL;
+           nf = (newsfeeds_t*) search_board(board);
+           if (nf != NULL) {
+              outdata = (char*)filterdata(nf, 1, FD_BUF, &FD_BUF_FILTER);
+           }
+           if (outdata) indata= outdata;
+           /*indata = (char*)processfilter(FD_BUF, FD_BUF_FILTER, 1);*/
+         }
+ #endif

          *ORGANIZATION = '\0';
          *NEWSCONTROL  = '\0';
***************
*** 569,588 ****
          *NNTPHOST_BUF = '\0';
          NNTPHOST      = NULL;

!         for (buffer= FD_BUF, bufferp=strchr(buffer,'\n');
               buffer && *buffer; bufferp = strchr(buffer,'\n')) {
            if (bufferp) *bufferp = '\0';
            if( *buffer == '\0' ) {
                break;
            }
            /*printf("get buffer %s\n", buffer);*/
            if ( NEWSFEED == REMOTE) {
             if( strncmp(buffer,"Date:      ", 11) == 0 ) {
               strcpy(DATE_BUF, buffer+11 );
               DATE = DATE_BUF;
!              } else if( strncmp( buffer, "发信站: ", 8 ) == 0 ) {
               char *m, *n;
!              m = strchr( buffer, '(' );
               n = strrchr( buffer, ')' );
               if (m && n) {
                 strncpy( DATE_BUF, m+1, n-m-1 );
--- 620,657 ----
          *NNTPHOST_BUF = '\0';
          NNTPHOST      = NULL;

!         for (buffer= indata, bufferp=strchr(buffer,'\n');
               buffer && *buffer; bufferp = strchr(buffer,'\n')) {
            if (bufferp) *bufferp = '\0';
            if( *buffer == '\0' ) {
                break;
            }
            /*printf("get buffer %s\n", buffer);*/
+ #ifdef FILTER
+             if (strncmp( buffer, "Subject: ", 9) == 0) {
+             strncpy(SUBJECT_BUF, buffer+9, sizeof SUBJECT_BUF);
+             sover->subject = SUBJECT_BUF;
+           } else if (strncmp( buffer, "From: ",6) ==0) {
+             strncpy(FROM_BUF, buffer+6, sizeof FROM_BUF);
+             sover->from = FROM_BUF;
+           } else if (strncmp( buffer, "Organization: ",14) == 0) {
+             if ( NEWSFEED == LOCAL )
+               strncpy(SITE_BUF, buffer+14, sizeof SITE_BUF);
+               SITE_PTR = SITE_BUF;
+           } else
+ #endif
            if ( NEWSFEED == REMOTE) {
+            time_t datevalue;
             if( strncmp(buffer,"Date:      ", 11) == 0 ) {
               strcpy(DATE_BUF, buffer+11 );
               DATE = DATE_BUF;
! #ifndef FILTER
!              } else if( strncmp( buffer, OrganizationTxt, 8 ) == 0 )
{
! #else
!              } else if(isMsgTxt(OrganizationTxtClass,  buffer)) {
! #endif
               char *m, *n;
!              m = strrchr( buffer, '(' );
               n = strrchr( buffer, ')' );
               if (m && n) {
                 strncpy( DATE_BUF, m+1, n-m-1 );
***************
*** 607,612 ****
--- 676,686 ----
             break;
           }
         }
+        if ( NEWSFEED == REMOTE) {
+            char* datevalue;
+            datevalue = (char*)parselocaltime(DATE_BUF);
+            strncpy(DATE_BUF, datevalue, sizeof DATE_BUF);
+        }
         if (bufferp) { BODY = bufferp+1;}
         else BODY = "";
         if (bufferp)
***************
*** 633,638 ****
--- 707,719 ----
  /*#       fprintf("BODY @BODY\n";*/
          close( FD );
       }
+      if (Verbose) {
+        printf("<read_outgoing> %s:%s:%s\n", sover->board,
sover->filename, sover->group);
+        printf("  => %ld:%s\n", mtime, sover->from);
+        printf("  => %s\n", sover->subject);
+        printf("  => %s:%s\n", sover->outgoingtype, sover->msgid);
+        printf("  => %s\n",sover->path);
+      }
       return 0;
  }

***************
*** 714,720 ****
        fprintf( NNTPwfp, "Newsgroups: %s\r\n", sover->group);
        fprintf( NNTPwfp, "Subject: %s\r\n", sover->subject);
        fprintf( NNTPwfp, "Date: %s\r\n", sover->date);
!       fprintf( NNTPwfp, "Organization: %s\r\n", MYSITE);
        fprintf( NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid);
        fprintf( NNTPwfp, "X-Filename: %s/%s\r\n", sover->board,
sover->filename);
     }
--- 795,801 ----
        fprintf( NNTPwfp, "Newsgroups: %s\r\n", sover->group);
        fprintf( NNTPwfp, "Subject: %s\r\n", sover->subject);
        fprintf( NNTPwfp, "Date: %s\r\n", sover->date);
!       fprintf( NNTPwfp, "Organization: %s\r\n", SITE_PTR);
        fprintf( NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid);
        fprintf( NNTPwfp, "X-Filename: %s/%s\r\n", sover->board,
sover->filename);
     }
***************
*** 1061,1070 ****
     }
     fprintf(FN,"%s\n", from);
     fprintf(FN,"%s\n", subject);
!    fprintf(FN,"发信人: %s, 信区: %s\n", from, board);
!    fprintf(FN,"标  题: %s\n", subject);
!    fprintf(FN,"发信站: %s (%s)\n", MYSITE, DATE);
!    fprintf(FN,"转信站: %s\n", MYBBSID);
     fputs("\n",FN);
     fputs(BODY, FN);
     pclose( FN );
--- 1142,1151 ----
     }
     fprintf(FN,"%s\n", from);
     fprintf(FN,"%s\n", subject);
!    fprintf(FN,"%s%s, %s%s\n", FromTxt, from, BoardTxt, board);
!    fprintf(FN,"%s%s\n", SubjectTxt, subject);
!    fprintf(FN,"%s%s (%s)\n", OrganizationTxt, SITE_PTR, DATE);
!    fprintf(FN,"%s%s\n", PathTxt, MYBBSID);
     fputs("\n",FN);
     fputs(BODY, FN);
     pclose( FN );
***************
*** 1077,1089 ****
        }
        FN = fopen(filepath,"w") ;

!       fprintf(FN,"发信人: %s, 信区: %s\n", from, board);
!       fprintf(FN,"标  题: <article cancelled and mailed to the
moderator\n");
!       fprintf(FN,"发信站: %s (%s)\n", MYSITE, DATE);
!       fprintf(FN,"转信站: %s\n", MYBBSID);
        fprintf(FN,"\n");
  fputs("\n", FN);
! fprintf(FN,"你的文章 \"%s\" 已经送往审核中. 请等待回覆.\n", subject);

  fputs("\n", FN);
  fputs("Your post has been sent to the moderator and move\n",FN);
  fputs("into the deleted board. If the post accepted by the moderator,
\n",FN);
--- 1158,1170 ----
        }
        FN = fopen(filepath,"w") ;

!       fprintf(FN,"%s%s, %s%s\n", FromTxt, from, BoardTxt, board);
!       fprintf(FN,"%s<article cancelled and mailed to the
moderator\n",SubjectTxt);
!       fprintf(FN,"%s%s (%s)\n", OrganizationTxt, SITE_PTR, DATE);
!       fprintf(FN,"%s%s\n", PathTxt, MYBBSID);
        fprintf(FN,"\n");
  fputs("\n", FN);
! fprintf(FN,ModerationTxt,subject);
  fputs("\n", FN);
  fputs("Your post has been sent to the moderator and move\n",FN);
  fputs("into the deleted board. If the post accepted by the moderator,
\n",FN);
***************

*** 1115,1122 ****
  int nlcount;
  {
      FILE *POSTS;
!     char textline[1024];
!     char baktextline[1024];
      char *filepath;
      int status;

--- 1196,1203 ----
  int nlcount;
  {
      FILE *POSTS;
!     char textline[4096];
!     char baktextline[4096];
      char *filepath;
      int status;

***************
*** 1271,1276 ****
--- 1352,1384 ----

  */

+
+ saverename(file1, file2)
+ char *file1, *file2;
+ {
+     FILE *dest, *src;
+     char buf[1024];
+     if (isfile(file2) && !iszerofile(file2)) {
+       dest = fopen(file2,"a");
+       src  = fopen(file1,"r");
+       if (src && dest) {
+        while (fgets(buf,sizeof buf, src) != NULL) {
+           fputs(buf,dest);
+           fflush(dest);
+        }
+        fclose(dest); fclose(src);
+        unlink(file1);
+        return 0;
+       } else {
+       if (src) fclose(src);
+       if (dest)fclose(dest);
+         return rename(file1, file2);
+       }
+     } else {
+       return rename(file1, file2);
+     }
+ }
+

  send_article()
  {
      char *site, *addr, *protocol, *port, *op;
***************
*** 1338,1344 ****
                   fclose(node->feedfp);
                   node->feedfp = NULL;
              }
!             rename( linkfile, sendfile );
                send_nntplink( node, site, nntphost, protocol, port,
sendfile, nlcount);
              bbslink_un_lock(linkfile);
              bbslink_un_lock(sendfile);
--- 1446,1452 ----
                   fclose(node->feedfp);
                   node->feedfp = NULL;
              }
!             saverename( linkfile, sendfile );
                send_nntplink( node, site, nntphost, protocol, port,
sendfile, nlcount);
              bbslink_un_lock(linkfile);
              bbslink_un_lock(sendfile);
***************
*** 1366,1372 ****
                         node->feedfp = NULL;
                 }
               }
!              rename( feedfile, feedingfile );
               system(fileglue("%s/ctlinnbbsd reload > /dev/null",
INNDHOME));
                 send_nntplink( node, site, nntphost, protocol, port,
feedingfile, nlcount);
               bbslink_un_lock(feedfile);
--- 1474,1480 ----
                         node->feedfp = NULL;
                 }
               }
!              saverename( feedfile, feedingfile );
               system(fileglue("%s/ctlinnbbsd reload > /dev/null",
INNDHOME));
                 send_nntplink( node, site, nntphost, protocol, port,
feedingfile, nlcount);
               bbslink_un_lock(feedfile);
***************
*** 1399,1408 ****
    fprintf(stderr,"       -V (visit only: bbspost visit)\n");
    fprintf(stderr,"       -N (no visit, and only process batch
queue)\n");
    fprintf(stderr,"       -k (kill the former bbslink process before
started)\n\n");
!   fprintf(stderr,"本程式要正常执行必须将以下档案置於 %s/innd 下:\n",
BBSHOME);
!   fprintf(stderr,"bbsname.bbs   设定贵站的 BBS ID (请尽量简短)\n");
!   fprintf(stderr,"nodelist.bbs  设定网路各 BBS 站的 ID, Address 和
fullname\n");
!   fprintf(stderr,"newsfeeds.bbs 设定网路信件的 newsgroup board
nodelist ...\n");
    fprintf(stderr,"  -- Modified from mfchen's bntplink\n");
  }

--- 1507,1516 ----
    fprintf(stderr,"       -V (visit only: bbspost visit)\n");
    fprintf(stderr,"       -N (no visit, and only process batch
queue)\n");
    fprintf(stderr,"       -k (kill the former bbslink process before
started)\n\n");
!   fprintf(stderr,bbslinkUsage1, BBSHOME);
!   fprintf(stderr,bbslinkUsage2);
!   fprintf(stderr,bbslinkUsage3);
!   fprintf(stderr,bbslinkUsage4);
    fprintf(stderr,"  -- Modified from mfchen's bntplink\n");
  }

***************
*** 1627,1632 ****
--- 1735,1743 ----
  /*  For debug Only */
  #define DEBUGBBSLINK
  #ifdef DEBUGBBSLINK
+
+     initial_lang();
+
      NoAction = 0;
      Verbose = 0;
      VisitOnly = 0;
diff -rcs innbbsd-0.50beta-4/bbsnnrp.c innbbsd-0.50beta-5F/bbsnnrp.c
*** innbbsd-0.50beta-4/bbsnnrp.c        Sat Sep  2 19:07:53 1995
--- innbbsd-0.50beta-5F/bbsnnrp.c       Sun Sep 17 20:59:42 1995
***************
*** 132,137 ****
--- 132,138 ----
  fprintf(stderr,"          default=%d\n", MAX_STATS);
  fprintf(stderr,"       -t stdin|nntp (default=nntp)\n");
  fprintf(stderr,"       -g newsgroups\n");
+ fprintf(stderr,"          (stdin: pseudo group, nntp: the newsgroup to
 process)\n");
  fprintf(stderr,"       -m moderator\n");
  fprintf(stderr,"       -o organization\n");
  fprintf(stderr,"       -f trust_user (From: trust_user)\n");
***************
*** 595,600 ****
--- 596,607 ----
         rcptr->nameptr = nptr;
         for (nptr++; *nptr && !isspace(*nptr); ) nptr++;
         rcptr->namelen = (int)(nptr - rcptr->nameptr);
+        if (*DefaultNewsgroups) {
+        if (strncmp(DefaultNewsgroups,rcptr->nameptr,rcptr->namelen)!=0)
+          continue;
+          if (strlen(DefaultNewsgroups) > rcptr->namelen)
+          continue;
+        }
         if ( nptr == actlistptr) continue;
         for (nptr++ ;*nptr && isspace(*nptr); ) nptr++;
         if ( nptr == actlistptr) continue;
***************
*** 609,620 ****
         rcptr->low = atol(nptr);
         for (nptr++; *nptr && !isspace(*nptr); ) nptr++;
         rcptr->lowlen = (int)(nptr - rcptr->lowptr);
!        if ( nptr == actlistptr) continue;
         for (nptr++ ;*nptr && isspace(*nptr); ) nptr++;
!        if ( nptr == actlistptr) continue;
         rcptr->mode = *nptr;
         rcptr->modeptr = nptr;
-        ACT_COUNT ++;
     }
  }

--- 616,633 ----
         rcptr->low = atol(nptr);
         for (nptr++; *nptr && !isspace(*nptr); ) nptr++;
         rcptr->lowlen = (int)(nptr - rcptr->lowptr);
!        ACT_COUNT ++;
!        if ( nptr == actlistptr) {
!        fprintf(stderr,"No mode field. incomplete active file but
ignore\n");
!        continue;
!        }
         for (nptr++ ;*nptr && isspace(*nptr); ) nptr++;
!        if ( nptr == actlistptr) {
!        fprintf(stderr,"No mode field. incomplete active file but
ignore\n");
!        continue;
!        }
         rcptr->mode = *nptr;
         rcptr->modeptr = nptr;
     }
  }

Files innbbsd-0.50beta-4/clibrary.h and innbbsd-0.50beta-5F/clibrary.h
are identical
Files innbbsd-0.50beta-4/closeonexec.c and innbbsd-0.
50beta-5F/closeonexec.c are identical
Files innbbsd-0.50beta-4/connectsock.c and innbbsd-0.
50beta-5F/connectsock.c are identical
Only in innbbsd-0.50beta-5F: convert
diff -rcs innbbsd-0.50beta-4/ctlinnbbsd.c innbbsd-0.
50beta-5F/ctlinnbbsd.c

*** innbbsd-0.50beta-4/ctlinnbbsd.c     Sat Sep  2 19:07:53 1995
--- innbbsd-0.50beta-5F/ctlinnbbsd.c    Sun Sep 17 20:59:42 1995
***************
*** 18,23 ****
--- 18,25 ----
     fprintf(stderr,"  ctlinnbbsd hismaint : maintain history\n");
     fprintf(stderr,"  ctlinnbbsd listnodelist  : list nodelist.
bbs\n");
     fprintf(stderr,"  ctlinnbbsd listnewsfeeds : list newsfeeds.
bbs\n");
+    fprintf(stderr,"  ctlinnbbsd pause    : pause innbbsd server\n");
+    fprintf(stderr,"  ctlinnbbsd go       : resume innbbsd server\n");

  #ifdef GETRUSAGE
     fprintf(stderr,"  ctlinnbbsd getrusage: get resource usage\n");
  #endif
***************
*** 50,56 ****
  #endif
            strcasecmp(argv[0], "mode")==0       ||
            strcasecmp(argv[0], "listnodelist")==0   ||
!           strcasecmp(argv[0], "listnewsfeeds")==0
            ) {
            fprintf( innbbsout, "%s\r\n", argv[0]);
            fflush( innbbsout);
--- 52,60 ----
  #endif
            strcasecmp(argv[0], "mode")==0       ||
            strcasecmp(argv[0], "listnodelist")==0   ||
!           strcasecmp(argv[0], "listnewsfeeds")==0  ||
!           strcasecmp(argv[0], "pause")==0  ||
!           strcasecmp(argv[0], "go")==0
            ) {
            fprintf( innbbsout, "%s\r\n", argv[0]);
            fflush( innbbsout);
Files innbbsd-0.50beta-4/daemon.c and innbbsd-0.50beta-5F/daemon.c are
identical
diff -rcs innbbsd-0.50beta-4/daemon.h innbbsd-0.50beta-5F/daemon.h
*** innbbsd-0.50beta-4/daemon.h Sat Sep  2 19:07:55 1995
--- innbbsd-0.50beta-5F/daemon.h        Sun Sep 17 20:59:43 1995
***************
*** 39,44 ****
--- 39,45 ----
    int ihavecount, ihavesize, ihaveduplicate, ihavefail;
    int statcount, statfail;
    time_t begin;
+   char *filter_buffer;
  } ClientType;

  typedef struct Daemoncmd {
Files innbbsd-0.50beta-4/dbz.c and innbbsd-0.50beta-5F/dbz.c are
identical
Files innbbsd-0.50beta-4/dbz.h and innbbsd-0.50beta-5F/dbz.h are
identical
Files innbbsd-0.50beta-4/dbz_query_sample.c and innbbsd-0.
50beta-5F/dbz_query_sample.c are identical
Files innbbsd-0.50beta-4/dbztool.c and innbbsd-0.50beta-5F/dbztool.c are
 identical
diff -rcs innbbsd-0.50beta-4/doc/alt-gateways innbbsd-0.
50beta-5F/doc/alt-gateways
*** innbbsd-0.50beta-4/doc/alt-gateways Sat Sep  2 19:07:51 1995
--- innbbsd-0.50beta-5F/doc/alt-gateways        Sun Sep 17 20:59:40 1995
***************
*** 26,48 ****
                    请注意此 "," 必须加上
  C) 多(newsgroups)对一(board)转入, 一(board)对多(newsgroups)转出:
     N1,N2 B S
!    N1 B null
!    N2 B null

     Example: tw.bbs.campus.nctu + nctu.talk -> nctu board
                                  nctu board -> tw.bbs.campus.nctu,
nctu.talk
     tw.bbs.campus.nctu,nctu.talk  nctu    bbsroute
!    tw.bbs.campus.nctu            nctu    null
!    nctu.talk                     nctu    null

  C1)多(newsgroups)对一(board)转入, 一(board)对一(newsgroups)转出:
!    N2 B bbsroute
!    N1 B null

     Example: tw.bbs.test + csie.test -> test board
                                 test -> csie.test
     csie.test              test    bbsroute
!    tw.bbs.test            test    null

  D)多(boards)对一(newsgroup)转出, 一(newsgroups)转入多(board):
     N, B1 S
--- 26,48 ----
                    请注意此 "," 必须加上
  C) 多(newsgroups)对一(board)转入, 一(board)对多(newsgroups)转出:
     N1,N2 B S
!    N1 B, null
!    N2 B, null

     Example: tw.bbs.campus.nctu + nctu.talk -> nctu board
                                  nctu board -> tw.bbs.campus.nctu,
nctu.talk
     tw.bbs.campus.nctu,nctu.talk  nctu    bbsroute
!    tw.bbs.campus.nctu            nctu,    null
!    nctu.talk                     nctu,    null

  C1)多(newsgroups)对一(board)转入, 一(board)对一(newsgroups)转出:
!    N2 B  bbsroute
!    N1 B, null

     Example: tw.bbs.test + csie.test -> test board
                                 test -> csie.test
     csie.test              test    bbsroute
!    tw.bbs.test            test,    null

  D)多(boards)对一(newsgroup)转出, 一(newsgroups)转入多(board):
     N, B1 S
Files innbbsd-0.50beta-4/doc/bbnnrp-generic-gateway and innbbsd-0.
50beta-5F/doc/bbnnrp-generic-gateway are identical
Files innbbsd-0.50beta-4/doc/bbslink.8 and innbbsd-0.
50beta-5F/doc/bbslink.8 are identical
Only in innbbsd-0.50beta-5F/doc: bbslink.patch
diff -rcs innbbsd-0.50beta-4/doc/bbsnnrp.8 innbbsd-0.
50beta-5F/doc/bbsnnrp.8
*** innbbsd-0.50beta-4/doc/bbsnnrp.8    Sat Sep  2 19:07:51 1995
--- innbbsd-0.50beta-5F/doc/bbsnnrp.8   Sun Sep 17 20:59:40 1995
***************
*** 89,97 ****
  directly.
  .TP
  .BI \-g  " newsgroups"
! When feed to stdin,
  .I newsgroups
  is the pseudo newsgroup name.
  .TP
  .BI \-m  " moderator"
  You can add "Approved:
--- 89,100 ----
  directly.
  .TP
  .BI \-g  " newsgroups"
! When get feed from stdin,
  .I newsgroups
  is the pseudo newsgroup name.
+ When get feed from nntp, only handle
+ .I newsgroups
+ in the active file.
  .TP
  .BI \-m  " moderator"
  You can add "Approved:
Files innbbsd-0.50beta-4/doc/ctlinnbbsd.8 and innbbsd-0.
50beta-5F/doc/ctlinnbbsd.8 are identical
Only in innbbsd-0.50beta-5F/doc: filter.doc
Files innbbsd-0.50beta-4/doc/gateway.doc and innbbsd-0.
50beta-5F/doc/gateway.doc are identical
Files innbbsd-0.50beta-4/doc/gateway2.doc and innbbsd-0.
50beta-5F/doc/gateway2.doc are identical
Files innbbsd-0.50beta-4/doc/history-corrupt and innbbsd-0.
50beta-5F/doc/history-corrupt are identical
Files innbbsd-0.50beta-4/doc/innbbsd.8 and innbbsd-0.
50beta-5F/doc/innbbsd.8 are identical
Files innbbsd-0.50beta-4/doc/mailing-list-reply and innbbsd-0.
50beta-5F/doc/mailing-list-reply are identical
Files innbbsd-0.50beta-4/doc/makedbz.8 and innbbsd-0.
50beta-5F/doc/makedbz.8 are identical
Files innbbsd-0.50beta-4/doc/mkhistory.8 and innbbsd-0.
50beta-5F/doc/mkhistory.8 are identical
Files innbbsd-0.50beta-4/doc/multiple-feeds and innbbsd-0.
50beta-5F/doc/multiple-feeds are identical
Files innbbsd-0.50beta-4/doc/newsfeeds.bbs.5 and innbbsd-0.
50beta-5F/doc/newsfeeds.bbs.5 are identical
Files innbbsd-0.50beta-4/doc/nodelist.bbs.5 and innbbsd-0.
50beta-5F/doc/nodelist.bbs.5 are identical
Only in innbbsd-0.50beta-5F/doc: relaese.0.50beta-5F
Files innbbsd-0.50beta-4/doc/release.0.44 and innbbsd-0.
50beta-5F/doc/release.0.44 are identical
Files innbbsd-0.50beta-4/externs.h and innbbsd-0.50beta-5F/externs.h are
 identical
Files innbbsd-0.50beta-4/file.c and innbbsd-0.50beta-5F/file.c are
identical
Only in innbbsd-0.50beta-5F: filter.c
Files innbbsd-0.50beta-4/his.c and innbbsd-0.50beta-5F/his.c are
identical
Files innbbsd-0.50beta-4/his.h and innbbsd-0.50beta-5F/his.h are
identical
Files innbbsd-0.50beta-4/hisconvert and innbbsd-0.50beta-5F/hisconvert
are identical
diff -rcs innbbsd-0.50beta-4/innbbsconf.h innbbsd-0.
50beta-5F/innbbsconf.h
*** innbbsd-0.50beta-4/innbbsconf.h     Sat Sep  2 19:07:55 1995
--- innbbsd-0.50beta-5F/innbbsconf.h    Sun Sep 17 20:59:43 1995
***************
*** 189,192 ****
--- 189,211 ----
  #undef WITH_RECORD_O
  #endif

+ #ifdef HCCC
+ #if defined(HC) || defined(WORDG2B)
+ #  define Rfprintf b2gfprintf
+ #  define Sfprintf g2bfprintf
+ #  define Rfputs   b2gfputs
+ #  define Sfputs   g2bfputs
+ #else
+ #  define Rfprintf fprintf
+ #  define Sfprintf fprintf
+ #  define Rfputs   fputs
+ #  define Sfputs   fputs
+ #endif
+ #endif
+
+ #ifndef LANG
+ #define LANG "BIG5"
+ #endif
+
+
  #endif
diff -rcs innbbsd-0.50beta-4/innbbsd.c innbbsd-0.50beta-5F/innbbsd.c
*** innbbsd-0.50beta-4/innbbsd.c        Sat Sep  2 19:07:54 1995
--- innbbsd-0.50beta-5F/innbbsd.c       Sun Sep 17 20:59:42 1995
***************
*** 44,49 ****
--- 44,51 ----
  static int CMDverboselog ARG((ClientType*));
  static int CMDlistnodelist ARG((ClientType*));
  static int CMDlistnewsfeeds ARG((ClientType*));
+ static int CMDpause ARG((ClientType*));
+ static int CMDgo ARG((ClientType*));

  #ifdef GETRUSAGE
  static int CMDgetrusage ARG((ClientType*));
***************
*** 66,71 ****
--- 68,75 ----
    {"listnodelist","listnodelist (local)",1,1, NNTP_MODE_BAD,
NNTP_MODE_OK, CMDlistnodelist},
    {"listnewsfeeds","listnewsfeeds (local)",1,1, NNTP_MODE_BAD,
NNTP_MODE_OK, CMDlistnewsfeeds},
    {"reload","reload (local)",1,1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK,
CMDreload},
+   {"pause","pause (local)",1,1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK,
CMDpause},
+   {"go","go (local)",1,1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDgo},
    {"hismaint","hismaint (local)",1,1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK,
 CMDhismaint},
    {"verboselog","verboselog [on|off](local)",1,2, NNTP_VERBOSELOG_BAD,
 NNTP_VERBOSELOG_OK, CMDverboselog},
  #ifdef GETRUSAGE
***************
*** 454,459 ****
--- 458,515 ----
        fprintf(argv->out,"%d hismaint complete\r\n", p->normalcode);
        fflush(argv->out);
        verboselog("Hismaint Put: %d hismaint complete\n", p->normalcode);
+       return 1;
+ }
+
+ static int INNBBSDpause = 0;
+
+ static int CMDgo(client)
+ ClientType *client;
+ {
+         argv_t *argv = &client->Argv;
+       buffer_t *in = &client->in;
+       daemoncmd_t *p = argv->dc;
+       if (!islocalconnect(client)) {
+               fprintf(argv->out,"%d go access denied\r\n", p->errorcode);
+               fflush(argv->out);
+               verboselog("Pause Put: %d go access denied\n", p->errorcode);
+               return 1;
+       }
+
+       INNBBSDpause = 0;
+
+       fprintf(argv->out,"%d go complete\r\n", p->normalcode);
+       fflush(argv->out);
+       verboselog("Pause Put: %d go complete\n", p->normalcode);
+       return 1;
+ }
+
+
+
+ int
+ isPause()
+ {
+   return INNBBSDpause;
+ }
+
+ static int CMDpause(client)
+ ClientType *client;
+ {
+         argv_t *argv = &client->Argv;
+       buffer_t *in = &client->in;
+       daemoncmd_t *p = argv->dc;
+       if (!islocalconnect(client)) {
+               fprintf(argv->out,"%d pause access denied\r\n", p->errorcode);
+               fflush(argv->out);
+               verboselog("Pause Put: %d pause access denied\n", p->errorcode);
+               return 1;
+       }
+
+       INNBBSDpause = 1;
+
+       fprintf(argv->out,"%d pause complete\r\n", p->normalcode);
+       fflush(argv->out);
+       verboselog("Pause Put: %d pause complete\n", p->normalcode);
        return 1;
  }

Files innbbsd-0.50beta-4/innbbsd.h and innbbsd-0.50beta-5F/innbbsd.h are
 identical
Files innbbsd-0.50beta-4/innd/Makefile and innbbsd-0.
50beta-5F/innd/Makefile are identical
Files innbbsd-0.50beta-4/innd/README and innbbsd-0.50beta-5F/innd/README
 are identical
Files innbbsd-0.50beta-4/innd/bbsgate-skhuang.active and innbbsd-0.
50beta-5F/innd/bbsgate-skhuang.active are identical
Files innbbsd-0.50beta-4/innd/bbsgate.active and innbbsd-0.
50beta-5F/innd/bbsgate.active are identical
Files innbbsd-0.50beta-4/innd/bbsgate.active.BAK and innbbsd-0.
50beta-5F/innd/bbsgate.active.BAK are identical
Files innbbsd-0.50beta-4/innd/bbsgate.active.BAK.OLD and innbbsd-0.
50beta-5F/innd/bbsgate.active.BAK.OLD are identical
Files innbbsd-0.50beta-4/innd/bbsname.bbs and innbbsd-0.
50beta-5F/innd/bbsname.bbs are identical
Files innbbsd-0.50beta-4/innd/bbspost.c and innbbsd-0.
50beta-5F/innd/bbspost.c are identical
Files innbbsd-0.50beta-4/innd/bntplink and innbbsd-0.
50beta-5F/innd/bntplink are identical
Files innbbsd-0.50beta-4/innd/bntplink.palmbbs and innbbsd-0.
50beta-5F/innd/bntplink.palmbbs are identical
Only in innbbsd-0.50beta-5F/innd: filter.ctl
Only in innbbsd-0.50beta-4/innd: in.bntpd
diff -rcs innbbsd-0.50beta-4/innd/innbbs.conf innbbsd-0.
50beta-5F/innd/innbbs.conf
*** innbbsd-0.50beta-4/innd/innbbs.conf Sat Sep  2 19:07:57 1995
--- innbbsd-0.50beta-5F/innd/innbbs.conf        Sun Sep 17 20:59:46 1995
***************
*** 9,15 ****
  #    ctlinnbbsd grephist <mid>
  #    ctlinnbbsd addhist  <mid> path

! expiretime   3:50
! expiredays   7
! #nodelist  local
! #newsfeeds none
--- 9,32 ----
  #    ctlinnbbsd grephist <mid>
  #    ctlinnbbsd addhist  <mid> path

! expiretime    3:50
! expiredays    7
! #nodelist     local
! #newsfeeds    none
! #bbsname      mybbsname
! #organization 个人 BBS
! #adminuser    bbsroot@csie.nctu.edu.tw
! #hctable      /home/bbs/lib/hc.tab /home/bbs/lib/incorrect.tab
! #hctable      /home/bbs/lib/japsupp.tab
! #wordlib      /home/bbs/lib/wordg2b
! #             Name   Input         Output
! #filter       A      big2gb        gb2big
! #for tw.bbs.*  -> BBS in GB
! #filter       B      jis2big       big2jis
! #for fj.*      -> BBS in BIG5
! #filter       C      hz2gb         gb2hz
! #for alt.chinese.text -> BBS in GB
! #filter       D      ut8tobig      bigtout8
! #filter       E      ut7tout8      ut8tout7
! #filter       F      hz2gb:gb2big  big2gb:gb2hz
! #for alt.chinese.text -> BBS in BIG5
Files innbbsd-0.50beta-4/innd/innbbslib.pl and innbbsd-0.
50beta-5F/innd/innbbslib.pl are identical
Only in innbbsd-0.50beta-4/innd: mailpost
diff -rcs innbbsd-0.50beta-4/innd/news.active innbbsd-0.
50beta-5F/innd/news.active
*** innbbsd-0.50beta-4/innd/news.active Sat Sep  2 19:07:58 1995
--- innbbsd-0.50beta-5F/innd/news.active        Sun Sep 17 20:59:47 1995
***************
*** 1,16 ****
! csie.test   0000007691 0000007162 y
! tw.bbs.test 0000026840 0000023348 y
! nctu.test   0000010615 0000010011 y
! tw.test     0000006988 0000006952 y
! csie.computer-center   0000001656 0000000805 y
! nthu.test   0000006324 0000005613 y
! tw.bbs.admin.installbbs 0000002995 0000000338 y
! tw.bbs.comp.unix 0000018473 0000010378 y
! control.cancel 0000551473 0000486697 y
! csie.dcp  00000001130 0000000918 y
! tw.bbs.csbbs.pbbs 0000000162 0000000081 y
! alt.chinese.text.big5 0000065307 0000058972 y
! csie.course.u.chinese 0000017212 0000015600 y
! csie.gcp  0000002508 0000002030 y
! tw.bbs.campus.nthu 0000023054 0000013521 y
! csie.cp74  0000000000 0000000001 y
--- 1,16 ----
! csie.test   0000008094 0000007744 y
! tw.bbs.test 0000034714 0000031698 y
! nctu.test   0000015157 0000015044 y
! tw.test     0000008194 0000007851 y
! csie.computer-center   0000001770 0000000805 y
! nthu.test   0000007100 0000007018 y
! tw.bbs.admin.installbbs 0000003303 0000000901 y
! tw.bbs.comp.unix 0000020793 0000019891 y
! control.cancel 0000709694 0000706694 y
! csie.dcp  00000001166 0000001077 y
! tw.bbs.csbbs.pbbs 0000000433 0000000165 y
! alt.chinese.text.big5 0000066583 0000058972 y
! csie.course.u.chinese 0000028197 0000027892 y
! csie.gcp  0000002586 0000002338 y
! tw.bbs.campus.nthu 0000026586 0000026135 y
! csie.cp74  0000000020 0000000017 y
diff -rcs innbbsd-0.50beta-4/innd/news.active.BAK innbbsd-0.
50beta-5F/innd/news.active.BAK
*** innbbsd-0.50beta-4/innd/news.active.BAK     Sat Sep  2 19:07:59 1995
--- innbbsd-0.50beta-5F/innd/news.active.BAK    Sun Sep 17 20:59:47 1995
***************
*** 1,15 ****
! csie.test   0000007691 0000007162 y
! tw.bbs.test 0000026840 0000023348 y
! nctu.test   0000010615 0000010011 y
! tw.test     0000006988 0000006952 y
! csie.computer-center   0000001656 0000000805 y
! nthu.test   0000006324 0000005613 y
! tw.bbs.admin.installbbs 0000002995 0000000338 y
! tw.bbs.comp.unix 0000017968 0000010378 y
! control.cancel 0000551473 0000486697 y
! csie.dcp  00000001130 0000000918 y
! tw.bbs.csbbs.pbbs 0000000162 0000000081 y
! alt.chinese.text.big5 0000065206 0000058972 y
! csie.course.u.chinese 0000017111 0000015600 y
! csie.gcp  0000002508 0000002030 y
! tw.bbs.campus.nthu 0000022942 0000013521 y
--- 1,16 ----
! csie.test   0000008094 0000007744 y
! tw.bbs.test 0000034714 0000031698 y
! nctu.test   0000015157 0000015044 y
! tw.test     0000008194 0000007851 y
! csie.computer-center   0000001770 0000000805 y
! nthu.test   0000007100 0000007018 y
! tw.bbs.admin.installbbs 0000003303 0000000901 y
! tw.bbs.comp.unix 0000020793 0000019891 y
! control.cancel 0000709694 0000706694 y
! csie.dcp  00000001166 0000001077 y
! tw.bbs.csbbs.pbbs 0000000433 0000000165 y
! alt.chinese.text.big5 0000066583 0000058972 y
! csie.course.u.chinese 0000028197 0000027892 y
! csie.gcp  0000002586 0000002338 y
! tw.bbs.campus.nthu 0000026586 0000026135 y
! csie.cp74  0000000020 0000000017 y
diff -rcs innbbsd-0.50beta-4/innd/news.active.BAK.OLD innbbsd-0.
50beta-5F/innd/news.active.BAK.OLD
*** innbbsd-0.50beta-4/innd/news.active.BAK.OLD Sat Sep  2 19:07:59
1995
--- innbbsd-0.50beta-5F/innd/news.active.BAK.OLD        Sun Sep 17 20:59:48
1995
***************
*** 1,15 ****
! csie.test   0000007691 0000007162 y
! tw.bbs.test 0000026840 0000022334 y
! nctu.test   0000010424 0000010011 y
! tw.test     0000006823 0000006800 y
! csie.computer-center   0000001625 0000000805 y
! nthu.test   0000006154 0000005613 y
! tw.bbs.admin.installbbs 0000002651 0000000338 y
! tw.bbs.comp.unix 0000017867 0000010378 y
! control.cancel 0000551473 0000486697 y
! csie.dcp  00000001109 0000000916 y
! tw.bbs.csbbs.pbbs 0000000139 0000000037 y
! alt.chinese.text.big5 0000065107 0000058972 y
! csie.course.u.chinese 0000017012 0000014051 y
! csie.gcp  0000002453 0000002026 y
! tw.bbs.campus.nthu 0000022839 0000013521 y
--- 1,16 ----
! csie.test   0000008094 0000007744 y
! tw.bbs.test 0000033714 0000031698 y
! nctu.test   0000015153 0000015044 y
! tw.test     0000008189 0000007851 y
! csie.computer-center   0000001770 0000000805 y
! nthu.test   0000007100 0000007018 y
! tw.bbs.admin.installbbs 0000003200 0000000901 y
! tw.bbs.comp.unix 0000020687 0000019891 y
! control.cancel 0000708694 0000706694 y
! csie.dcp  00000001166 0000001077 y
! tw.bbs.csbbs.pbbs 0000000417 0000000165 y
! alt.chinese.text.big5 0000066483 0000058972 y
! csie.course.u.chinese 0000028096 0000027892 y
! csie.gcp  0000002586 0000002338 y
! tw.bbs.campus.nthu 0000026483 0000026135 y
! csie.cp74  0000000020 0000000017 y
Files innbbsd-0.50beta-4/innd/newsfeeds.bbs and innbbsd-0.
50beta-5F/innd/newsfeeds.bbs are identical
Files innbbsd-0.50beta-4/innd/nodelist.bbs and innbbsd-0.
50beta-5F/innd/nodelist.bbs are identical
Files innbbsd-0.50beta-4/innd/parsedate.c and innbbsd-0.
50beta-5F/innd/parsedate.c are identical
Files innbbsd-0.50beta-4/innd/src/modify.doc and innbbsd-0.
50beta-5F/innd/src/modify.doc are identical
Files innbbsd-0.50beta-4/innd/t.pl and innbbsd-0.50beta-5F/innd/t.pl are
 identical
Files innbbsd-0.50beta-4/innd/tcp.pl and innbbsd-0.50beta-5F/innd/tcp.pl
 are identical
Files innbbsd-0.50beta-4/innd/timefmt.y and innbbsd-0.
50beta-5F/innd/timefmt.y are identical
diff -rcs innbbsd-0.50beta-4/inndchannel.c innbbsd-0.
50beta-5F/inndchannel.c
*** innbbsd-0.50beta-4/inndchannel.c    Sat Sep  2 19:07:54 1995
--- innbbsd-0.50beta-5F/inndchannel.c   Sun Sep 17 20:59:42 1995
***************
*** 71,76 ****
--- 71,77 ----
    client->statcount = 0;
    client->statfail = 0;
    client->begin = time(NULL);
+   client->filter_buffer = NULL;
  }

  channeldestroy(client)
***************
*** 84,89 ****
--- 85,94 ----
       free(client->out.data);
       client->out.data = NULL;
     }
+    if (client->filter_buffer != NULL) {
+       free(client->filter_buffer);
+       client->filter_buffer = NULL;
+    }
  #if !defined(PowerBBS) && !defined(DBZSERVER)
     if (client->ihavecount >0 || client->statcount >0) {
       bbslog("%s@%s rec: %d dup: %d fail: %d size: %d, stat rec: %d
fail: %d, time sec: %d\n",
***************
*** 166,171 ****
--- 171,177 ----
           exit(0);
        }

+
        time(&now);
        local = localtime(&now);
        if (local != NULL & local->tm_hour == His_Maint_Hour &&
***************
*** 284,292 ****
                  continue;
                }
                bbslog("connected from (%s@%s).\n",client[i].username, client[i]
.
hostname);
  #ifdef INNBBSDEBUG
                printf("connected from (%s@%s).\n",client[i].username, client[i]
.
hostname);
! #endif
  #ifdef DBZSERVER
                fprintf(client[i].Argv.out,"200 %s InterNetNews DBZSERVER
server
%s (%s@%s).\r\n",MYBBSID, VERSION, client[i].username, client[i].
hostname );
  #else
--- 290,308 ----
                  continue;
                }
                bbslog("connected from (%s@%s).\n",client[i].username, client[i]
.
hostname);
+               if (isPause()) {
+                 fprintf(client[i].Argv.out,"400 Server Paused. (%s@%s)\r\n",
client[i].username, client[i].hostname);
+                 fflush(client[i].Argv.out);
+                 fclose(client[i].Argv.in);
+                 fclose(client[i].Argv.out);
+                 close(client[i].fd);
+                 FD_CLR(client[i].fd,&rfd);
+                 client[i].fd = -1;
+                 continue;
+               }
  #ifdef INNBBSDEBUG
                printf("connected from (%s@%s).\n",client[i].username, client[i]
.
hostname);
!       #endif
  #ifdef DBZSERVER
                fprintf(client[i].Argv.out,"200 %s InterNetNews DBZSERVER
server
%s (%s@%s).\r\n",MYBBSID, VERSION, client[i].username, client[i].
hostname );
  #else
***************
*** 568,573 ****
--- 584,592 ----
      char *port, *path;
      int c, errflag=0;
      extern INNBBSDhalt();
+ #if !defined(DBZSERVER)
+     initial_lang();
+ #endif

      port = DefaultINNBBSPort;
      path = LOCALDAEMON;
diff -rcs innbbsd-0.50beta-4/inntobbs.c innbbsd-0.50beta-5F/inntobbs.c
*** innbbsd-0.50beta-4/inntobbs.c       Sat Sep  2 19:07:54 1995
--- innbbsd-0.50beta-5F/inntobbs.c      Sun Sep 17 20:59:42 1995
***************
*** 1,10 ****
--- 1,12 ----
  #include <stdio.h>
+ #include "innbbsconf.h"
  #include "daemon.h"
  #include "bbslib.h"
  #include <time.h>

  #define INNTOBBS
  #include "inntobbs.h"
+ #include "lang.h"

  typedef struct Header {
    char *name;
***************
*** 18,26 ****
  };
  */

! char *strchr ARG((char*,int));
  char *strrchr ARG((char*,int));
  char *strstr ARG((char*,char*));

  header_t headertable[] = {
  "Subject"   ,SUBJECT_H,
--- 20,29 ----
  };
  */

! /*char *strchr ARG((char*,int));
  char *strrchr ARG((char*,int));
  char *strstr ARG((char*,char*));
+ */

  header_t headertable[] = {
  "Subject"   ,SUBJECT_H,
***************
*** 206,219 ****

     if( echomailfp != NULL ) {
        fprintf(echomailfp,"\n");
!       fprintf(echomailfp,"发信人: %s, 信区: %s\n", FROM, GROUPS);
!       fprintf(echomailfp,"标  题: %s\n", SUBJECT);
!       fprintf(echomailfp,"发信站: %s (%s)\n", SITE, DATE);
!       fprintf(echomailfp,"转信站: %s (%s)\n", PATH, REMOTEHOSTNAME);
        fflush(echomailfp);
     }
  }

  int headercmp(a,b)
  header_t *a, *b;
  {
--- 209,371 ----

     if( echomailfp != NULL ) {
        fprintf(echomailfp,"\n");
!       fprintf(echomailfp,"%s%s, %s%s\n", FromTxt, FROM, BoardTxt, GROUPS);

!       fprintf(echomailfp,"%s%s\n", SubjectTxt, SUBJECT);
!       fprintf(echomailfp,"%s%s (%s)\n", OrganizationTxt, SITE, DATE);
!       fprintf(echomailfp,"%s%s (%s)\n", PathTxt, PATH, REMOTEHOSTNAME);
        fflush(echomailfp);
     }
  }

+
+ #ifdef FILTER
+
+ char *
+ cmdfilter(indata, filterbuffer, cmd)
+ char *indata, **filterbuffer;
+ FuncPtr cmd;
+ {
+    char *outdata;
+    int len = strlen(indata);
+    if (*filterbuffer != NULL)
+      *filterbuffer = (char*)myrealloc(*filterbuffer, len + 4096);
+    else
+      *filterbuffer = (char*)mymalloc(len + 4096);
+    if (filterbuffer == NULL) return NULL;
+    bcopy(indata, *filterbuffer, len);
+    (*cmd)(*filterbuffer, &len, 0);
+    (*filterbuffer)[len] = '\0';
+    return *filterbuffer;
+ }
+
+ char *externfilter(indata, filterbuffer, cmd)
+ char *indata, **filterbuffer, *cmd;
+ {
+    char *outdata;
+    FILE *fp;
+    int fd;
+    char *tmpfile;
+
+    int len = strlen(indata);
+    int size ;
+    struct stat st;
+
+    fp = (FILE*)popen((char*)fileglue("%s > /tmp/.innbbsdfilter%d%d",
cmd,getpid(), getuid()),"w");
+    if (fp == NULL) {
+       bbslog("Err: can't popen %s\n",cmd);
+       return NULL;
+    }
+    if (fwrite(indata, 1, len, fp) != len) {
+       bbslog("Err: fwrite to %s failed, len %d\n",cmd, len);
+       return NULL;

+    }
+    pclose(fp);
+
+    tmpfile = (char*)fileglue("/tmp/.innbbsdfilter%d%d", getpid(),
getuid());
+    if (stat(tmpfile, &st) != 0) return NULL;
+
+    if (*filterbuffer != NULL)
+      *filterbuffer = myrealloc(*filterbuffer, st.st_size + 1);
+    else
+      *filterbuffer = mymalloc( st.st_size + 1);
+    (*filterbuffer)[st.st_size] = '\0';
+    if (*filterbuffer == NULL) return NULL;
+
+    fd = open(tmpfile, O_RDONLY);
+    if (fd < 0) return NULL;
+    read(fd, *filterbuffer, st.st_size);
+    close(fd);
+    unlink(tmpfile);
+    return *filterbuffer;
+ }
+
+ char *
+ filterdata(arp, direction, indata, filterdata)
+ newsfeeds_t *arp;
+ int direction;
+ char *indata, **filterdata;
+ {
+    char *outdata;
+    FuncPtr fptr = NULL;
+    char *cmdptr = NULL;
+    if (direction) {
+       fptr = arp->sfilter;
+       cmdptr = arp->scmdfilter;
+    } else {
+       fptr = arp->rfilter;
+       cmdptr = arp->rcmdfilter;
+    }
+    if (fptr)
+      outdata = cmdfilter(indata, filterdata, fptr);
+    else if (cmdptr)
+      outdata = externfilter(indata, filterdata, cmdptr);
+    else
+      outdata = NULL;
+    return outdata;
+ }
+
+ char *
+ processfilter(indata, filterbuffer, direction)
+ char *indata, **filterbuffer;
+ int direction;
+ {
+     char *front = indata, *ptr, *hptr;
+     int i;
+     char *outdata = indata;
+     int filterflag=0;
+
+     for (ptr = (char*)strchr(indata,'\n'); ptr != NULL && *ptr != '\0'
 ; front = ptr+1, ptr = (char*)strchr(front,'\n')) {
+       *ptr = '\0';
+         if (front[0] == '\r' || front[1] == '\n') {
+          *ptr= '\n';
+          break;
+         }
+         hptr = (char*)strchr(front,':');
+       if (hptr != NULL && hptr[1] == ' ') {
+         *hptr = '\0';
+         if (strcmp(front,"Newsgroups")==0) {
+            char *ngp, *ongp;
+            newsfeeds_t *arp;
+            char *tp;
+            if ((tp = (char*)strchr(hptr+2,'\r'))!=NULL)
+                *tp = '\0';
+            for (ngp = hptr+2, ongp = strchr(ngp,',');
+                 ngp && *ngp; ongp = strchr(ngp,',')) {
+                 if (ongp) *ongp = '\0';
+                 arp = search_group(ngp);
+                 if (arp) {
+                   if (ongp) *ongp = ',';
+                   if (tp != NULL) *tp = '\r';
+                   if (hptr) *hptr = ':';
+                   if (ptr) *ptr = '\n';
+                   outdata = filterdata(arp, direction, indata, filterbuffer);
+                   if (outdata) filterflag = 1;
+                   if (ongp) *ongp = '\0';
+                   if (tp != NULL) tp = '\0';
+                   if (hptr) *hptr = '\0';
+                   if (ptr) *ptr = '\0';
+                 }
+                 if (ongp) {
+                     *ongp = ',';
+                     ngp = ongp+1;
+                 } else {
+                     break;
+                 }
+                 if (filterflag) break;
+              }
+            if (tp != NULL) *tp='\r';
+            filterflag = 1;
+         }
+         *hptr = ':';
+       }
+       *ptr = '\n';
+       if (filterflag) break;
+     }
+     if (outdata) return outdata;
+     else return indata;
+ }
+ #endif
+
  int headercmp(a,b)
  header_t *a, *b;
  {
***************
*** 226,237 ****
      int fd = client->fd;
      char *buffer = client->buffer;
      buffer_t *in = &client->in;
      char *front = in->data, *ptr, *hptr;
      int i;

      for (i=0; i < LASTHEADER; i++ )
        HEADER[i] = NULL;
!     for (ptr = (char*)strchr(in->data,'\n'); ptr != NULL && *ptr !=
'\0' ; front = ptr+1, ptr = (char*)strchr(front,'\n')) {
        *ptr = '\0';
          if (front[0] == '\r' || front[1] == '\n') {
           BODY = front+2;
--- 378,401 ----
      int fd = client->fd;
      char *buffer = client->buffer;
      buffer_t *in = &client->in;
+     char *indata = in->data;
      char *front = in->data, *ptr, *hptr;
      int i;

      for (i=0; i < LASTHEADER; i++ )
        HEADER[i] = NULL;
!
! #ifdef FILTER
!     indata = processfilter(in->data, &client->filter_buffer, 0);
! #endif
!
!     if (indata != NULL) {
!        front = indata;
!     } else {
!        front = indata = in->data;
!     }
!
!     for (ptr = (char*)strchr(indata,'\n'); ptr != NULL && *ptr != '\0'
 ; front = ptr+1, ptr = (char*)strchr(front,'\n')) {
        *ptr = '\0';
          if (front[0] == '\r' || front[1] == '\n') {
           BODY = front+2;
Files innbbsd-0.50beta-4/inntobbs.h and innbbsd-0.50beta-5F/inntobbs.h
are identical
Only in innbbsd-0.50beta-5F: lang.c
Only in innbbsd-0.50beta-5F: lang.h
Files innbbsd-0.50beta-4/makedbz.c and innbbsd-0.50beta-5F/makedbz.c are
 identical
Files innbbsd-0.50beta-4/mkhistory.c and innbbsd-0.50beta-5F/mkhistory.c
 are identical
Files innbbsd-0.50beta-4/nntp.h and innbbsd-0.50beta-5F/nntp.h are
identical
Files innbbsd-0.50beta-4/parsdate.y and innbbsd-0.50beta-5F/parsdate.y
are identical
Files innbbsd-0.50beta-4/pmain.c and innbbsd-0.50beta-5F/pmain.c are
identical
Files innbbsd-0.50beta-4/port.c and innbbsd-0.50beta-5F/port.c are
identical
diff -rcs innbbsd-0.50beta-4/receive_article.c innbbsd-0.
50beta-5F/receive_article.c
*** innbbsd-0.50beta-4/receive_article.c        Sat Sep  2 19:07:55 1995
--- innbbsd-0.50beta-5F/receive_article.c       Sun Sep 17 20:59:43 1995
***************
*** 18,28 ****

        char *ptr = (char*)DBfetch(msgid);

!      收到之文章内容 (body)在 char *BODY,
!      档头 (header)在 char *HEADER[]
       SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H,
       NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H,
       ORGANIZATION_H
  */

  /*
--- 18,31 ----

        char *ptr = (char*)DBfetch(msgid);

!      the post contents received (body) is in char *BODY,
!      (header) in char *HEADER[]
       SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H,
       NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H,
       ORGANIZATION_H
+
+      To filter input text, another set of HEADER is processed
+      at first and BODY processed later.
  */

  /*
***************
*** 39,50 ****
--- 42,56 ----
  #include "daemon.h"
  #include "bbslib.h"
  #include "inntobbs.h"
+ #include "lang.h"

  extern int Junkhistory;

  char *post_article ARG((char *, char *, char *, int (*)(),char *,
char*));
  int cancel_article ARG(( char*, char*, char* ));

+ #define FAILED goto failed
+
  report()
  {
        /* Function called from record.o */
***************
*** 67,99 ****
  char *filename;
  {
         char *fptr, *ptr;
!        FILE *fhfd = fdopen(fh,"w");

         if (fhfd == NULL) {
          bbslog("can't fdopen, maybe disk full\n");
          return -1;
         }

!        fprintf(fhfd,"发信人: %s, 信区: %s\n",FROM, board);
!        fprintf(fhfd,"标  题: %s\n", SUBJECT);
!        fprintf(fhfd,"发信站: %.43s (%s)\n",SITE,DATE);
!        fprintf(fhfd,"转信站: %s\n",PATH);
         if (POSTHOST != NULL) {
!           fprintf(fhfd, "Origin: %.70s\n",POSTHOST);
         }
!        fprintf(fhfd,"\n");
         for (fptr = BODY, ptr = strchr(fptr,'\r'); ptr != NULL &&
*ptr != '\0' ; fptr = ptr+1, ptr = strchr(fptr,'\r')) {
          int ch = *ptr;
          *ptr = '\0';
!         fputs(fptr, fhfd);
          *ptr = ch;
         }
!        fputs(fptr,fhfd);
!

         fflush(fhfd);
         fclose(fhfd);
         return 0;
  }

  /* process cancel write */
--- 73,111 ----
  char *filename;
  {
         char *fptr, *ptr;
!        FILE *fhfd;

+        fhfd = fdopen(fh,"w");
         if (fhfd == NULL) {
          bbslog("can't fdopen, maybe disk full\n");
          return -1;

         }

!        if (fprintf(fhfd,"%s%s, %s%s\n",FromTxt, FROM, BoardTxt,
board)==EOF ||
!            fprintf(fhfd,"%s%s\n", SubjectTxt, SUBJECT)==EOF ||
!            fprintf(fhfd,"%s%.43s (%s)\n",OrganizationTxt,SITE,
DATE)==EOF ||
!            fprintf(fhfd,"%s%s\n",PathTxt, PATH)==EOF )
!          FAILED;
!
         if (POSTHOST != NULL) {
!           if(fprintf(fhfd, "Origin: %.70s\n",POSTHOST)==EOF)
!          FAILED;
         }
!        if (fprintf(fhfd,"\n")==EOF) FAILED;
         for (fptr = BODY, ptr = strchr(fptr,'\r'); ptr != NULL &&
*ptr != '\0' ; fptr = ptr+1, ptr = strchr(fptr,'\r')) {
          int ch = *ptr;
          *ptr = '\0';
!         if (fputs(fptr, fhfd)== EOF) FAILED;
          *ptr = ch;
         }
!        if (fputs(fptr,fhfd)==EOF) FAILED;

         fflush(fhfd);
         fclose(fhfd);
         return 0;
+ failed:
+        fclose(fhfd);
+        return -1;
  }

  /* process cancel write */
***************
*** 110,145 ****
          return -1;
         }

!        fprintf(fhfd,"发信人: %s, 信区: %s\n",FROM, board);
!        fprintf(fhfd,"标  题: %s\n", SUBJECT);
!        fprintf(fhfd,"发信站: %.43s (%s)\n",SITE,DATE);
!        fprintf(fhfd,"转信站: %.70s\n",PATH);
         if (HEADER[CONTROL_H] != NULL) {
!           fprintf(fhfd, "Control: %s\n",HEADER[CONTROL_H]);
         }
         if (POSTHOST != NULL) {
!           fprintf(fhfd, "Origin: %s\n",POSTHOST);
         }
!        fprintf(fhfd,"\n");
         for (fptr = BODY, ptr = strchr(fptr,'\r'); ptr != NULL &&
*ptr != '\0' ; fptr = ptr+1, ptr = strchr(fptr,'\r')) {
          int ch = *ptr;
          *ptr = '\0';
!         fputs(fptr, fhfd);
          *ptr = ch;
         }
!        fputs(fptr,fhfd);
         /*if (POSTHOST != NULL) {
            fprintf(fhfd, "\n * Origin: ● %.26s ● From: %.40s\n",
SITE,POSTHOST);
         }
         */
!        fprintf(fhfd,"\n---------------------\n");
         fp = fopen(filename,"r");
         if (fp == NULL) {
             bbslog("can't open %s\n", filename);
             return -1;
         }
         while (fgets( buffer, sizeof buffer, fp)!=NULL) {
!           fputs(buffer,fhfd);
         }
         fclose(fp);
         fflush(fhfd);
--- 122,161 ----
          return -1;
         }

!        if (fprintf(fhfd,"%s%s, %s%s\n",FromTxt, FROM, BoardTxt,
board)==EOF)
!        FAILED;
!        if (fprintf(fhfd,"%s%s\n", SubjectTxt, SUBJECT)==EOF) FAILED;
!        if (fprintf(fhfd,"%s%.43s (%s)\n",OrganizationTxt, SITE,
DATE)==EOF) FAILED;
!        if (fprintf(fhfd,"%s%.69s\n",PathTxt, PATH)==EOF) FAILED;
         if (HEADER[CONTROL_H] != NULL) {
!           if (fprintf(fhfd, "Control: %s\n",HEADER[CONTROL_H])==EOF)

!            FAILED;
         }
         if (POSTHOST != NULL) {
!           if (fprintf(fhfd, "Origin: %s\n",POSTHOST)==EOF)
!           FAILED;
         }
!        if (fprintf(fhfd,"\n")==EOF) FAILED;
         for (fptr = BODY, ptr = strchr(fptr,'\r'); ptr != NULL &&
*ptr != '\0' ; fptr = ptr+1, ptr = strchr(fptr,'\r')) {
          int ch = *ptr;
          *ptr = '\0';
!         if (fputs(fptr, fhfd)==EOF) FAILED;
          *ptr = ch;
         }
!        if (fputs(fptr,fhfd)==EOF) FAILED;
         /*if (POSTHOST != NULL) {
            fprintf(fhfd, "\n * Origin: ● %.26s ● From: %.40s\n",
SITE,POSTHOST);
         }
         */
!        if (fprintf(fhfd,"\n---------------------\n")==EOF) FAILED;
         fp = fopen(filename,"r");
         if (fp == NULL) {
             bbslog("can't open %s\n", filename);
+              fclose(fhfd);
             return -1;
         }
         while (fgets( buffer, sizeof buffer, fp)!=NULL) {
!           if (fputs(buffer,fhfd)==EOF) FAILED;
         }
         fclose(fp);
         fflush(fhfd);
***************
*** 151,166 ****
             bbslog("can't write %s\n", filename);
             return -1;
          }
!           fprintf(fp,"发信人: %s, 信区: %s\n",FROM, board);
!           fprintf(fp,"标  题: %.70s\n", SUBJECT);
!           fprintf(fp,"发信站: %.43s (%s)\n",SITE,DATE);
!           fprintf(fp,"转信站: %.70s\n",PATH);
            if (POSTHOST != NULL) {
!              fprintf(fhfd, "Origin: %s\n",POSTHOST);
            }
          /*
            if (HEADER[CONTROL_H] != NULL) {
!              fprintf(fhfd, "Control: %s\n",HEADER[CONTROL_H]);
            }
          */
            fprintf(fp,"\n");
--- 167,182 ----
             bbslog("can't write %s\n", filename);
             return -1;
          }
!           fprintf(fp,"%s%s, %s%s\n",FromTxt, FROM, BoardTxt, board);
!           fprintf(fp,"%s%.70s\n", SubjectTxt, SUBJECT);
!           fprintf(fp,"%s%.43s (%s)\n",OrganizationTxt, SITE,DATE);
!           fprintf(fp,"%s%.70s\n",PathTxt, PATH);
            if (POSTHOST != NULL) {
!              fprintf(fp, "Origin: %s\n",POSTHOST);
            }
          /*
            if (HEADER[CONTROL_H] != NULL) {
!              fprintf(fp, "Control: %s\n",HEADER[CONTROL_H]);
            }
          */
            fprintf(fp,"\n");
***************
*** 176,181 ****
--- 192,200 ----
          fclose(fp);
         }
         return 0;
+ failed:
+        fclose(fhfd);
+        return -1;
  }

  bbspost_write_control(fh, board, filename)
***************
*** 191,227 ****
          return -1;
         }

!        fprintf(fhfd,"Path: %s!%s\n",MYBBSID, HEADER[PATH_H]);
!        fprintf(fhfd,"From: %s\n",FROM);
!        fprintf(fhfd,"Newsgroups: %s\n", GROUPS);
!        fprintf(fhfd,"Subject: %s\n", SUBJECT);
!        fprintf(fhfd,"Date: %s\n",DATE);
!        fprintf(fhfd,"Organization: %s\n",SITE);
         if (POSTHOST != NULL) {
!           fprintf(fhfd, "NNTP-Posting-Host: %.70s\n",POSTHOST);
         }
         if (HEADER[CONTROL_H] != NULL) {
!           fprintf(fhfd, "Control: %s\n",HEADER[CONTROL_H]);
         }
         if (HEADER[APPROVED_H] != NULL) {
!           fprintf(fhfd, "Approved: %s\n",HEADER[APPROVED_H]);
         }
         if (HEADER[DISTRIBUTION_H] != NULL) {
!           fprintf(fhfd, "Distribution: %s\n",HEADER[DISTRIBUTION_H]);

         }
!        fprintf(fhfd,"\n");
         for (fptr = BODY, ptr = strchr(fptr,'\r'); ptr != NULL &&
*ptr != '\0' ; fptr = ptr+1, ptr = strchr(fptr,'\r')) {
          int ch = *ptr;
          *ptr = '\0';
!         fputs(fptr, fhfd);
          *ptr = ch;
         }
!        fputs(fptr,fhfd);


         fflush(fhfd);
         fclose(fhfd);
         return 0;
  }

  /* process cancel write */
--- 210,257 ----
          return -1;
         }

!        if (fprintf(fhfd,"Path: %s!%s\n",MYBBSID,
HEADER[PATH_H])==EOF ||
!            fprintf(fhfd,"From: %s\n",FROM)==EOF ||
!            fprintf(fhfd,"Newsgroups: %s\n", GROUPS)==EOF ||
!            fprintf(fhfd,"Subject: %s\n", SUBJECT)==EOF ||
!            fprintf(fhfd,"Date: %s\n",DATE)== EOF ||
!            fprintf(fhfd,"Organization: %s\n",SITE)==EOF)
!        {
!         fclose(fhfd);
!         return -1;
!        }
         if (POSTHOST != NULL) {
!           if (fprintf(fhfd, "NNTP-Posting-Host: %.70s\n",
POSTHOST)==EOF)
!           FAILED;
         }
         if (HEADER[CONTROL_H] != NULL) {
!           if (fprintf(fhfd, "Control: %s\n",HEADER[CONTROL_H])==EOF)
!           FAILED;
         }
         if (HEADER[APPROVED_H] != NULL) {
!           if (fprintf(fhfd, "Approved: %s\n",
HEADER[APPROVED_H])==EOF)
!           FAILED;
         }
         if (HEADER[DISTRIBUTION_H] != NULL) {
!           if (fprintf(fhfd, "Distribution: %s\n",
HEADER[DISTRIBUTION_H])==EOF)
!           FAILED;
         }
!        if (fprintf(fhfd,"\n")==EOF) FAILED;
         for (fptr = BODY, ptr = strchr(fptr,'\r'); ptr != NULL &&
*ptr != '\0' ; fptr = ptr+1, ptr = strchr(fptr,'\r')) {
          int ch = *ptr;
          *ptr = '\0';
!         if (fputs(fptr, fhfd)==EOF) FAILED;
          *ptr = ch;
         }
!        if (fputs(fptr,fhfd)==EOF) FAILED;


         fflush(fhfd);
         fclose(fhfd);
         return 0;
+ failed:
+        fclose(fhfd);
+        return -1;
  }

  /* process cancel write */
***************
*** 283,291 ****
       DATE = xdate;
     }
     if (SITE && strcasecmp("Computer Science & Information
Engineering NCTU",SITE) ==0) {
!       SITE = "交大资工 News Server";
     } else if (SITE && strcasecmp("Dep. Computer Sci. & Information
Eng., Chiao Tung Univ., Taiwan, R.O.C",SITE) ==0) {
!       SITE = "交大资工 News Server";
     } else if ( SITE == NULL || *SITE == '\0') {
        if (nameptrleft != NULL && nameptrright != NULL) {
         char savech = *nameptrright;
--- 313,321 ----
       DATE = xdate;
     }
     if (SITE && strcasecmp("Computer Science & Information
Engineering NCTU",SITE) ==0) {
!       SITE = NCTUCSIETxt;
     } else if (SITE && strcasecmp("Dep. Computer Sci. & Information
Eng., Chiao Tung Univ., Taiwan, R.O.C",SITE) ==0) {
!       SITE = NCTUCSIETxt;
     } else if ( SITE == NULL || *SITE == '\0') {
        if (nameptrleft != NULL && nameptrright != NULL) {
         char savech = *nameptrright;
***************
*** 475,486 ****
                 if (buffer[0]=='\n') break;
                 hptr = strchr(buffer,'\n');
                 if (hptr != NULL) *hptr = '\0';
!                if (strncmp(buffer,"发信人: ",8)==0) {
                    char* n;
                    n = strrchr(buffer,',');
                    if (n!=NULL) *n = '\0';
                    xfrom = buffer+8;
!                } else if (strncmp(buffer,"转信站: ",8)==0) {
                    xpath = buffer+8;
                 }
              }
--- 505,516 ----
                 if (buffer[0]=='\n') break;
                 hptr = strchr(buffer,'\n');
                 if (hptr != NULL) *hptr = '\0';
!                if (strncmp(buffer,FromTxt,8)==0) {
                    char* n;
                    n = strrchr(buffer,',');
                    if (n!=NULL) *n = '\0';
                    xfrom = buffer+8;
!                } else if (strncmp(buffer,PathTxt,8)==0) {
                    xpath = buffer+8;
                 }
              }
***************
*** 570,576 ****
        return 0;
  }

! #if defined(PhoenixBBS) || defined(SecretBBS) || defined(PivotBBS)
  /* for PhoenixBBS's post article and cancel article */
  #include "bbs.h"

--- 600,606 ----
        return 0;
  }

! #if defined(PhoenixBBS) || defined(SecretBBS) || defined(PivotBBS)
|| defined(MapleBBS)
  /* for PhoenixBBS's post article and cancel article */
  #include "bbs.h"

***************
*** 654,660 ****
      strncpy( header.owner, userid, IDLEN );
      strncpy( header.title, subject, STRLEN );
      header.filename[ STRLEN - 1 ] = 'M';
!     append_record( index, &header, sizeof( header ) );
      return name;
  }

--- 684,693 ----
      strncpy( header.owner, userid, IDLEN );
      strncpy( header.title, subject, STRLEN );
      header.filename[ STRLEN - 1 ] = 'M';
!     /* if append record record, should return fail message */
!     if (append_record( index, &header, sizeof( header ) ) < 0) {
!       return NULL;
!     }
      return name;
  }

***************
*** 803,808 ****
--- 836,845 ----
  #else

  receive_article()
+ {
+ }
+
+ receive_control()
  {
  }

Files innbbsd-0.50beta-4/rfc931.c and innbbsd-0.50beta-5F/rfc931.c are
identical
Only in innbbsd-0.50beta-5F: wildmat.c

--
     \|/
    /    |             YTHT StoryOnline的《Chasing Rita》也不是我写的
   <  ⊙  |        。。。。。。。
   |    ////
   |    \\\\           唔,兔子哪去了?
    \__|                    。。。。。。。

※ 来源:.一塌糊涂 BBS ytht.net.[FROM: 162.105.106.53]
--
※ 转载:.一塌糊涂 BBS ytht.net.[FROM: 162.105.106.53]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店