home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / MAIN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  7.2 KB  |  308 lines

  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.  
  308.