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 FROM 210.78.134.197
FROM 210.78.134.197