home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / XINIT.C < prev   
C/C++ Source or Header  |  1992-01-05  |  12KB  |  439 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <dir.h>
  22. #include <math.h>
  23.  
  24.  
  25.  
  26.  
  27. void far interrupt inlii();
  28. void far interrupt checkai();
  29. void far interrupt plai();
  30. void far interrupt outchri();
  31. void far interrupt outstri();
  32. void far interrupt nli();
  33. void far interrupt pli();
  34. void far interrupt emptyi();
  35. void far interrupt inkeyi();
  36. void far interrupt getkeyi();
  37. void far interrupt inputi();
  38. void far interrupt inputli();
  39. void far interrupt yni();
  40. void far interrupt nyi();
  41. void far interrupt ansici();
  42. void far interrupt oneki();
  43. void far interrupt prti();
  44. void far interrupt mpli();
  45.  
  46. void init(int x)
  47. {
  48.   char s[161],*buf,ch,*ss;
  49.   int i,i1,i2,sm,cp,n,f;
  50.   long l;
  51.   union REGS r;
  52.   struct date today;
  53.   votingrec v;
  54.  
  55.  
  56.   crttype=peekb(0x0040,0x0049);
  57.   if (crttype==7)
  58.     scrn=MK_FP(0xb000,0x0000);
  59.   else
  60.     scrn=MK_FP(0xb800,0x0000);
  61.   r.h.ah=15;
  62.   int86(0x10,&r,&r);
  63.   sm=r.h.al;
  64.   if (r.h.ah!=80) {
  65.     printf("\n\nYou must be in 80 column mode to run WWIV.\n\n");
  66.     end_bbs(noklevel);
  67.   }
  68.   if ((sm==4) || (sm==5) || (sm==6)) {
  69.     printf("\n\nYou must be in text mode to run WWIV.\n\n");
  70.     end_bbs(noklevel);
  71.   }
  72.   defscreenbottom=(int) peekb(0x0000,0x0484);
  73.   if (defscreenbottom<24)
  74.     defscreenbottom=24;
  75.   if (defscreenbottom>63)
  76.     defscreenbottom=24;
  77.   if ((defscreenbottom!=42) && (defscreenbottom!=49))
  78.     defscreenbottom=24;
  79.   screenbottom=defscreenbottom;
  80.   screenlen=160*(screenbottom+1);
  81.   if (!exist("restore.wwv")) {
  82.     for (i=0; i<screenbottom; i++)
  83.       printf("\n");
  84.     strcpy(s,VERSION_NUMBER);
  85.     strcat(s,", Copyright (c) 1988-1991 by Wayne Bell.\n\n");
  86.     printf(s);
  87.   }
  88.   strcpy(cdir,"X:\\");
  89.   cdir[0]='A'+getdisk();
  90.   getcurdir(0,&(cdir[3]));
  91.   userfile=-1;
  92.   configfile=-1;
  93.   statusfile=-1;
  94.   dlf=-1;
  95.   curlsub=-1;
  96.   curldir=-1;
  97.   setvect(INT_SAVE_21, getvect(0x21));
  98.   oldx=0;
  99.   oldy=0;
  100.   itimer();
  101.   r.h.ah=0x33;
  102.   r.h.al=0x01;
  103.   r.h.dl=0x00;
  104.   int86(0x21,&r,&r);
  105.   agemin=0;
  106.   agemax=255;
  107.   slmin=0;
  108.   slmax=255;
  109.   dslmin=0;
  110.   dslmax=255;
  111.   ressex=0;
  112.   daysmin=0;
  113.   daysmax=9999;
  114.   arres=0;
  115.   darres=0;
  116.   resres=0;
  117.   use_workspace=0;
  118.   input_extern=0;
  119.   chat_file=0;
  120.   do_event=0;
  121.   sysop_alert=0;
  122.   ncn=NULL;
  123.   num_ncn=0;
  124.   global_handle=0;
  125.  
  126.   if (x) {
  127.     for (i=0; i<25; i++)
  128.       funcs[i]=NULL;
  129.     funcs[0]=(void far *)inlii;
  130.     funcs[1]=(void far *)checkai;
  131.     funcs[2]=(void far *)plai;
  132.     funcs[3]=(void far *)outchri;
  133.     funcs[4]=(void far *)outstri;
  134.     funcs[5]=(void far *)nli;
  135.     funcs[8]=(void far *)pli;
  136.     funcs[9]=(void far *)emptyi;
  137.     funcs[10]=(void far *)inkeyi;
  138.     funcs[11]=(void far *)getkeyi;
  139.     funcs[12]=(void far *)inputi;
  140.     funcs[13]=(void far *)inputli;
  141.     funcs[14]=(void far *)yni;
  142.     funcs[15]=(void far *)nyi;
  143.     funcs[16]=(void far *)ansici;
  144.     funcs[17]=(void far *)oneki;
  145.     funcs[18]=(void far *)prti;
  146.     funcs[19]=(void far *)mpli;
  147.     setvect(INT_POINT_FUNCS, (void far interrupt (*) (void))funcs);
  148.  
  149.  
  150.     strcpy(ver_no1,"BBS=");
  151.     strcat(ver_no1,VERSION_NUMBER);
  152.  
  153.     getdate(&today);
  154.     if (today.da_year<1988) {
  155.       printf("You need to set the date & time before running the BBS.\n");
  156.       end_bbs(noklevel);
  157.     }
  158.     configfile=open("CONFIG.DAT",O_RDWR | O_BINARY);
  159.     if (configfile<0) {
  160.       printf("%s NOT FOUND.\n",s);
  161.       end_bbs(noklevel);
  162.     }
  163.     read(configfile,(void *) (&syscfg), sizeof(configrec));
  164.     close(configfile);
  165.  
  166.     if (!syscfg.primaryport)
  167.       ok_modem_stuff=0;
  168.  
  169.     strcpy(s,syscfg.tempdir);
  170.     i=strlen(s);
  171.     if (s[0]==0)
  172.       i1=1;
  173.     else {
  174.       if ((s[i-1]=='\\') && (s[i-2]!=':'))
  175.         s[i-1]=0;
  176.       i1=chdir(s);
  177.     }
  178.     if (i1) {
  179.       printf("\nYour temporary directory isn't valid.\n");
  180.       printf("It is now set to: '%s'\n\n",syscfg.tempdir);
  181.       end_bbs(noklevel);
  182.     } else
  183.       cd_to(cdir);
  184.  
  185.     strcpy(s,syscfg.batchdir);
  186.     i=strlen(s);
  187.     if (s[0]==0)
  188.       i1=1;
  189.     else {
  190.       if ((s[i-1]=='\\') && (s[i-2]!=':'))
  191.         s[i-1]=0;
  192.       i1=chdir(s);
  193.     }
  194.     if (i1) {
  195.       printf("\nYour batchdirectory isn't valid.\n");
  196.       printf("It is now set to: '%s'\n\n",syscfg.batchdir);
  197.       end_bbs(noklevel);
  198.     } else
  199.       cd_to(cdir);
  200.  
  201.     sprintf(s,"%sSTATUS.DAT",syscfg.datadir);
  202.     statusfile=open(s,O_RDWR | O_BINARY);
  203.     if (statusfile<0) {
  204.       printf("%s NOT FOUND.\n",s);
  205.       end_bbs(noklevel);
  206.     }
  207.     read(statusfile,(void *)(&status), sizeof(statusrec));
  208.     close(statusfile);
  209.     strcpy(s,VERSION_NUMBER);
  210.     status.wwiv_version=(s[6]-'0')*100+(s[8]-'0')*10+(s[9]-'0');
  211.     gat=(short *) mallocx(2048 * sizeof(short));
  212.     smallist=(smalrec *) mallocx((long)syscfg.maxusers * (long)sizeof(smalrec));
  213.     gfilesec=(gfiledirrec *) mallocx((long) (32 * sizeof(gfiledirrec)));
  214.  
  215.     screensave.scrn1=(char *)mallocx(screenlen);
  216.  
  217.     read_in_file("MENUS.MSG",(menus),30);
  218.     read_in_file("HELP.MSG",(helps),50);
  219.     for (i=0; i<30; i++) {
  220.       menus1[i].stored_as=0L;
  221.       menus1[i].storage_type=255;
  222.       menus2[i].stored_as=0L;
  223.       menus2[i].storage_type=255;
  224.     }
  225.     sprintf(s,"%sMENUSANS.MSG",syscfg.gfilesdir);
  226.     if (exist(s))
  227.       read_in_file("MENUSANS.MSG",(menus1),30);
  228.     sprintf(s,"%sMENUS40.MSG",syscfg.gfilesdir);
  229.     if (exist(s))
  230.       read_in_file("MENUS40.MSG",(menus2),30);
  231.  
  232.     sprintf(s,"%sGFILE.DAT",syscfg.datadir);
  233.     i=open(s,O_RDWR | O_BINARY);
  234.     if (i<0)
  235.       num_sec=0;
  236.     else
  237.       num_sec=read(i,(void *)gfilesec,32*sizeof(gfiledirrec))/sizeof(gfiledirrec);
  238.     close(i);
  239.  
  240.     sprintf(s,"%sNAMES.LST",syscfg.datadir);
  241.     i=open(s,O_RDWR | O_BINARY);
  242.     if (i<0) {
  243.       printf("%s NOT FOUND.\n",s);
  244.       end_bbs(noklevel);
  245.     }
  246.     read(i,(void *) (smallist), (sizeof(smalrec) * status.users));
  247.     close(i);
  248.  
  249.     subboards=(subboardrec *) mallocx(MAX_SUBS*sizeof(subboardrec));
  250.     directories=(directoryrec *)mallocx(MAX_DIRS*sizeof(directoryrec));
  251.  
  252.     sprintf(s,"%sSUBS.DAT",syscfg.datadir);
  253.     i=open(s,O_RDWR | O_BINARY);
  254.     if (i<0) {
  255.       printf("%s NOT FOUND.\n",s);
  256.       end_bbs(noklevel);
  257.     }
  258.     num_subs=(read(i,subboards, (MAX_SUBS*sizeof(subboardrec))))/
  259.              sizeof(subboardrec);
  260.     close(i);
  261.  
  262.     sprintf(s,"%sDIRS.DAT",syscfg.datadir);
  263.     i=open(s,O_RDWR | O_BINARY);
  264.     if (i<0) {
  265.       printf("%s NOT FOUND.\n",s);
  266.       end_bbs(noklevel);
  267.     }
  268.     num_dirs=(read(i,directories, (MAX_DIRS*sizeof(directoryrec))))/
  269.              sizeof(directoryrec);
  270.     close(i);
  271.  
  272.     chains=(chainfilerec *) mallocx(50 * sizeof(chainfilerec));
  273.     numextrn=0;
  274.     numchain=0;
  275.     numed=0;
  276.     sprintf(s,"%sCHAINS.DAT",syscfg.datadir);
  277.     i=open(s,O_RDWR | O_BINARY);
  278.     if (i>0) {
  279.       numchain=(read(i,(void *)chains, 50*sizeof(chainfilerec)))/sizeof(chainfilerec);
  280.       numchain=numchain;
  281.       close(i);
  282.     }
  283.     sprintf(s,"%sMODEM.DAT",syscfg.datadir);
  284.     i=open(s,O_RDWR | O_BINARY);
  285.     if (i>0) {
  286.       l=filelength(i);
  287.       modem_i = mallocx(l);
  288.       read(i,modem_i, (unsigned) l);
  289.       close(i);
  290.     } else {
  291.       printf("\nRun INIT.EXE to convert modem data.\n\n");
  292.       end_bbs(noklevel);
  293.     }
  294.  
  295.     sprintf(s,"%sNEXTERN.DAT",syscfg.datadir);
  296.     i=open(s,O_RDWR | O_BINARY);
  297.     if (i>0) {
  298.       l=filelength(i);
  299.       if (l>15*sizeof(newexternalrec))
  300.         l=15*sizeof(newexternalrec);
  301.       externs=mallocx(l+10);
  302.       numextrn=(read(i,(void *)externs, (unsigned) l))/sizeof(newexternalrec);
  303.       close(i);
  304.     } else
  305.       numextrn=0;
  306.  
  307.  
  308.     sprintf(s,"%sEDITORS.DAT",syscfg.datadir);
  309.     i=open(s,O_RDWR | O_BINARY);
  310.     if (i>0) {
  311.       l=filelength(i);
  312.       if (l>10*sizeof(editorrec))
  313.         l=10*sizeof(editorrec);
  314.       editors=mallocx(l+10);
  315.       numed=(read(i,(void *)editors, (unsigned) l))/sizeof(editorrec);
  316.       numed=numed;
  317.       close(i);
  318.     }
  319.     batch=mallocx(MAX_BATCH * sizeof(batchrec));
  320.  
  321.     read_user(1,&thisuser);
  322.     if (thisuser.inact & inact_deleted)
  323.       fwaiting=0;
  324.     else
  325.       fwaiting=thisuser.waiting;
  326.     sl1(2,status.date1);
  327.     if (ok_modem_stuff) {
  328.       initport(syscfg.primaryport);
  329.       do_result(&(modem_i->defl));
  330.     }
  331.     if (syscfg.sysconfig & sysconfig_no_local)
  332.       topdata=0;
  333.     else
  334.       topdata=2;
  335.     ss=getenv("PROMPT");
  336.     strcpy(newprompt,"PROMPT=WWIV: ");
  337.     if (ss)
  338.       strcat(newprompt,ss);
  339.     else
  340.       strcat(newprompt,"$P$G");
  341.     sprintf(dszlog,"%s\\WWIVDSZ.LOG",cdir);
  342.     sprintf(s,"DSZLOG=%s",dszlog);
  343.     i=0;
  344.     while (environ[i]!=NULL) {
  345.       if (strncmp(environ[i],"PROMPT=",7)==0)
  346.     xenviron[i]=newprompt;
  347.       else
  348.         if (strncmp(environ[i],"DSZLOG=",7)==0)
  349.           xenviron[i]=strdup(s);
  350.         else
  351.           xenviron[i]=environ[i];
  352.       ++i;
  353.     }
  354.     if (!getenv("DSZLOG"))
  355.       xenviron[i++]=strdup(s);
  356.     if (!ss)
  357.       xenviron[i++]=newprompt;
  358.     xenviron[i++]=ver_no1;
  359.     xenviron[i]=NULL;
  360.     for (i=0; i<20; i++)
  361.       questused[i]=0;
  362.     sprintf(s,"%sVOTING.DAT",syscfg.datadir);
  363.     f=open(s,O_RDWR | O_BINARY);
  364.     if (f>0) {
  365.       n=(int) (filelength(f) / sizeof(votingrec)) -1;
  366.       for (i=0; i<n; i++) {
  367.         lseek(f,(long) i * sizeof(votingrec),SEEK_SET);
  368.         read(f,(void *)&v,sizeof(votingrec));
  369.         if (v.numanswers)
  370.       questused[i]=1;
  371.       }
  372.       close(f);
  373.     }
  374.     if (syscfg.sysconfig & sysconfig_high_speed)
  375.       high_speed=1;
  376.     else
  377.       high_speed=0;
  378.     if (syscfg.sysconfig & sysconfig_flow_control)
  379.       flow_control=1;
  380.     else
  381.       flow_control=0;
  382.     time_event=((double)syscfg.executetime)*60.0;
  383.     last_time=time_event-timer();
  384.     if (last_time<0.0)
  385.       last_time+=24.0*3600.0;
  386.     do_event=0;
  387.     if (status.callernum!=65535) {
  388.       status.callernum1=(long)status.callernum;
  389.       status.callernum=65535;
  390.       save_status();
  391.     }
  392.     msgs=(postrec *) mallocx((long)(255 * sizeof(postrec)));
  393.     read_bbs_list_index();
  394.     frequent_init();
  395.     read_contacts();
  396.     if (!restoring_shrink && !already_on) {
  397.       remove_from_temp("*.*", syscfg.tempdir, 1);
  398.       remove_from_temp("*.*", syscfg.batchdir, 1);
  399.       imodem(1);
  400.       cleanup_net();
  401.     }
  402.   } else {
  403.     topdata=0;
  404.     ansiptr=0;
  405.     curatr=0x07;
  406.     outcom=0;
  407.     incom=0;
  408.     charbufferpointer=0;
  409.     andwith=0xff;
  410.     checkit=0;
  411.     topline=0;
  412.     endofline[0]=0;
  413.     hangup=0;
  414.     hungup=0;
  415.     chatcall=0;
  416.     chatreason[0]=0;
  417.     useron=0;
  418.     change_color=0;
  419.     chatting=0;
  420.     echo=1;
  421.     lines_listed=0;
  422.     helpl=0;
  423.     ihelp=0;
  424.     using_modem=0;
  425.     thisuser.sysstatus=0;
  426.   }
  427.   lecho=ok_local();
  428.   daylight=0;
  429.  
  430.   status.resx[0]=8;/*grey 8*/
  431.   status.resx[1]=6;/*brown 9*/
  432.   status.resx[2]=4;/*red a*/
  433.   status.resx[3]=1;/*b*/
  434.   status.resx[4]=12;/*c*/
  435.   status.resx[5]=3;/*d*/
  436.   status.resx[6]=10;/*e*/
  437.   status.resx[7]=13;/*f*/
  438. }
  439.