home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / WWIV412S.ZIP / BBS.C < prev    next >
C/C++ Source or Header  |  1990-08-05  |  32KB  |  1,464 lines

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