home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / WWIV2.ZIP / BBS.C < prev    next >
Text File  |  1995-12-17  |  39KB  |  1,746 lines

  1. #pragma hdrstop
  2. #define _DEFINE_GLOBALS_
  3. #include "vars.h"
  4. #include "subxtr.h"
  5. #include <math.h>
  6. unsigned _stklen=15360;
  7. #define modem_time 3.5
  8.  
  9. int checkpw(void)
  10. {
  11.   char s[81];
  12.  
  13.   nl();
  14.   outstr("1SY 7> f");
  15.   echo=0;
  16.   input(s,20);
  17.   echo=1;
  18.   if (strcmp(s,(syscfg.systempw))==0)
  19.     return(1);
  20.   else
  21.     return(0);
  22. }
  23.  
  24. void feedb()
  25. {
  26.  char ch;
  27.  
  28.  npr("\r\n1            17. 1Gilgamesh #1      7- 1Local Sysop\r\n");
  29.  npr("1            27. 1Bongo #71         7- 1Remote Validation Sysop\r\n");
  30.  npr("1            37. 1Thrashin' Seth #3 7- 1Question & Answer Man\r\n");
  31.  npr("1            Q7. 1Quit\r\n\r\n");
  32.  outstr("7(> 1");
  33.  ch=onek("1,2,3,Q");
  34.  switch(ch) {
  35.  case '1':
  36.   email(1,0,0,0);
  37.   break;
  38.  case '2':
  39.   email(71,0,0,0);
  40.   break;
  41.  case '3':
  42.   email(3,0,0,0);
  43.   break;
  44.  case 'Q':
  45.   break;
  46.  }
  47. }
  48.  
  49.  
  50. int pcrat(void)
  51. {
  52.   int ok=1;
  53.   char s[101];
  54.  
  55.   if (!(thisuser.exempt & exempt_post))
  56.     if ((syscfg.post_call_ratio>0.0001) && (post_ratio()<syscfg.post_call_ratio)) {
  57.       ok=0;
  58.       nl();
  59.       nl();
  60.       sprintf(s,"1%s 2%-5.3f7.  1%s 2%-5.3f 1to play games7.",
  61.           get_string(733), post_ratio(),
  62.           get_string(731), syscfg.post_call_ratio);
  63.       pl(s);
  64.       nl();
  65.     }
  66.   return(ok);
  67. }
  68.  
  69. void end_bbs(int lev)
  70. {
  71.   sl1(1,"");
  72.   close_user();
  73.   close_strfiles();
  74.   if (ok_modem_stuff)
  75.     closeport();
  76.   dtr(0);
  77.   outs(wwiv_version);
  78.   outs(" run complete.\r\n\r\n");
  79.   setvect(save_dos,NULL);
  80.   exit(lev);
  81. }
  82.  
  83. void sublist(void)
  84. {
  85.   int i,abort;
  86.   char s[80],s1[80],*ss;
  87.  
  88.   abort=0;
  89.   nl();
  90.   pla("7-=*1Message Subs Available7*=-",&abort);
  91.   nl();
  92.   i=0;
  93.   while ((i<num_subs) && (usub[i].subnum!=-1)) {
  94.     sprintf(s,"7[1%-3.3s7]1",usub[i].keys);
  95.     if (qsc_q[usub[i].subnum/32]&(1L<<(usub[i].subnum%32)))
  96.       strcat(s,get_string(3));
  97.     else
  98.       strcat(s,get_string(4));
  99.     if (net_sysnum || (net_num_max>1)) {
  100.       if (xsubs[usub[i].subnum].num_nets) {
  101.         if (xsubs[usub[i].subnum].num_nets>1)
  102.       ss="3Gated";
  103.     else
  104.       ss=net_networks[xsubs[usub[i].subnum].nets[0].net_num].name;
  105.     if (subboards[usub[i].subnum].anony & anony_val_net)
  106.       sprintf(s1,"7[1%-8.8s7] ",ss);
  107.     else
  108.       sprintf(s1,"7<1%-8.8s7> ",ss);
  109.     strcat(s,s1);
  110.       } else
  111.     strcat(s," 2Local     ");
  112.     }
  113.     strcat(s,subboards[usub[i].subnum].name);
  114.     pla(s,&abort);
  115.     i++;
  116.   }
  117.   if (i==0)
  118.     pla("6None.",&abort);
  119.   nl();
  120. }
  121.  
  122.  
  123. void dirlist(void)
  124. {
  125.   int i,abort;
  126.   char s[80];
  127.  
  128.   abort=0;
  129.   nl();
  130.   pla(get_string(6),&abort);
  131.   nl();
  132.   i=0;
  133.   while ((i<num_dirs) && (udir[i].subnum!=-1)) {
  134.     sprintf(s,"%3s - %s",udir[i].keys, directories[udir[i].subnum].name);
  135.     pla(s,&abort);
  136.     i++;
  137.   }
  138.   if (i==0)
  139.     pla(get_string(5),&abort);
  140.   nl();
  141. }
  142.  
  143.  
  144. void text_edit(void)
  145. {
  146.   char s[81],s1[81];
  147.  
  148.   nl();
  149.   prt(3,get_string(7));
  150.   mpl(12);
  151.   input(s,12);
  152.   if (strstr(s,".LOG")!=NULL)
  153.     s[0]=0;
  154.   if (!okfn(s))
  155.     s[0]=0;
  156.   if (s[0]) {
  157.     sprintf(s1,get_stringx(1,1),s);
  158.     sysoplog(s1);
  159.     if (okfsed())
  160.       external_edit(s,syscfg.gfilesdir,thisuser.defed-1,500,syscfg.gfilesdir,s,1);
  161.     else
  162.       tedit(s);
  163.   }
  164. }
  165.  
  166. void parse_email_info(char *s, unsigned short *un1, unsigned short *sy1)
  167. {
  168.   char *ss,*ss1,s1[5],onx[20],ch,*mmk;
  169.   unsigned un, sy;
  170.   int i,nv,on,xx,onxi,odci;
  171.   net_system_list_rec *csne;
  172.  
  173.   *un1=0;
  174.   *sy1=0;
  175.   ss=strchr(s,'@');
  176.   if (ss==NULL) {
  177.     un=finduser1(s);
  178.     if (un>0)
  179.       *un1=un;
  180.     else
  181.       pl("6Unknown User.");
  182.   } else {
  183.     ss[0]=0;
  184.     ss=&(ss[1]);
  185.     i=strlen(s);
  186.     while ((i>0) && (s[i-1]==' '))
  187.       --i;
  188.     s[i]=0;
  189.     un=atoi(s);
  190.     sy=atoi(ss);
  191.     ss1=strchr(ss,'.');
  192.     if (ss1)
  193.       ss1++;
  194.     if (sy==0) {
  195.       un=finduser1(s);
  196.       if (un>0)
  197.         *un1=un;
  198.       else
  199.     pl("6Unknown User.");
  200.     } else {
  201.       if (un==0) {
  202.         strcpy(net_email_name,s);
  203.         i=strlen(net_email_name);
  204.         while ((i>0) && (net_email_name[i-1]==' '))
  205.           --i;
  206.         net_email_name[i]=0;
  207.         if (net_email_name[0])
  208.           *sy1=sy;
  209.         else
  210.       pl("6Unknown User.");
  211.       } else {
  212.         *un1=un;
  213.         *sy1=sy;
  214.       }
  215.       if (*sy1 && ss1) {
  216.         for (i=0; i<net_num_max; i++) {
  217.           set_net_num(i);
  218.           if (stricmp(ss1,net_name)==0) {
  219.             if (!valid_system(*sy1)) {
  220.               nl();
  221.           outstr("1There is no ");
  222.           npr("%s 7@1%u7.\r\n",ss1,*sy1);
  223.               nl();
  224.               *sy1=*un1=0;
  225.             } else {
  226.               if (*sy1==net_sysnum) {
  227.                 *sy1=0;
  228.                 if (*un1==0)
  229.                   *un1=finduser(net_email_name);
  230.                 if ((*un1==0) || (*un1>32767)) {
  231.                   *un1=0;
  232.           pl("6Unknown User.");
  233.         }
  234.           }
  235.         }
  236.         break;
  237.       }
  238.     }
  239.     if (i>=net_num_max) {
  240.       nl();
  241.       outstr("1This system isn't connected to ");
  242.       outstr(ss1);
  243.       nl();
  244.           *sy1=*un1=0;
  245.         }
  246.       } else if (*sy1 && (net_num_max>1)) {
  247.         odc[0]=0;
  248.         odci=0;
  249.         onx[0]='Q';
  250.         onx[1]=0;
  251.         onxi=1;
  252.         nv=0;
  253.         on=net_num;
  254.         ss=malloc(net_num_max);
  255.         xx=-1;
  256.         for (i=0; i<net_num_max; i++) {
  257.           set_net_num(i);
  258.           if (net_sysnum==*sy1) {
  259.             xx=i;
  260.           } else if (valid_system(*sy1)) {
  261.             ss[nv++]=i;
  262.           }
  263.         }
  264.         set_net_num(on);
  265.         if (nv==0) {
  266.           if (xx!=-1) {
  267.             set_net_num(xx);
  268.             *sy1=0;
  269.             if (*un1==0) {
  270.               *un1=finduser(net_email_name);
  271.               if ((*un1==0) || (*un1>32767)) {
  272.                 *un1=0;
  273.         pl("6Unknown User.");
  274.           }
  275.         }
  276.       } else {
  277.         nl();
  278.         pl("6Unknown System.");
  279.         *sy1=*un1=0;
  280.           }
  281.         } else if (nv==1) {
  282.           set_net_num(ss[0]);
  283.         } else {
  284.           nl();
  285.           for (i=0; i<nv; i++) {
  286.             set_net_num(ss[i]);
  287.             csne=next_system(*sy1);
  288.             if (csne) {
  289.               if (i<9) {
  290.                 onx[onxi++]=i+'1';
  291.                 onx[onxi]=0;
  292.               } else {
  293.                 odci=(i+1)/10;
  294.                 odc[odci-1]=odci+'0';
  295.                 odc[odci]=0;
  296.               }
  297.           npr("1%d7. 1%s 7(1%s7)\r\n",i+1,net_name,csne->name);
  298.             }
  299.           }
  300.       pl("1Q7. 1Quit");
  301.       nl();
  302.       prt(1,"Which network 7(1Number7)? ");
  303.       if (nv<9) {
  304.             ch=onek(onx);
  305.             if (ch=='Q')
  306.               i=-1;
  307.             else
  308.               i=ch-'1';
  309.           } else {
  310.             mmk=mmkey(2);
  311.             if (*mmk=='Q')
  312.               i=-1;
  313.             else
  314.               i=atoi(mmk)-1;
  315.           }
  316.           if ((i>=0) && (i<nv)) {
  317.             set_net_num(ss[i]);
  318.           } else {
  319.             nl();
  320.         pl("6Aborted.");
  321.         nl();
  322.         *un1=*sy1=0;
  323.       }
  324.     }
  325.     farfree(ss);
  326.       } else {
  327.         if (*sy1==net_sysnum) {
  328.           *sy1=0;
  329.           if (*un1==0)
  330.             *un1=finduser(net_email_name);
  331.           if ((*un1==0) || (*un1>32767)) {
  332.             *un1=0;
  333.         pl("6Unknown User.");
  334.       }
  335.     } else if (!valid_system(*sy1)) {
  336.       nl();
  337.       pl("6Unknown System.");
  338.       *sy1=*un1=0;
  339.         }
  340.       }
  341.     }
  342.   }
  343. }
  344.  
  345.  
  346. void send_email(void)
  347. {
  348.   char s1[81],*ss;
  349.   int i;
  350.   unsigned short sy,un;
  351.  
  352.   nl();
  353.   nl();
  354.   pl("1Enter user7'1s name or number7.");
  355.   helpl=14;
  356.   ansic(3);
  357.   outstr(":");
  358.   input(s1,40);
  359.   helpl=0;
  360.   irt[0]=0;
  361.   irt_name[0]=0;
  362.   parse_email_info(s1,&un,&sy);
  363.   grab_quotes(NULL, NULL);
  364.   if (un || sy)
  365.     email(un,sy,0,0);
  366. }
  367.  
  368. void mainmenu(void)
  369. {
  370.   char *s, s1[81],s2[81],ch;
  371.   int i;
  372.   long l;
  373.   double d;
  374.  
  375.   tleft(1);
  376.   if ((sysstatus_expert & thisuser.sysstatus)==0)
  377.     printmenu(0);
  378.  
  379.   nl();
  380.   nl();
  381.   tleft(1);
  382.   npr("1T 7- 1%s\r\n",ctim(nsl()));
  383.   npr("1P/C Ratio: %-5.3f\r\n",post_ratio());
  384.   s1[0]=0;
  385.   if (usub[cursub].subnum==-1) {
  386.     cursub=0;
  387.     if (usub[cursub].subnum==-1) {
  388.       strcpy(s1,get_string(16));
  389.     }
  390.   }
  391.   if (s1[0]==0)
  392.     sprintf(s1,"7[1%s7] [1%s7] :",usub[cursub].keys,subboards[usub[cursub].subnum].name);
  393.   prt(2,s1);
  394.   helpl=1;
  395.   s=mmkey(0);
  396.   helpl=0;
  397.   if (s[0])
  398.     for (i=0; (i<num_subs) && (usub[i].subnum!=-1); i++)
  399.       if (strcmp(usub[i].keys,s)==0)
  400.         cursub=i;
  401.   if (strlen(s)>2) {
  402.     sprintf(s1,"//%s",s);
  403.     sysopchar(s1);
  404.   } else
  405.     sysopchar(s);
  406. /**************************************************/
  407.   if (so()) {
  408.     if (strcmp(s,"BOARDEDIT")==0) {
  409.       sysoplog(get_stringx(1,2));
  410.       boardedit();
  411.     }
  412.     if (strcmp(s,"DIREDIT")==0) {
  413.       sysoplog(get_stringx(1,3));
  414.       dlboardedit();
  415.     }
  416.     if (strcmp(s,"CHAINEDIT")==0) {
  417.       sysoplog(get_stringx(1,4));
  418.       chainedit();
  419.     }
  420.     if (strcmp(s,"GFILEEDIT")==0) {
  421.       sysoplog(get_stringx(1,5));
  422.       gfileedit();
  423.     }
  424.     if (strcmp(s,"DOS")==0) {
  425.       if (checkpw()) {
  426.         sysoplog(get_stringx(1,6));
  427.         shrink_out(getenv("COMSPEC"),1,1,1,0);
  428.         topscreen();
  429.       }
  430.     }
  431.     if (strcmp(s,"RESETF")==0) {
  432.       reset_files();
  433.     }
  434.     if ((strcmp(s,"REBOOT")==0) && (checkpw())) {
  435.       dtr(0);
  436.       sysoplog(get_stringx(1,7));
  437.       logoff();
  438.       sl1(1,"");
  439.       if (ok_modem_stuff)
  440.         closeport();
  441.       close_user();
  442.       close_strfiles();
  443.       wait(3.0);
  444.       setvect(0xff,(void interrupt (*) ()) MK_FP(0xffff,0x0000));
  445.       geninterrupt(0xff);
  446.     }
  447.     if (strcmp(s,"RELOAD")==0) {
  448.       read_new_stuff();
  449.     }
  450.     if ((strcmp(s,"EDIT")==0)) {
  451.       nl();
  452.       prt(2,get_string(7));
  453.       input(s1,50);
  454.       if (s1[0]) {
  455.         if ((okansi()) && (thisuser.defed))
  456.           external_edit(s1,"",thisuser.defed-1,500,".",s1,1);
  457.         else
  458.           tedit(s1);
  459.       }
  460.     }
  461.     if (strcmp(s,"LOAD")==0) {
  462.       nl();
  463.       prt(2,get_string(7));
  464.       input(s1,50);
  465.       if (s1[0]) {
  466.         nl();
  467.         prt(5,get_string(17));
  468.         if (yn()) {
  469.           nl();
  470.           load_workspace(s1,0);
  471.         } else {
  472.           nl();
  473.           load_workspace(s1,1);
  474.         }
  475.       }
  476.     }
  477.     if (strcmp(s,"CHUSER")==0) {
  478.       chuser();
  479.     }
  480.     if (strcmp(s,"STAT")==0) {
  481.       nl();
  482.       outstr(get_string(18));
  483.       pln(_stklen);
  484.       outstr(get_string(19));
  485.       npr("%dk\r\n", (int) (farcoreleft()/1024));
  486.       outstr(get_string(20));
  487.       npr("%d%%\r\n", cachestat());
  488.       nl();
  489.     }
  490.     if (strcmp(s,"MAILR")==0) {
  491.       if (checkpw()) {
  492.         sysoplog(get_stringx(1,8));
  493.         mailr();
  494.       }
  495.     }
  496.     if (strcmp(s, "CHAT")==0) {
  497.       nl();
  498.       pl(((*(char far *)0x00000417L ^= 0x10) & 0x10) ?
  499.                        get_string(21) :
  500.                        get_string(22));
  501.       sysoplog(get_stringx(1,9));
  502.       topscreen();
  503.     }
  504.   }
  505. /**************************************************/
  506.   if (cs()) {
  507.     if (strcmp(s,"PENDING")==0) {
  508.       print_pending_list();
  509.     }
  510.     if (strcmp(s,"VOTEPRINT")==0) {
  511.       voteprint();
  512.     }
  513.     if (strcmp(s,"LOG")==0) {
  514.       sl1(3,s1);
  515.       printfile(s1);
  516.     }
  517.     if (strcmp(s,"YLOG")==0) {
  518.       printfile(status.log1);
  519.     }
  520.     if (strcmp(s,"NLOG")==0) {
  521.       printfile("NET.LOG");
  522.     }
  523.     if (strcmp(s,"UEDIT")==0) {
  524.       sysoplog(get_stringx(1,10));
  525.       uedit(usernum,0);
  526.     }
  527.     if (strcmp(s,"STATUS")==0) {
  528.       prstatus();
  529.     }
  530.     if (strcmp(s,"IVOTES")==0) {
  531.       sysoplog(get_stringx(1,11));
  532.       ivotes();
  533.     }
  534.     if (strcmp(s,"ZLOG")==0) {
  535.       zlog();
  536.     }
  537.     if (strcmp(s,"TEDIT")==0) {
  538.       sysoplog(get_stringx(1,12));
  539.       text_edit();
  540.     }
  541.     if ((strcmp(s,",")==0) && ((net_sysnum>0) || (net_num_max>1))) {
  542.       nl();
  543.       prt(2,get_string(23));
  544.       ch=onek("Q012");
  545.       switch(ch) {
  546.         case '0': printfile("NETDAT0.LOG"); break;
  547.         case '1': printfile("NETDAT1.LOG"); break;
  548.         case '2': printfile("NETDAT2.LOG"); break;
  549.       }
  550.     }
  551.     if (strcmp(s,"/?")==0) {
  552.       printmenu(5);
  553.     }
  554.   }
  555. /*************************************************/
  556.   if ((strcmp(s,"UPLOAD")==0) && (actsl>10))
  557.     upload_post();
  558.   if (strcmp(s,"QSCAN")==0) {
  559.     nl();
  560.     prt(3,get_string(24));
  561.     if (yn()) {
  562.       for (i=0; i<max_subs; i++)
  563.         qsc_p[i]=status.qscanptr-1L;
  564.       nl();
  565.       ansic(3);
  566.       pl(get_string(25));
  567.       nl();
  568.     }
  569.   }
  570.   if (strcmp(s,"CLS")==0)
  571.     outstr("\f");
  572.   if (strcmp(s,"/O")==0)
  573.     hangup=1;
  574.   if (strcmp(s,"/E")==0)
  575.     slash_e();
  576.   if (strcmp(s,"/N")==0)
  577.     nscan(cursub);
  578.   if (strcmp(s,"/Z")==0) {
  579.     pl("1Please wait7...");
  580.     set_x_only(1, "POSTS.TXT", 0);
  581.     nscan(0);
  582.     set_x_only(0, NULL, 0);
  583.     add_arc("OFFLINE", "POSTS.TXT", 0);
  584.     download_temp_arc("OFFLINE", 0);
  585.   }
  586.   if (strcmp(s,"NET")==0)
  587.     print_net_listing(0);
  588.   if (strncmp(s,"NET=",4)==0) {
  589.     print_net_listing(atoi(s+4));
  590.   }
  591.   if (strcmp(s,"VER")==0) {
  592.     nl();
  593.     npr("1%s   7(1%s7)\r\n",wwiv_version, wwiv_date);
  594.     nl();
  595.     pl("3The author may be contacted at5:");
  596.     nl();
  597.     pl("3   Wayne Bell");
  598.     pl("3   WWIV Software Services");
  599.     pl("3   PO Box 720455");
  600.     pl("3   McAllen5, 3TX  785045-30455");
  601.     nl();
  602.   }
  603.   if ((s[1]==0) && (s[0]!=0)) {
  604.     switch(s[0]) {
  605.       case '>':
  606.       case '+':
  607.         if ((cursub<num_subs-1) && (usub[cursub+1].subnum>=0))
  608.           ++cursub;
  609.         else
  610.           cursub=0;
  611.         break;
  612.       case '<':
  613.       case '-':
  614.         if (cursub>0)
  615.           --cursub;
  616.         else {
  617.           while ((usub[cursub+1].subnum>=0) && (cursub<num_subs-1))
  618.             ++cursub;
  619.         }
  620.         break;
  621.       case '!':
  622.         helpl=14;
  623.         if (!cs())
  624.           return;
  625.         nl();
  626.         nl();
  627.     pl("1Enter user7'1s name or number7.");
  628.     ansic(3);
  629.     outstr(":");
  630.     input(s1,30);
  631.     i=finduser1(s1);
  632.     if (i>0) {
  633.       sysoplog(get_stringx(1,13));
  634.       valuser(i);
  635.     } else
  636.       pl("6Unknown user.");
  637.     break;
  638.       case '.':
  639.     helpl=26;
  640.     if (thisuser.restrict & restrict_auto_msg_delete) {
  641.       pl("Sorry, no games for you!");
  642.       break; }
  643.     if (thisuser.ass_pts>9) {
  644.       nl();
  645.       pl("3You have too many ass points to play games5!");
  646.       nl();
  647.       prt(3,"Would you like to read the info on how you get ass points5? ");
  648.       if(yn())
  649.        printfile("ASS.MSG");
  650.       break;
  651.     }
  652.     if (pcrat())
  653.       do_chains();
  654.     break;
  655.       case '~':
  656.     /*iqqst();*/
  657.     break;
  658.       case 'A':
  659.         helpl=19;
  660.         write_automessage();
  661.         break;
  662.       case 'B':
  663.         helpl=25;
  664.         bbslist();
  665.         break;
  666.       case 'C':
  667.         helpl=3;
  668.         reqchat();
  669.         break;
  670.       case 'D':
  671.         helpl=4;
  672.         defaults();
  673.         break;
  674.       case 'E':
  675.         send_email();
  676.         break;
  677.       case 'F':
  678. /*        strcpy(irt,get_stringx(1,14));
  679.     irt_name[0]=0;
  680.     grab_quotes(NULL, NULL);
  681.     email(1,0,0,0);*/
  682.     feedb();
  683.     break;
  684.       case 'G':
  685.         helpl=28;
  686.         gfiles();
  687.         break;
  688.       case 'I':
  689.         nl();
  690.     npr("1%s   7(1%s7)\r\n",wwiv_version, wwiv_date);
  691.     nl();
  692.     printfile("LOGON");
  693.     printfile("SYSTEM");
  694.     break;
  695.       case 'K':
  696.         helpl=8;
  697.         kill_old_email();
  698.         break;
  699.       case 'L':
  700.         printfile("USER.LOG");
  701.         break;
  702.       case 'M':
  703.         if (thisuser.waiting>0) {
  704.           readmail();
  705.         } else {
  706.           nl();
  707.       pl("2You have no mail5.");
  708.       nl();
  709.     }
  710.     break;
  711.       case 'N':
  712.         express=0;
  713.         expressabort=0;
  714.         nscan(0);
  715.         break;
  716.       case 'O':
  717.         nl();
  718.         nl();
  719.     prt(5,"Log Off3? ");
  720.     helpl=12;
  721.     if (yn()) {
  722.       outchr(12);
  723.       outstr("1Time on 7- 1");
  724.       pl(ctim(timer()-timeon));
  725.           printfile("LOGOFF");
  726.           hangup=1;
  727.         }
  728.         break;
  729.       case 'P':
  730.         irt[0]=0;
  731.         irt_name[0]=0;
  732.         grab_quotes(NULL, NULL);
  733.         if (usub[0].subnum!=-1)
  734.           post();
  735.         break;
  736.       case 'Q':
  737.         i=0;
  738.         express=0;
  739.         expressabort=0;
  740.         qscan(cursub,&i);
  741.         break;
  742.       case 'R':
  743.         helpl=15;
  744.         remove_post();
  745.         break;
  746.       case 'S':
  747.         express=0;
  748.         expressabort=0;
  749.         scan2();
  750.         break;
  751.       case 'T':
  752.         if (syscfg.sysconfig & sysconfig_no_xfer) {
  753.           nl();
  754.           pl(get_string(30));
  755.           nl();
  756.           break;
  757.     }
  758.     if (thisuser.ass_pts>9) {
  759.       nl();
  760.       pl("3You have too many ass points to transfer5!");
  761.       nl();
  762.       prt(3,"Would you like to read the info on how you get ass points5? ");
  763.       if(yn())
  764.        printfile("ASS.MSG");
  765.       break;
  766.     }
  767.         if (udir[0].subnum!=-1)
  768.           curdloads=1;
  769.         else {
  770.       nl();
  771.       ansic(2);
  772.       pl(get_string(31));
  773.       nl();
  774.     }
  775.     break;
  776.       case 'U':
  777.         list_users();
  778.         break;
  779.       case 'V':
  780.         helpl=18;
  781.         vote();
  782.         break;
  783.       case 'W':
  784.         printmenu(15);
  785.         break;
  786.       case 'X':
  787.         thisuser.sysstatus ^= sysstatus_expert;
  788.         break;
  789.       case 'Y':
  790.         yourinfo();
  791.         break;
  792.       case 'Z':
  793.         express=1;
  794.         expressabort=0;
  795.         l=thisuser.sysstatus;
  796.         if (l & sysstatus_pause_on_page)
  797.           thisuser.sysstatus ^= sysstatus_pause_on_page;
  798.         nscan(0);
  799.         express=0;
  800.         expressabort=0;
  801.         thisuser.sysstatus=l;
  802.         break;
  803.       case '?':
  804.         if ((sysstatus_expert & thisuser.sysstatus))
  805.           printmenu(0);
  806.         break;
  807.       case '*': sublist(); break;
  808.     }
  809.   }
  810.   helpl=0;
  811. }
  812.  
  813.  
  814. void dlmainmenu(void)
  815. {
  816.   char *s, s1[81],s2[81],ch;
  817.   int i,i1,i2,abort,next;
  818.   messagerec m;
  819.  
  820.   tleft(1);
  821.   if ((sysstatus_expert & thisuser.sysstatus)==0)
  822.     printmenu(3);
  823.  
  824.   nl();
  825.   nl();
  826.   tleft(1);
  827.   npr("T - %s\r\n",ctim(nsl()));
  828.   s1[0]=0;
  829.   if (udir[curdir].subnum==-1) {
  830.     curdir=0;
  831.     if (udir[curdir].subnum==-1) {
  832.       strcpy(s1,get_string(32));
  833.       curdloads=0;
  834.       return;
  835.     }
  836.   }
  837.   if (s1[0]==0)
  838.     sprintf(s1,"(%s)-(%s) :",udir[curdir].keys,directories[udir[curdir].subnum].name);
  839.   prt(2,s1);
  840.   helpl=2;
  841.   s=mmkey(1);
  842.   helpl=0;
  843.   if (s[0])
  844.     for (i=0; i<num_dirs; i++)
  845.       if (strcmp(udir[i].keys,s)==0)
  846.         curdir=i;
  847.   if (strlen(s)>2) {
  848.     sprintf(s1,"//%s",s);
  849.     sysopchar(s1);
  850.   } else
  851.     sysopchar(s);
  852.   if (strcmp(s,"/O")==0)
  853.     hangup=1;
  854.   if (strcmp(s,"/S")==0) {
  855.     pl(get_string(26));
  856.     set_x_only(1,"FILES.TXT", 1);
  857.     searchall();
  858.     set_x_only(0, NULL, 0);
  859.     add_arc("TEMP", "FILES.TXT", 1);
  860.   }
  861.   if ((strcmp(s,"/?")==0) && (dcs()))
  862.     printmenu(8);
  863.   if ((strcmp(s,"UPLOADALL")==0) && (dcs())) {
  864.     i1=0;
  865.     for (i=0; (i<num_dirs) && (udir[i].subnum>=0) && (!i1); i++) {
  866.       nl();
  867.       nl();
  868.       outstr(get_string(33));
  869.       pl(directories[udir[i].subnum].name);
  870.       nl();
  871.       i1=uploadall(i);
  872.     }
  873.   }
  874.   if ((strcmp(s,"UPLOAD")==0) && (dcs()))
  875.     uploadall(curdir);
  876.   if ((strcmp(s,"UPLOADFILE")==0) && (so())) {
  877.     nl();
  878.     pl(get_string(34));
  879.     pl(get_string(35));
  880.     nl();
  881.     prt(5,get_string(36));
  882.     ch=onek("Q12");
  883.     nl();
  884.     if (ch!='Q') {
  885.       outstr(get_string(7));
  886.       inputl(s2,80);
  887.       switch(ch) {
  888.         case '1': i2=2; break;
  889.         case '2': i2=0; break;
  890.         default : i2=0; break;
  891.       }
  892.       upload_files(s2,curdir,i2);
  893.     }
  894.   }
  895.   if ((strcmp(s,"REN")==0) && (dcs())) {
  896.     helpl=39;
  897.     rename_file();
  898.   }
  899.   if ((strcmp(s,"MOVE")==0) && (dcs()))
  900.     move_file();
  901.   if ((strcmp(s,"SORT")==0) && (dcs())) {
  902.     nl();
  903.     prt(2,get_string(37));
  904.     i=yn();
  905.     nl();
  906.     prt(2,get_string(38));
  907.     if (yn())
  908.       i1=2;
  909.     else
  910.       i1=0;
  911.     if (i)
  912.       sort_all(i1);
  913.     else
  914.       sortdir(udir[curdir].subnum,i1);
  915.   }
  916.   if ((strcmp(s,"RSORT")==0) && (dcs())) {
  917.     sort_all(1);
  918.   }
  919.   if ((strcmp(s,"DIREDIT")==0) && (so())) {
  920.     sysoplog(get_stringx(1,3));
  921.     dlboardedit();
  922.   }
  923.   if ((strcmp(s,"DOS")==0) && (so())) {
  924.     if (checkpw()) {
  925.       sysoplog(get_stringx(1,6));
  926.       shrink_out(getenv("COMSPEC"),1,1,1,0);
  927.       topscreen();
  928.     }
  929.   }
  930.  
  931.   if ((s[1]==0) && (s[0]!=0)) {
  932.     switch(s[0]) {
  933.       case '>':
  934.       case '+':
  935.         if ((curdir<num_dirs-1) && (udir[curdir+1].subnum>=0))
  936.           ++curdir;
  937.         else
  938.           curdir=0;
  939.         break;
  940.       case '<':
  941.       case '-':
  942.         if (curdir>0)
  943.           --curdir;
  944.         else {
  945.           while ((udir[curdir+1].subnum>=0) && (curdir<num_dirs-1))
  946.             ++curdir;
  947.         }
  948.         break;
  949.       case '*': dirlist(); break;
  950.       case 'Q': curdloads=0; break;
  951.       case '.':
  952.         if (dcs()) {
  953.           m.stored_as=0L;
  954.           m.storage_type=255;
  955.           next=0;
  956.           read_message1(&m,0,0,&next,dszlog);
  957.         }
  958.         break;
  959.       case '^':
  960.         if (so())
  961.           print_devices();
  962.         break;
  963.       case '?':
  964.         if ((sysstatus_expert & thisuser.sysstatus))
  965.           printmenu(3);
  966.         break;
  967.       case 'A':
  968.         helpl=23;
  969.         arc_l();
  970.         break;
  971.       case 'B':
  972.         helpl=22;
  973.         batchdl();
  974.         break;
  975.       case 'C':
  976.         helpl=3;
  977.         reqchat();
  978.         break;
  979.       case 'D':
  980.         helpl=20;
  981.         download();
  982.         break;
  983.       case 'E':
  984.         helpl=29;
  985.         temp_extract();
  986.         break;
  987.       case 'F':
  988.         helpl=21;
  989.         finddescription();
  990.         break;
  991.       case 'G':
  992.         helpl=30;
  993.         temporary_stuff();
  994.         break;
  995.       case 'L':
  996.         listfiles();
  997.         break;
  998.       case 'M':
  999.         helpl=31;
  1000.         if (dcs())
  1001.           move_file();
  1002.         break;
  1003.       case 'N':
  1004.         abort=0;
  1005.         nl();
  1006.         prt(5,get_string(39));
  1007.         if (yn())
  1008.           nscanall();
  1009.         else {
  1010.           nl();
  1011.           nl();
  1012.           nl();
  1013.           nscandir(curdir,&abort,0);
  1014.         }
  1015.         break;
  1016.       case 'O':
  1017.         helpl=12;
  1018.         nl();
  1019.         nl();
  1020.         prt(5,get_string(28));
  1021.         if (yn()) {
  1022.           outchr(12);
  1023.           outstr(get_string(29));
  1024.           pl(ctim(timer()-timeon));
  1025.           printfile("LOGOFF");
  1026.           hangup=1;
  1027.         }
  1028.         break;
  1029.       case 'P':
  1030.         helpl=13;
  1031.         setldate();
  1032.         break;
  1033.       case 'R':
  1034.         helpl=38;
  1035.         removefile();
  1036.         break;
  1037.       case 'S':
  1038.         searchall();
  1039.         break;
  1040.       case 'T':
  1041.         helpl=32;
  1042.         xfer_defaults();
  1043.         break;
  1044.       case 'U':
  1045.         helpl=17;
  1046.         if ((thisuser.restrict & (restrict_validate | restrict_upload)) ||
  1047.             (syscfg.sysconfig & sysconfig_all_sysop)) {
  1048.           if (syscfg.newuploads<num_dirs)
  1049.             upload((int) syscfg.newuploads);
  1050.           else
  1051.             upload(0);
  1052.         } else
  1053.           upload(udir[curdir].subnum);
  1054.         break;
  1055.       case 'V':
  1056.         helpl=23;
  1057.         arc_l();
  1058.         break;
  1059.       case 'W':
  1060.         printmenu(16);
  1061.         break;
  1062.       case 'X':
  1063.         helpl=22;
  1064.         batchdl();
  1065.         break;
  1066.       case 'Y':
  1067.         yourinfodl();
  1068.         break;
  1069.       case 'Z':
  1070.         nl();
  1071.         nl();
  1072.         pl(get_string(40));
  1073.         nl();
  1074.         helpl=17;
  1075.         upload(0);
  1076.         break;
  1077.     }
  1078.   }
  1079.   helpl=0;
  1080. }
  1081.  
  1082.  
  1083. int date_changed(void)
  1084. {
  1085.   struct date today,today1;
  1086.  
  1087.   getdate(&today);
  1088.   getdate(&today1);
  1089.   if (today.da_day==today1.da_day)
  1090.     return(0);
  1091.   else
  1092.     return(1);
  1093. }
  1094.  
  1095.  
  1096. void print_local_file(char *ss, char *ss1)
  1097. {
  1098.   char s[81];
  1099.   char s1[81];
  1100.  
  1101.   if (syscfg.sysconfig & sysconfig_list) {
  1102.     sprintf(s,"LIST %s%s",syscfg.gfilesdir,ss);
  1103.     if (ss1[0]) {
  1104.       sprintf(s1,"%s %s%s",s,syscfg.gfilesdir,ss1);
  1105.       strcpy(s,s1);
  1106.     }
  1107.     do_remote(s,1);
  1108.   } else {
  1109.     printfile(ss);
  1110.     nl();
  1111.     nl();
  1112.     getkey();
  1113.   }
  1114. }
  1115.  
  1116.  
  1117. void getcaller(void)
  1118. {
  1119.   char s[81],s1[81],ch,done,lokb,*ss;
  1120.   int i,i1,i2,i3,any;
  1121.   double d,d1;
  1122.   long l,l1;
  1123.  
  1124.   c_sub=c_dir=0;
  1125.  
  1126.   frequent_init();
  1127.   sl1(1,"");
  1128.   imodem(0);
  1129.   usernum=0;
  1130.   wfc=0;
  1131.   read_user(1,&thisuser);
  1132.   read_qscn(1,qsc,0);
  1133.   usernum=1;
  1134.   reset_act_sl();
  1135.   fwaiting=thisuser.waiting;
  1136.   if (thisuser.inact & inact_deleted) {
  1137.     thisuser.screenchars=80;
  1138.     thisuser.screenlines=25;
  1139.   }
  1140.   screenlinest=defscreenbottom+1;
  1141.   d=(1.0+timer()) / 102.723;
  1142.   d-=floor(d);
  1143.   d*=10000.0;
  1144.   srand((unsigned int)d);
  1145.   do {
  1146.     set_net_num(0);
  1147.     any=0;
  1148.     wfc=1;
  1149.     if (date_changed())
  1150.       if (date_changed()) {
  1151.         printf("\n\nClock Corrupted.\n\n");
  1152.         printf("Should put BBS in a batch file like:\n\n");
  1153.         printf("copy con: wwiv.bat\n");
  1154.         printf(":top\n");
  1155.         printf("setclock\n");
  1156.         printf("bbs\n");
  1157.         printf("if errorlevel 1 goto top\n");
  1158.         printf("^Z\n");
  1159.         end_bbs(noklevel);
  1160.       }
  1161.     if (strcmp(date(), status.date1)!=0) {
  1162.       holdphone(1);
  1163.       beginday();
  1164.       holdphone(0);
  1165.       clrscrb();
  1166.     }
  1167.     check_event();
  1168.     if (do_event) {
  1169.       run_event();
  1170.       any=1;
  1171.     }
  1172.     lokb=0;
  1173.     strcpy(curspeed,"KB");
  1174.     if ((!any) && ((rand() % 8000)==0) && (net_sysnum) &&
  1175.                    (ok_modem_stuff)) {
  1176.       attempt_callout();
  1177.       any=1;
  1178.     }
  1179.     okskey=0;
  1180.     ch=upcase(inkey());
  1181.     if (ch) {
  1182.       any=1;
  1183.       switch(ch) {
  1184.         case '?':
  1185.           if (ok_local()) {
  1186.             printmenu(7);
  1187.             nl();
  1188.             getkey();
  1189.           }
  1190.           break;
  1191.         case ' ':
  1192.           outs(get_string(41));
  1193.           d=timer();
  1194.           while ((!kbhitb()) && (fabs(timer()-d)<60.0));
  1195.           if (kbhitb()) {
  1196.             ch=upcase(getchd1());
  1197.             if (ch==str_yes[0]) {
  1198.               outs(str_yes);
  1199.               outstr("\r\n");
  1200.               lokb=1;
  1201.               if ((syscfg.sysconfig & sysconfig_off_hook)==0)
  1202.                 dtr(0);
  1203.             }
  1204.             ss=get_string(42);
  1205.             if ((ch==upcase(*ss)) && (ok_local())) {
  1206.               outstr(ss);
  1207.               outs("\r\n\r\n\r\n\r\n\r\n\r\n");
  1208.               read_user(1,&thisuser);
  1209.               read_qscn(1,qsc,0);
  1210.               reset_act_sl();
  1211.               if (thisuser.inact & inact_deleted) {
  1212.                 out1ch(12);
  1213.                 break;
  1214.               }
  1215.               lokb=2;
  1216.               if ((syscfg.sysconfig & sysconfig_off_hook)==0)
  1217.                 dtr(0);
  1218.             }
  1219.             if (ch==0)
  1220.               getchd1();
  1221.           }
  1222.           if (!lokb)
  1223.             out1ch(12);
  1224.           break;
  1225.         case 'A':
  1226.           if (!ok_modem_stuff)
  1227.             break;
  1228.           answer_phone();
  1229.           break;
  1230.         case 'B':
  1231.           okskey=1;
  1232.           if (ok_local()) {
  1233.             holdphone(1);
  1234.             boardedit();
  1235.             holdphone(0);
  1236.           }
  1237.           okskey=0;
  1238.           break;
  1239.         case 'C':
  1240.           okskey=1;
  1241.           if (ok_local()) {
  1242.             holdphone(1);
  1243.             chainedit();
  1244.             holdphone(0);
  1245.           }
  1246.           okskey=0;
  1247.           break;
  1248.         case 'D':
  1249.           okskey=1;
  1250.           if (ok_local()) {
  1251.             holdphone(1);
  1252.             dlboardedit();
  1253.             holdphone(0);
  1254.           }
  1255.           okskey=0;
  1256.           break;
  1257.         case 'E':
  1258.           okskey=1;
  1259.           if (ok_local()) {
  1260.             holdphone(1);
  1261.             text_edit();
  1262.             holdphone(0);
  1263.           }
  1264.           okskey=0;
  1265.           break;
  1266.         case 'F':
  1267.           if (ok_local()) {
  1268.             holdphone(1);
  1269.             nl();
  1270.             pl(get_string(43));
  1271.             nl();
  1272.             full_external(getenv("COMSPEC"),1,0);
  1273.             out1ch(12);
  1274.             cleanup_net();
  1275.             holdphone(0);
  1276.           }
  1277.           break;
  1278.         case 'G':
  1279.           okskey=1;
  1280.           if (ok_local()) {
  1281.             holdphone(1);
  1282.             gfileedit();
  1283.             holdphone(0);
  1284.           }
  1285.           okskey=0;
  1286.           break;
  1287.         case 'I':
  1288.           okskey=1;
  1289.           if (ok_local()) {
  1290.             holdphone(1);
  1291.             ivotes();
  1292.             holdphone(0);
  1293.           }
  1294.           okskey=0;
  1295.           break;
  1296.         case 'K':
  1297.           if (ok_local()) {
  1298.             usernum=1;
  1299.             useron=1;
  1300.             holdphone(1);
  1301.             okskey=1;
  1302.             prt(2,get_string(44));
  1303.             input(s1,50);
  1304.             load_workspace(s1,0);
  1305.             send_email();
  1306.             okskey=0;
  1307.             useron=0;
  1308.             write_user(1,&thisuser);
  1309.             close_user();
  1310.             cleanup_net();
  1311.             holdphone(0);
  1312.           }
  1313.           break;
  1314.         case 'L':
  1315.           if (ok_local()) {
  1316.             sl1(3,s1);
  1317.             print_local_file(s1,status.log1);
  1318.           }
  1319.           break;
  1320.         case 'M':
  1321.           okskey=1;
  1322.           if (ok_local()) {
  1323.             holdphone(1);
  1324.             mailr();
  1325.             holdphone(0);
  1326.           }
  1327.           okskey=0;
  1328.           break;
  1329.         case 'N':
  1330.           if (ok_local())
  1331.             print_local_file("NET.LOG","NETDAT*.LOG");
  1332.           break;
  1333.         case 'P':
  1334.           if (ok_local())
  1335.             print_pending_list();
  1336.           break;
  1337.         case 'Q':
  1338.           end_bbs(oklevel);
  1339.           break;
  1340.         case 'R':
  1341.           if (ok_local()) {
  1342.             usernum=1;
  1343.             if (thisuser.waiting) {
  1344.               holdphone(1);
  1345.               okskey=1;
  1346.               readmail();
  1347.               okskey=0;
  1348.               write_user(1,&thisuser);
  1349.               close_user();
  1350.               cleanup_net();
  1351.               holdphone(0);
  1352.             }
  1353.           }
  1354.           break;
  1355.         case 'S':
  1356.           if (ok_local()) {
  1357.             prstatus();
  1358.             getkey();
  1359.           }
  1360.           break;
  1361.         case 'T':
  1362.           if ((ok_local()) && (syscfg.terminal[0])) {
  1363.             if (syscfg.sysconfig & sysconfig_shrink_term)
  1364.               shrink_out(syscfg.terminal,0,0,0,1);
  1365.             else
  1366.               run_external(syscfg.terminal);
  1367.             imodem(1);
  1368.             imodem(0);
  1369.           }
  1370.           break;
  1371.         case 'U':
  1372.           okskey=1;
  1373.           if (ok_local()) {
  1374.             holdphone(1);
  1375.             uedit(1,0);
  1376.             holdphone(0);
  1377.           }
  1378.           okskey=0;
  1379.           break;
  1380.         case 'W':
  1381.           if (ok_local()) {
  1382.             usernum=1;
  1383.             useron=1;
  1384.             holdphone(1);
  1385.             okskey=1;
  1386.             send_email();
  1387.             okskey=0;
  1388.             useron=0;
  1389.             write_user(1,&thisuser);
  1390.             close_user();
  1391.             cleanup_net();
  1392.             holdphone(0);
  1393.           }
  1394.           break;
  1395.         case 'Y':
  1396.           if (ok_local()) {
  1397.             sl1(3,s1);
  1398.             print_local_file(status.log1,s1);
  1399.           }
  1400.           break;
  1401.         case 'Z':
  1402.           if (ok_local()) {
  1403.             zlog();
  1404.             nl();
  1405.             getkey();
  1406.           }
  1407.           break;
  1408.         case '/':
  1409.           if ((net_sysnum) && (ok_local()))
  1410.             force_callout();
  1411.           break;
  1412.  
  1413.       }
  1414.       if (!incom) {
  1415.         frequent_init();
  1416.         read_user(1,&thisuser);
  1417.         read_qscn(1,qsc,0);
  1418.         fwaiting=thisuser.waiting;
  1419.         reset_act_sl();
  1420.         usernum=1;
  1421.       }
  1422.       okskey=0;
  1423.     }
  1424.     if ((comhit()) && (ok_modem_stuff) && (!lokb)) {
  1425.       any=1;
  1426.       if (peek1c()==10)
  1427.         get1c();
  1428.       else {
  1429.         outs("* ");
  1430.         if (mode_switch(1.0,0)==mode_ring)
  1431.           answer_phone();
  1432.         else if (modem_mode == mode_con) {
  1433.           incom=outcom=1;
  1434.           if (!(modem_flag & flag_ec))
  1435.             wait1(45);
  1436.           else
  1437.             wait1(2);
  1438.         }
  1439.       }
  1440.     }
  1441.     if (!any) {
  1442.       if (c_sub<num_subs) {
  1443.         if (!sub_dates[c_sub]) {
  1444.           any=1;
  1445.           iscan_hash(c_sub);
  1446.         }
  1447.         c_sub++;
  1448.       } else if (c_dir<num_dirs) {
  1449.         if (!dir_dates[c_dir]) {
  1450.           any=1;
  1451.           dliscan_hash(c_dir);
  1452.         }
  1453.         c_dir++;
  1454.       } else
  1455.         giveup_timeslice();
  1456.     }
  1457.   } while ((!incom) && (!lokb) && (!endday));
  1458.   if (lokb)
  1459.     modem_speed = modem_i->defl.modem_speed;
  1460.   using_modem=incom;
  1461.   if (lokb==2)
  1462.     using_modem=-1;
  1463.   okskey=1;
  1464.   if (!endday) {
  1465.     clrscrb();
  1466.     if (modem_mode==mode_fax)
  1467.       outs(get_string(45));
  1468.     else
  1469.       outs(get_string(46));
  1470.     outs(curspeed);
  1471.     outs("...\r\n");
  1472.   }
  1473.   wfc=0;
  1474. }
  1475.  
  1476.  
  1477. void gotcaller(unsigned int ms, unsigned int cs)
  1478. {
  1479.   char s[81];
  1480.   double d;
  1481.  
  1482.   frequent_init();
  1483.   com_speed = cs;
  1484.   modem_speed = ms;
  1485.   sl1(1,"");
  1486.   read_user(1,&thisuser);
  1487.   read_qscn(1,qsc,0);
  1488.   reset_act_sl();
  1489.   usernum=1;
  1490.   if (thisuser.inact & inact_deleted) {
  1491.     thisuser.screenchars=80;
  1492.     thisuser.screenlines=25;
  1493.   }
  1494.   screenlinest=25;
  1495.   clrscrb();
  1496.   outs(get_string(46));
  1497.   outs(curspeed);
  1498.   outs("...\r\n");
  1499.   outs(s);
  1500.   if (ms) {
  1501.     set_baud(cs);
  1502.     incom=1;
  1503.     outcom=1;
  1504.     using_modem=1;
  1505.   } else {
  1506.     using_modem=incom=outcom=0;
  1507.   }
  1508.   d=(timer()) / 102.723;
  1509.   d-=floor(d);
  1510.   d*=10000.0;
  1511.   srand((unsigned int)d);
  1512. }
  1513.  
  1514.  
  1515. void main(int argc, char *argv[])
  1516. {
  1517.   char s[81],s1[81],ch,frc[81],*ss;
  1518.   int i,i1,i2,num_min=0;
  1519.   unsigned int ui=0, us=0;
  1520.   double dt;
  1521.   unsigned short c_s,c_o;
  1522.  
  1523.   ss=getenv("BBS");
  1524.   if (ss) {
  1525.     if (strncmp(ss,"WWIV",4)==0) {
  1526.       printf("You are already in the BBS, type 'EXIT' instead.\n\n");
  1527.       exit(-1);
  1528.     }
  1529.   }
  1530.   already_on=0;
  1531.   endday=0;
  1532.   oklevel=0;
  1533.   noklevel=0;
  1534.   ooneuser=0;
  1535.   no_hangup=0;
  1536.   ok_modem_stuff=1;
  1537.   if (exist("restore.wwv"))
  1538.     restoring_shrink=1;
  1539.   else
  1540.     restoring_shrink=0;
  1541.  
  1542.   frc[0]=0;
  1543.  
  1544.   for (i=1; i<argc; i++) {
  1545.     strcpy(s,argv[i]);
  1546.     if ((s[0]=='-') || (s[0]=='/')) {
  1547.       ch=upcase(s[1]);
  1548.       switch(ch) {
  1549.         case 'C':
  1550.           flow_control=1;
  1551.           break;
  1552.         case 'B':
  1553.           ui=(unsigned int) atol(&(s[2]));
  1554.           if ((ui%300)==0) {
  1555.             ultoa((unsigned long) ui,curspeed,10);
  1556.             if (!us)
  1557.               us=ui;
  1558.             already_on=1;
  1559.           } else {
  1560.             ui=us=0;
  1561.             if (stricmp(&(s[2]),"KB")==0) {
  1562.               strcpy(curspeed,"KB");
  1563.               already_on=1;
  1564.             }
  1565.           }
  1566.           break;
  1567.         case 'F':
  1568.           strcpy(frc,s+2);
  1569.           strupr(frc);
  1570.           already_on=1;
  1571.           break;
  1572.         case 'S':
  1573.           us=(unsigned int) atol(&(s[2]));
  1574.           if (us%300) {
  1575.             us=ui;
  1576.           }
  1577.           break;
  1578.         case 'N':
  1579.           oklevel=atoi(&(s[2]));
  1580.           break;
  1581.         case 'A':
  1582.           noklevel=atoi(&(s[2]));
  1583.           break;
  1584.         case 'O':
  1585.           ooneuser=1;
  1586.           break;
  1587.         case 'H':
  1588.           no_hangup=1;
  1589.           break;
  1590.         case 'M':
  1591.           ok_modem_stuff=0;
  1592.           break;
  1593.         case 'X':
  1594.           c_s=strtol(&(s[2]),NULL,16);
  1595.           c_o=strtol(&(s[7]),NULL,16);
  1596.           if (c_s && c_o) {
  1597.             point_shrink=MK_FP(c_s, c_o);
  1598.           }
  1599.           break;
  1600.         case 'R':
  1601.           num_min=atoi(&(s[2]));
  1602.           break;
  1603.         case '?':
  1604.           printf("WWIV Bulletin Board\n\n");
  1605.           printf("BBS /B<rate> /S<rate> /N<level> /A<level> /R<min> /O /H /M /X /F /C /?\n\n");
  1606.           printf("  /B - someone already logged on at rate (modem speed)\n");
  1607.           printf("  /S - used only with /B, indicates com port speed\n");
  1608.           printf("  /N - normal exit level\n");
  1609.           printf("  /A - abnormal exit level\n");
  1610.           printf("  /R - specify max # minutes until event\n");
  1611.           printf("  /O - quit WWIV after one user done\n");
  1612.           printf("  /H - don't hang up on user when he logs off\n");
  1613.           printf("  /M - don't access modem at all\n");
  1614.           printf("  /X - pointer to bbs.com info\n");
  1615.           printf("  /F - pass full result code (\"CONNECT 9600/ARQ/HST/HST/V.42BIS\")\n");
  1616.           printf("  /C - enable CTS/RTS flow control\n");
  1617.           printf("  /? - display command line options\n\n");
  1618.           exit(0);
  1619.       }
  1620.     }
  1621.   }
  1622.  
  1623.   init();
  1624.  
  1625.   if (frc[0])
  1626.     process_full_result(frc);
  1627.  
  1628.   if (num_min) {
  1629.     syscfg.executetime=(timer()+num_min*60)/60;
  1630.     if (syscfg.executetime>1440)
  1631.       syscfg.executetime-=1440;
  1632.     syscfg.executestr[0]=0;
  1633.     time_event=((double)syscfg.executetime)*60.0;
  1634.     last_time=time_event-timer();
  1635.     if (last_time<0.0)
  1636.       last_time+=24.0*3600.0;
  1637.   }
  1638.  
  1639.   if (restoring_shrink) {
  1640.     restoring_shrink=0;
  1641.     switch(restore_data("restore.wwv")) {
  1642.       case -1: /* hanging up */
  1643.         goto hanging_up;
  1644.       case 0: /* WFC */
  1645.         goto wfc_label;
  1646.       case 1: /* main menu */
  1647.       case 2:
  1648.         goto main_menu_label;
  1649.     }
  1650.   }
  1651.  
  1652.   do {
  1653.  
  1654.     wait1(9);
  1655.     if (already_on)
  1656.       gotcaller(ui, us);
  1657.     else
  1658.       getcaller();
  1659.     if (modem_mode==mode_fax) {
  1660.       /* nothing here yet */
  1661.       goto hanging_up;
  1662.     }
  1663.     if (using_modem>-1) {
  1664.       if (!using_modem)
  1665.         holdphone(1);
  1666.       getuser();
  1667.     } else {
  1668.       holdphone(1);
  1669.       using_modem=0;
  1670.       checkit=0;
  1671.       okmacro=1;
  1672.       usernum=1;
  1673.       reset_act_sl();
  1674.       changedsl();
  1675.     }
  1676.     if (!hangup) {
  1677.       logon();
  1678. main_menu_label:
  1679.       set_net_num(0);
  1680.       while (!hangup) {
  1681.         if (curdloads)
  1682.           dlmainmenu();
  1683.         else
  1684.           mainmenu();
  1685.       }
  1686.       logoff();
  1687.     }
  1688.  
  1689. hanging_up:
  1690.     if ((!no_hangup) && (using_modem) && ok_modem_stuff) {
  1691.       dtr(0);
  1692.       if (cdet()) {
  1693.         wait1(9);
  1694.         if (cdet()) {
  1695.           wait1(9);
  1696.           if (cdet()) {
  1697.             i=0;
  1698.             dtr(1);
  1699.             while ((i++<2) && (cdet())) {
  1700.               wait1(27);
  1701.               pr1("\x1\x1\x1");
  1702.               wait1(54);
  1703.               if (modem_i->hang[0])
  1704.                 pr1(modem_i->hang);
  1705.               else
  1706.                 pr1("ATH\r");
  1707.               wait1(6);
  1708.             }
  1709.           }
  1710.         }
  1711.       }
  1712.     }
  1713.     frequent_init();
  1714. wfc_label:
  1715.     cleanup_net();
  1716.     if (!using_modem)
  1717.       holdphone(0);
  1718.     if ((!no_hangup) && ok_modem_stuff)
  1719.       dtr(0);
  1720.     already_on=0;
  1721.     if (sysop_alert && (!kbhitb())) {
  1722.       dtr(1);
  1723.       wait1(2);
  1724.       holdphone(1);
  1725.       dt=timer();
  1726.       clrscrb();
  1727.       nl();
  1728.       pl(get_string(47));
  1729.       nl();
  1730.       while ((!kbhitb()) && (fabs(timer()-dt)<60.0)) {
  1731.         setbeep(1);
  1732.         wait1(9);
  1733.         setbeep(0);
  1734.         wait1(18);
  1735.       }
  1736.       clrscrb();
  1737.       holdphone(0);
  1738.     }
  1739.     sysop_alert=0;
  1740.   } while ((!endday) && (!ooneuser));
  1741.  
  1742.   outs("\f");
  1743.   end_bbs(oklevel);
  1744. }
  1745.  
  1746.