荔园在线

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

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


发信人: jjk (FAQ), 信区: InstallBBS
标  题: [转载] bbsd for fb bbs 说明                   djq (转寄)
发信站: 荔园晨风BBS站 (Thu Dec 13 12:56:46 2001), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjksam@smth.org 所发表 】
发信人: KCN (毒中之毒~有点累), 信区: BBSMan_Dev
标  题: bbsd for fb bbs 说明
发信站: BBS 水木清华站 (Thu Sep  2 00:12:11 1999)

                        bbsd for fb bbs说明
                        KCN kcn@cic.tsinghua.edu.cn 1999.9.1
一.目录下有newterm.c,bbsd.c以及本说明文件
二.说明:
        bbsd.c:    telnet daemon
        newterm.c: 取代原来的tty函数.
        这个package是用来取代原来firebird bbs的tty登陆方式的.

三.安装:
        把以上两个文件考到bbs_src目录下
(1)改动Makefile
        a.减少CFILES和COBJS
                将里面的term.c,term.o,io.c,io.o去掉
        b.加入几个target
        bbsd: bbsd.c
                $(CC) $(CFLAGS) -o bbsd $(SITE_DEF) $(DEFINES) bbsd.c

        installbbsd: bbsd
                $(INSTALL) -s -m 750 -g $(BBSGRP) -o $(BBSADM) bbsd $(BBSHOME)
/bin/bbsd

        bbsnew: : $(COBJS) $(OTHERS) newterm.o newio.o
                $(CC) -o bbsnew $(CFLAGS) $(COBJS) $(LIBS) newterm.o newio.o

        installbbsnew: bbsnew $(BBSHOME)/bin/bbsnew
                $(INSTALL) -s -m 750 -g $(BBSGRP) -o $(BBSADM) bbsnew $@.new
                -rm -f $@.old
                -mv $@ $@.old
                mv $@.new $@

        c.改变原来的bbs的obj list
        $(PROGNAME): $(COBJS) $(OTHERS) term.o io.o
                $(CC) -o $(PROGNAME) $(CFLAGS) $(COBJS) $(LIBS)

(2)改动main.c
        1.找到
        #ifdef SHOW_IDLE_TIME
            strncpy( uinfo.tty, tty_name, 20 );
        #endif
        改变为
        #ifdef SHOW_IDLE_TIME
        /* KCN modified for my error  1999.9.1*/
                if (tty_name[0])
                strncpy( uinfo.tty, tty_name, 20 );
                else {
                  time_t now;
                  now=time(0);
                  memcpy(uinfo.tty+1,&now,sizeof(time_t));
                }
        #endif

        2.找到

            if( argc < 2 || *argv[1] != 'h' ) {
        改为
        if( argc < 2 || ((*argv[1] != 'h' )&& ( *argv[1] != 'd'))) {
                /* KCN add 'd' mode for bbsd 1999.9.1 */


(3)改动talk.c
        找到 idle_str函数里面的
        strcpy(tty,uent->tty);

        {取tty的代码}

        改为
    strcpy( tty, uent->tty );

    if (tty[0]) {
        中间是原来的一堆取tty的代码,保留
    } else {
        /* KCN add tty[0]==0 for bbsd */
        diff = time(0) - *(time_t*)(uent->tty+1);
    }

(4)改动newio.c
        把原来的io.c复制为newio.c,然后开始改
        1.首先把所有的write(1,XXXXX 改为write(0,XXXXXX
        2.把ochar函数改为
        void
        ochar(c)
        int     c;
        {
            if(obufsize > OBUFSIZE-1) {  /* doin a oflush */
                write(0,outbuf,obufsize) ;
                obufsize = 0 ;
            }
            outbuf[obufsize++] = c ;
            /* need to change IAC to IAC IAC */
            if (c==IAC) {
                    if(obufsize > OBUFSIZE-1) {  /* doin a oflush */
                        write(0,outbuf,obufsize) ;
                        obufsize = 0 ;
                    }
                    outbuf[obufsize++] = c ;
            }
        }
        3.把output函数改为
        void
        output(s,len)
        char    *s;
        int     len;
        {
            /* need to change IAC to IAC IAC
            if(obufsize+len > OBUFSIZE) {
                write(0,outbuf,obufsize) ;
                obufsize = 0 ;
            }
            memcpy(outbuf+obufsize, s, len) ;
            obufsize+=len ; */
            int i;
            for (i=0;i<len;i++)
                ochar(s[i]);
        }

        4.把igetch函数改为
        int telnet_state=0;

        int telnet_machine(ch)
        unsigned char ch;
        {
          switch (telnet_state) {
          case 255:     /* after the first IAC */
                switch(ch) {
                case DO:
                case DONT:
                case WILL:
                case WONT:
                        telnet_state=1;
                        break;
                case SB:                        /* loop forever looking for the
SE */
                        telnet_state=2;
                        break;
                case IAC:
                        return IAC;
                default:
                        telnet_state=0;         /* other telnet command*/
                }
                break;
          case 1: /* Get the DO,DONT,WILL,WONT */
                telnet_state==0;  /* the ch is the telnet option */
                break;
          case 2: /* the telnet suboption */
                if (ch==IAC)
                        telnet_state=3; /* wait for SE */
                break;
          case 3:       /* wait for se */
                if (ch==SE)
                        telnet_state=0;
                else telnet_state=2;
                break;
          }
          return 0;
        }

        int
        igetch()
        {
          time_t now;
          char lastch;
          char c;
          igetagain:
            if(ibufsize == icurrchar) {
                fd_set readfds ;
                struct timeval to ;
                int sr ;

                to.tv_sec = 0 ;
                to.tv_usec = 0 ;
                FD_ZERO(&readfds) ;
                FD_SET(0,&readfds) ;
                if(i_newfd)
                  FD_SET(i_newfd,&readfds) ;
                if((sr = select(FD_SETSIZE,&readfds, NULL, NULL, &to)) <= 0) {
                    if(flushf)
                      (*flushf)() ;
                    if(dumb_term)
                      oflush() ;
                    else
                      refresh() ;
                    FD_ZERO(&readfds) ;
                    FD_SET(0,&readfds) ;
                    if(i_newfd)
                      FD_SET(i_newfd,&readfds) ;
                    while((sr = select(FD_SETSIZE,&readfds, NULL, NULL, i_top))
<0) {
                        if(errno == EINTR)
                          continue ;
                        else {
                            abort_bbs();
                        }
                    }
                    if(sr == 0)
                      return I_TIMEOUT ;
                }
                if(i_newfd && FD_ISSET(i_newfd,&readfds))
                  return I_OTHERDATA ;

                now=time(0);
                memcpy(&uinfo.tty[1],&now,sizeof(time_t));
                while((ibufsize = read(0,inbuf,IBUFSIZE)) <= 0) {
                    if(ibufsize == 0)
                      longjmp(byebye,-1) ;
                    if(ibufsize < 0 && errno != EINTR)
                      longjmp(byebye,-1) ;
                }
                icurrchar = 0 ;
            }

            if (telnet_state) {
                int ch=0;
                while (icurrchar!=ibufsize) {
                        ch=telnet_machine(inbuf[icurrchar]);
                        icurrchar++;
                        if ((ch!=0)||(!telnet_state))
                          break;
                }
                if (ch==0)      /* no input char or telnet_state==0 */
                        goto igetagain;
                if (ch==IAC) { //两个IAC
                        icurrchar--;
                        inbuf[icurrchar]=ch;
                }
            } else {
                if (inbuf[icurrchar]==IAC) {
                        telnet_state=255;
                        icurrchar++;
                        goto igetagain;
                }
                if (((inbuf[icurrchar]=='\n')&&(lastch=='\r'))
                    ||((inbuf[icurrchar]=='\r')&&(lastch=='\n')))
                {
                        lastch=0;
                        goto igetagain;
                }
                else if (icurrchar!=ibufsize) {
                        if (((inbuf[icurrchar]=='\n')&&(inbuf[icurrchar+1]=='\r'
))
                            ||((inbuf[icurrchar]=='\r')&&(inbuf[icurrchar+1]=='
\n'))) {
                                icurrchar++;
                                lastch=0;
                        }
                }
                else     lastch=inbuf[icurrchar];
            }

            i_mode = INPUT_ACTIVE;
            c=inbuf[icurrchar];
            switch(c) {
              case Ctrl('L'):
                redoscr() ;
                icurrchar++ ;
                goto igetagain ;
              default:
                break ;
            }
            icurrchar++;
            while((icurrchar!=ibufsize)&&(inbuf[icurrchar]==0)) icurrchar++;
            return c;
        }
(5)执行
        make installbbs
        make installbbsd
        make installbbsnew
        /home/bbs/bin/bbsd    呵呵,运行bbsd

  telnet 一下定义的端口,是不是有了?呵呵
  注意,1024以下的端口需要root才能执行.:)
  Enjoy it.


四.BBSD里面定义了端口
#define MAXPORTS        1/* 最多端口数 */
int myports[MAXPORTS]=端口列表.

五.在9#BBS测试的性能表现
  到了核心限制.但内存仍然没有用到swap.swap空间为0.:PPP
  平时一般到120人就慢的不行了,现在165人仍然运转如飞


平台:redhat 6.0 核心没有做优化配置.
     128M 内存.
  开了缺省的daemon.




结果
时间:[Wed Sep  1 21:10]  在线/朋友:[165/  3] 状态:[pOMFXc]  使用者:[KCN]


[bbs@bbs bbs_src]$ free
             total       used       free     shared    buffers     cached
Mem:        128092     124844       3248     214004       2652      55796
-/+ buffers/cache:      66396      61696
Swap:        64224          0      64224


[bbs@bbs bbs_src]$ free
bash: fork: Resource temporarily unavailable
等重新编译核心再测试一把.




六.package说明
  现在这个package没有生成tty,所以一些需要tty的命令可能
无法执行,主要是一些外挂的游戏和BBSNET等等.Shell out也
不行.其他常规测试没有发现问题.tty用户和bbsd用户可以共存.

KCN 1999.9.1

--
※ 修改:·KCN 於 Sep  2 00:12:51 修改本文·[FROM:  210.78.134.197]
※ 修改:·KCN 於 Sep  2 00:23:56 修改本文·[FROM:  210.78.134.197]
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 210.78.134.197]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


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

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