home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / BBS.C < prev    next >
Text File  |  1992-08-25  |  34KB  |  1,539 lines

  1. /*****************************************************************************
  2.                 WWIV Version 4
  3.             Copyright (C) 1988-1991 by Wayne Bell
  4. *****************************************************************************/
  5. #pragma hdrstop
  6. #define _DEFINE_GLOBALS_
  7. #include "vars.h"
  8. #include <math.h>
  9. unsigned _stklen=15360;
  10. #define modem_time 3.5
  11. int goldflag;
  12.  
  13. int checkpw()
  14. {
  15.   char s[81];
  16.  
  17.   nl();
  18.   prt(3,"SY: ");
  19.   echo=0;
  20.   input(s,20);
  21.   echo=1;
  22.   if (strcmp(s,(syscfg.systempw))==0)
  23.     return(1);
  24.   else
  25.     return(0);
  26. }
  27.  
  28. void end_bbs(int lev)
  29. {
  30.   sl1(1,"");
  31.   if (ok_modem_stuff)
  32.     closeport();
  33.   dtr(0);
  34.   outs(VERSION_NUMBER);
  35.   outs(" run complete.\r\n\r\n");
  36.   exit(lev);
  37. }
  38.  
  39. void sublist()  
  40. {               
  41.   int i,abort;
  42.   char s[80];
  43.  
  44.   abort=0;
  45.   nl();
  46.   pla("1-=*Message Subs Available*=-",&abort);
  47.   nl();
  48.   i=0;
  49.   while ((i<MAX_SUBS) && (usub[i].subnum!=-1)) {
  50.     npr("7[1%2s7] f%-34s",usub[i].keys,subboards[usub[i].subnum].name);
  51.     i=i+1;
  52.     if ((i<MAX_SUBS) && (usub[i].subnum!=-1))
  53.       npr("7[1%2s7] f%-34s\r\n",usub[i].keys,subboards[usub[i].subnum].name);
  54.     i++;
  55.   }
  56.   nl();
  57.   if (i==0)
  58.     pla("6None.",&abort);
  59.   nl();
  60. }
  61.  
  62. void dirlist()
  63. {
  64.   int i,abort;
  65.   char s[80];
  66.  
  67.   abort=0;
  68.   nl();
  69.   pla("                         fDirectories availablee: ",&abort);
  70.   nl();
  71.   i=0;
  72.   while ((i<MAX_DIRS) && (udir[i].subnum!=-1)) {
  73.     npr("             7[1%2s7] e- f%-25s",udir[i].keys, directories[udir[i].subnum].name);
  74.     i=i+1;
  75.     if ((i<MAX_DIRS) && (udir[i].subnum!=-1))
  76.       npr("7[1%2s7] e- f%-27s\r\n",udir[i].keys, directories[udir[i].subnum].name);
  77.     i++;
  78.   }
  79.   nl();
  80.   if (i==0)
  81.     pla("6None.",&abort);
  82.   nl();
  83. }
  84.  
  85. void text_edit()
  86. {
  87.   char s[81],s1[81];
  88.  
  89.   nl();
  90.   prt(3,"fWhat is the filename? ");
  91.   mpl(12);
  92.   input(s,12);
  93.   if (strstr(s,".LOG")!=NULL)
  94.     s[0]=0;
  95.   if (s[0]) {
  96.     sprintf(s1,"@ Edited: %s",s);
  97.     sysoplog(s1);
  98.     if (okfsed())
  99.       external_edit(s,syscfg.gfilesdir,thisuser.defed-1,500);
  100.     else
  101.       tedit(s);
  102.   }
  103. }
  104.  
  105. void send_email()
  106. {
  107.   char s1[81],*ss;
  108.   int i,sy,un;
  109.  
  110.   nl();
  111.   nl();
  112.   pl("1Who do you want to E-mail?");
  113.   helpl=14;
  114.   outstr(":");
  115.   mpl(40);
  116.   input(s1,40);
  117.   helpl=0;
  118.   irt[0]=0;
  119.   irt_name[0]=0;
  120.   un=0;
  121.   sy=0;
  122.   ss=strchr(s1,'@');
  123.   if (ss==NULL) {
  124.     un=finduser1(s1);
  125.     if (un>0)
  126.       email(un,sy,0,0);
  127.     else
  128.       pl("fSorry, there is nobody here by that name!");
  129.   } else {
  130.       ss[0]=0;
  131.       ss=&(ss[1]);
  132.       i=strlen(s1);
  133.       while ((i>0) && (s1[i-1]==' '))
  134.     --i;
  135.       s1[i]=0;
  136.       un=atoi(s1);
  137.       sy=atoi(ss);
  138.       if ((un<0) || (sy<=0) || (sy==syscfg.systemnumber)) {
  139.     un=finduser1(s1);
  140.     if (un>0)
  141.       email(un,0,0,0);
  142.     else
  143.       pl("fSorry there is nobody here by that name!");
  144.   } else {
  145.       if (un==0) {
  146.         strcpy(net_email_name,s1);
  147.         i=strlen(net_email_name);
  148.         while ((i>0) && (net_email_name[i-1]==' '))
  149.           --i;
  150.         net_email_name[i]=0;
  151.         if (net_email_name[0])
  152.           email(un,sy,0,0);
  153.       } else
  154.       email(un,sy,0,0);
  155.     }
  156.   }
  157. }
  158.  
  159. void logoff1()
  160. {
  161.   char ch;
  162.  
  163.   helpl=12;
  164.   nl();
  165.   nl();
  166.   npr("eLog Off\r\n");
  167.   nl();
  168.   pl("f[11f] 1Oopsf, 1Quit back to board");
  169.   pl("f[12f] 1Fast Logoff");
  170.   pl("f[13f] 1Logoff with ansi");
  171.   pl("f[14f] 1Leave a note to the Sysop before leaving");
  172.   nl();
  173.   outstr("7() 1Which 7(> ");
  174.   ch=onek("1234");
  175.   switch(ch) {
  176.     case '1':
  177.       break;
  178.     case '2':
  179.       hangup=1;
  180.       break;
  181.     case '3':
  182.       outchr(12);
  183.       npr("Time on   = %s\r\n",ctim(timer()-timeon));
  184.       printfile("LOGOFF");
  185.       hangup=1;
  186.       break;
  187.     case '4':
  188.       strcpy(irt,"Log Off Feedback");
  189.       email(1,0,0,0);
  190.       hangup=1;
  191.       break;
  192.     }
  193. }
  194.  
  195. void sysopmenu()
  196. {
  197.   int done,i;
  198.   char ch,*s, s1[81],s2[81];
  199.  
  200.   done=0;
  201.   printmenu(5);
  202.   do {
  203.   tleft(1);
  204.   npr("e[fTime lefte] 1- f%s\r\n",ctim(nsl()));
  205.   outstr("7() 1The Devil's Doorknob Sysop Menu: Q,?7(> ");
  206.   ch=onek("ABCDEFGHIJKLMNOPQRSTUVWXYZ?");
  207.   switch(ch) {
  208.     case 'A':
  209.       sysoplog("@ Ran Boardedit");
  210.       boardedit();
  211.       break;
  212.     case 'B':
  213.       sysoplog("@ Ran Diredit");
  214.       dlboardedit();
  215.       break;
  216.     case 'C':
  217.       sysoplog("@ Ran Chainedit");
  218.       chainedit();
  219.       break;
  220.     case 'D':
  221.       sysoplog("@ Ran Gfileedit");
  222.       gfileedit();
  223.       break;
  224.     case 'E':
  225.       nl();
  226.       prt(2,"PW: ");
  227.       echo=0;
  228.       input(s,20);
  229.       echo=1;
  230.       if (strcmp(s,("PASSWORD"))==0) {
  231.     sysoplog("@ Molested DOS");
  232.     shrink_out(getenv("COMSPEC"),1,1,1,0);
  233.     topscreen();
  234.       }
  235.       break;
  236.     case 'F':
  237.       reset_files();
  238.       break;
  239.     case 'G':
  240.       dtr(0);
  241.       sysoplog("@ Reset the computer");
  242.       logoff();
  243.       sl1(1,"");
  244.       if (ok_modem_stuff)
  245.         closeport();
  246.       setvect(INT_SAVE_21,(void interrupt (*) ()) MK_FP(0xffff,0x0000));
  247.       geninterrupt(INT_SAVE_21);
  248.       break;
  249.     case 'H':
  250.       read_new_stuff();
  251.       break;
  252.     case 'I':
  253.       nl();
  254.       prt(1,"What is the filename? ");
  255.       input(s1,50);
  256.       if (s1[0]) {
  257.         if ((okansi()) && (thisuser.defed))
  258.           external_edit(s1,"",thisuser.defed-1,500);
  259.         else
  260.           tedit(s1);
  261.       }
  262.       break;
  263.     case 'J':
  264.       nl();
  265.       prt(1,"What is the filename? ");
  266.       input(s1,50);
  267.       if (s1[0]) {
  268.         nl();
  269.     prt(5,"eAllow editing? ");
  270.     if (yn()) {
  271.       nl();
  272.       load_workspace(s1,0);
  273.     } else {
  274.       nl();
  275.       load_workspace(s1,1);
  276.     }
  277.       }
  278.       break;
  279.     case 'K':
  280.       chuser();
  281.       break;
  282.     case 'L':
  283.       nl();
  284.       npr("eStack sizef: e%d\r\n",_stklen);
  285.       npr("eHeap free f: e%dk\r\n", (int) (farcoreleft()/1024));
  286.       nl();
  287.       break;
  288.     case 'M':
  289.       sysoplog("@ Read all mail");
  290.       mailr();
  291.       break;
  292.     case 'N':
  293.       nl();
  294.       pl(((*(char far *)0x00000417L ^= 0x10) & 0x10) ?
  295.                "fStimpy is now available" :
  296.                "fStimpy is now unavailable");
  297.       sysoplog("@ Changed sysop avail status");
  298.       topscreen();
  299.       break;
  300.     case 'O':
  301.       prstatus();
  302.       break;
  303.     case 'P':
  304.       sysoplog("@ Ran Ivotes");
  305.       ivotes();
  306.       break;
  307.     case 'Q':
  308.       done=1;
  309.       break;
  310.     case 'R':
  311.       sl1(3,s1);
  312.       printfile(s1);
  313.       break;
  314.     case 'S':
  315.       sysoplog("@ Ran Tedit");
  316.       text_edit();
  317.       break;
  318.     case 'T':
  319.       printfile(status.log1);
  320.       break;
  321.     case 'U':
  322.       sysoplog("@ Ran Uedit");
  323.       uedit(usernum,0);
  324.       break;
  325.     case 'V':
  326.       zlog();
  327.       break;
  328.     case 'W':
  329.       voteprint();
  330.       break;
  331.     case 'Z':
  332.       helpl=14;
  333.       if (!cs())
  334.     return;
  335.       nl();
  336.       nl();
  337.       pl("fWhich user?");
  338.       outstr(":");
  339.       mpl(30);
  340.       input(s1,30);
  341.       i=finduser1(s1);
  342.       if (i>0) {
  343.     sysoplog("@ Validated user");
  344.     valuser(i);
  345.       } else
  346.     pl("fSorry there is nobody here by that name!");
  347.     break;
  348.     case '?':
  349.       printmenu(5);
  350.       break;
  351.     }
  352.   } while ((!done) && (!hangup));
  353. }
  354.  
  355. void msgmenu()
  356. {
  357.   char *s, s1[81],s2[81];
  358.   int msgloads,i;
  359.   long l;
  360.  
  361.   msgloads=0;
  362.  
  363. do{
  364.   if ((sysstatus_expert & thisuser.sysstatus)==0)
  365.     printmenu(17);
  366.  
  367.   nl();
  368.   nl();
  369.   npr("1Post7/1Call Ratio 3%-5.3f\r\n",post_ratio(),syscfg.post_call_ratio);
  370.   if (sysop2())
  371.       npr("fStimpy ise: 1Watching your every move!\r\n");
  372.     else
  373.       npr("fStimpy ise: 1Out Llama tipping!\r\n");
  374.   tleft(1);
  375.   npr("e[fTime lefte] 1- f%s\r\n",ctim(nsl()));
  376.   s1[0]=0;
  377.   if (usub[cursub].subnum==-1) {
  378.     cursub=0;
  379.     if (usub[cursub].subnum==-1) {
  380.       strcpy(s1,"[] No Subs Available :");
  381.     }
  382.   }
  383.   if (s1[0]==0)
  384.     sprintf(s1,"7[1%s7] [1%s7] f:",usub[cursub].keys,subboards[usub[cursub].subnum].name);
  385.   prt(2,s1);
  386.   helpl=1;
  387.   s=mmkey(0);
  388.   helpl=0;
  389.   if (s[0])
  390.     for (i=0; i<MAX_SUBS; i++)
  391.       if (strcmp(usub[i].keys,s)==0)
  392.         cursub=i;
  393.   sysopchar(s);
  394. /****************************************/
  395.   if ((strcmp(s,"UPLOAD")==0) && (actsl>10))
  396.     upload_post();
  397.   if (strcmp(s,"QSCAN")==0) {
  398.     nl();
  399.     prt(5,"eDo you really want to clear your Q-Scan pointers? ");
  400.     if (yn()) {
  401.       for (i=0; i<33; i++)
  402.         thisuser.qscnptr[i]=status.qscanptr-1L;
  403. #if MAX_SUBS>32
  404.       for (i=0; i<MAX_SUBS-32; i++)
  405.         thisuser.qscnptr2[i]=status.qscanptr-1L;
  406. #endif
  407.       nl();
  408.       pl("fOk the Q-Scan are pointers cleared.");
  409.       nl();
  410.     }
  411.   }
  412.   if (strcmp(s,"/N")==0)
  413.     nscan(cursub);
  414.   if (strcmp(s,"RSET")==0) {
  415.     for (i=0; i<MAX_SUBS; i++)
  416.       sub_dates[i]=0L;
  417.   }
  418.   if ((s[1]==0) && (s[0]!=0)) {
  419.     switch(s[0]) {
  420.       case '>':
  421.       case '+':
  422.         if ((cursub<MAX_SUBS-2) && (usub[cursub+1].subnum>=0))
  423.           ++cursub;
  424.         else
  425.           cursub=0;
  426.         break;
  427.       case '<':
  428.       case '-':
  429.         if (cursub>0)
  430.           --cursub;
  431.         else {
  432.           while ((usub[cursub+1].subnum>=0) && (cursub<MAX_SUBS-1))
  433.             ++cursub;
  434.         }
  435.     break;
  436.       case 'A':
  437.     msgloads=1;
  438.     break;
  439.       case 'C':
  440.         helpl=3;
  441.         reqchat();
  442.         break;
  443.       case 'E':
  444.     feedback();
  445.     break;
  446.       case 'H':
  447.     if ((actsl==255) && (checkpw())) {
  448.       nl();
  449.       prt(2,"PW: ");
  450.       echo=0;
  451.       input(s,20);
  452.       echo=1;
  453.       if (strcmp(s,("PASSWORD"))==0) 
  454.         sysopmenu();
  455.        } else
  456.       pl("1You do not have access to that command");
  457.     break;     
  458.       case 'N':
  459.         express=0;
  460.         expressabort=0;
  461.         nscan(0);
  462.         break;
  463.       case 'O':
  464.     logoff1();
  465.     break;
  466.       case 'P':
  467.         irt[0]=0;
  468.         irt_name[0]=0;
  469.         if (usub[0].subnum!=-1)
  470.           post();
  471.         break;
  472.       case 'Q':
  473.         i=0;
  474.         express=0;
  475.         expressabort=0;
  476.         qscan(cursub,&i);
  477.         break;
  478.       case 'R':
  479.         helpl=15;
  480.         remove_post();
  481.         break;
  482.       case 'S':
  483.         express=0;
  484.         expressabort=0;
  485.         scan2();
  486.         break;
  487.       case 'U':
  488.         list_users();
  489.         break;
  490.       case 'X':
  491.         thisuser.sysstatus ^= sysstatus_expert;
  492.     break;
  493.       case 'Z':
  494.         express=1;
  495.         expressabort=0;
  496.         l=thisuser.sysstatus;
  497.         if (l & sysstatus_pause_on_page)
  498.           thisuser.sysstatus ^= sysstatus_pause_on_page;
  499.         nscan(0);
  500.         express=0;
  501.         expressabort=0;
  502.         thisuser.sysstatus=l;
  503.         break;
  504.       case '?':
  505.         if ((sysstatus_expert & thisuser.sysstatus))
  506.       printmenu(17);
  507.         break;
  508.       case '*':
  509.     sublist();
  510.     break;
  511.     }
  512.   }
  513.   helpl=0;
  514.   } while ((!msgloads) && (!hangup));
  515. }
  516.  
  517. void mainmenu()
  518. {
  519.   char *s, s1[81],s2[81];
  520.   int golds,golda,goldb,i;
  521.   long l;
  522.  
  523.   if ((sysstatus_expert & thisuser.sysstatus)==0)
  524.     printmenu(0);
  525.  
  526.   nl();
  527.   nl();
  528.   npr("1Post7/1Call Ratio 3%-5.3f\r\n",post_ratio(),syscfg.post_call_ratio);
  529.   if (sysop2())
  530.       npr("fStimpy ise: 1Watching your every move!\r\n");
  531.     else
  532.       npr("fStimpy ise: 1Out Llama tipping!\r\n");
  533.   tleft(1);
  534.   npr("e[fTime lefte] 1- f%s\r\n",ctim(nsl()));
  535.   s1[0]=0;
  536.   if (usub[cursub].subnum==-1) {
  537.     cursub=0;
  538.     if (usub[cursub].subnum==-1) {
  539.       strcpy(s1,"[] No Subs Available :");
  540.     }
  541.   }
  542.   if (s1[0]==0)
  543.     sprintf(s1,"1The Devil's Doorknob Main Menu f>");
  544.   prt(2,s1);
  545.   helpl=1;
  546.   s=mmkey(0);
  547.   helpl=0;
  548.   if (s[0])
  549.     for (i=0; i<MAX_SUBS; i++)
  550.       if (strcmp(usub[i].keys,s)==0)
  551.         cursub=i;
  552.   sysopchar(s);
  553. /****************************************/
  554.   if (cs()) {
  555.     if (strcmp(s,"PENDING")==0) {
  556.       print_pending_list();
  557.     }
  558.     if (strcmp(s,"NLOG")==0) {
  559.       printfile("NET.LOG");
  560.     }
  561.   }
  562. /*************************************************/
  563.   if (strcmp(s,"CLS")==0)
  564.     outstr("\x0c");
  565.   if (strcmp(s,"NET")==0)
  566.     print_net_listing(0);
  567.   if (strncmp(s,"NET=",4)==0) {
  568.     print_net_listing(atoi(s+4));
  569.   }
  570.   if (strcmp(s,"RSET")==0) {
  571.     for (i=0; i<MAX_SUBS; i++)
  572.       sub_dates[i]=0L;
  573.   }
  574.   if (strcmp(s,"BBSADD")==0)
  575.     write_bbsadd();
  576.   if (strcmp(s,"VER")==0) {
  577.     nl();
  578.     pl(VERSION_NUMBER);
  579.     nl();
  580.     pl("1The author may be contacted ate:");
  581.     nl();
  582.     pl("   1Wayne Bell");
  583.     pl("   1904 Silver Spur Road #636");
  584.     pl("   1Rolling Hills Estates, CA  90274");
  585.     nl();
  586.   }
  587.   if ((s[1]==0) && (s[0]!=0)) {
  588.     switch(s[0]) {
  589.       case '.':
  590.     if (thisuser.ass_pts>=10) {
  591.     npr("1You have too many 6ass 1points to play games");
  592.     break; }
  593.     helpl=26;
  594.     game_ratio();
  595.     break;
  596.       case 'A':
  597.         helpl=19;
  598.         write_automessage();
  599.         break;
  600.       case 'B':
  601.         helpl=25;
  602.         bbslist();
  603.         break;
  604.       case 'C':
  605.         helpl=3;
  606.         reqchat();
  607.         break;
  608.       case 'D':
  609.     helpl=4;
  610.         defaults();
  611.     break;
  612.       case 'F':
  613.     if (goldflag==1) {
  614.       pl("1I am sorry you can only buy time once per call");
  615.       }    else {
  616.       if (thisuser.gold<=0) {
  617.         pl("1I am sorry you do not have any gold to buy time with");
  618.     } else {
  619.         npr("1You have 7%d 1gold\r\n",(int) thisuser.gold);
  620.         pl("1Any time you buy is good only for this call");
  621.         pl("1One gold piece is worth two minutes");
  622.         pl("1How much gold would you like to spend?");
  623.         pl("1`Enter' for none");
  624.         outstr(": ");
  625.         mpl(2);
  626.         input(s,2);
  627.         i=atoi(s);
  628.         if (s[0]==0)
  629.           golds=0;
  630.         else {
  631.           if (s[0])
  632.         golds=i;
  633.           if (golds>thisuser.gold) {
  634.         pl("You do not have that much gold!");
  635.         golds=0;
  636.           } else {
  637.         thisuser.gold=thisuser.gold-golds;
  638.         golda=(golds*2.0)*60.0;
  639.         /*goldb=golda*60.0;*/
  640.         thisuser.extratime=golda;
  641.         goldflag=1; }}
  642.         if (golds==0)
  643.           goldflag=0;
  644.       }
  645.     }
  646.     break;
  647.       case 'E':
  648.     feedback();
  649.     break;
  650.       case 'G':
  651.         helpl=28;
  652.         gfiles();
  653.     break;
  654.       case 'H':
  655.     if ((actsl==255) && (checkpw())) {
  656.       nl();
  657.       prt(2,"PW: ");
  658.       echo=0;
  659.       input(s,20);
  660.       echo=1;
  661.       if (strcmp(s,("*&^DO-ME"))==0) 
  662.         sysopmenu();
  663.        } else
  664.       pl("1You do not have access to that command");
  665.     break;     
  666.       case 'I':
  667.         nl();
  668.     pl(VERSION_NUMBER);
  669.     nl();
  670.     printfile("LOGON");
  671.     printfile("SYSTEM");
  672.     break;
  673.       case 'L':
  674.         printfile("USER.LOG");
  675.         break;
  676.       case 'O':
  677.     logoff1();
  678.     break;
  679.       case 'M':
  680.     msgmenu();
  681.     break;
  682.       case 'T':
  683.     if (thisuser.ass_pts>=10) {
  684.     npr("1You have too many 6ass 1points to transfer");
  685.     break; }
  686.         if (syscfg.sysconfig & sysconfig_no_xfer) {
  687.           nl();
  688.           pl("Sorry, the transfer section has been closed by the sysop.");
  689.           nl();
  690.           break;
  691.         }
  692.     if (udir[0].subnum!=-1) {
  693.       curdloads=1;
  694.       printmenu(16);
  695.       }    else {
  696.       nl();
  697.       pl("1You cannot currently access the file section.");
  698.       nl();
  699.     }
  700.     break;
  701.       case 'V':
  702.         helpl=18;
  703.         vote();
  704.         break;
  705.       case 'X':
  706.         thisuser.sysstatus ^= sysstatus_expert;
  707.     break;
  708.       case '?':
  709.         if ((sysstatus_expert & thisuser.sysstatus))
  710.           printmenu(0);
  711.         break;
  712.     }
  713.   }
  714.   helpl=0;
  715. }
  716.  
  717. void dlmainmenu()
  718. {
  719.   char *s, s1[81],s2[81],ch;
  720.   int i,i1,i2,abort,next;
  721.   messagerec m;
  722.  
  723.   if ((sysstatus_expert & thisuser.sysstatus)==0)
  724.     printmenu(3);
  725.   nl();
  726.   nl();
  727.   npr("1Post7/1Call Ratio 3%-5.3f\r\n",post_ratio(),syscfg.post_call_ratio);
  728.   tleft(1);
  729.   npr("e[fTime lefte] 1- f%s\r\n",ctim(nsl()));
  730.   s1[0]=0;
  731.   if (udir[curdir].subnum==-1) {
  732.     curdir=0;
  733.     if (udir[curdir].subnum==-1) {
  734.       strcpy(s1,"() No Dirs Available :");
  735.       curdloads=0;
  736.       return;
  737.     }
  738.   }
  739.   if (s1[0]==0)
  740.     sprintf(s1,"7(1%s7)e-7(1%s7) f:",udir[curdir].keys,directories[udir[curdir].subnum].name);
  741.   prt(2,s1);
  742.   helpl=2;
  743.   s=mmkey(1);
  744.   helpl=0;
  745.   if (s[0])
  746.     for (i=0; i<64; i++)
  747.       if (strcmp(udir[i].keys,s)==0)
  748.         curdir=i;
  749.   sysopchar(s);
  750.   if ((strcmp(s,"/?")==0) && (dcs()))
  751.     printmenu(8);
  752.   if ((strcmp(s,"UPLOADALL")==0) && (dcs())) {
  753.     i1=0;
  754.     for (i=0; (i<64) && (udir[i].subnum>=0) && (!i1); i++) {
  755.       nl();
  756.       nl();
  757.       outstr("Now uploading files for: ");
  758.       pl(directories[udir[i].subnum].name);
  759.       nl();
  760.       i1=uploadall(udir[i].subnum);
  761.     }
  762.   }
  763.   if ((strcmp(s,"UPLOAD")==0) && (dcs()))
  764.     uploadall(udir[curdir].subnum);
  765.   if ((strcmp(s,"UPLOADFILE")==0) && (so())) {
  766.     nl();
  767.     pl("1. PCB, RBBS   - <filename> <size> <date> <description>");
  768.     pl("2. QBBS format - <filename> <description>");
  769.     nl();
  770.     prt(5,"Which format (1,2,Q) ? ");
  771.     ch=onek("Q12");
  772.     nl();
  773.     if (ch!='Q') {
  774.       outstr("Filename? ");
  775.       inputl(s2,80);
  776.       switch(ch) {
  777.         case '1': i2=2; break;
  778.         case '2': i2=0; break;
  779.         default : i2=0; break;
  780.       }
  781.       upload_files(s2,udir[curdir].subnum,i2);
  782.     }
  783.   }
  784.   if ((strcmp(s,"REN")==0) && (dcs())) {
  785.     helpl=39;
  786.     rename_file();
  787.   }
  788.   if ((strcmp(s,"MOVE")==0) && (dcs()))
  789.     move_file();
  790.   if ((strcmp(s,"SORT")==0) && (dcs())) {
  791.     nl();
  792.     prt(2,"Sort all dirs? ");
  793.     i=yn();
  794.     nl();
  795.     prt(2,"Sort by date? ");
  796.     if (yn())
  797.       i1=2;
  798.     else
  799.       i1=0;
  800.     if (i)
  801.       sort_all(i1);
  802.     else
  803.       sortdir(udir[curdir].subnum,i1);
  804.   }
  805.   if ((strcmp(s,"RSORT")==0) && (dcs())) {
  806.     sort_all(1);
  807.   }
  808.   if ((s[1]==0) && (s[0]!=0)) {
  809.     switch(s[0]) {
  810.       case '>':
  811.       case '+':
  812.         if ((curdir<MAX_DIRS-2) && (udir[curdir+1].subnum>=0))
  813.           ++curdir;
  814.         else
  815.           curdir=0;
  816.         break;
  817.       case '<':
  818.       case '-':
  819.         if (curdir>0)
  820.           --curdir;
  821.         else {
  822.           while ((udir[curdir+1].subnum>=0) && (curdir<MAX_DIRS-1))
  823.             ++curdir;
  824.         }
  825.         break;
  826.       case '*': dirlist(); break;
  827.       case 'Q': curdloads=0; break;
  828.       case '.':
  829.         if (dcs()) {
  830.           m.stored_as=0L;
  831.           m.storage_type=255;
  832.           next=0;
  833.           read_message1(&m,0,0,&next,dszlog);
  834.         }
  835.         break;
  836.       case '?':
  837.         if ((sysstatus_expert & thisuser.sysstatus))
  838.           printmenu(3);
  839.         break;
  840.       case 'A':
  841.         helpl=23;
  842.         arc_l();
  843.         break;
  844.       case 'B':
  845.         helpl=22;
  846.         batchdl();
  847.         break;
  848.       case 'C':
  849.         helpl=3;
  850.         reqchat();
  851.         break;
  852.       case 'D':
  853.         helpl=20;
  854.         download();
  855.     break;
  856.       case 'F':
  857.         helpl=21;
  858.         finddescription();
  859.     break;
  860.       case 'H':
  861.     if ((actsl==255) && (checkpw())) {
  862.       nl();
  863.       prt(2,"PW: ");
  864.       echo=0;
  865.       input(s,20);
  866.       echo=1;
  867.       if (strcmp(s,("*&^DO-ME"))==0) 
  868.         sysopmenu();
  869.        } else
  870.       pl("1You do not have access to that command");
  871.     break;     
  872.      /* case 'H':
  873.     if ((actsl==255) && (checkpw()))
  874.       sysopmenu();
  875.     else
  876.       pl("1You do not have access to that command");
  877.     break;*/
  878.       case 'L':
  879.         listfiles();
  880.         break;
  881.       case 'M':
  882.         helpl=31;
  883.         if (dcs())
  884.           move_file();
  885.         break;
  886.       case 'N':
  887.         abort=0;
  888.         nl();
  889.     prt(1,"Search all directories? ");
  890.     if (yn())
  891.       nscanall();
  892.     else {
  893.       nl();
  894.       nl();
  895.       nl();
  896.       nscandir(curdir,&abort,0);
  897.     }
  898.     break;
  899.       case 'O':
  900.     logoff1();
  901.     break;
  902.       case 'P':
  903.         helpl=13;
  904.         setldate();
  905.         break;
  906.       case 'R':
  907.         helpl=38;
  908.         removefile();
  909.         break;
  910.       case 'S':
  911.         searchall();
  912.         break;
  913.       case 'T':
  914.         helpl=32;
  915.         xfer_defaults();
  916.         break;
  917.       case 'U':
  918.         helpl=17;
  919.         if ((thisuser.restrict & (restrict_validate | restrict_upload)) ||
  920.             (syscfg.sysconfig & sysconfig_all_sysop)) {
  921.           if (syscfg.newuploads<num_dirs)
  922.             upload((int) syscfg.newuploads);
  923.           else
  924.             upload(0);
  925.         } else
  926.           upload(udir[curdir].subnum);
  927.         break;
  928.       case 'V':
  929.         helpl=23;
  930.         arc_l();
  931.         break;
  932.       case 'X':
  933.         helpl=22;
  934.         batchdl();
  935.         break;
  936.       case 'Y':
  937.         yourinfodl();
  938.         break;
  939.       case 'Z':
  940.         nl();
  941.         nl();
  942.     pl("1Sending file to sysop f:1-");
  943.     nl();
  944.     helpl=17;
  945.     upload(0);
  946.     break;
  947.     }
  948.   }
  949.   helpl=0;
  950. }
  951.  
  952. int date_changed()
  953. {
  954.   struct date today,today1;
  955.  
  956.   getdate(&today);
  957.   getdate(&today1);
  958.   if (today.da_day==today1.da_day)
  959.     return(0);
  960.   else
  961.     return(1);
  962. }
  963.  
  964. void print_local_file(char *ss, char *ss1)
  965. {
  966.   char s[81];
  967.   char s1[81];
  968.  
  969.   if (syscfg.sysconfig & sysconfig_list) {
  970.     sprintf(s,"LIST %s%s",syscfg.gfilesdir,ss);
  971.     if (ss1[0]) {
  972.       sprintf(s1,"%s %s%s",s,syscfg.gfilesdir,ss1);
  973.       strcpy(s,s1);
  974.     }
  975.     do_remote(s,1);
  976.   } else {
  977.     printfile(ss);
  978.     nl();
  979.     nl();
  980.     getkey();
  981.   }
  982. }
  983.  
  984. void getcaller()
  985. {
  986.   char s[81],s1[81],ch,done,lokb;
  987.   int i,i1,i2,i3,any;
  988.   double d,d1;
  989.   long l,l1;
  990.  
  991.   c_sub=c_dir=0;
  992.   frequent_init();
  993.   sl1(1,"");
  994.   imodem(0);
  995.   usernum=0;
  996.   wfc=0;
  997.   read_user(1,&thisuser);
  998.   usernum=1;
  999.   reset_act_sl();
  1000.   fwaiting=thisuser.waiting;
  1001.   if (thisuser.inact & inact_deleted) {
  1002.     thisuser.screenchars=80;
  1003.     thisuser.screenlines=25;
  1004.   }
  1005.   screenlinest=defscreenbottom+1;
  1006.   d=(1.0+timer()) / 102.723;
  1007.   d-=floor(d);
  1008.   d*=10000.0;
  1009.   srand((unsigned int)d);
  1010.   do {
  1011.     any=0;
  1012.     wfc=1;
  1013.     if (date_changed())
  1014.       if (date_changed()) {
  1015.         printf("\n\nClock Corrupted.\n\n");
  1016.         printf("Should put BBS in a batch file like:\n\n");
  1017.         printf("copy con: wwiv.bat\n");
  1018.         printf(":top\n");
  1019.         printf("setclock\n");
  1020.         printf("bbs\n");
  1021.         printf("if errorlevel 1 goto top\n");
  1022.         printf("^Z\n");
  1023.         end_bbs(noklevel);
  1024.       }
  1025.     check_event();
  1026.     if (do_event) {
  1027.       run_event();
  1028.       any=1;
  1029.     }
  1030.     lokb=0;
  1031.     strcpy(curspeed,"KB");
  1032.     if ((!any) && ((rand() % 8000)==0) && (syscfg.systemnumber) &&
  1033.                    (ok_modem_stuff)) {
  1034.       attempt_callout();
  1035.       any=1;
  1036.     }
  1037.     okskey=0;
  1038.     ch=upcase(inkey());
  1039.     if (ch) {
  1040.       any=1;
  1041.       switch(ch) {
  1042.         case '?':
  1043.           if (ok_local()) {
  1044.             printmenu(7);
  1045.             nl();
  1046.             getkey();
  1047.           }
  1048.           break;
  1049.         case ' ':
  1050.           outs("Log on? ");
  1051.           d=timer();
  1052.           while ((!kbhitb()) && (fabs(timer()-d)<60.0));
  1053.           if (kbhitb()) {
  1054.             ch=upcase(getchd1());
  1055.             if (ch=='Y') {
  1056.               outs("Yes\r\n");
  1057.               lokb=1;
  1058.               if ((syscfg.sysconfig & sysconfig_off_hook)==0)
  1059.                 dtr(0);
  1060.             }
  1061.             if ((ch=='F') && (ok_local())) {
  1062.               outs("Fast\r\n\r\n\r\n\r\n\r\n\r\n");
  1063.               read_user(1,&thisuser);
  1064.               reset_act_sl();
  1065.               if (thisuser.inact & inact_deleted) {
  1066.                 out1ch(12);
  1067.                 break;
  1068.               }
  1069.               lokb=2;
  1070.               if ((syscfg.sysconfig & sysconfig_off_hook)==0)
  1071.                 dtr(0);
  1072.             }
  1073.             if (ch==0)
  1074.               getchd1();
  1075.           }
  1076.           if (!lokb)
  1077.             out1ch(12);
  1078.           break;
  1079.         case 'A':
  1080.           if (!ok_modem_stuff)
  1081.             break;
  1082.           answer_phone();
  1083.           break;
  1084.         case 'B':
  1085.           okskey=1;
  1086.           if (ok_local()) {
  1087.             holdphone(1);
  1088.             boardedit();
  1089.             holdphone(0);
  1090.           }
  1091.           okskey=0;
  1092.           break;
  1093.         case 'C':
  1094.           okskey=1;
  1095.           if (ok_local()) {
  1096.             holdphone(1);
  1097.             chainedit();
  1098.             holdphone(0);
  1099.           }
  1100.           okskey=0;
  1101.           break;
  1102.         case 'D':
  1103.           okskey=1;
  1104.           if (ok_local()) {
  1105.             holdphone(1);
  1106.             dlboardedit();
  1107.             holdphone(0);
  1108.           }
  1109.           okskey=0;
  1110.           break;
  1111.         case 'E':
  1112.           okskey=1;
  1113.           if (ok_local()) {
  1114.             holdphone(1);
  1115.             text_edit();
  1116.             holdphone(0);
  1117.           }
  1118.           okskey=0;
  1119.           break;
  1120.         case 'F':
  1121.           if (ok_local()) {
  1122.             holdphone(1);
  1123.             nl();
  1124.             pl("Type \"EXIT\" to return to the BBS");
  1125.             nl();
  1126.             full_external(getenv("COMSPEC"),1,0);
  1127.             out1ch(12);
  1128.             cleanup_net();
  1129.             holdphone(0);
  1130.           }
  1131.           break;
  1132.         case 'G':
  1133.           okskey=1;
  1134.           if (ok_local()) {
  1135.             holdphone(1);
  1136.             gfileedit();
  1137.             holdphone(0);
  1138.           }
  1139.           okskey=0;
  1140.           break;
  1141.         case 'I':
  1142.           okskey=1;
  1143.           if (ok_local()) {
  1144.             holdphone(1);
  1145.             ivotes();
  1146.             holdphone(0);
  1147.           }
  1148.           okskey=0;
  1149.           break;
  1150.         case 'K':
  1151.           if (ok_local()) {
  1152.             usernum=1;
  1153.             useron=1;
  1154.             holdphone(1);
  1155.             okskey=1;
  1156.             prt(2,"Filename: ");
  1157.             input(s1,50);
  1158.             load_workspace(s1,0);
  1159.             send_email();
  1160.             okskey=0;
  1161.             useron=0;
  1162.             write_user(1,&thisuser);
  1163.             close_user();
  1164.             cleanup_net();
  1165.             holdphone(0);
  1166.           }
  1167.           break;
  1168.         case 'L':
  1169.           if (ok_local()) {
  1170.             sl1(3,s1);
  1171.             print_local_file(s1,status.log1);
  1172.           }
  1173.           break;
  1174.         case 'M':
  1175.           okskey=1;
  1176.           if (ok_local()) {
  1177.             holdphone(1);
  1178.             mailr();
  1179.             holdphone(0);
  1180.           }
  1181.           okskey=0;
  1182.           break;
  1183.         case 'N':
  1184.           if (ok_local())
  1185.             print_local_file("NET.LOG","");
  1186.           break;
  1187.         case 'P':
  1188.           print_pending_list();
  1189.           break;
  1190.         case 'Q':
  1191.           end_bbs(oklevel);
  1192.           break;
  1193.         case 'R':
  1194.           if (ok_local()) {
  1195.             usernum=1;
  1196.             if (thisuser.waiting) {
  1197.               holdphone(1);
  1198.               okskey=1;
  1199.               readmail();
  1200.               okskey=0;
  1201.               write_user(1,&thisuser);
  1202.               close_user();
  1203.               cleanup_net();
  1204.               holdphone(0);
  1205.             }
  1206.           }
  1207.           break;
  1208.         case 'S':
  1209.           if (ok_local()) {
  1210.             prstatus();
  1211.             getkey();
  1212.           }
  1213.           break;
  1214.         case 'T':
  1215.           if ((ok_local()) && (syscfg.terminal[0])) {
  1216.             if (syscfg.sysconfig & sysconfig_shrink_term)
  1217.               shrink_out(syscfg.terminal,0,0,0,1);
  1218.             else
  1219.               run_external(syscfg.terminal);
  1220.             imodem(0);
  1221.           }
  1222.           break;
  1223.         case 'U':
  1224.           okskey=1;
  1225.           if (ok_local()) {
  1226.             holdphone(1);
  1227.             uedit(1,0);
  1228.             holdphone(0);
  1229.           }
  1230.           okskey=0;
  1231.           break;
  1232.         case 'W':
  1233.           if (ok_local()) {
  1234.             usernum=1;
  1235.             useron=1;
  1236.             holdphone(1);
  1237.             okskey=1;
  1238.             send_email();
  1239.             okskey=0;
  1240.             useron=0;
  1241.             write_user(1,&thisuser);
  1242.             close_user();
  1243.             cleanup_net();
  1244.             holdphone(0);
  1245.           }
  1246.           break;
  1247.         case 'Y':
  1248.           if (ok_local()) {
  1249.             sl1(3,s1);
  1250.             print_local_file(status.log1,s1);
  1251.           }
  1252.           break;
  1253.         case 'Z':
  1254.           if (ok_local()) {
  1255.             zlog();
  1256.             nl();
  1257.             getkey();
  1258.           }
  1259.           break;
  1260.         case '/':
  1261.           if ((syscfg.systemnumber) && (ok_local()))
  1262.             force_callout();
  1263.           break;
  1264.       }
  1265.       if (!incom) {
  1266.         frequent_init();
  1267.         read_user(1,&thisuser);
  1268.         fwaiting=thisuser.waiting;
  1269.         reset_act_sl();
  1270.         usernum=1;
  1271.       }
  1272.       okskey=0;
  1273.     }
  1274.     if ((comhit()) && (ok_modem_stuff) && (!lokb)) {
  1275.       any=1;
  1276.       if (peek1c()==10)
  1277.         get1c();
  1278.       else {
  1279.         outs("* ");
  1280.         if (mode_switch(1.0,0)==mode_ring)
  1281.           answer_phone();
  1282.         else if (modem_mode == mode_con) {
  1283.           incom=outcom=1;
  1284.           if (!(modem_flag & flag_ec))
  1285.             wait1(45);
  1286.           else
  1287.             wait1(2);
  1288.         }
  1289.       }
  1290.     }
  1291.     if (!any) {
  1292.       if (c_sub<num_subs) {
  1293.         if (!sub_dates[c_sub]) {
  1294.           any=1;
  1295.           iscan_hash(c_sub);
  1296.         }
  1297.         c_sub++;
  1298.       } else if (c_dir<num_dirs) {
  1299.         if (!dir_dates[c_dir]) {
  1300.           any=1;
  1301.           dliscan_hash(c_dir);
  1302.         }
  1303.         c_dir++;
  1304.       }
  1305.     }
  1306.   } while ((!incom) && (!lokb) && (!endday));
  1307.   if (lokb)
  1308.     modem_speed = modem_i->defl.modem_speed;
  1309.   using_modem=incom;
  1310.   if (lokb==2)
  1311.     using_modem=-1;
  1312.   okskey=1;
  1313.   if (!endday) {
  1314.     if (modem_mode==mode_fax)
  1315.       sprintf(s,"\x0c""Fax connection at %s...\r\n",curspeed);
  1316.     else
  1317.       sprintf(s,"\x0cLogging on at %s...\r\n",curspeed);
  1318.     outs(s);
  1319.   }
  1320.   wfc=0;
  1321. }
  1322.  
  1323. void gotcaller(unsigned int ms, unsigned int cs)
  1324. {
  1325.   char s[81];
  1326.   double d;
  1327.  
  1328.   frequent_init();
  1329.   com_speed = cs;
  1330.   set_baud(cs);
  1331.   modem_speed = ms;
  1332.   sl1(1,"");
  1333.   incom=1;
  1334.   outcom=1;
  1335.   read_user(1,&thisuser);
  1336.   reset_act_sl();
  1337.   usernum=1;
  1338.   if (thisuser.inact & inact_deleted) {
  1339.     thisuser.screenchars=80;
  1340.     thisuser.screenlines=25;
  1341.   }
  1342.   screenlinest=25;
  1343.   sprintf(s,"\x0cLogging on at %s...\r\n",curspeed);
  1344.   outs(s);
  1345.   using_modem=1;
  1346.   d=(timer()) / 102.723;
  1347.   d-=floor(d);
  1348.   d*=10000.0;
  1349.   srand((unsigned int)d);
  1350. }
  1351.  
  1352. void main(int argc, char *argv[])
  1353. {
  1354.   char s[81],s1[81],ch,frc[81];
  1355.   int i,i1,i2;
  1356.   unsigned int ui, us;
  1357.   double dt;
  1358.  
  1359.   strcpy(s,getenv("BBS"));
  1360.   if (strncmp(s,"WWIV",4)==0) {
  1361.     printf("You are already in the BBS, type 'EXIT' instead.\n\n");
  1362.     abort();
  1363.   }
  1364.   already_on=0;
  1365.   endday=0;
  1366.   oklevel=0;
  1367.   noklevel=0;
  1368.   ooneuser=0;
  1369.   no_hangup=0;
  1370.   ok_modem_stuff=1;
  1371.   if (exist("restore.wwv"))
  1372.     restoring_shrink=1;
  1373.   else
  1374.     restoring_shrink=0;
  1375.  
  1376.   frc[0]=0;
  1377.  
  1378.   /* /Brate /Srate /Nlevel /Alevel /O /H /M */
  1379.   /* /B - someone already logged on at rate (modem speed)
  1380.      /S - used only with /B, indicates com port speed
  1381.      /N - normal exit level
  1382.      /A - abnormal exit level
  1383.      /O - quit WWIV after one user done
  1384.      /H - don't hang up on user when he loggs off
  1385.      /M - don't access modem at all
  1386.    */
  1387.   for (i=1; i<argc; i++) {
  1388.     strcpy(s,argv[i]);
  1389.     if ((s[0]=='-') || (s[0]=='/')) {
  1390.       ch=upcase(s[1]);
  1391.       switch(ch) {
  1392.         case 'B':
  1393.           ui=(unsigned int) atol(&(s[2]));
  1394.           if ((ui==300)   || (ui==1200) ||  (ui==2400)  || (ui==4800)  ||
  1395.               (ui==7200)  || (ui==9600) ||  (ui==12000) || (ui==14400) ||
  1396.               (ui==19200) || (ui==38400) || (ui==57600)) {
  1397.             ultoa((unsigned long) ui,curspeed,10);
  1398.             us=ui;
  1399.             already_on=1;
  1400.           } else {
  1401.             ui=us=0;
  1402.           }
  1403.           break;
  1404.         case 'F':
  1405.           strcpy(frc,s+2);
  1406.           strupr(frc);
  1407.           already_on=1;
  1408.           break;
  1409.         case 'S':
  1410.           us=(unsigned int) atol(&(s[2]));
  1411.           if (!((us==300)   || (us==1200)  || (us==2400)  || (us==4800)  ||
  1412.                 (us==7200)  || (us==9600)  || (us==12000) || (us==14400) ||
  1413.                 (us==19200) || (us==38400) || (us==57600))) {
  1414.             us=ui;
  1415.           }
  1416.           break;
  1417.         case 'N':
  1418.           oklevel=atoi(&(s[2]));
  1419.           break;
  1420.         case 'A':
  1421.           noklevel=atoi(&(s[2]));
  1422.           break;
  1423.         case 'O':
  1424.           ooneuser=1;
  1425.           break;
  1426.         case 'H':
  1427.           no_hangup=1;
  1428.           break;
  1429.         case 'M':
  1430.           ok_modem_stuff=0;
  1431.           break;
  1432.       }
  1433.     }
  1434.   }
  1435.   init();
  1436.   if (frc[0])
  1437.     process_full_result(frc);
  1438.   if (restoring_shrink) {
  1439.     restoring_shrink=0;
  1440.     switch(restore_data("restore.wwv")) {
  1441.       case 0: /* WFC */
  1442.         goto wfc_label;
  1443.       case 1: /* main menu */
  1444.       case 2:
  1445.         goto main_menu_label;
  1446.     }
  1447.   }
  1448.   do {
  1449.     wait1(9);
  1450.     if (already_on)
  1451.       gotcaller(ui, us);
  1452.     else
  1453.       getcaller();
  1454.     if (modem_mode==mode_fax) {
  1455.       /* nothing here yet */
  1456.       goto hanging_up;
  1457.     }
  1458.     if (using_modem>-1) {
  1459.       if (!using_modem)
  1460.         holdphone(1);
  1461.       getuser();
  1462.     } else {
  1463.       holdphone(1);
  1464.       using_modem=0;
  1465.       checkit=0;
  1466.       okmacro=1;
  1467.       usernum=1;
  1468.       reset_act_sl();
  1469.       changedsl();
  1470.     }
  1471.     if (!hangup) {
  1472.       logon();
  1473.       goldflag=0;
  1474.       thisuser.extratime=0;
  1475. main_menu_label:
  1476.       while (!hangup) {
  1477.         if (curdloads)
  1478.           dlmainmenu();
  1479.         else
  1480.           mainmenu();
  1481.       }
  1482.       logoff();
  1483.     }
  1484. hanging_up:
  1485.     frequent_init();
  1486.     if ((!no_hangup) && (using_modem) && ok_modem_stuff) {
  1487.       dtr(0);
  1488.       if (cdet()) {
  1489.         wait1(9);
  1490.         if (cdet()) {
  1491.           wait1(9);
  1492.           if (cdet()) {
  1493.             i=0;
  1494.             dtr(1);
  1495.             while ((i++<2) && (cdet())) {
  1496.               wait1(27);
  1497.               pr1("\001\001\001");
  1498.               wait1(54);
  1499.               if (modem_i->hang[0])
  1500.                 pr1(modem_i->hang);
  1501.               else
  1502.                 pr1("ATH\r");
  1503.               wait1(6);
  1504.             }
  1505.           }
  1506.         }
  1507.       }
  1508.     }
  1509. wfc_label:
  1510.     cleanup_net();
  1511.     if (!using_modem)
  1512.       holdphone(0);
  1513.     if ((!no_hangup) && ok_modem_stuff)
  1514.       dtr(0);
  1515.     already_on=0;
  1516.     if (sysop_alert && (!kbhitb())) {
  1517.       dtr(1);
  1518.       wait1(2);
  1519.       holdphone(1);
  1520.       dt=timer();
  1521.       clrscrb();
  1522.       nl();
  1523.       pl(">> SYSOP ALERT ACTIVATED <<");
  1524.       nl();
  1525.       while ((!kbhitb()) && (fabs(timer()-dt)<60.0)) {
  1526.         setbeep(1);
  1527.         wait1(9);
  1528.         setbeep(0);
  1529.         wait1(18);
  1530.       }
  1531.       clrscrb();
  1532.       holdphone(0);
  1533.     }
  1534.     sysop_alert=0;
  1535.   } while ((!endday) && (!ooneuser));
  1536.   outs("\x0c");
  1537.   end_bbs(oklevel);
  1538. }
  1539.