Annotation of sbbs/sbbs2/main.c, revision 1.1

1.1     ! root        1: #line 1 "MAIN.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: /*********************************************************/
        !             6: /* Entry point to the BBS and the waitforcall() function */
        !             7: /*********************************************************/
        !             8: 
        !             9: #include "sbbs.h"
        !            10: #include "cmdshell.h"
        !            11: 
        !            12: csi_t  main_csi;
        !            13: uint   curshell=0;
        !            14: 
        !            15: char onquiet=0,qwklogon;
        !            16: char term_ret=0;
        !            17: ulong connect_rate=0;  /* already connected at xbps */
        !            18: 
        !            19: #if __OS2__
        !            20: void cbreakh(int sig)           /* Ctrl-C */
        !            21: {
        !            22: sys_status|=SS_ABORT;
        !            23: signal(sig,cbreakh);
        !            24: }
        !            25: 
        !            26: #else
        !            27: 
        !            28: int cbreakh()  /* ctrl-break handler */
        !            29: {
        !            30: sys_status|=SS_ABORT;
        !            31: return(1);             /* 1 to continue, 0 to abort */
        !            32: }
        !            33: #endif
        !            34: 
        !            35: /****************************************************************************/
        !            36: /* This is the entry point to the BBS from dos                              */
        !            37: /* No arguments are defined as of yet.                                      */
        !            38: /****************************************************************************/
        !            39: main(int argc, char *argv[])
        !            40: {
        !            41:        char    str[256];
        !            42:        int     i,j,file,twenty;
        !            43:        node_t  node;
        !            44: 
        !            45: startup(argc,argv);    /* startup code overlaid */
        !            46: 
        !            47: while(1) {
        !            48:        
        !            49:        while(1) {
        !            50:                qwklogon=0;
        !            51:                twenty=0;
        !            52: 
        !            53:                /* Reset TEXT.DAT */
        !            54: 
        !            55:                for(i=0;i<TOTAL_TEXT;i++)
        !            56:                        if(text[i]!=text_sav[i]) {
        !            57:                                if(text[i]!=nulstr)
        !            58:                                        FREE(text[i]);
        !            59:                                text[i]=text_sav[i]; }
        !            60: 
        !            61:                /* Reset COMMAND SHELL */
        !            62: 
        !            63:                if(main_csi.cs)
        !            64:                        FREE(main_csi.cs);
        !            65:                if(main_csi.str)
        !            66:                        FREE(main_csi.str);
        !            67:                freevars(&main_csi);
        !            68:                memset(&main_csi,0,sizeof(csi_t));
        !            69:                main_csi.str=MALLOC(1024);
        !            70:                if(!main_csi.str) {
        !            71:                        errormsg(WHERE,ERR_ALLOC,"command shell",1024);
        !            72:                        bail(1); }
        !            73:                memset(main_csi.str,0,1024);
        !            74:                menu_dir[0]=0;
        !            75:                twenty+=10;
        !            76: 
        !            77:                /* Reset Global Variables */
        !            78: 
        !            79:                if(global_str_var)
        !            80:                        for(i=0;i<global_str_vars;i++)
        !            81:                                if(global_str_var[i]) {
        !            82:                                        FREE(global_str_var[i]);
        !            83:                                        global_str_var[i]=0; }
        !            84:                if(global_str_var) {
        !            85:                        FREE(global_str_var);
        !            86:                        global_str_var=0; }
        !            87:                if(global_str_var_name) {
        !            88:                        FREE(global_str_var_name);
        !            89:                        global_str_var_name=0; }
        !            90:                global_str_vars=0;
        !            91:                if(global_int_var) {
        !            92:                        FREE(global_int_var);
        !            93:                        global_int_var=0; }
        !            94:                if(global_int_var_name) {
        !            95:                        FREE(global_int_var_name);
        !            96:                        global_int_var_name=0; }
        !            97:                global_int_vars=0;
        !            98:                twenty*=2;
        !            99: 
        !           100:                if(waitforcall())               /* Got caller/logon */
        !           101:                        break; }
        !           102: 
        !           103:        if(qwklogon) {
        !           104:                getsmsg(useron.number);
        !           105:         qwk_sec();
        !           106:         hangup();
        !           107:                logout();
        !           108:         continue; }
        !           109: 
        !           110:        while(useron.number && (main_csi.misc&CS_OFFLINE_EXEC || online)) {
        !           111: 
        !           112:                if(!main_csi.cs || curshell!=useron.shell) {
        !           113:                        if(useron.shell>=total_shells)
        !           114:                                useron.shell=0;
        !           115:                        sprintf(str,"%s%s.BIN",exec_dir,shell[useron.shell]->code);
        !           116:                        if((file=nopen(str,O_RDONLY|O_BINARY))==-1) {
        !           117:                                errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY);
        !           118:                                hangup();
        !           119:                                break; }
        !           120:                        if(main_csi.cs)
        !           121:                                FREE(main_csi.cs);
        !           122:                        freevars(&main_csi);
        !           123:                        clearvars(&main_csi);
        !           124: 
        !           125:                        main_csi.length=filelength(file);
        !           126:                        if((main_csi.cs=(uchar *)MALLOC(main_csi.length))==NULL) {
        !           127:                                close(file);
        !           128:                                errormsg(WHERE,ERR_ALLOC,str,main_csi.length);
        !           129:                                hangup();
        !           130:                                break; }
        !           131: 
        !           132:                        if(lread(file,main_csi.cs,main_csi.length)!=main_csi.length) {
        !           133:                                errormsg(WHERE,ERR_READ,str,main_csi.length);
        !           134:                                close(file);
        !           135:                                FREE(main_csi.cs);
        !           136:                 main_csi.cs=NULL;
        !           137:                                hangup();
        !           138:                                break; }
        !           139:                        close(file);
        !           140: 
        !           141:                        main_csi.ip=main_csi.cs;
        !           142:                        curshell=useron.shell;
        !           143:                        menu_dir[0]=0;
        !           144:                        menu_file[0]=0;
        !           145:                #ifdef __MSDOS__
        !           146:                        freedosmem=farcoreleft();
        !           147:                #endif
        !           148:                        }
        !           149:                if(exec(&main_csi))
        !           150:                        break;
        !           151: 
        !           152:                if(!(main_csi.misc&CS_OFFLINE_EXEC))
        !           153:                        checkline();
        !           154: 
        !           155: #if 0
        !           156:                if(freedosmem!=farcoreleft()) {
        !           157:                        if(freedosmem>farcoreleft())
        !           158:                                errormsg(WHERE,ERR_CHK,"memory",freedosmem-farcoreleft());
        !           159:                        freedosmem=farcoreleft(); }
        !           160: #endif
        !           161:                }
        !           162:        logout();
        !           163:        catsyslog(0);
        !           164:        if(!REALSYSOP || sys_misc&SM_SYSSTAT)
        !           165:                logoffstats();  /* Updates both system and node dsts.dab files */
        !           166:        if(qoc) {
        !           167:                while(!wfc_events(time(NULL)))
        !           168:                        ;
        !           169:                catsyslog(0);
        !           170:                if(qoc==1)
        !           171:                        offhook();
        !           172:                lclini(node_scrnlen);
        !           173:                lputc(FF);
        !           174:                bail(0); }
        !           175:        }
        !           176: }
        !           177: 
        !           178: /************************************/
        !           179: /* encrypted string output function */
        !           180: /************************************/
        !           181: char *decrypt(ulong l[], char *instr)
        !           182: {
        !           183:        static char str[128];
        !           184:     uchar ch,bits,len;
        !           185:        ushort i,j,lc=0;
        !           186: 
        !           187: len=(uchar)(l[0]&0x7f)^0x49;
        !           188: bits=7;
        !           189: for(i=0,j=0;i<len;i++) {
        !           190:     ch=(char)((l[j]>>bits)&0x7fL);
        !           191:     ch^=(i^0x2c);
        !           192:        str[lc++]=ch;
        !           193:     bits+=7;
        !           194:     if(bits>=26 && i+1<len) {
        !           195:                if(bits==32)
        !           196:                        ch=0;
        !           197:                else
        !           198:                        ch=(char)((l[j]>>bits)&0x7fL);
        !           199:         bits=(32-bits);
        !           200:         j++;
        !           201:         ch|=((l[j]&0x7f)<<(bits))&0x7f;
        !           202:         i++;
        !           203:         ch^=(i^0x2c);
        !           204:         bits=7-bits;
        !           205:                str[lc++]=ch; } }
        !           206: str[lc]=0;
        !           207: if(instr) {
        !           208:        strcpy(instr,str);
        !           209:        return(instr); }
        !           210: else
        !           211:        return(str);
        !           212: }
        !           213: 
        !           214: /****************************************************************************/
        !           215: /* Writes NODE.LOG at end of SYSTEM.LOG                                                                                */
        !           216: /****************************************************************************/
        !           217: void catsyslog(int crash)
        !           218: {
        !           219:        char str[256];
        !           220:        char HUGE16 *buf;
        !           221:        int  i,file;
        !           222:        ulong length;
        !           223: 
        !           224: if(sys_status&SS_LOGOPEN) {
        !           225:        if(close(logfile)) {
        !           226:                errormsg(WHERE,ERR_CLOSE,"logfile",0);
        !           227:                return; }
        !           228:        sys_status&=~SS_LOGOPEN; }
        !           229: sprintf(str,"%sNODE.LOG",node_dir);
        !           230: if((file=nopen(str,O_RDONLY))==-1) {
        !           231:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
        !           232:        return; }
        !           233: length=filelength(file);
        !           234: if(length) {
        !           235:        if((buf=(char HUGE16 *)LMALLOC(length))==NULL) {
        !           236:                close(file);
        !           237:                errormsg(WHERE,ERR_ALLOC,str,length);
        !           238:                return; }
        !           239:        if(lread(file,buf,length)!=length) {
        !           240:                close(file);
        !           241:                errormsg(WHERE,ERR_READ,str,length);
        !           242:                FREE((char *)buf);
        !           243:                return; }
        !           244:        close(file);
        !           245:        now=time(NULL);
        !           246:        unixtodos(now,&date,&curtime);
        !           247:        sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG",data_dir,date.da_mon,date.da_day
        !           248:                ,date.da_year-1900);
        !           249:        if((file=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) {
        !           250:                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT);
        !           251:                FREE((char *)buf);
        !           252:                return; }
        !           253:        if(lwrite(file,buf,length)!=length) {
        !           254:                close(file);
        !           255:                errormsg(WHERE,ERR_WRITE,str,length);
        !           256:                FREE((char *)buf);
        !           257:                return; }
        !           258:        close(file);
        !           259:        if(crash) {
        !           260:                for(i=0;i<2;i++) {
        !           261:                        sprintf(str,"%sCRASH.LOG",i ? data_dir : node_dir);
        !           262:                        if((file=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) {
        !           263:                                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT);
        !           264:                                FREE((char *)buf);
        !           265:                                return; }
        !           266:                        if(lwrite(file,buf,length)!=length) {
        !           267:                                close(file);
        !           268:                                errormsg(WHERE,ERR_WRITE,str,length);
        !           269:                                FREE((char *)buf);
        !           270:                                return; }
        !           271:                        close(file); } }
        !           272:        FREE((char *)buf); }
        !           273: else
        !           274:        close(file);
        !           275: sprintf(str,"%sNODE.LOG",node_dir);
        !           276: if((logfile=nopen(str,O_WRONLY|O_TRUNC))==-1) /* Truncate NODE.LOG */
        !           277:        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC);
        !           278: else sys_status|=SS_LOGOPEN;
        !           279: }
        !           280: 
        !           281: void quicklogonstuff()
        !           282: {
        !           283:        int i;
        !           284:        node_t node;
        !           285: 
        !           286: reset_logon_vars();
        !           287: 
        !           288: lclini(node_scrnlen-1);
        !           289: if(com_port && !DCDHIGH)                               /* don't take phone offhook if */
        !           290:        offhook();                                                      /* connected */
        !           291: useron.number=1;
        !           292: getuserdat(&useron);
        !           293: autoterm=ANSI;
        !           294: if(!useron.number)
        !           295:        useron.level=99;
        !           296: console=CON_L_ECHO|CON_L_INPUT;
        !           297: online=ON_LOCAL;
        !           298: statline=sys_def_stat;
        !           299: statusline();
        !           300: answertime=logontime=time(NULL);
        !           301: sprintf(connection,"%.*s",LEN_MODEM,text[Locally]);
        !           302: cur_rate=14400;
        !           303: cur_cps=1750;
        !           304: sys_status|=SS_USERON;
        !           305: }
        !           306: 
        !           307: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.