home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / XINIT.C < prev   
C/C++ Source or Header  |  1992-07-20  |  11KB  |  406 lines

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