home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / WWIVMODS / XMOD.ZIP / MODS.CAP < prev    next >
Text File  |  1992-01-20  |  462KB  |  14,845 lines

  1. 1
  2.  
  3. [1 /99]: Variable pause string modification -
  4. [Name ]: Punisher #1 @2402
  5. [Date ]: Mon Dec 09 15:26:39 1991
  6. [From ]: Bunch 'o Bull (Manitoba, Canada)
  7.  
  8. PUNY02.MOD - Creation of a dynamic pause string
  9.  
  10. By:    Punisher 1@2402 [Bunch 'o Bull]
  11. Date:  December 9th, 1991
  12. Time:  It takes about ten minutes to install and compile.
  13. WWIV:  WWIV 4.20
  14. Files: VARDEC.H, bbsutl1.c, bbs.c
  15.  
  16. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  17.  
  18. This is a very handy modifcation. It adds a lot to a BBS to customize the text
  19. display.  As set up by Wayne Bell, WWIV uses [PAUSE] to ask for a keypress.  To
  20. me, this seemed a little boring, so I changed it to something a little more
  21. interesting.  ([cows])  I decided it would be worth it to make a modification
  22. so that I could change the pause string whenever I wanted.
  23.  
  24. Basically what it does is this - it creates another field in the dynamic system
  25. record that is saved and updated every time a user logs off.  The pause string
  26. is changed by pressing '%' at the WFC or by using the '//PAUSEEDIT' command at
  27. the main menu.  Anybody with sysop access can change the pause string.
  28.  
  29. (That's how I have it set up on _my_ system.. you can, of course, change it to
  30. whatever your system might require.)
  31.  
  32. On my system I have a modification called "BACKSPAC.412" (by Goose) installed
  33. that affects the inli function.  The reason I mention this is because my system
  34. allows color in the inli function using Ctrl-P and I'm not sure whether the
  35. standard inli allows this.  THE POINT IS THIS:  If you install this 
  36. modification
  37. only to discover that you can't use color when making your pause prompt, you
  38. can do one of two things to remedy the problem:  A) You can place some ansic
  39. statements in the void pausescr function I provide or B) you can get the mod
  40. by Goose and install it.  It's good.
  41.  
  42. One more quick thing - if you have users in 40 column mode you should be 
  43. careful
  44. not to make your pause string over 40 actual characters in length.  If you make
  45. it more than 40 you'll have a lot of unhappy Commodore users..
  46.  
  47.  
  48. Here's the modification:
  49.  
  50. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  51.  
  52. STEP 1:
  53.  
  54. Back up your source.  Do it.  I lost my whole source once because I didn't back
  55. it up.  It was a pain.  Back up your source.
  56.  
  57.  
  58. STEP 2:
  59.  
  60. Load up VARDEC.H.  Here's a listing of my code;  a line beginning with '%'
  61. already exists.. a line beginning with '+' you should add into the code.
  62.  
  63.  
  64.  
  65. %  #define QSCN(i) (thisuser.qscnptr[i])
  66. %  #endif
  67. %
  68. +  #define MAXLEN_PAUSE 60   /* Add this line for PUNY02.MOD */
  69. %
  70. %  
  71. /****************************************************************************/
  72. %
  73. %
  74. %  /* DATA FOR EVERY USER */
  75.  
  76.  
  77. Now search for "net_req_free".  Here's a listing of my code with the same key:
  78.  
  79.  
  80. %          long            last_connect,           /* date last connect.net */
  81. %                          last_bbslist;           /* date last bbslist.net */
  82. %          float           net_req_free;           /* net free factor def 3 */
  83. %          char            res[31];                /* RESERVED */
  84. +          char          pausestring[MAXLEN_PAUSE];/* Added for dynamic pause 
  85. */
  86. %
  87. %  } statusrec;
  88.  
  89.  
  90. That's all you have to do in VARDEC.H - save the file now.
  91.  
  92.  
  93. STEP 3:
  94.  
  95. Load up BBSUTL1.C.  Go to the very end of the file and block read in this
  96. function:
  97.  
  98.  
  99. void change_pausestring()
  100. /* This function added for PUNY02.MOD - the dynamic pause string. */
  101. {
  102.   char def[MAXLEN_PAUSE];
  103.  
  104.   strcpy(def,status.pausestring);
  105.   ansic(0);
  106.   npr("Current pause string - %s\r\n", status.pausestring);
  107.   npr("Enter the new pause string.. maximum %d characters:\r\n", MAXLEN_PAUSE);
  108.   npr("Remember that each time you change color it counts as two characters.");
  109.   npr("\r\n\r\n");
  110.   inli(status.pausestring, def, MAXLEN_PAUSE, 1);
  111.   nl();
  112.   npr("The new pausestring:  \r\n\r\n");
  113.   pausescr();
  114. }
  115.  
  116.  
  117.  
  118. Save BBSUTL1.C.
  119.  
  120.  
  121. STEP 4:
  122.  
  123. Load BBS.C.  Search for ""BOARDEDIT"".  Here's a listing of my code with the
  124. same key:
  125.  
  126.  
  127. %    if (so()) {
  128. %      if (strcmp(s,"BOARDEDIT")==0) {
  129. %        sysoplog("@ Ran Boardedit");
  130. %        boardedit();
  131. %      }
  132. +      if (strcmp(s,"PAUSEEDIT")==0) {  /* This code added with PUNY02.MOD */
  133. +        change_pausestring();
  134. +        sprintf(s,"@ Changed pause to [%s].", status.pausestring);
  135. +        sysoplog(s);
  136. +        strcpy(s,"PAUSEEDIT");
  137. +      }
  138. %      if (strcmp(s,"DIREDIT")==0) {
  139.  
  140.  
  141. Now search for "Log on?".  This will take you to the WFC case list.  Here's a
  142. list of my code (this case could be added anywhere in the case list):
  143.  
  144.  
  145. %            }
  146. %            break;
  147. +          case '%': /* or any other unused character */
  148. +            change_pausestring();  /* This code added with PUNY02.MOD */
  149. +            break;
  150. %          case ' ':
  151. %            outs("Log on? ");
  152. %            d=timer();
  153.  
  154.  
  155. That's it.  Save BBS.C.
  156.  
  157.  
  158. STEP 5:
  159.  
  160. Re-compile your BBS program, which has been improved 329182739%.  It will take
  161. a while to re-compile since VARDEC.H was modified; it will have to re-compile
  162. everything.  That's ok.. have a beer.
  163.  
  164.  
  165.  
  166. Standard disclaimer:   "It ain't mah fault."
  167.  
  168.  
  169. Enjoy the modification!  If you use any of my modifications, please take the
  170. time to send me some e-mail.  (If you're a WWIVnet type person, that is.)  My
  171. net address is 1 @2402.  Thanks very much.
  172.  
  173.  
  174. Puny
  175.  
  176.  
  177.  
  178. (This modification is dedicated to the new Red Hot Chili Peppers' album,
  179.  "BloodSugarSexMagik", a true masterpiece.)
  180.  
  181.  
  182.  
  183. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^1),?    
  184. << DOS Shell >>. Type 'EXIT┘' to return to Telix.
  185.  
  186.  
  187. [2 /99]: ;ƒ3;40;1m╨[πLTOM3.MOD. Works!Turn A-Msg To color/9line/80col. mode!
  188. [Name ]: Phantom Lord #46 @2109
  189. [Date ]: Mon Dec 09 21:49:36 1991
  190. [From ]: The Forbidden Void (PIN) (New Jersey)
  191.  
  192. ┌─────────────────────────────────────────────────────────────────────────┐
  193. │ Phantom3.Mod ── 12-07-91 ─── By Phantom Lord ─── WWIV v4.11 v4.12 v4.20 │
  194. │ Description: Working Enhanced AutoMsg │ Experience: Simple Block Read!  │
  195. │ Files Affected: MISCCMD.C             │ Steps: 3                        │
  196. │ ───    GoldSystem Delayed. Still Typing Out. Keep Your Eyes Open    ─── │
  197. └─────────────────────────────────────────────────────────────────────────┘
  198.  Step 1:
  199.  ──────
  200.  Backup Your Source!!!
  201.  ------------------------------------------------------------------------
  202.  Step 2:
  203.  ──────
  204.  Load MISCCMD.C and delete void read_automessage(),
  205.  void write_automessage1() and void write_automessage().
  206.  ------------------------------------------------------------------------
  207.  Step 3:
  208.  ──────
  209.  Block read the following 3 voids where read_automessage(),
  210.  write_automessage1(), and write_automessage were.
  211.  
  212. void read_automessage()
  213. {
  214.   int i,i1,i2,i3,f,len,ptrbeg[10],ptrend[10];
  215.   char s[81],l[10][81],anon,buf[512];
  216.   slrec ss;
  217.  
  218.   sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  219.   f=open(s,O_RDWR | O_BINARY);
  220.   nl();
  221.   anon=status.amsganon;
  222.   if (f<1) {
  223.     pl("No Auto-Post! Write One!");
  224.   } else {
  225.     len=read(f,(void *)buf,512);
  226.     close(f);
  227.     for (i=0; i<10; i++) {
  228.       ptrbeg[i]=0;
  229.       ptrend[i]=0;
  230.     }
  231.     i=0;
  232.     i1=0;
  233.     i2=0;
  234.     for(i=0; i<len; i++) {
  235.       if (i1) {
  236.         if (buf[i]==10) {
  237.           ptrbeg[i2]=i+1;
  238.           i1=0;
  239.         }
  240.       } else {
  241.         if (buf[i]==13) {
  242.           ptrend[i2]=i-1;
  243.           if (i2<9) {
  244.             for (i3=ptrbeg[i2]; i3<=ptrend[i2]; i3++)
  245.               l[i2][i3-ptrbeg[i2]]=buf[i3];
  246.               l[i2][ptrend[i2]-ptrbeg[i2]+1]=0;
  247.           }
  248.           ++i2;
  249.           i1=1;
  250.         }
  251.       }
  252.     }
  253.     ss=syscfg.sl[actsl];
  254.     if (anon)
  255.       if (ss.ability & ability_read_post_anony) {
  256.         sprintf(s,"%s",&(l[0][0]));
  257.       } else
  258.         strcpy(s,"NoBoDy #xxx");
  259.     else
  260.       strcpy(s,&(l[0][0]));
  261.     nl();
  262.     npr("[══── Auto Post Entered By: %s ──══]\r\n",s);
  263.     nl();
  264.     i=1;
  265.     while ((ptrend[i]) && (i<9)) {
  266.       pl(&(l[i][0]));
  267.       ++i;
  268.     }
  269.   }
  270.   nl();
  271. }
  272.  
  273. void write_automessage1()
  274. {
  275.   int i,i1,f;
  276.   char s[81],l[10][81];
  277.   slrec ss;
  278.  
  279.   nl();
  280.   pl("Write Auto-Post! 9 Lines: Ctrl-P Colors Work Here!");
  281.   s[0]=0;
  282.   nl();
  283.   for (i=0; i<9; i++) {
  284.     outchr(i+'1');
  285.     outchr('>');
  286.     inli(&(l[i][0]),s,77,1);
  287.     strcat(&(l[i][0]),"\r\n");
  288.   }
  289.   nl();
  290.   ss=syscfg.sl[actsl];
  291.   if (ss.ability & ability_post_anony) {
  292.     prt(5,"Anonymous!? [Y/N]: ");
  293.     if (yn())
  294.       i1=anony_sender;
  295.     else
  296.       i1=0;
  297.   } else
  298.     i1=0;
  299.   prt(5,"Is This Ok? [Y/N]: ");
  300.   if (yn()) {
  301.     status.amsganon=i1;
  302.     status.amsguser=usernum;
  303.     save_status();
  304.     sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  305.     f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  306.     strcpy(s,nam(&thisuser,usernum));
  307.     strcat(s,"\r\n");
  308.     write(f,(void *)s,strlen(s));
  309.     for (i=0; i<9; i++)
  310.       write(f,(void *)&(l[i][0]),strlen(&(l[i][0])));
  311.     sysoplog("-+*+- Changed Auto-Post!");
  312.     for (i=0; i<9; i++) {
  313.       strcpy(s,"   ");
  314.       l[i][strlen(&(l[i][0]))-2]=0;
  315.       strcat(s,&(l[i][0]));
  316.       sysoplog(s);
  317.     }
  318.     nl();
  319.     pl("Auto-Post Saved!");
  320.     nl();
  321.     close(f);
  322.   }
  323.  
  324. }
  325.  
  326. void write_automessage()
  327. {
  328.   char ch;
  329.   int done,okwrite;
  330.   slrec ss;
  331.  
  332.   ss=syscfg.sl[actsl];
  333.   if (ss.posts)
  334.     okwrite=1;
  335.   else
  336.     okwrite=0;
  337.   if (thisuser.restrict & restrict_automessage)
  338.     okwrite=0;
  339.   done=0;
  340.   do {
  341.     nl();
  342.     if (okwrite) {
  343.       prt(2,"Auto-Post! [Read/Write/Email/Quit]: ");
  344.       ch=onek("QRWE");
  345.     } else {
  346.       prt(2,"Auto-Post! [Read/Email/Quit]: ");
  347.       ch=onek("QRE");
  348.     }
  349.     switch(ch) {
  350.       case 'Q':
  351.         done=1;
  352.         break;
  353.       case 'R':
  354.         read_automessage();
  355.         break;
  356.       case 'W':
  357.         write_automessage1();
  358.         break;
  359.       case 'E':
  360.         if (status.amsguser)
  361.           email(status.amsguser,0,0,status.amsganon);
  362.         break;
  363.     }
  364.   } while ((!done) && (!hangup));
  365.  
  366. }
  367.  
  368.  ------------------------------------------------------------------------
  369.  What'd I Tell Ya... Easy As Hell Aint It? Sorry The GoldSystem Is So
  370.  Late, I'm Still Writing Out The 4 Files For It... I'm Trying To Keep
  371.  These In Chronological Order So That's Why This Is PHANTOM3 Instead
  372.  Of PHANTOM2... If You Need Any Help With This Or Any Other Of My Mods,
  373.  Let Me Know, Net-Mail Me.
  374.                                                   -Phantom Lord
  375.  ------------------------------------------------------------------------
  376.  
  377.  
  378.  
  379. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^2),?    
  380. << DOS Shell >>. Type 'EXIT┘' to return to Telix.
  381.  
  382.  
  383. [3 /99]: Feedback loop revisited...
  384. [Name ]: Pc Guru #1 @3450 [Phd]  [Creve Coeur, Mo]
  385. [Date ]: Wednesday, December 11, 1991   4:49 pm <CST>
  386. [From ]: B.S. Box (Missouri)
  387.  
  388. >                             Feedback Loop Mod
  389. >                                 by: Æ£ƒ
  390. >                          (idea by:  Skull Leader)
  391. >
  392. > Description:  Ever have a user abort the newuser feedback?  Well, what
  393. > this does is loops them right back into the e-mail and gives them a little
  394. > message, "You Must Leave Me Feedback".  I saw something like this before,
  395. > but it automatically deleted the user, I want to give them another chance
  396. > in case they aborted it to start over (yeah right!), but this will loop
  397. > them forever....
  398.  
  399.  
  400. Actually, your mod can be simplified to a few lines of code, instead of adding
  401. several voids.  It can actually be simplified more, but this should give you
  402. a working example of what I mean:
  403.  
  404. Legend:
  405.  
  406. /++/    Added code
  407. /**/    Existing code
  408.  
  409. /**/if (incom) {
  410. /**/    if (printfile("FEEDBACK"))
  411. /**/       sl1(0,"#Aborted FEEDBACK MSG");
  412. /**/    pausescr();
  413. /++/    do {
  414. /**/       sprintf(irt,"Validation Feedback (%d slots left)...
  415. /**/       email(1,0,1,0);
  416. /++/       if (thisuser.feedbacksent==0)
  417. /++/         {
  418. /++/             sysoplog("* * * TRIED to abort Feedback message!!! * * *");
  419. /++/             nl();
  420. /++/             nl();
  421. /++/             prt(6,"                         You Must Leave Me Feedback!");
  422. /++/             pausescr();
  423. /++/         }
  424.          } while (thisuser.feedbacksent==0);
  425. ----------------------------------------------------------------------------
  426.  
  427.                                         PC guru, 1@3450
  428.  
  429.  
  430.  
  431.  
  432. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^3),?    
  433.  
  434. [4 /99]: SMENU420.MOD   Hotkey pop-up sysop/co-sysop menu system
  435. [Name ]: Stingray #52 @5060
  436. [Date ]: Thu Dec 12 20:56:53 1991
  437. [From ]: Fuzzball Land (Unknown Area)
  438.  
  439. Name:        SMENU420.MOD
  440. Author:      Stingray
  441. Difficulty:  Easy
  442. Version:     WWIV 4.20 version.  WWIV v4.11/v4.12 version also available.
  443. Files:       VARS.H, FCNS.H, COM.C, SYSOPF.C
  444. Description: This mod provides a hot-keyed menu for the use of sysops and
  445.              co-sysops.  It is available from anywhere in the BBS and will
  446.              perform all of the needed functions (plus, it's easy to add
  447.              more if you want to, or to change this mod to do something
  448.              else!).  It will present the sysop or co-sysop with a prompt
  449.              when they press ^E, and they can select most cosysop or sysop
  450.              commands with single letters.
  451.  
  452.  
  453. Step 1:
  454. Backup all of your source files!
  455. I may have implanted a bug in this mod that will erase *.c, just to check
  456. if you did this.
  457. <grin>
  458.  
  459. Step 2:
  460. Load VARS.H
  461. First, look at the block of lines that starts with
  462. int abortext, already_on, ansiptr, arcling, async_irq, base, bchanged,
  463. At the end, right before the ';', add ",insysmenu".  The end should now
  464. look kinda like this:
  465.     use_workspace, using_modem, wfc, insysmenu;
  466.  
  467. Save VARS.H
  468.  
  469. Step 3:
  470. Load FCNS.H
  471. At the end of the declarations for SYSOPF.C, add this line:
  472. void sysmenu();
  473. Save FCNS.H
  474.  
  475. Step 4:
  476. Load COM.C
  477. Search for:
  478. if (helpl && !ihelp && !chatting && echo) {
  479. Two lines above that, right before it says "case 15:", put in this code:
  480.       case 5:
  481.         if ((cs())&&(okmacro)) {
  482.           sysmenu();
  483.         }
  484.         break;
  485. Save COM.C
  486.  
  487. Step 5:
  488. Load SYSOPF.C
  489. At the end of the file, block read this in:
  490. /*  Start here  */
  491.  
  492. void sysmenu()
  493. {
  494.   char chr,xl[81],cl[81],atr[81],cc,s1[81];
  495.  
  496.   if(insysmenu==0) {
  497.     savel(cl,atr,xl,&cc);
  498.     insysmenu=1;
  499.     outchr('\x0c');
  500.     while((insysmenu)&&(!hangup)) {
  501.       outstr("/Sysop Menu/-");
  502.       if(so()) {
  503.         chr=onek("?SILTYUZVBEDGCHMOQ");
  504.       } else {
  505.         chr=onek("?SILTYUZVQ");
  506.       }
  507.       switch(chr) {
  508.         case '?':
  509.           printfile("HOTMENU");
  510.           break;
  511.         case 'S':
  512.           prstatus();
  513.           break;
  514.         case 'I':
  515.           ivotes();
  516.           sysoplog("=-Ran IVotes");
  517.           break;
  518.         case 'L':
  519.           sl1(3,s1);
  520.           printfile(s1);
  521.           break;
  522.         case 'T':
  523.           sysoplog("=-Ran TEdit");
  524.           text_edit();
  525.           break;
  526.         case 'Y':
  527.           printfile(status.log1);
  528.           break;
  529.         case 'U':
  530.           sysoplog("=-Ran UEdit");
  531.           uedit(usernum,0);
  532.           break;
  533.         case 'Z':
  534.           zlog();
  535.           break;
  536.         case 'V':
  537.           sysoplog("=-Ran VotePrint");
  538.           voteprint();
  539.           break;
  540.         case 'B':
  541.           sysoplog("=-Ran BoardEdit");
  542.           boardedit();
  543.           break;
  544.         case 'E':
  545.           prt(2,"Filename? ");
  546.           input(s1,50);
  547.           if (s1[0]) {
  548.             if ((okansi()) && (thisuser.defed))
  549.               external_edit(s1,"",thisuser.defed-1,500);
  550.             else
  551.               tedit(s1);
  552.           }
  553.           break;
  554.         case 'D':
  555.           sysoplog("=-Ran DirEdit");
  556.           dlboardedit();
  557.           break;
  558.         case 'G':
  559.           sysoplog("=-Ran GFileEdit");
  560.           gfileedit();
  561.           break;
  562.         case 'C':
  563.           sysoplog("=-Ran ChainEdit");
  564.           chainedit();
  565.           break;
  566.         case 'H':
  567.           chuser();
  568.           break;
  569.         case 'M':
  570.           if(checkpw()) {
  571.             sysoplog("=-Ran MailR");
  572.             mailr();
  573.           }
  574.           break;
  575.         case 'O':
  576.           if(checkpw()) {
  577.             sysoplog("=-Shelled to DOS");
  578.             full_external(getenv("COMSPEC"),1,0);
  579.             topscreen();
  580.           }
  581.           break;
  582.         case 'Q':
  583.           insysmenu=0;
  584.           break;
  585.       }
  586.     }
  587.     restorel(cl,atr,xl,&cc);
  588.   }
  589. }
  590.  
  591. /*  End of block read  */
  592. Save SYSOPF.C
  593.  
  594. Step 6:
  595. Load BBS.C
  596. Search for
  597.   init(1);
  598. Directly after that, add this line:
  599.   insysmenu=0;
  600. Save BBS.C
  601.  
  602. Step 7:
  603. Recompile the BBS,
  604. all done!
  605. Make sure to add a menu, HOTMENU.MSG in your GFILES directory.  Mine looks
  606. like this:
  607. ┌──────────────────────────────Sysop─Hotkey─Menu──────────────────────────────┐
  608. │ ┌ Co-Sysop Commands                                                       ┐ │
  609. │  S>ystem status                    Y>esterday's log                         │
  610. │  I>nitialize Voting Questions      U>ser editor                             │
  611. │  L>og for today                    Z>log (system activity)                  │
  612. │  T>ext file editor                 V>oting question result > VOTING.TXT     │
  613. │ ├ Sysop Commands                                                         ┤  │
  614. │  B>oard list editor                C>hain list editor                       │
  615. │  E>dit any text file               H> Change to a user                      │
  616. │  D>irectory list editor            M>ail read (all mail)                    │
  617. │  G>file section edit               O> Drop to DOS                           │
  618. │ └                                                                         ┘ │
  619. └───Q─Quit─back─to─BBS────────────────────────────────────?─Print─this─menu───┘
  620.  
  621.  
  622.  
  623. Disclaimer:
  624. If, suddenly, upon typing "BBS", all of your C files are erased, I'm not to
  625. blame. Really. Nope, not me.
  626. <grin>
  627. But seriously (how seriously is still under consideration), if your computer
  628. should develop a mind of its own and take over your life and blackmail you
  629. because of this mod, I didn't do it. Really.
  630.  
  631. ---->--->-->->> Stingray <<-<--<---<----
  632. Sysop of Special F/X BBS, (510) 689-8620
  633.  
  634.  
  635.  
  636.  
  637. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^4),?    
  638.  
  639. [5 /99]: Previous post
  640. [Name ]: Stingray #52 @5060
  641. [Date ]: Thu Dec 12 20:57:47 1991
  642. [From ]: Fuzzball Land (Unknown Area)
  643.  
  644. I got a few requests for the 4.20 version of SMENU412.MOD.. I had already 
  645. posted it, but for some reason it hadnt gone out to a lot of the systems. So, 
  646. there it is if you didnt get it before.
  647.  
  648.  
  649.  
  650. -----
  651. Stingray
  652.  
  653.  
  654.  
  655.  
  656. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^5),?    
  657.  
  658. [6 /99]: Some small changes to a good mod.
  659. [Name ]: Wafwot #2 @2632
  660. [Date ]: Fri Dec 13 01:16:00 1991
  661. [From ]: The Evening Post (Washington)
  662.  
  663. This is a bit of a change to a mod that came over the net on Dec 9, 1991.
  664. The original mod I changed belonged to Vortex Rouge, (VRBTRLGN) so he is
  665. who I'll credit.  If anyone else deserves credit, consider it given.
  666.  
  667. I installed the original mod, and was dissatisfied with the display
  668. output.  So, I changed it.  It's basically the same mod.... just some
  669. additions, and cosmetic changes.
  670.  
  671. blablabla...
  672.  
  673. Let's get busy...
  674.  
  675. KEY:
  676. == Search For
  677. -- Delete this line
  678. ++ Add this line
  679. @@ Change this line
  680.  
  681. BACK UP YOUR SOURCE!  NEVER MOD WITHOUT THE LATEST COPY!
  682. pkzip/r/p/f filename.zip *.*  Use pkunzip/d filename.zip to extract.
  683.  
  684. In LILO.C: Delete or comment out these lines:
  685.  
  686. ==  if (live_user) {
  687. ==    nl();
  688. --    npr("Name: %s\r\n",nam(&thisuser,usernum));
  689. --    npr("Time allowed on: %d\r\n", (int) ((nsl()+30)/60.0));
  690. --    if (thisuser.illegal)
  691. --      npr("Illegal logons : %d\r\n",thisuser.illegal);
  692. --    if (thisuser.waiting)
  693. --      npr("Mail waiting   : %d\r\n",thisuser.waiting);
  694. --    if (thisuser.ontoday==1)
  695. --      npr("Last on        : %s\r\n",thisuser.laston);
  696. --   else
  697. --      npr("Times on today : %d\r\n",thisuser.ontoday);
  698. --    npr("Sysop is       : %sAvailable\r\n",sysop2()?"":"NOT ");
  699.  
  700.  
  701.  Then add these lines in it's place:
  702.  
  703. /* Changed Vortex Rogue's mod to the following block of code */
  704.  
  705.   npr("Alias          : %-25s Time allowed : %d\r\n",thisuser.name,(int) 
  706. ((nsl()+30)/60.0));
  707.   npr("Real Name      : %-25s Gold On51a$%ñú+ĺª╙'ºK■
  708. %d\r\n",thisuser.realname,(int)thisuser.gold);
  709.   npr("Sec Lev        : %-25d D/L Sec Lev  : %d\r\n",thisuser.sl,thisuser.dsl);
  710.   npr("Logons Today   : %-25d Logons Total : 
  711. %d\r\n",thisuser.ontoday,thisuser.logons);
  712.   npr("Msgs Posted    : %-25d E-mail Sent  : 
  713. %d\r\n",thisuser.msgpost,(thisuser.emailsent+thisuser.feedbacksent+thisuser.em
  714. ailnet));
  715.   npr("Last on        : %-25s\r\n",thisuser.laston);
  716.   npr("Time Online    : %ld Minutes total since %s\r\n",(long)
  717.     ((thisuser.timeon+timer()-timeon)/60.0),thisuser.firston);
  718.   if (thisuser.waiting) {
  719.     npr("Mail waiting   : %d\r\n",thisuser.waiting);
  720.     npr("Sysop is       : %sAvailable\r\n",sysop2()?"":"NOT ");
  721.   } else {
  722.     npr("Sysop is       : %sAvailable\r\n",sysop2()?"":"NOT ");
  723.   }
  724. /****************************************************************************/
  725. /*
  726.  * Do NOT remove or modify this part of the code.  If the registration number
  727.  * (or an indicator that it is unregistered) is not printed out, it will
  728.  * be plainly obvious that this is a 'pirated' version of the source code.
  729.  * Yeah, and don't remove those matress tags either.
  730.  */
  731.     if (syscfg.wwiv_reg_number)
  732.       sprintf(s,"(Reg #%ld)",syscfg.wwiv_reg_number);
  733.     else
  734.       strcpy(s,"(UNREGISTERED)");
  735.     sprintf(s1,"System is      : %s    %s",VERSION_NUMBER,s);
  736.     pl(s1);
  737. /****************************************************************************/
  738.  
  739.     if (syscfg.systemnumber)
  740.       npr("WWIVnet node   : @%u   
  741. (net%u)\r\n",syscfg.systemnumber,status.net_version);
  742.  
  743. /* End changed code */
  744.     nl();    /* existing */
  745.  
  746.  
  747.  
  748. I just found this to be a bit more pleasing, and adds more info to the
  749. display.  Watch for errors caused by the wrap around in the WWIV editor.
  750. I DO NOT claim any credit for this mod.  I just changed things around.
  751. I'm sure you have heard all the cute excuses possible about screwed up
  752. code, crashed hard drives..... all I have to say is: "Not my fault, Not
  753. my fault
  754.  
  755.  
  756.  
  757. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^6),?    
  758.  
  759. [7 /99]: This is a really easy mod, so I'll just give you the jist
  760. [Name ]: Ice Man #1 @8406
  761. [Date ]: Saturday, December 14, 1991  10:41 am
  762. [From ]: The Cryogenic BBS (Virginia)
  763.  
  764.  
  765. of what you need to do.  
  766.  
  767. What it does:  allows you to hit a key at the UEDIT screen and see what all 
  768. current SL's, DSL's, AR's, and DAR's mean. (I don't know about you, but I can 
  769. never remember what my AR's mean)
  770.  
  771. Step 1.  Load UEDIT.C
  772.  
  773. Step 2.  Search down for void uedit(something), then search for where there 
  774. are two "ch=onek(blahblah)"'s two and four lines below where it prints out 
  775. "Uedit : ".
  776.  
  777. Step 3.  Add a "`", or whatever key you want to use, to the beginning of the 
  778. ch=onek's.  
  779.  
  780. Step 4.  Right below where it says "switch(ch) {", add this:
  781.   
  782.   case '`': /*or whatever*/
  783.     printfile("AR'S.TXT");  /* or whatever you want to call it */
  784.     pausescr();
  785.     break;
  786.  
  787. Step 5.  Recompile it.
  788.  
  789. Step 6.  Make a file in your gfiles directory called "AR'S.TXT", or whatever 
  790. you put in UEDIT.C, that has each AR and DAR you use, and what access they 
  791. give, and do the same with your SL's and DSL's.
  792.  
  793. Step 7. (optional) Update your Uedit menu's to show the change.  
  794.  
  795. Step 8. (also optional)  If you only don't want co-sysops to be able to see 
  796. the list, don't add the "`" in the second "ch=onek(blah blah)"
  797.  
  798. Should work with 4.11 and up, but if you have any problems, e-mail me, 1@8406.
  799.  
  800. Ice 
  801.     Man
  802.  
  803.  
  804.  
  805. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^7),?    
  806.  
  807. [8 /99]: File Point Mod
  808. [Name ]: Ice Man #1 @8406
  809. [Date ]: Saturday, December 14, 1991   6:07 pm
  810. [From ]: The Cryogenic BBS (Virginia)
  811.  
  812.  
  813.                              File Point Mod
  814.                           By Ice Man #1 @8406
  815.  
  816. Description:    Allows sysops to use a file point system instead of the normal
  817.                 ratio system.  For every file point a user has, they can
  818.                 download 1 K.  When a user sends in money, add the appropriate
  819.                 number of file points to his/her account.  This mod also keeps
  820.                 track of how much a user has contributed, although its not
  821.                 related to how many file points they have.
  822. WWIV version:   4.11, but could be easily adapted to 4.12 or 4.20 as far as I
  823.                 can tell.
  824. Files affected: XFER.C, VARDEC.H, SYSOPF.C
  825.  
  826. Step 1.  First off, since this mod changes your user structure, you'll have to
  827.          do one of two things: a) trash your user list, or b) get a CONVERT.C
  828.          for WWIV 4.11, and modify it do it'll convert your old user list into
  829.          a new one with this mod in.  If you know C pretty good, try B.  If you
  830.          don't, either try A or don't put this mod in.
  831.  
  832. Step 2.  BACKUP YOUR SOURCE CODE!!!
  833.  
  834. Step 3.  Load up VARDEC.H and make the following changes:
  835.  
  836. /*==*/                  ontoday;                /* num times on today */
  837. /*==*/  unsigned short  homeuser,homesys,       /* where user can be found */
  838. /*++*/                  contrib,                /* $ contributed by user */
  839. /*==*/                  forwardusr,forwardsys,  /* where to forward mail */
  840. /*==*/                  msgpost,                /* number messages posted */
  841. /*==*/  unsigned long   msgread,                /* total num msgs read */
  842. /*++*/                  dlpoints,               /* user's DL points */
  843. /*==*/                  uk,                     /* number of k uploaded */
  844. /*==*/                  dk,                     /* number of k downloaded */
  845.  
  846. Step 4.  Load up SYSOPF.C and seach(^Q,F) down for void uedit(blahblah).  Make
  847.          the following changes:
  848.  
  849. /*==*/prt(2,"Uedit : ");
  850. /*==*/if ((realsl==255) || (wfc))
  851. /*+-*/  ch=onek("#$Q[]{}/,.?UDRNLCPOGMSTEYZAI~:");  /* # and $ added */
  852. /*==*/else                                          /* # for file points */
  853. /*+-*/  ch=onek("#$Q[]{}/,.?UDRNLCPOGMSTEYZAI");    /* $ for contributed */
  854. /*==*/switch(ch) {
  855. /*add*/ case '#':
  856. /*from*/  prt(2,"New file points? ");
  857. /*here*/  input(s2,5);
  858.           if (s2[0])
  859.           i=atoi(s2);
  860.             u.dlpoints=i;
  861.             ite_user(un,&u);
  862.           }
  863.           break;
  864.         case '$':
  865.           prt(2,"New money contributed? (without dollar sign) ");
  866.           input(s2,5);
  867.           if (s2[0]) {
  868.             i=atoi(s2);
  869.             u.contrib=i;
  870.             write_user(un,&u);
  871.           }
  872. /* here */break;
  873. /*==*/  case 'Q':
  874. /*==*/    done=1;
  875.  
  876. Step 5.  Load up XFER.C and search down for void download_temp_arc().  Search
  877.          down and make the following changes:
  878.  
  879. /*==*/  numbytes=filelength(f);
  880. /*==*/  close(f);
  881. /*++*/  if ((numbytes+1023)/1024>thisuser.dlpoints) {
  882. /*++*/    nl();
  883. /*++*/    prt(5,"I'm sorry, you don't have enough file points to DL that 
  884. file.");
  885. /*++*/    nl();
  886. /*++*/    return;
  887. /*++*/  }
  888. /*==*/  if (numbytes==0L) {
  889. /*==*/    nl();
  890.  
  891. Step 6.  Still in void download_temp_arc(), search down a little further and
  892.          make the following changes:
  893.  
  894. /*==*/      sprintf(s1,"%-6.3f",ratio());
  895. /*==*/      print("Your ratio is now: ",s1,"");
  896. /*++*/      thisuser.dlpoints=thisuser.dlpoints-(((numbytes)+1023)/1024);
  897. /*++*/      ltoa(thisuser.dlpoints,s,10);
  898. /*++*/      prt(0,"You now have ");
  899. /*++*/      prt(0,s);
  900. /*++*/      pl(" file points left.");
  901. /*==*/
  902. /*==*/      if (useron)
  903. /*==*/        topscreen();
  904.  
  905. Step 7.  Still in XFER.C, search down (^Q,F) for int try_to_download() and make
  906.          the following changes:
  907.  
  908. /*==*/    SETREC(i);
  909. /*==*/    read(dlf,(void *)&u,sizeof(uploadsrec));
  910. /*++*/    if ((u.numbytes+1023)/1024>thisuser.dlpoints) {
  911. /*++*/      nl();
  912. /*++*/      prt(5,"I'm sorry, you don't have enough file points to DL that 
  913. file.");
  914. /*++*/      nl();
  915. /*++*/      closedl();
  916. /*++*/      return(-1);
  917. /*++*/    }
  918. /*==*/    nl();
  919. /*==*/    if (title)
  920. /*==*/      print("Directory  : ",directories[dn].name,"");
  921.  
  922. Step 8.  A little bit further down, make the following changes:
  923.  
  924. /*==*/  sprintf(s1,"%-6.3f",ratio());
  925. /*==*/  print("Your ratio is now: ",s1,"");
  926. /*++*/  thisuser.dlpoints=thisuser.dlpoints-(((u.numbytes)+1023)/1024);
  927. /*++*/  ltoa(thisuser.dlpoints,s,10);
  928. /*++*/  prt(0,"You now have ");
  929. /*++*/  prt(0,s);
  930. /*++*/  pl(" file points left.");
  931. /*==*/
  932. /*==*/  if (useron)
  933. /*==*/    topscreen();
  934.  
  935. Step 9.  Still in XFER.C, search down for void yourinfodl() and replace the
  936.          entire function with this one.
  937.  
  938. void yourinfodl()
  939. {
  940.   char s[81],s1[81],s2[81],s3[81],s4[81];
  941.  
  942.   itoa(thisuser.uploaded,s,10);
  943.   itoa(thisuser.downloaded,s1,10);
  944.   ltoa(thisuser.uk,s2,10);
  945.   ltoa(thisuser.dk,s3,10);
  946.   ltoa(thisuser.dlpoints,s4,10);
  947.   nl();
  948.   nl();
  949.   print("Uploads  : ",s2,"k in ",s," files","");
  950.   print("Downloads: ",s3,"k in ",s1," files","");
  951.   print("File Points (K you can DL): ",s4,"");   /*  add */
  952.   sprintf(s,"%-6.3f",ratio());
  953.   print("Ratio    : ",s,"");
  954.   itoa(thisuser.dsl,s,10);
  955.   print("Your DSL : ",s,"");
  956.   nl();
  957. }
  958.  
  959. Step 10.  Recompile it!
  960.  
  961.     If you have any questions, complaints, comments, etc., sent them to #1
  962. @8406(WWIVnet).  If you use this mod, please leave me some mail telling me you
  963. are.  If you're using 4.20, but would really like to use this mod, e-mail me
  964. and I'll try and write one for it.
  965.  
  966.  
  967.  
  968. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^8),?    T
  969. *   (9) ENHAMCE.C module for WWIV 4.20 or higher.
  970. *  (10) Another one of Airflight's Cheap Mods
  971. *  (11) insysmenu
  972. *  (12) < TYPE all files of a specified parameter >
  973. *  (13) Help!!!!
  974. *  (14) to the host...
  975. *  (15) VRMENU.MOD  (VR #2) --Makes choices pop up after letter.
  976. *  (16) NO! (re: SYsmenu Mod)
  977. *  (17) -
  978. *  (18) CD ROM Disks
  979.  
  980. [Sub]: The WWIV Modification Net                  [Read]: (1-99,^18),?    Q
  981.  
  982.  
  983. 28 minutes used, 62 left.
  984. [12] [The WWIV Modification Net]         Z
  985.  
  986. << Q-Scan All >>
  987.  
  988. < Nothing new on General 1 >
  989.  
  990. < Nothing new on The Rebel Room 2 >
  991.  
  992. < Nothing new on Amiga Talk 3 >
  993.  
  994. < Nothing new on Smorgasßoard Battle Forum 4 >
  995.  
  996. < Nothing new on MD Classifieds 5 >
  997.  
  998. < Nothing new on Art Gallery  >> ANSI ONLY << 6 >
  999.  
  1000. < Nothing new on Greenpeace (Env. Debate) 9 >
  1001.  
  1002. < Nothing new on WWIV Mod Talk & Requests 11 >
  1003.  
  1004. < Q-scan The WWIV Modification Net 12 - 99 msgs >
  1005.  
  1006. [9 /99]: ENHAMCE.C module for WWIV 4.20 or higher.
  1007. [Name ]: Tolkien #1 @3456
  1008. [Date ]: Sat Dec 14 17:38:47 1991
  1009. [From ]:%The Fellowship (Missouri)
  1010.  
  1011. /*═══════════════════════  START OF ENHANCE.C  ════════════════════════════*/
  1012.  
  1013. /*
  1014.  * This file comprises a set of functions for enhancing the look and feel of
  1015.  * your BBS. This is not a modification per se, but rather a toolbox of
  1016.  * utilitarian functions that you can apply when and where you see fit, to
  1017.  * more customize the look and feel of your BBS.
  1018.  *
  1019.  * There are 32 functions here, including those necessary for making use
  1020.  * of ESM (any version, even 2.00 if you have registered it), as well as
  1021.  * the functions that were once included with ANSI.C, and a fair number
  1022.  * of additional functions as well.
  1023.  *
  1024.  * Each function is described and an example of how to use it is given. To
  1025.  * use these anywhere in your code, you will need to add ENHANCE.C to your
  1026.  * project file (if you use the IDE) or to your makefile (if you compile
  1027.  * on the commandline). I suggest not overlaying these functions unless you
  1028.  * have installed the XMSEMS modification which allows you to store your
  1029.  * overlays in extended or expanded memory.
  1030.  *
  1031.  * This source file has been tested with WWIV 4.20. Though it is possible
  1032.  * to make it work with prior releases, I leave that up to you to do if
  1033.  * that is your intention.
  1034.  *
  1035.  * Comments and suchlike can be sent to WWIVnet 1@3456.
  1036.  *
  1037.  * Tolkien
  1038.  * 1 @3456
  1039.  * Dec 14, 1991
  1040.  *
  1041.  */
  1042.  
  1043. /*═════════════════════════════════════════════════════════════════════════*/
  1044.  
  1045. #include "vars.h"
  1046.  
  1047. #pragma hdrstop
  1048.  
  1049. /*═════════════════════════════════════════════════════════════════════════*/
  1050.  
  1051. /*
  1052.  * This is a modified bitmapped sysstatus, which goes in VARDEC.H, to make
  1053.  * use of the fancy ANSI toggle (or whatever you want). Note that it is
  1054.  * padded with "fillers" in case Wayne decides to use some of those other
  1055.  * bits.
  1056.  *
  1057.  * #define sysstatus_ansi 0x0001
  1058.  * #define sysstatus_color 0x0002
  1059.  * #define sysstatus_music 0x0004
  1060.  * #define sysstatus_pause_on_page 0x0008
  1061.  * #define sysstatus_expert 0x0010
  1062.  * #define sysstatus_smw 0x0020
  1063.  * #define sysstatus_full_screen 0x0040
  1064.  * #define sysstatus_nscan_file_system 0x0080
  1065.  * #define sysstatus_funky_colors 0x0100
  1066.  * #define sysstatus_clr_scrn 0x0200
  1067.  * #define sysstatus_one 0x0400
  1068.  * #define sysstatus_two 0x0800
  1069.  * #define sysstatus_three 0x1000
  1070.  * #define sysstatus_four 0x2000
  1071.  * #define sysstatus_five 0x4000
  1072.  * #define sysstatus_fancy 0x8000
  1073.  *
  1074.  */
  1075.  
  1076. /*═════════════════════════════════════════════════════════════════════════*/
  1077.  
  1078. /*
  1079.  * You should add the following hunk of code (minus the commenting) to
  1080.  * FCNS.H. Note that some of these functions were once in ANSI.C and some
  1081.  * were in STRINGS.C (or ESM.C), so you may have some rearranging to do.
  1082.  *
  1083.  */
  1084.  
  1085. /* File: ENHANCE.C */
  1086.  
  1087. /*
  1088. * void localprt(int fc, int bc, unsigned char *s);
  1089. * int attrib(int fc, int bc);
  1090. * void writeat(int x, int y, int color, char *s);
  1091. * void writebetween(int x1, int x2, int y, int color, char *s);
  1092. * void yesorno();
  1093. * void backprint(unsigned char *s, int d1, int d2, int d3);
  1094. * void shimmer(unsigned char *s, int i);
  1095. * void slowtype(int color, unsigned char *s);
  1096. * void spin(unsigned char *s, int d1);
  1097. * void padleftwrite(int color, unsigned char *s, int endpos);
  1098. * void pla2(unsigned char *s, int *abort);
  1099. * unsigned char *get_word(char *filename);
  1100. * void prt2(int x, int i, unsigned char *s);
  1101. * unsigned char *proper(unsigned char *s);
  1102. * void center(int a, unsigned char *s);
  1103. * char *get_string(int whichstring);
  1104. * char *getstring(char *dataname, int whichstring);
  1105. * int writestring(char *datafile, int whichstring, char *writethis);
  1106. * int okfancy();
  1107. * int primetime();
  1108. * void noise(int startfreq, int endfreq, int step, int paws, int repeats);
  1109. * void send_ssm();
  1110. * void goxy(int i, int j);
  1111. * void left(int i);
  1112. * void right(int i);
  1113. * void up(int i);
  1114. * void down(int i);
  1115. * void clearline();
  1116. * void frame(int bordercolor, int x1, int y1, int x2, int y2);
  1117. * void makewin(int bordercolor, int wincolor, int x1, int y1, int x2, int y2);
  1118. * void clearscreen();
  1119. * void cleareol();
  1120. *
  1121. */
  1122.  
  1123. /*═════════════════════════════════════════════════════════════════════════*/
  1124.  
  1125. /*
  1126.  * Here are some variables you should add to VARS.H (in both places, the
  1127.  * "normal" place at the top and the "extern" section at the bottom of
  1128.  * VARS.H).
  1129.  *
  1130.  * int lastrandom;
  1131.  *
  1132.  */
  1133.  
  1134. /*═════════════════════════════════════════════════════════════════════════*/
  1135.  
  1136. /*
  1137.  * Here are some #defines which you will wish to alter to suit your own
  1138.  * specific system configuration and preferences.
  1139.  *
  1140.  */
  1141.  
  1142. #define RAMDRIVE "D:\\"                /* Edit this so it is correct!      */
  1143. #define DATADIR  "C:\\WWIV\\DATA\\"    /* Edit this so it is correct!      */
  1144. #define PRIMETIMESTART 17*3600.0       /* When you want primetime to start */
  1145. #define PRIMETIMEEND 23*3600.0         /* When you want primetime to end   */
  1146.  
  1147. /*═════════════════════════════════════════════════════════════════════════*/
  1148.  
  1149. /*
  1150.  * This is the data structure for the string datafiles. Very simple.
  1151.  */
  1152.  
  1153. typedef struct {
  1154.   unsigned char thestring[161];
  1155. } stringrec;
  1156.  
  1157. /*═════════════════════════════════════════════════════════════════════════*/
  1158.  
  1159. void localprt(int fc, int bc, unsigned char *s)
  1160. /*
  1161.  * This function prints to the local screen only, using the attribute
  1162.  * defined as the first parameter as the color. Restores the previous
  1163.  * local screen attribute when it's done printing. Need to have <conio.h>
  1164.  * #included (in VARS.H preferably).
  1165.  *
  1166.  */
  1167. {
  1168.   unsigned char oatr;
  1169.  
  1170.   oatr=curatr;
  1171.   curatr=attrib(fc,bc);
  1172.   outs(s);
  1173.   curatr=oatr;
  1174. }
  1175. /*
  1176.  * Example:
  1177.  *
  1178.  * localprt(YELLOW,BLUE,"This is yellow on blue, local screen only.");
  1179.  *
  1180.  */
  1181.  
  1182. /*═════════════════════════════════════════════════════════════════════════*/
  1183.  
  1184. int attrib(int fc, int bc)
  1185. /*
  1186.  * This function takes a foreground color value and a background color value
  1187.  * and returns a single attribute byte. This is used in the localprt()
  1188.  * function above. You should have <conio.h> #included (preferably in
  1189.  * VARS.H) to make use of the constant strings as color values (such as
  1190.  * RED and YELLOW, and LIGHTBLUE, etc).
  1191.  *
  1192.  */
  1193. {
  1194.   int i;
  1195.  
  1196.   i = (int) (bc*16) + (fc);
  1197.   return(i);
  1198. }
  1199. /*
  1200.  * Example:
  1201.  *
  1202.  * curatr=attrib(YELLOW,MAGENTA);
  1203.  *
  1204.  */
  1205.  
  1206. /*═════════════════════════════════════════════════════════════════════════*/
  1207.  
  1208. void writeat(int x, int y, int color, char *s)
  1209. /*
  1210.  * This function will write a specified string at a specified screen location
  1211.  * using a specified color, if the user has ANSI toggled "on".
  1212.  *
  1213.  */
  1214. {
  1215.   if (okansi()) {
  1216.     goxy(x,y);
  1217.     ansic(color);
  1218.     outstr(s);
  1219.   }
  1220. }
  1221. /*
  1222.  * Example:
  1223.  *
  1224.  * writeat(1,25,4,"This is the normal color #4 on the botom screen line.");
  1225.  *
  1226.  */
  1227.  
  1228. /*═════════════════════════════════════════════════════════════════════════*/
  1229.  
  1230. void writebetween(int x1, int x2, int y, int color, char *s)
  1231. /*
  1232.  * This function will write a specified string to the screen, centered
  1233.  * between two x coordinates, in a specified color, and on a specified
  1234.  * line, if the user has ANSI toggled on.
  1235.  *
  1236.  */
  1237. {
  1238.   int i,z;
  1239.  
  1240.   if ((x2<=x1) || (x1<1) || (x2>80) || (y<1) || (y>50) || (strlen(s)<1)
  1241.     || (!okansi()))
  1242.     return;
  1243.  
  1244.   if (strlen(s)>(x2-x1+1))
  1245.     s[x2-x1+1]=0;
  1246.  
  1247.   i = (int) (((x2 - x1 + 1) - (strlen(s))) / 2) + x1;
  1248.   writeat(i,y,color,s);
  1249. }
  1250. /*
  1251.  * Example:
  1252.  *
  1253.  * writebetween(1,60,4,1,"This is on row 4, is color #1, between 1 and 60.");
  1254.  *
  1255.  */
  1256.  
  1257. /*═════════════════════════════════════════════════════════════════════════*/
  1258.  
  1259. void yesorno()
  1260. /*
  1261.  * This function prints out "Yes or No" in yellow, pauses, and backspaces.
  1262.  * ANSI is not required.
  1263.  */
  1264. {
  1265.   backprint("Yes or No",2,5,400);
  1266. }
  1267. /*
  1268.  * Example:
  1269.  *
  1270.  * yesorno();
  1271.  *
  1272.  */
  1273.  
  1274. /*═════════════════════════════════════════════════════════════════════════*/
  1275.  
  1276. void backprint(unsigned char *s, int d1, int d2, int d3)
  1277. /*
  1278.  * This function prints out a string, with a user-specifiable delay between
  1279.  * each character, and a user-definable pause after the entire string has
  1280.  * been printed, then it backspaces the string. The color is also definable.
  1281.  * The parameters are as follows:
  1282.  *
  1283.  * char *s : the string to print
  1284.  * int d1  : the color of the string
  1285.  * int d2  : delay between each character, in milliseconds
  1286.  * int d3  : delay between completion of string and backspacing
  1287.  *
  1288.  * ANSI is not required.
  1289.  *
  1290.  */
  1291. {
  1292.   int i1, i2, i3;
  1293.  
  1294.   i3 = 0;
  1295.   i1 = echo;
  1296.   echo = 1;
  1297.   i2=strlen(s);
  1298.   ansic(d1);
  1299.   delay(d2);
  1300.   while ((s[i3]) && (!hangup)) {
  1301.     outchr(s[i3]);
  1302.     delay(d2);
  1303.     i3++;
  1304.   }
  1305.   delay(d3);
  1306.   for (i3=0; i3 < i2; i3++) {
  1307.     backspace();
  1308.     delay(5);
  1309.   }
  1310.   echo = i1;
  1311. }
  1312. /*
  1313.  * Example:
  1314.  *
  1315.  * backprint("This is an example.",3,20,500);
  1316.  *
  1317.  */
  1318.  
  1319. /*═════════════════════════════════════════════════════════════════════════*/
  1320.  
  1321. void shimmer(unsigned char *s, int i)
  1322. /*
  1323.  * If the user has "fancy ANSI" on then the string to be printed will shimmer
  1324.  * through the number of colors defined in the userrec struct in VARDEC.H.
  1325.  * ANSI is checked, and if the user does not have ANSI and does not have
  1326.  * "fancy ANSI" enabled then the string is simply printed normally. A <CR> is
  1327.  * not done.
  1328.  *
  1329.  */
  1330. {
  1331.   int x,y;
  1332.  
  1333.   x=strlen(s);
  1334.   y=0;
  1335.  
  1336.   if ((okansi()) && (okfancy())) {
  1337.     do {
  1338.       if (y!=i) {
  1339.         prt(y,s);
  1340.         left(x);
  1341.       }
  1342.       y++;
  1343.     } while(y<(sizeof(thisuser.colors)));
  1344.   }
  1345.   prt(i,s);
  1346.   ansic(0);
  1347. }
  1348. /*
  1349.  * Example:
  1350.  *
  1351.  * shimmer("Whoa, wild!",6);
  1352.  *
  1353.  */
  1354.  
  1355. /*═════════════════════════════════════════════════════════════════════════*/
  1356.  
  1357. void slowtype(int color, unsigned char *s)
  1358. /*
  1359.  * This function will type out a string at random speed, as if there were
  1360.  * someone actually typing it. The color is the first parameter, just as
  1361.  * in the prt() function. A <CR> is not done.
  1362.  *
  1363.  * ANSI not required.
  1364.  *
  1365.  */
  1366. {
  1367.   int x, i;
  1368.  
  1369.   x=0;
  1370.   randomize();
  1371.   ansic(color);
  1372.   checkhangup();
  1373.   while ((s[x]) && (!hangup)) {
  1374.     outchr(s[x]);
  1375.     delay(random(120)+100);
  1376.     if (s[x]==32) {
  1377.       i=random(2);
  1378.       if (i==0)
  1379.         delay(random(100)+250);
  1380.     }
  1381.     x++;
  1382.   }
  1383. }
  1384. /*
  1385.  * Example:
  1386.  *
  1387.  * slowtype(3,"Hey, I'm not *really* here!");
  1388.  *
  1389.  */
  1390.  
  1391. /*═════════════════════════════════════════════════════════════════════════*/
  1392.  
  1393. void spin(unsigned char *s, int d1)
  1394. /*
  1395.  * This function will print out a string, making each character "spin"
  1396.  * using the / - \ | sequence. The color is definable and is the
  1397.  * second parameter, not the first. If the user does not have ANSI
  1398.  * then the string is simply printed normally.
  1399.  *
  1400.  */
  1401. {
  1402.   int i1, i3, dly;
  1403.  
  1404.   dly  = 30;
  1405.   i3   = 0;
  1406.   i1   = echo;
  1407.   echo = 1;
  1408.  
  1409.   if ((okansi()) && (okfancy())) {
  1410.     ansic(d1);
  1411.     while ((s[i3]) && (!hangup)) {
  1412.       delay(dly);
  1413.       outstr("/");
  1414.       left(1);
  1415.       delay(dly);
  1416.       outstr("-");
  1417.       left(1);
  1418.       delay(dly);
  1419.       outstr("\\");
  1420.       left(1);
  1421.       delay(dly);
  1422.       outstr("|");
  1423.       left(1);
  1424.       delay(dly);
  1425.       outchr(s[i3]);
  1426.       i3++;
  1427.     }
  1428.   } else {
  1429.     outstr(s);
  1430.   }
  1431.   echo = i1;
  1432. }
  1433. /*
  1434.  * Example:
  1435.  *
  1436.  * spin("This will spin and be yellow (defualt #2 color).",2);
  1437.  *
  1438.  */
  1439.  
  1440. /*═════════════════════════════════════════════════════════════════════════*/
  1441.  
  1442. void padleftwrite(int color, unsigned char *s, int endpos)
  1443. /*
  1444.  * This function prints a string and pads it with enough spaces on the
  1445.  * right of the string to make the next string print starting right after
  1446.  * endpos.  Useful for lining things up in columns, etc. The color is
  1447.  * definable and is the first parameter.
  1448.  *
  1449.  * ANSI not required.
  1450.  *
  1451.  */
  1452. {
  1453.   int i;
  1454.  
  1455.   prt(color,s);
  1456.   for (i=wherex();i<endpos;i++) {
  1457.     outstr(" ");
  1458.   }
  1459. }
  1460. /*
  1461.  * Example:
  1462.  *
  1463.  * padleftwrite(3,"The next string after this will be in column 41.",40);
  1464.  *
  1465.  */
  1466.  
  1467. /*═════════════════════════════════════════════════════════════════════════*/
  1468.  
  1469. void pla2(unsigned char *s, int *abort)
  1470. /*
  1471.  * This function is identical to void pla() except that it is not terminated
  1472.  * with a <CR>, so that multiple colors can be used on the same line.
  1473.  *
  1474.  */
  1475. {
  1476.   int i,next;
  1477.  
  1478.   i=0;
  1479.   checkhangup();
  1480.   if (hangup)
  1481.     *abort=1;
  1482.   checka(abort,&next);
  1483.   while ((s[i]) && (!(*abort))) {
  1484.     outchr(s[i++]);
  1485.     checka(abort,&next);
  1486.   }
  1487. }
  1488. /*
  1489.  * Example:
  1490.  *
  1491.  * pla2("This is on one line.",&abort);
  1492.  * pla2("Hey, this is on the same line!",&abort);
  1493.  *
  1494.  */
  1495.  
  1496. /*═════════════════════════════════════════════════════════════════════════*/
  1497.  
  1498. unsigned char *get_word(char *filename)
  1499. /*
  1500.  * This function will read a random word from a textfile and print it to the
  1501.  * screen. This function takes one parameter, the filename (in the gfiles dir)
  1502.  * from which to snag a random word/phrase.
  1503.  *
  1504.  */
  1505. {
  1506.   int f,i,ran,count;
  1507.   long p,l;
  1508.   static char s[81];
  1509.  
  1510.   sprintf(s,"%s%s",syscfg.gfilesdir,filename);
  1511.   if (exist(s)) {
  1512.         f=open(s,O_RDWR | O_BINARY);
  1513.     lseek(f,0L,SEEK_SET);
  1514.     l=filelength(f);
  1515.     p=0;
  1516.     count=0;
  1517.         while (p<l) {
  1518.       lseek(f,p,SEEK_SET);
  1519.       read(f,(void *)s,80);
  1520.       i=0;
  1521.       while ((i<80) && (s[i])) {
  1522.         if (s[i]==13) {
  1523.           s[i]=0;
  1524.           ++count;
  1525.         } else
  1526.           ++i;
  1527.       }
  1528.       s[80]=0;
  1529.       p += (long) (i+2);
  1530.       if (s[i-1]==1)
  1531.         s[i-1]=0;
  1532.     }
  1533.     if (lastrandom==0)
  1534.       lastrandom=1;
  1535.     do {
  1536.       ran=random(count)+1;
  1537.     } while (ran==lastrandom);
  1538.     count=0;
  1539.     lastrandom=ran;
  1540.     lseek(f,0L,SEEK_SET);
  1541.     l=filelength(f);
  1542.     p=0;
  1543.     while ((p<l) && (count<ran)) {
  1544.       lseek(f,p,SEEK_SET);
  1545.       read(f,(void *)s,80);
  1546.       i=0;
  1547.       while ((i<80) && (s[i])) {
  1548.         if (s[i]==13) {
  1549.           s[i]=0;
  1550.           ++count;
  1551.         } else
  1552.           ++i;
  1553.       }
  1554.       s[80]=0;
  1555.       p += (long) (i+2);
  1556.       if (s[i-1]==1)
  1557.         s[i-1]=0;
  1558.     }
  1559.     close(f);
  1560.     return(s);
  1561.   } else
  1562.     return("");
  1563. }
  1564. /*
  1565.  * Example:
  1566.  *
  1567.  * pl(get_word("NOUN.TXT"));
  1568.  *
  1569.  */
  1570.  
  1571. /*═════════════════════════════════════════════════════════════════════════*/
  1572.  
  1573. void prt2(int x, int i, unsigned char *s)
  1574. /*
  1575.  * This function is the same as void prt() except that it takes an extra
  1576.  * parameter, the first one, an int, which is how many spaces to put before
  1577.  * the string to be printed.
  1578.  *
  1579.  */
  1580. {
  1581.   int z;
  1582.  
  1583.   for (z=0; z<x; z++)
  1584.         outstr(" ");
  1585.   ansic(i);
  1586.   outstr(s);
  1587.   ansic(0);
  1588. }
  1589. /*
  1590.  * Example:
  1591.  *
  1592.  * prt2(30,1,"Much more memory effective than...");
  1593.  * prt(1,"                               this.");
  1594.  *
  1595.  */
  1596.  
  1597. /*═════════════════════════════════════════════════════════════════════════*/
  1598.  
  1599. unsigned char *proper(unsigned char *s)
  1600. /*
  1601.  * This function will return a "properized" replica of the string it is
  1602.  * fed. In other words, "jon doe" would become "Jon Doe".
  1603.  *
  1604.  */
  1605. {
  1606.   int i,f;
  1607.   static char o[81];
  1608.   char z[81];
  1609.  
  1610.   strcpy(z,s);
  1611.   strcpy(z,strupr(z));
  1612.   f=1;
  1613.   for (i=0; i<strlen(z); i++) {
  1614.     if (f) {
  1615.       if ((z[i]>='A') && (z[i]<='Z'))
  1616.         f=0;
  1617.       o[i]=z[i];
  1618.     } else {
  1619.       if ((z[i]>='A') && (z[i]<='Z'))
  1620.         o[i]=z[i]-'A'+'a';
  1621.       else {
  1622.         if ((z[i]>=' ') && (z[i]<='/'))
  1623.           f=1;
  1624.         o[i]=z[i];
  1625.       }
  1626.     }
  1627.   }
  1628.   o[i++]=0;
  1629.   return(o);
  1630. }
  1631. /*
  1632.  * Example:
  1633.  *
  1634.  * outstr(proper(thisuser.realname));
  1635.  *
  1636.  */
  1637.  
  1638. /*═════════════════════════════════════════════════════════════════════════*/
  1639.  
  1640. void center(int a, unsigned char *s)
  1641. /*
  1642.  * This function centers a string on a line, and takes into account the
  1643.  * embedded WWIV color codes (ASCII 003's).
  1644.  *
  1645.  */
  1646. {
  1647.   char s1[160];
  1648.   int i,x,col,lenx;
  1649.   div_t len;
  1650.  
  1651.   i = 0;
  1652.   x = 0;
  1653.   lenx = strlen(s);
  1654.  
  1655.   while (s[x]) {
  1656.     if (s[x]==3) {
  1657.       lenx--;
  1658.       lenx--;
  1659.     }
  1660.     x++;
  1661.   }
  1662.   if (thisuser.screenchars > lenx) {
  1663.     col = thisuser.screenchars - lenx;
  1664.     len = div(col,2);
  1665.     i = len.quot;
  1666.   }
  1667.   strcpy(s1,"");
  1668.   while (i>0) {
  1669.     strcat(s1," ");
  1670.     i--;
  1671.   }
  1672.   strcat(s1,s);
  1673.   ansic(a);
  1674.   outstr(s1);
  1675. }
  1676. /*
  1677.  * Example:
  1678.  *
  1679.  * center(6,"Hey Jude, don't make it bad.");
  1680.  *
  1681.  */
  1682.  
  1683. /*═════════════════════════════════════════════════════════════════════════*/
  1684.  
  1685. /*
  1686.  * This function is the one that retrieves the string from STRINGS.DAT
  1687.  * If there is an error reading the file the BBS will abort (much like
  1688.  * it does when it cannot find CONFIG.DAT, etc). It will try first for
  1689.  * the ramdrive. If it cannot access that file then it will look in
  1690.  * the data directory. *Make sure* you specify the directories right.
  1691.  * The datafile filename should be the first parameter in this case,
  1692.  * followed by the record number to retrieve.
  1693.  */
  1694.  
  1695. char *get_string(int whichstring)
  1696. {
  1697.   static char s[161];
  1698.   char s1[81];
  1699.   int i;
  1700.   stringrec astring;
  1701.  
  1702.   sprintf(s1,"%sSTRINGS.DAT",RAMDRIVE);
  1703.   i=open(s1,O_RDWR | O_BINARY);
  1704.   /* The above line is the path to the ramdrive and the STRINGS.DAT file.
  1705.    * If you don't use a ramdrive then make this the path to your data
  1706.    * directory.
  1707.    */
  1708.   if (i<0) {
  1709.     sprintf(s1,"%sSTRINGS.DAT",DATADIR);
  1710.     i=open(s1,O_RDWR | O_BINARY);
  1711.     /* The above line should be the path of your BBS data directory which
  1712.      * should be the permanent residence of the STRINGS.DAT file. ESM.EXE
  1713.      * should either be in the WWIV main dir or in the path or, preferably,
  1714.      * in the WWIV main dir and have that in the path.
  1715.      */
  1716.     if (i<0) {
  1717.       printf("\r\n\7Error reading STRINGS.DAT.\7\r\n");
  1718.       end_bbs(noklevel);
  1719.     }
  1720.   }
  1721.   lseek(i,((long)(whichstring-1))*(sizeof(astring)),SEEK_SET);
  1722.   read(i,(void *)&astring,sizeof(astring));
  1723.   sprintf(s,"%s",&astring.thestring);
  1724.   close(i);
  1725.   return(s);
  1726. }
  1727. /*
  1728.  * Example:
  1729.  *
  1730.  * outstr(get_string(3));
  1731.  *
  1732.  */
  1733.  
  1734. /*═════════════════════════════════════════════════════════════════════════*/
  1735.  
  1736. /*
  1737.  * The following is a getstring function that allows you to specify
  1738.  * the string datafile filename from which to retrieve the string.
  1739.  * This would allow you to have separate string datafiles for each
  1740.  * WWIV module. For example, a BBS.DAT, a BBSUTL.DAT, a COM.DAT, etc.
  1741.  * Note the slightly different name for this function to distinguish
  1742.  * it from the other. The extension .DAT is automatically used,
  1743.  * so >do not< use it in your getstring calls.
  1744.  */
  1745.  
  1746. char *getstring(char *dataname, int whichstring)
  1747. {
  1748.   static char s[161];
  1749.   char s1[81];
  1750.   int i;
  1751.   stringrec astring;
  1752.  
  1753.   sprintf(s1,"%s%s.DAT",RAMDRIVE,dataname);
  1754.   i=open(s1,O_RDWR | O_BINARY);
  1755.   if (i<0) {
  1756.     sprintf(s1,"%s%s.DAT",DATADIR,dataname);
  1757.     i=open(s1,O_RDWR | O_BINARY);
  1758.     if (i<0) {
  1759.       sprintf(s1,"\r\n\7Error reading %s.DAT.\7\r\n",dataname);
  1760.       printf(s1);
  1761.       end_bbs(noklevel);
  1762.     }
  1763.   }
  1764.   lseek(i,((long)(whichstring-1))*(sizeof(astring)),SEEK_SET);
  1765.   read(i,(void *)&astring,sizeof(astring));
  1766.   sprintf(s,"%s",&astring.thestring);
  1767.   close(i);
  1768.   return(s);
  1769. }
  1770. /*
  1771.  * Example:
  1772.  *
  1773.  * outstr(getstring("RANDOM",5));
  1774.  *
  1775.  */
  1776.  
  1777. /*═════════════════════════════════════════════════════════════════════════*/
  1778.  
  1779. /*
  1780.  * The next function will write a specified string at a specified location
  1781.  * in a specified string datafile. If the write fails this function will
  1782.  * not abort the BBS but will retuen a 0. It returns a 1 if the write is
  1783.  * successful.
  1784.  *
  1785.  */
  1786.  
  1787. int writestring(char *datafile, int whichstring, char *writethis)
  1788. {
  1789.   char s[81],s1[161];
  1790.   stringrec astring;
  1791.   int i;
  1792.   long l;
  1793.  
  1794.   sprintf(s,"%s%s.DAT",RAMDRIVE,datafile);
  1795.   i=open(s,O_RDWR | O_BINARY);
  1796.   if (i<0) {
  1797.     sprintf(s,"%s%s.DAT",DATADIR,datafile);
  1798.     i=open(s,O_RDWR | O_BINARY);
  1799.     if (i<0) {
  1800.       return(0);
  1801.     }
  1802.   }
  1803.   lseek(i,((long)(whichstring-1))*(sizeof(astring)),SEEK_SET);
  1804.   l=strlen(writethis);
  1805.   strcpy(s1,writethis);
  1806.   if (write(i, (void *)s1, l)!=-1) {
  1807.     close(i);
  1808.     return(1);
  1809.   } else
  1810.     return(0);
  1811. }
  1812. /*
  1813.  * Example:
  1814.  *
  1815.  * if (!writestring("RANDOM","Stash this string in the third record.",3))
  1816.  *   outstr("String write failed. RANDOM.DAT isn't there?");
  1817.  *
  1818.  */
  1819.  
  1820. /*═════════════════════════════════════════════════════════════════════════*/
  1821.  
  1822. int okfancy()
  1823. /*
  1824.  * Checks to see if the sysstatus_fancy bit is toggled on. Use it as you
  1825.  * wish. I use it for determining how much neat ANSI to send at people,
  1826.  * since some like it and some do not.
  1827.  *
  1828.  */
  1829. {
  1830.   if (thisuser.sysstatus & sysstatus_fancy)
  1831.     return(1);
  1832.   else
  1833.     return(0);
  1834. }
  1835. /*
  1836.  * Example:
  1837.  *
  1838.  * if (okfancy())
  1839.  *   ansic(6);
  1840.  * pl(s);
  1841.  *
  1842.  */
  1843.  
  1844. /*═════════════════════════════════════════════════════════════════════════*/
  1845.  
  1846. int primetime()
  1847. /*
  1848.  * This function checks to see if the current time is between the declared
  1849.  * prime time, for uploading, downloading, bimodeming, etc. If it is then
  1850.  * this function is returned as true (1), else it is false (0);
  1851.  *
  1852.  */
  1853. {
  1854.   if (!(thisuser.exempt & exempt_primetime)) {
  1855.     if ((timer()>=PRIMETIMESTART) && (timer()<=PRIMETIMEEND))
  1856.       return(1);
  1857.     else
  1858.       return(0);
  1859.   } else
  1860.     return(0);
  1861. }
  1862. /*
  1863.  * Example:
  1864.  *
  1865.  * if (primetime())
  1866.  *   pl("Sorry, it's primetime. Xfers are closed. Call back later.");
  1867.  *
  1868.  */
  1869.  
  1870. /*═════════════════════════════════════════════════════════════════════════*/
  1871.  
  1872. void noise(int startfreq, int endfreq, int step, int paws, int repeats)
  1873. /*
  1874.  * This function takes several parameters. Depending on these parameters,
  1875.  * a noise will be made locally. We use this for such things as newuser
  1876.  * logon, file access, chain access, logoff, chat, etc.
  1877.  *
  1878.  * The parameters are as follows:
  1879.  *
  1880.  * startfreq : The start frequency in hertz.
  1881.  * endfreq   : The end frequency in hertz.
  1882.  * step      : The number of hertz to step between startfreq and endfreq.
  1883.  *             This number should be negative if endfreq is less than
  1884.                                                          startfreq.
  1885.  * paws      : The paws in milliseconds between repetitions.
  1886.  * repeats   : The number of times to repeat the entire sequence.
  1887.  *
  1888.  * ANSI not required.
  1889.  *
  1890.  */
  1891. {
  1892.   int i,x,z;
  1893.  
  1894.   x=0;
  1895.   if (startfreq<endfreq) {
  1896.     do {
  1897.       z=startfreq;
  1898.       do {
  1899.         sound(z);
  1900.         delay(paws);
  1901.         z+=step;
  1902.       } while ((z <= endfreq) && (!hangup));
  1903.       x++;
  1904.     } while((x < repeats) && (!hangup));
  1905.   } else {
  1906.     do {
  1907.       z=startfreq;
  1908.       do {
  1909.         sound(z);
  1910.         delay(paws);
  1911.         z+=step;
  1912.       } while ((z >= endfreq) && (!hangup));
  1913.       x++;
  1914.     } while((x < repeats) && (!hangup));
  1915.   }
  1916.   nosound();
  1917. }
  1918. /*
  1919.  * Example:
  1920.  *
  1921.  * noise(100,800,25,20,3);
  1922.  * newuser();
  1923.  *
  1924.  */
  1925.  
  1926. /*═════════════════════════════════════════════════════════════════════════*/
  1927.  
  1928. void send_ssm()
  1929. /*
  1930.  * This function allows a caller, if his/her security level is higher than
  1931.  * that of a newuser, to send a one-line message to another caller, that will
  1932.  * be seen the next time that caller logs on. It is just like the messages
  1933.  * such as "Mr. Dude read your mail on XX/XX/XX.", and shown in the same
  1934.  * place. (SSM.EXE included in SSM###.ZIP, where ### is the current version
  1935.  * number, will also allow this function, and more.)
  1936.  *
  1937.  */
  1938. {
  1939.   char s1[81],*ss;
  1940.   int un;
  1941.  
  1942.   if (actsl > syscfg.newusersl) {
  1943.     clearscreen();
  1944.     outstr("Send a short message? ");
  1945.     if (yn()) {
  1946.       nl();
  1947.       prt(1,"Enter caller's name or number: ");
  1948.       ansic(0);
  1949.       input(s1,30);
  1950.       ss=strchr(s1,64);
  1951.       if (ss==NULL) {
  1952.         un=finduser1(s1);
  1953.         if (un>0) {
  1954.           nl();
  1955.           pl("Enter short message now.");
  1956.           prt(2,": ");
  1957.           mpl(70);
  1958.           ansic(4);
  1959.           inputl(s1,70);
  1960.           ssm(un,0,s1);
  1961.           nl();
  1962.           pl("Short message has been sent!");
  1963.           nl();
  1964.         } else {
  1965.           pl("Who?!?");
  1966.           nl();
  1967.         }
  1968.       } else {
  1969.         pl("Can't send a short message across the net!");
  1970.         nl();
  1971.       }
  1972.     }
  1973.   }
  1974. }
  1975.  
  1976. /*═════════════════════════════════════════════════════════════════════════*/
  1977.  
  1978. void goxy(int i, int j)
  1979. /*
  1980.  * This function will position the cursor at x:i, y:j coordinates on the
  1981.  * screen. If the user has no ANSI then nothing happens.
  1982.  *
  1983.  */
  1984. {
  1985.   char s[12];
  1986.  
  1987.   if (okansi()) {
  1988.     sprintf(s,"\x1b[%d;%dH",j,i);
  1989.     outstr(s);
  1990.   }
  1991. }
  1992. /*
  1993.  * Example:
  1994.  *
  1995.  * goxy(12,22);
  1996.  *
  1997.  */
  1998.  
  1999. /*═════════════════════════════════════════════════════════════════════════*/
  2000.  
  2001. void left(int i)
  2002. /*
  2003.  * This function will reposition the cursor i spaces to the left, or if the
  2004.  * cursor is on the left side of the screen already then it will not move.
  2005.  * If the user has no ANSI then nothing happens.
  2006.  *
  2007.  */
  2008. {
  2009.   char s[10];
  2010.  
  2011.   if (okansi()) {
  2012.     sprintf(s,"\x1b[%dD",i);
  2013.     outstr(s);
  2014.   }
  2015. }
  2016. /*
  2017.  * Example:
  2018.  *
  2019.  * left(6);
  2020.  *
  2021.  */
  2022.  
  2023. /*═════════════════════════════════════════════════════════════════════════*/
  2024.  
  2025. void right(int i)
  2026. /*
  2027.  * This function repositions the cursor i spaces to the right, not moving it
  2028.  * at all if it is already on the righthand side of the screen. If the
  2029.  * user hasn't got ANSI then nothing happens.
  2030.  *
  2031.  */
  2032. {
  2033.   char s[10];
  2034.  
  2035.   if (okansi()) {
  2036.     sprintf(s,"\x1b[%dC",i);
  2037.     outstr(s);
  2038.   }
  2039. }
  2040. /*
  2041.  * Example:
  2042.  *
  2043.  * right(12);
  2044.  *
  2045.  */
  2046.  
  2047. /*═════════════════════════════════════════════════════════════════════════*/
  2048.  
  2049. void up(int i)
  2050. /*
  2051.  * This function repositions the cursor i spaces upwards, not moving it at
  2052.  * all if it is already on the upper line of the screen. If the user has no
  2053.  * ANSI then nothing happens.
  2054.  *
  2055.  */
  2056. {
  2057.   char s[10];
  2058.  
  2059.   if (okansi()) {
  2060.     sprintf(s,"\x1b[%dA",i);
  2061.     outstr(s);
  2062.   }
  2063. }
  2064. /*
  2065.  * Example:
  2066.  *
  2067.  * up(25);
  2068.  *
  2069.  */
  2070.  
  2071. /*═════════════════════════════════════════════════════════════════════════*/
  2072.  
  2073. void down(int i)
  2074. /*
  2075.  * This function repositions the cursor i spaces to the bottom, not moving it
  2076.  * at all if it is already on the bottom line of the screen. If the user has
  2077.  * no ANSI then nothing happens.
  2078.  *
  2079.  */
  2080. {
  2081.   char s[10];
  2082.  
  2083.   if (okansi()) {
  2084.     sprintf(s,"\x1b[%dB",i);
  2085.     outstr(s);
  2086.   }
  2087. }
  2088. /*
  2089.  * Example:
  2090.  *
  2091.  * down(1);
  2092.  *
  2093.  */
  2094.  
  2095. /*═════════════════════════════════════════════════════════════════════════*/
  2096.  
  2097. void clearline()
  2098. /*
  2099.  * This function clears the current line, if the user has ANSI, otherwise
  2100.  * nothing happens.
  2101.  *
  2102.  */
  2103. {
  2104.   if (okansi()) {
  2105.     outstr("\x1b[K");
  2106.   }
  2107. }
  2108. /*
  2109.  * Example:
  2110.  *
  2111.  * clearline();
  2112.  *
  2113.  */
  2114.  
  2115. /*═════════════════════════════════════════════════════════════════════════*/
  2116.  
  2117. void frame(int bordercolor, int x1, int y1, int x2, int y2)
  2118. /*
  2119.  * This function creates a colored frame around an area on the screen. The
  2120.  * screen within the frame is not cleared or overwritten. Nice for special
  2121.  * titling effects and whatnot.
  2122.  *
  2123.  */
  2124. {
  2125.   char s[91];
  2126.   int i,z;
  2127.  
  2128.   if (okansi()) {
  2129.     ansic(bordercolor);
  2130.     strcpy(s,"╒");
  2131.     for (i=0;i<(x2-x1-1);i++)
  2132.       strcat(s,"═");
  2133.     strcat(s,"╕");
  2134.     goxy(x1,y1);
  2135.     outstr(s);
  2136.     if ((y2-y1)>1) {
  2137.       for (z=0;z<(y2-y1-1);z++) {
  2138.         goxy(x1,y1+1+z);
  2139.         outstr("│");
  2140.         goxy(x2,y1+1+z);
  2141.         outstr("│");
  2142.       }
  2143.     }
  2144.     strcpy(s,"╘");
  2145.     for (i=0;i<(x2-x1-1);i++)
  2146.       strcat(s,"═");
  2147.     strcat(s,"╛");
  2148.     goxy(x1,y2);
  2149.     outstr(s);
  2150.   }
  2151. }
  2152. /*
  2153.  * Example:
  2154.  *
  2155.  * frame(4,11,3,70,5);
  2156.  * writebetween(12,69,4,3,"This is color #3 centered in the frame.");
  2157.  *
  2158.  */
  2159.  
  2160. /*═════════════════════════════════════════════════════════════════════════*/
  2161.  
  2162. void makewin(int bordercolor, int wincolor, int x1, int y1, int x2, int y2)
  2163. /*
  2164.  * This function will create an ansi box with (x1,y1) the top left corner
  2165.  * and (x2,y2) the bottom right corner of the box in the color specified.
  2166.  * The inside of the box is cleared and set to wincolor.
  2167.  *
  2168.  */
  2169. {
  2170.   char s[91];
  2171.   int i,z;
  2172.  
  2173.   if (okansi()) {
  2174.     frame(bordercolor,x1,y1,x2,y2);
  2175.     ansic(wincolor);
  2176.     if ((y2-y1)>1) {
  2177.       for (z=0;z<(y2-y1-1);z++) {
  2178.         strcpy(s," ");
  2179.         for (i=0;i<(x2-x1-2);i++)
  2180.           strcat(s," ");
  2181.         goxy(x1+1,y1+1+z);
  2182.         outstr(s);
  2183.       }
  2184.     }
  2185.   }
  2186. }
  2187. /*
  2188.  * Example:
  2189.  *
  2190.  * makewin(4,2,11,3,70,23);
  2191.  *
  2192.  */
  2193.  
  2194. /*═════════════════════════════════════════════════════════════════════════*/
  2195.  
  2196. void clearscreen()
  2197. /*
  2198.  * This function clears the screen, using ANSI escape codes if the user
  2199.  * has ANSI toggled on, else using the normal WWIV method of spitting out
  2200.  * an ASCII 012.
  2201.  *
  2202.  */
  2203. {
  2204.   if (okansi()) {
  2205.     outchr(12);
  2206.     outstr("\x1b[2J");
  2207.   } else {
  2208.     outchr(12);
  2209.   }
  2210. }
  2211. /*
  2212.  * Example:
  2213.  *
  2214.  * clearscreen();
  2215.  *
  2216.  */
  2217.  
  2218. /*═════════════════════════════════════════════════════════════════════════*/
  2219.  
  2220. void cleareol()
  2221. /*
  2222.  * If the user has ANSI then this function will clear from the current cursor
  2223.  * position to the end of the line.
  2224.  *
  2225.  */
  2226. {
  2227.   if (okansi())
  2228.     outstr("\x1b[K");
  2229. }
  2230. /*
  2231.  * Example:
  2232.  *
  2233.  * cleareol();
  2234.  *
  2235.  */
  2236.  
  2237. /*══════════════════════════  END OF ENHANCE.C  ═══════════════════════════*/
  2238.  
  2239.  
  2240.  
  2241.  
  2242.  
  2243.  
  2244. [10/99]: Another one of Airflight's Cheap Mods
  2245. [Name ]: Airflight #44 @7495
  2246. [Date ]: Mon Dec 16 20:02:30 1991
  2247. [From ]: -=-{ The Empire BBS }-=- (Southern California)
  2248.  
  2249. [REPLY]: Not Necessary.
  2250.  
  2251.  
  2252.  
  2253. ╓──────────────────────────────────────────────────────────────────────────────╖
  2254. ║ Name: AIF02.MOD                                        Released: 12/16/91    
  2255. ║ Versions: Tested on 4.20 -- Should work on 4.xx though.                      
  2256. ║ Difficulty: ██░░░                                                            
  2257. ║                                                                              
  2258. ║  Description:  This little additive will alow you and your users edit their  
  2259. ║ macros when they are entering a message.  All they have to do is type:       
  2260. ║ /MACROS -- Of course, you can shorten this by putting in /M or something 
  2261. like║
  2262. ║ that just as easy.                                                           
  2263.  
  2264. ╙──────────────────────────────────────────────────────────────────────────────╜
  2265.  
  2266.         Ok, this mod is sooooooooooooooooooooo simple. I would hardly call it
  2267.  something worth putting out because of the degree of difficulty involved,but
  2268.  I decided to put it out because it is quite useful.  I should have put it in
  2269.  my system ages ago.  Anyways, when your users type '/MACROS', in the message
  2270.  editor, it will allow them to edit their macros.  For instance, if they want
  2271.  to annoy someone by just putting one line in a zillion times, or just change
  2272.  they're macro because they don't like the one they have. It will save them a
  2273.  trip that they won't have to make.  Anyways, here it is.  Pretty simple.
  2274.  
  2275.  Step 1:  BACKUP your source code.  I am sure you know how to do it, but if
  2276.           you don't, go in your source dir and type:
  2277.           pkzip backup *.c *.h *.obj <Enter>.
  2278.  
  2279.  Step 2:  This part is just a tad bit harder.  Fire up either turbo c or your
  2280.           fav. text editor.  <I know it's hard, but try> =)
  2281.  
  2282.  Step 3:  Load MSGBASE.C and go in void inmsg(..Blah).  Then search for
  2283.           "/TI" <with or without the quotes, either way you'll get it>
  2284.           and right above it, add the following code:
  2285.  
  2286.         if (stricmp(s,"/RL")==0) {     /* EXISTING */
  2287.           savel=0;                     /* EXISTING */
  2288.           if (curli) {                 /* EXISTING */
  2289.             --curli;                   /* EXISTING */
  2290.             pl("Replace:");            /* EXISTING */
  2291.           } else {                     /* EXISTING */
  2292.             pl("Nothing to replace."); /* EXISTING */
  2293.           }                            /* EXISTING */
  2294.         }                              /* EXISTING */
  2295.         if (stricmp(s,"/MACROS")==0) {                 /*ADD -- SEE NOTE*/
  2296.         nl();                                          /* ADD */
  2297.         prt(2,"You may now edit your macros...\r\n");  /* ADD */
  2298.         nl();                                          /* ADD */
  2299.         make_macros();                                 /* ADD */
  2300.         nl();                                          /* ADD */
  2301.         nl();                                          /* ADD */
  2302.         prt(3,"Continue with your message!");          /* ADD */
  2303.         nl();                                          /* ADD */
  2304.         }                                              /* ADD */
  2305.         if (stricmp(s,"/TI")==0) {                     /* EXISTING */
  2306.           savel=0;                                     /* EXISTING */
  2307.           helpl=26;                                    /* EXISTING */
  2308.  
  2309.  Step 4:  Save & Compile!
  2310.  
  2311.  Disclaimer:  I, Josh Deeden, take NO responsibility for the actions of this
  2312.  MOD.  You took FULL responsibility when you decided to put it in.  I will
  2313.  be more then happy to help you out if you have any problems with this mod.
  2314.  Just remember, I am NOT responsible for this little creature!
  2315.  
  2316.                            /\irflight's /\bode
  2317.                         Sysops:  /\irflight & Co.
  2318.                              714 247 2542
  2319.                        Located in Moreno Valley, CA
  2320.                              WWIVlink @17474
  2321.                        Running WWIV 4.20 /\ Modded
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330.  
  2331.  
  2332.  
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.  
  2339.  
  2340.  
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363. [11/99]: insysmenu
  2364. [Name ]: Mustang #1 @5301
  2365. [Date ]: Wed Dec 18 18:20:18 1991
  2366. [From ]: Full Force (Oregon)
  2367.  
  2368.  [Reply to]  Regarding SYsmenu.mod
  2369.   [AUTHOR]   Eric Fuller #1 @6477
  2370. [Msg Status] No reply needed.
  2371. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2372.  
  2373.      Just add it to the VARS.H file in the externs... that works fine too.
  2374.  
  2375.  
  2376.            Full Force    (503)-772-0304  300-9600 baud    Node 5301            
  2377.                ░▒░▒▓█ MS Windows/SoundBlaster/VGA Support █▓▒░▒░ 
  2378.  
  2379.  
  2380.  
  2381.  
  2382.  
  2383. [12/99]: < TYPE all files of a specified parameter >
  2384. [Name ]: Master Daarkhan #1 @7653
  2385. [Date ]: Wed Dec 18 01:32:37 1991
  2386. [From ]: The Dungeon (Upstate New York)
  2387.  
  2388.     The following post is not necessarily a WWIV modification, but instead is
  2389. a helpful batch technique that I feel many sysops (and non-sysops) will find
  2390. useful. If this is documented somewhere, I am unaware of it as I have written
  2391. this of my own accord, but it is not too difficult and takes only a few
  2392. seconds to impliment.
  2393.  
  2394.     What it does, is allow you, through the use of two small BATch files to
  2395. TYPE files of a given parameter. For example, you could use it to type out
  2396. all of your NN*.NET files, or maybe type all of your *.H files. The TYPE
  2397. statement itself cannot handle such a parameter as the infamous '*' symbol,
  2398. so I figured I'd write this out.
  2399.  
  2400.     The technique uses two batch files. One will call the other, so you will
  2401. only have to type in one quick statement. Follow these simple instructions to
  2402. use:
  2403.  
  2404.     1. Copy this file into your /BATCH directory (Oh come on! Everyone
  2405.          should have a /BATCH directory by now!) as TYPEALL.BAT:
  2406.  
  2407.               TYPEALL.BAT
  2408.                    @echo off
  2409.                    for %%p in (%1) do call typeit %%p
  2410.  
  2411.  
  2412.     2. Copy this file as TYPEIT.BAT:
  2413.               
  2414.               TYPEIT.BAT
  2415.                    @echo off
  2416.                    echo.
  2417.                    echo ------------
  2418.                    echo %1
  2419.                    echo ------------
  2420.                    type %1
  2421.                    echo ------------
  2422.                    echo.
  2423.                    pause
  2424.  
  2425.     To use, call TYPEALL with whatever command-line parameters you can think
  2426. of. It will accept many combinations, and I have absolutely no idea of what
  2427. you can and can't get away with! If you find something that it doesn't like,
  2428. please let me know!
  2429.  
  2430.     Note: Users of a DOS version earlier than 3.3 will have to use the
  2431. "command /c" instead of the "call" function to have TYPEALL access TYPEIT.
  2432.  
  2433.     Example: Well, say you want to print out all of your N*.NET files, this
  2434. is what it would look like (your input is in flashing red)
  2435.  
  2436. C:\> TYPEALL NN*.NET
  2437.  
  2438. --------------
  2439. N7653.NET
  2440. --------------
  2441. 4323
  2442. 6535
  2443. 6356
  2444. 8737
  2445. --------------
  2446.  
  2447. Press any key to continue . . . [ENTER]
  2448.  
  2449. --------------
  2450. NN27653.NET                                 (Yeah, don't forget that the
  2451. --------------                              parameter we specified would
  2452. 2452                                        also print out NN files as
  2453. 6535                                        well!)
  2454. --------------
  2455.  
  2456. Press any key to continue . . . [ENTER]
  2457.  
  2458.  
  2459.     Well, that's about it. If you use this, and find it helpful, all I ask is
  2460. that you please drop me an Email (1@7653) so that I know SOMEONE likes my
  2461. helpful batch techniques, and I'll keep posting them!
  2462.  
  2463. ┌┐┌┐┌┐┌┐┌┐
  2464. │Daarkhan│
  2465. └┘└┘└┘└┘└┘
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473. [13/99]: Help!!!!
  2474. [Name ]: Camper #61 @5866
  2475. [Date ]: Mon Dec 16 18:02:54 1991
  2476. [From ]: The Computer Hideout (Upstate New York)
  2477.  
  2478.  
  2479.       Does anybody have or know if there is any mod to access a cd rom disk 
  2480. through 4.20???
  2481.  
  2482.                            -=≡≥ÇÄmPΣΓ≤≡=-
  2483.  
  2484. ░▒▓│ The Computer Hideout ∞ 5866 ∞ 518-869-7641 ∞ 38400 ∞ Albany, New York│▓▒░
  2485.  
  2486.  
  2487.  
  2488.  
  2489.  
  2490.  
  2491. [14/99]: to the host...
  2492. [Name ]: James Dolan #1 @3473
  2493. [Date ]: Sun Dec 15 22:22:04 1991
  2494. [From ]: The Dragon's Weyr (Missouri)
  2495.  
  2496. testing.
  2497.  
  2498. had a problem with my *.dat files for the board, am I coming through correctly?
  2499.  
  2500. Jim Dolan, JIM-N-I Enterprises
  2501. Computer Equipment, Software & Supplies
  2502. Sales & Service
  2503. (314) 962-9014
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511. [15/99]: VRMENU.MOD  (VR #2) --Makes choices pop up after letter.
  2512. [Name ]: Vortex Rouge #163 @5853
  2513. [Date ]: Thu, Dec 19, 1991   5:26 pm
  2514. [From ]: The Dark Side of the Moon BBS (Upstate New York)
  2515.  
  2516. VRMENU.MOD
  2517.  
  2518. _____________________________________________________________________________
  2519. Name      : VRMENU.MOD (Mod #2)  Description: In any menu you choose, this 
  2520. Version   : 4.20                 Mod will output the routine after the letter
  2521. Diffuculty: Easy                 IE: When a user hit's `D' it will print
  2522.                                  out `efaults' making it Defaults.
  2523. _____________________________________________________________________________
  2524. /* I started out thinking this would be an easy mod...but ran into some 
  2525. problems with nl()'s...I traced the new lines back to function *mmkey(..)
  2526. I forgot exacly where I took stuff out of *mmkey(..)...but it wasn't much
  2527. Just replace  your orgional *mmkey with the *mmkey below.
  2528.  
  2529. /* FILE: bbsutil.c */
  2530. /* Begin VRMENU.MOD Blockread */
  2531. char *mmkey(int dl)
  2532. {
  2533.   static unsigned char cmd1[10],cmd2[81],ch;
  2534.   int i,i1,i2,p;
  2535.  
  2536.   do {
  2537.     do {
  2538.       ch=getkey();
  2539.     } while ((((ch<' ') && (ch!=13)) || (ch>126)) && (hangup==0));
  2540.     ch=upcase(ch);
  2541.     outchr(ch);
  2542.     if (ch==13)
  2543.       cmd1[0]=0;
  2544.     else
  2545.       cmd1[0]=ch;
  2546.     cmd1[1]=0;
  2547.     p=0;
  2548.     switch(dl) {
  2549.  
  2550.     case 1:
  2551.       if (strchr(dcd,ch)!=NULL)
  2552.         p=1;
  2553.       break;
  2554.     case 2:
  2555.       if (strchr(odc,ch)!=NULL)
  2556.         p=1;
  2557.       break;
  2558.     case 0:
  2559.       if (strchr(dc,ch)!=NULL)
  2560.         p=1;
  2561.       break;
  2562.     }
  2563.     if (p) {
  2564.       do {
  2565.         ch=getkey();
  2566.       } while ((((ch<' ') && (ch!=13) && (ch!=8)) || (ch>126)) && 
  2567. (hangup==0));  /* This line and the above are one line. From }while to ==0)); 
  2568. */
  2569.       ch=upcase(ch);
  2570.       if (ch==13) {
  2571.         nl();
  2572.         return(cmd1);
  2573.       } else
  2574.         if (ch==8) {
  2575.           backspace();
  2576.         } else {
  2577.           cmd1[1]=ch;
  2578.           cmd1[2]=0;
  2579.           outchr(ch);
  2580.           if (ch=='/') {
  2581.             input(cmd2,50);
  2582.             return(cmd2);
  2583.           } else
  2584.             return(cmd1);
  2585.         }
  2586.     } else {
  2587.       return(cmd1);
  2588.     }
  2589.   } while (hangup==0);
  2590.   cmd1[0]=0;
  2591.   return(cmd1);
  2592. }
  2593. /* End VRMENU.MOD Blockread */
  2594.  
  2595. OK, here comes the time consuming part.. in all your main menu cases, do 
  2596. something like what was done below for defaults. If you have your prompt set
  2597. on a different color than light blue, just chage the 1 in the prt statement
  2598. to whatever number you wish. Just follow the below example, and you should
  2599. be home free.
  2600.  
  2601.  
  2602.  case 'D':
  2603.         prt(1,"efaults");
  2604.         helpl=4;
  2605.         defaults();
  2606.         break;
  2607.  
  2608.  
  2609. If you have any questions/comments send them to me at:
  2610.   1 @5899  (SUBBnet)
  2611. 163 @5853  (WWIVnet)
  2612.  91 @5801  (VBBSnet)
  2613.      -=Insert Favorite Disclaimer Here=-
  2614.                         -Vorte
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  
  2621. [16/99]: NO! (re: SYsmenu Mod)
  2622. [Name ]: Stingray #52 @5060
  2623. [Date ]: Thu Dec 19 10:40:25 1991
  2624. [From ]: Fuzzball Land (Unknown Area)
  2625.  
  2626. That will NOT work, and will bring out all kinds of messups...
  2627. it'll allow the function to recurse into itself.
  2628. which will REALLY get you confused
  2629. and can crash your system!
  2630. Don't change that like and add "insysmenu"..
  2631. instead, there was something I left out of the 4.20 version..
  2632. When you add ",insysmenu" to the list of "int"s in VARS.H, you must also add it to the "extern int"s in the same manner.
  2633. Sorry for any inconvenience.
  2634. -----
  2635. Stingray
  2636.  
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.  
  2644. [17/99]: -
  2645. [Name ]: The Nut #2 @4801
  2646. [Date ]: Wed Dec 18 06:56:04 1991
  2647. [From ]: The Cutting Edge (Central California)
  2648.  
  2649. RE: Regarding SYsmenu.mod
  2650. BY: Eric Fuller #1 @6477
  2651.  
  2652. The SysOp Menu Is Good EXECPT!!! This Is A Major bug when a user calls  before 
  2653. they type there name.. at The NN: Prompt you can hit CTRL-E or whatever you 
  2654. set Yous crtl code to and the menu will load!!! because at the wfc menu it  
  2655.   sets USERNUM=1 and until the user logon wwiv thinks user one is on there and 
  2656. user one has 255!! HINT HINT!!
  2657.  
  2658.  well an easy way to stop it is Before The NN Prompt add a line which SAY
  2659.  
  2660.  usernum=0
  2661.  
  2662. it's very simple... and if you don't it's very deadly!!!!!!!
  2663.  
  2664.    ≡=-The-The-=≡
  2665.    SysOp #3
  2666.    The Cutting Edge (408)479-3364 
  2667.    WWIVnet 2@4801 ─ Fido Net 1:216/512.1 ─ V-Net 53@4085
  2668.  
  2669. ┌────────────┐
  2670. │Message Done│
  2671. └────────────┘
  2672.  
  2673.                     ┌───────────────────────────────────────┐
  2674.                     │ The Cutting Edge BBS - (408) 479-3364 │
  2675.                     │ Capitola, Ca.  -=-  WWIVnet Node 4801 │
  2676.                     │ SysOp : Daniel Duerr, Numdum, The Nut │
  2677.                     └───────────────────────────────────────┘
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685. [18/99]: CD ROM Disks
  2686. [Name ]: Sam #1 @7106
  2687. [Date ]: Sat Dec 21 00:58:31 1991
  2688. [From ]: Sam's BBS [ASV] (North Dakota)
  2689.  
  2690. This is concerning: Help!!!!
  2691. Posted By: Camper #61 @5866
  2692.  
  2693. ~~~~~~~~~~~~~~~~~~~~~~~~~ Quoted from your message ~~~~~~~~~~~~~~~~~~~~~~~~~
  2694.       Does anybody have or know if there is any mod to access a cd rom disk 
  2695. through 4.20???
  2696.                            -=≡≥ÇÄmPΣΓ≤≡=-
  2697. ░▒▓│ The Computer Hideout ∞ 5866 ∞ 518-869-7641 ∞ 38400 ∞ Albany, New York│▓▒░
  2698. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ My reply below ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2699.  
  2700. I am currently running one CD ROM drive, and am fixing to put one more 
  2701. online....
  2702.  
  2703.    Email me if you need more help....but I think that you can do what you need 
  2704. to do by using //Boardedit.....
  2705.  
  2706.                                        ⌠
  2707.                                        ⌡àm
  2708.                                      1@7106
  2709.                      Sam's ßßS...The ƒíñèst in adult ƒúñ!!!
  2710.  
  2711.  
  2712.  
  2713.  
  2714.  
  2715.  
  2716.  
  2717. [19/99]: Sorry...
  2718. [Name ]: Transgressor #294 @9800
  2719. [Date ]: Wed Dec 18 21:56:44 1991
  2720. [From ]: Maniac Mansion III (Unknown Area)
  2721.  
  2722. Sorry for not posting a Mod, but I am seriously looking for a WWIV v4.20 
  2723. Byline Mod. Let me know if theres any out there. Thanks...
  2724.  
  2725.            ⌠   ⌠⌠
  2726. ────── ┼räñ⌡GrΣ⌡⌡σr ──────
  2727.        ╬╬╬╬╬╬╬╬╬╬╬╬
  2728.  
  2729. LâsΣr-Rσm 2000 {908}634-6274
  2730. 1@9823
  2731. A Graphic NightMare
  2732. WWIV v.4.20  {Totally MODIFIED!}
  2733.  
  2734.  
  2735.  
  2736.  
  2737.  
  2738.  
  2739. [20/99]: STREET02.MOD
  2740. [Name ]: Streetdoc #1 @2503
  2741. [Date ]: Fri Dec 20 19:27:40 1991
  2742. [From ]: Streetdoc's Place (Alabama)
  2743.  
  2744.  
  2745.  
  2746.  /***********************************************************
  2747.    MODNAME:    STREET02.MOD        Date: 12/20/1991
  2748.    Difficulty: NOT
  2749.    Version:    4.20
  2750.    Author:     Streetdoc 1@2503
  2751.    Function: Sends short message to you, notifying you of any uploads
  2752.  
  2753.    Why:  I don't always remember to check my sysop dir for any new uploads
  2754.          and I don't always check my sysoplog as I should, so I needed a
  2755.          way to know when a user had uploaded a file. This (mini)-mod sends
  2756.          a short message to you as you logon with this info. This mod assumes
  2757.          that you force all uploads to your sysop dir. It replaces the upload
  2758.          dir with the user name in the sysoplog and the short message. The
  2759.          ssm(x,0,s) is used, with the x being the account that the note is
  2760.          sent to and the s being the message sent.
  2761.                  
  2762.    (Insert favorite disclaimer here........) 
  2763.     
  2764.              
  2765. ****************************************************************/
  2766.       All the changes are in XFER.C. in void upload()
  2767.  
  2768.    ++status.uptoday;   /* search for this */
  2769.    save_status();
  2770.    sprintf(s,"+%s uploaded by %s",u.filename,thisuser.name); /* change */
  2771.    sysoplog(s);
  2772.    ssm(1,0,s);                                               /* add */
  2773.    nl();
  2774.    nl();
  2775.    pl("File uploaded.");
  2776.    nl();
  2777.    npr("Your ratio is now: %-6.3f\r\n", ratio());
  2778.    nl();
  2779.  
  2780.  
  2781.  
  2782.  
  2783.  
  2784.  
  2785. [21/99]: STREET03.MOD--Addition to Tolkien's ENHANCE.MOD
  2786. [Name ]: Streetdoc #1 @2503
  2787. [Date ]: Fri Dec 20 19:28:28 1991
  2788. [From ]: Streetdoc's Place (Alabama)
  2789.  
  2790.  
  2791.  
  2792.  /***********************************************************
  2793.    MODNAME:    STREET03.MOD        Date: 12/20/1991
  2794.    Difficulty: NOT
  2795.    Version:    4.20
  2796.    Author:     Streetdoc 1@2503 --Addition to the ENHANCE.C mod by Tolkien
  2797.    Function: Adds "Fancy Ansi" to your defaults menu. 
  2798.  
  2799.    Why:  If you are using the ENHANCE.C mod by Tolkien then you can use
  2800.          this to add the fancy_ansi sysstatus bit in your D)efaults menu.
  2801.          This way, the users can select whether or not they use the Fancy
  2802.          Ansi stuff.
  2803.  
  2804.          BTW, Tolkien, GREAT MOD!!! :) Thanks!
  2805.  
  2806.    (Insert favorite disclaimer here........) 
  2807.     
  2808.              
  2809. ****************************************************************/
  2810.  
  2811.  
  2812.   Search for these lines in defaults.c in void print_cur_stat()
  2813.  
  2814.  
  2815. pl("5. Configured Q-scan");
  2816.   pl("6. Change password");
  2817.   pl("7. Update macros");
  2818.   if (okansi()) {
  2819.     pl("8. Change colors");
  2820.     npr("9. Full screen editor: %s\r\n",
  2821.       ((thisuser.defed) && (thisuser.defed<=numed))?
  2822.         editors[thisuser.defed-1].description:"None.");
  2823.     npr("A. Extended colors   : %s\r\n",
  2824.       (thisuser.sysstatus & sysstatus_funky_colors)?"Yes":"No");
  2825.   }
  2826.   npr("B. Optional lines    : %d\r\n",thisuser.optional_val);
  2827.   if (okansi()) {                                             /* ADD */
  2828.   npr("C. Fancy ANSI        : %s\r\n",                        /* ADD */
  2829.      (thisuser.sysstatus & sysstatus_fancy)?"Yes":"No");      /* ADD */
  2830.      }                                                        /* ADD */
  2831.  
  2832.  Also in defaults.c in void defaults.....
  2833.  
  2834.  do {
  2835.     nl();
  2836.     helpl=4;
  2837.     if (okansi()) {
  2838.       prt(2,"Defaults: (1-9,A-B,?,Q) : ");
  2839.       ch=onek("Q?123456789ABCW");            /* add the C */
  2840.     } else {
  2841.       prt(2,"Defaults: (1-7,B,?,Q) : ");
  2842.       ch=onek("Q?1234567BW");
  2843.     }
  2844.  
  2845.  
  2846.     Further Down......
  2847.  
  2848. case 'B':
  2849.         optional_lines();
  2850.         break;
  2851. case 'C':                                            /* ADD */
  2852.         if (thisuser.sysstatus & sysstatus_fancy)    /* ADD */
  2853.           thisuser.sysstatus ^= sysstatus_fancy;     /* ADD */
  2854.         nl();                                        /* ADD */
  2855.         prt(5,"Use Fancy ANSI? ");                   /* ADD */
  2856.         if (yn())                                    /* ADD */
  2857.           thisuser.sysstatus |= sysstatus_fancy;     /* ADD */
  2858.         break;                                       /* ADD */
  2859. /*************************************************************************/
  2860.  One more thing.....
  2861.  In ENHANCE.C in void spin(blah,blah) I changed this line to allow regular
  2862.  Ansi users to still have the original colors. The way it worked before was
  2863.  Non-Fansy_ansi users only had white instead of the intended color.
  2864.  
  2865.  
  2866.   }
  2867.   } else {
  2868.     outstr(s);   /* changed to prt(d1,s); */
  2869.   }
  2870.   echo = i1;
  2871.  
  2872. /* This stuff works for me....if you have a problem, I'm not responsible */
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879. [22/99]: STREET04.MOD
  2880. [Name ]: Streetdoc #1 @2503
  2881. [Date ]: Fri Dec 20 22:07:49 1991
  2882. [From ]: Streetdoc's Place (Alabama)
  2883.  
  2884.  
  2885.  
  2886.  /***********************************************************
  2887.    MODNAME:    STREET04.MOD        Date: 12/20/1991
  2888.    Difficulty: NOT
  2889.    Version:    4.20
  2890.    Author:     Streetdoc 1@2503
  2891.    Function:   Adds username to "Read you mail now?" and the
  2892.                "Sorry, no mail" prompts.
  2893.  
  2894.    Why:        Why ask Why?
  2895.  
  2896.  
  2897.    (Insert favorite disclaimer here........) 
  2898.     
  2899.  Please send a note to 1@2503 if you use any of my mods. Thanks!
  2900. ****************************************************************/
  2901.  
  2902.  In LILO.C in void logon.....
  2903.  
  2904.  
  2905. rsm(usernum,&thisuser);            /* Search for this */
  2906.     if (thisuser.waiting) {
  2907.     strcpy(s,nam(&thisuser,usernum));           /* ADD */
  2908.       npr("Read your mail now %s?",s);    /* CHANGE */
  2909.       if (yn())
  2910.         readmail();
  2911.     }
  2912.  
  2913.  
  2914.   In BBS.C in void mainmenu....
  2915.  
  2916.     case 'M':                             /* Search for this */
  2917.         if (thisuser.waiting>0) {
  2918.           readmail();
  2919.         } else {
  2920.           nl();
  2921.         strcpy(s,nam(&thisuser,usernum));               /* ADD */
  2922.           npr("Sorry, %s you have no mail.",s);   /* CHANGE */
  2923.           nl();
  2924.         }
  2925.           break
  2926.  
  2927.  
  2928.  
  2929.  
  2930.  
  2931.  
  2932. [23/99]: DEFAULT.MOD
  2933. [Name ]: Flyer #1 @9438
  2934. [Date ]: Sat Dec 21 16:14:29 1991
  2935. [From ]: Sky Harbor (Florida)
  2936.  
  2937. ┌────────────────────────────────────────────────────────────────────────────┐
  2938. │ Mod Name: DEFAULT.MOD                   Mod Author: Flyer 1@9438           │
  2939. │ Difficulty: █▒                          Date: December 21, 1991            │
  2940. │ WWIV Version: 4.2                                                          │
  2941. │ Description:  Makes the defaults section colorized, and just makes it      │
  2942. │               look alot better.                                            │
  2943. └────────────────────────────────────────────────────────────────────────────┘
  2944.  
  2945.   After modding my board alot, most of the board looked really nice and
  2946.   colorful except for one part of it.  That was the defaults section.
  2947.   Whenever I would hit 'D' for defaults, it would just come up colorless,
  2948.   and it just didn't look good.  So I made the whole Defaults menu look
  2949.   different.
  2950.  
  2951.  
  2952. 1)  Back up your source (Why am I even saying this?)
  2953.  
  2954. 2)  Load up DEFAULTS.C, and go down to around line 55, or search for
  2955.     void print_cur_stat().
  2956.  
  2957. 3)  All this mod really requires is a block copy, so just delete the entire
  2958.     void, and replace it with mine.  Here is the new void:
  2959.  
  2960.  
  2961. void print_cur_stat()
  2962. {
  2963.   char s[81],s1[81],s2[81];
  2964.   userrec ur;
  2965.  
  2966.   outchr(12);
  2967.  
  2968.    pl("══════════════════════╗");
  2969.    pl("       Defaults       ║");
  2970.    pl("══════════════════════╣");
  2971.   npr("1. Screen size        ║ %d X %d\r\n",
  2972.         thisuser.screenchars,
  2973.         thisuser.screenlines);
  2974.   npr("2. ANSI               ║ %s\r\n",
  2975.      (thisuser.sysstatus & sysstatus_ansi)?
  2976.        ((thisuser.sysstatus & sysstatus_color)? "Color":"Monochrome"):
  2977.      "No ANSI");
  2978.   npr("3. Pause on screen    ║ %s\r\n",
  2979.      (thisuser.sysstatus & sysstatus_pause_on_page)?"On":"Off");
  2980.   outstr("4. Mailbox            ║ ");
  2981.   if ((thisuser.forwardsys==0) && (thisuser.forwardusr==0))
  2982.     pl("Normal");
  2983.   else {
  2984.     if (thisuser.forwardsys) {
  2985.       sprintf(s,"Forward to #%u @%u.",thisuser.forwardusr,thisuser.forwardsys);
  2986.       pl(s);
  2987.     } else {
  2988.       read_user(thisuser.forwardusr,&ur);
  2989.       if (ur.inact & inact_deleted) {
  2990.         thisuser.forwardusr=0;
  2991.         pl("Normal");
  2992.       } else {
  2993.         sprintf(s,"Forward to %s",nam(&ur,thisuser.forwardusr));
  2994.         pl(s);
  2995.       }
  2996.     }
  2997.   }
  2998.   pl("5. Configured Q-scan  ║");
  2999.   pl("6. Change password    ║");
  3000.   pl("7. Update macros      ║");
  3001.   if (okansi()) {
  3002.     pl("8. Change colors      ║");
  3003.     npr("9. Full screen editor ║ %s\r\n",
  3004.       ((thisuser.defed) && (thisuser.defed<=numed))?
  3005.         editors[thisuser.defed-1].description:"None.");
  3006.     npr("A. Extended colors    ║ %s\r\n",
  3007.       (thisuser.sysstatus & sysstatus_funky_colors)?"Yes":"No");
  3008.   }
  3009.   npr("B. Optional lines     ║ %d\r\n",thisuser.optional_val);
  3010.   if (thisuser.wwiv_regnum)
  3011.     npr("W. WWIV reg num       ║ %ld\r\n",thisuser.wwiv_regnum);
  3012.   else
  3013.     pl("W. WWIV reg num       ║ <NONE>");
  3014.   pl("Q. Quit to main menu  ║");
  3015.   pl("══════════════════════╝");
  3016.   nl();
  3017. }
  3018.  
  3019. 4)  Copy your new BBS.EXE, and go look at it and see if it looks ok.
  3020.  
  3021. Thats it!!!!
  3022.  
  3023. As a favor to me, please email me and tell that you have seen this mod
  3024. around, and that you decided to install it.  I would like to know how it
  3025. got around.
  3026.  
  3027. Flyer - 12/21/91
  3028.  
  3029.  
  3030.  
  3031.  
  3032.  
  3033.  
  3034. [24/99]: ...
  3035. [Name ]: |\/|Erlin #5 @6850
  3036. [Date ]: Sat Dec 21 09:44:04 1991
  3037. [From ]: FarPoint Station (Illinois)
  3038.  
  3039. RE: Help!!!!
  3040.  
  3041. >       Does anybody have or know if there is any mod to access a cd rom
  3042. > disk through 4.20???
  3043. >                            -=≡≥ÇÄmPΣΓ≤≡=-
  3044.  
  3045. Never know, v4.21 might....  but, if you get in a hurry, I do have a mod out
  3046. for v4.12 called CDROM.MOD that will allow you to access a PC Blue disk (you
  3047. know, the ones that have all the files separated out, and not zipped up...)
  3048.  
  3049. EC/Merlin
  3050.  
  3051.  
  3052.  
  3053.  
  3054.  
  3055.  
  3056. [25/99]: PIANO13.MOD - List current sub above read prompt (v4.20e)
  3057. [Name ]: Piano Man #38 @6870
  3058. [Date ]: Fri Dec 20 15:39:46 1991
  3059. [From ]: Unknown System
  3060.  
  3061. ****************************************************************************
  3062.                                  PIANO13.MOD
  3063. Written For: WWIV v4.20e
  3064. Written By: Piano Man 1@6851 (IceNET) 12@6850 (WWIVnet)
  3065. Date: December 20th, 1991   While:  Listening to RUSH (Freewill) :)
  3066. Difficulty:  Simple..
  3067. Description: Prints the current sub that a user is on above the read
  3068. prompt.  EXAMPLE:
  3069. General Forum
  3070. Read:(1-30),?");
  3071.  
  3072. It's a useful mod and it looks pretty cool!
  3073. Well,  this is my 14'th mod (2 PIANO10's -A&B) so please E-Mail me or call
  3074. my board,  the add is at the end of the file..  THANKS!
  3075. ****************************************************************************
  3076.  
  3077. Legend:
  3078. * = Search for
  3079. = = Current Code (Existing...)
  3080. - = Delete line
  3081. + = Add line
  3082. % = Moddify line
  3083.  
  3084.  
  3085. On with the mod!
  3086.  
  3087. Step 1 -> Load up MSGBASE1.C
  3088.  
  3089. Step 2 -> Search for "void scan"
  3090.  
  3091. Step 3 -> Change the 'char' statements to look like this:
  3092.  
  3093. =  void scan(int msgnum, int optype, int *nextsub)
  3094. =  {
  3095. %    char s[81],s1[81],s2[81],s3[81],*b,*ss1;  <- Add the "s3[81]"
  3096. =    int i,i1,i2,done,quit,abort,next,val,realexpress;
  3097. =    slrec ss;
  3098. =    long l,len;
  3099. =    postrec p,p1;
  3100.  
  3101. Step 4 -> Search for "Read Prompt"  and make following changes:
  3102.  
  3103. =  case 0: /* Read Prompt */
  3104. +    strcpy(s3,subboards[usub[cursub].subnum].name);
  3105. +    prt(1,s3);
  3106. %    sprintf(s,"Read:(1-%u,^%u), <ENTER> for next msg? :",nummsgs,msgnum);
  3107. =    nl();
  3108. =    if (express) {
  3109. =      s[0]=0;
  3110.  
  3111. Step 5 ->  Save it,  go to dos and type in MAKE and compile it.
  3112.  
  3113. This mod was written assuming you are running WWIV v4.20revision 'E' and are
  3114. compiling with Borland C++ v2.0.  So if it doesn't work,  go tell someone
  3115. else...
  3116.  
  3117. Thanks and I hope you like this mod!
  3118. Email me at 1@6851 (IceNET) and/or 12@6850 (WWIVnet)
  3119.  
  3120. Or call:
  3121.  
  3122. Milliways ]I[
  3123. The Spirit of Radio
  3124. WWIV v4.2e++ PIANOLIZED!
  3125. (618) 259-7707
  3126. 12/2400bps
  3127. IceNET @6851 (ZC/AC)
  3128. SysOp: Piano Man
  3129.  
  3130.  
  3131.  
  3132.  
  3133.  
  3134.  
  3135.  
  3136.  
  3137.  
  3138. [26/99]: WFC MOD
  3139. [Name ]: The Duck #1 @853
  3140. [Date ]: Sun Dec 22 02:00:29 1991
  3141. [From ]: The Duck Pond (Okinawa, Japan) (Unknown Area)
  3142.  
  3143. ANyone out there know JC or have a WFC Mod for Version 420E? If So please post 
  3144. it on the net, I can't seem to figure out how to get the old one to work with 
  3145. version 420.
  3146.  
  3147.                    quack QUACK    Σ█▌
  3148.                                     ██ε
  3149.                                     ╛╛                <<<The Duck>>>
  3150.  
  3151.  
  3152.  
  3153.            Σ█▌   The Duck Pond BBS, WWIVnet, Node 853  Σ█▌
  3154.              ██ε  011-81-611-7372545  Okinawa, Japan     ██ε
  3155.              ╛╛        Fun for the Whole Family          ╛╛
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162. [27/99]: Zmodem Batch with Version 420 and the Batch 300 mod
  3163. [Name ]: The Duck #1 @853
  3164. [Date ]: Sun Dec 22 02:02:25 1991
  3165. [From ]: The Duck Pond (Okinawa, Japan) (Unknown Area)
  3166.  
  3167. Help!!! Can't seem to get Zmodem to work on D/l's or uploads with the Batch 
  3168. 300 mod. I tried both the string suggested in the mod as well as those 
  3169. mentioned in the read.me file of version 420E. Any help would be appreciated.
  3170.  
  3171.                    quack QUACK    Σ█▌
  3172.                                     ██ε
  3173.                                     ╛╛                <<<The Duck>>>
  3174.  
  3175.  
  3176.  
  3177.            Σ█▌   The Duck Pond BBS, WWIVnet, Node 853  Σ█▌
  3178.              ██ε  011-81-611-7372545  Okinawa, Japan     ██ε
  3179.              ╛╛        Fun for the Whole Family          ╛╛
  3180.  
  3181.  
  3182.  
  3183.  
  3184.  
  3185.  
  3186. [28/99]: PIANO15.MOD - File request mod - May have already been wrote
  3187. [Name ]: Piano Man #38 @6870
  3188. [Date ]: Sat Dec 21 17:11:27 1991
  3189. [From ]: Unknown System
  3190.  
  3191. ****************************************************************************
  3192.                                PIANO15.MOD
  3193. Written by  : Piano Man 1@6851 (IceNET)
  3194. For         : WWIV v4.2e (Should work with v4.11 and v4.12 and others)
  3195. Date        : December 21st, 1991 (Merry Christmas!)
  3196. Difficulty  : Not hard...  Simple..
  3197. While       : I'm still recovering from my car wreck last night! :) So this
  3198.                 mod is just another production of my boredom... RUSH is STILL
  3199.                 playing in the back ground (The Spirit of Radio)
  3200. Description : When a user goes to download a file,  and the file is offline,
  3201.                 this mod will say that the file is backed up and prompt them
  3202.                 and ask them if they want to send the sysop mail to request
  3203.                 the file.  If they say yes,  it instantly kicks up the title
  3204.                 screen,  if they say no,  it jumps back down to the protocoll
  3205.                 prompt.  It's a good mod,  and I hope you enjoy it.
  3206. *****************************************************************************
  3207.  
  3208.  
  3209. Legend:
  3210. = Existing line
  3211. - Delete line
  3212. + Add line
  3213. % Modify Line
  3214. * Search for line
  3215.  
  3216.  
  3217. Load up XFER.C and search for:
  3218. "FILE NOT THERE"  and make changes around that as follows:
  3219.  
  3220.  
  3221. = sprintf(s,"%s%s",directories[dn].path,u->filename);
  3222. = if (!exist(s)) {
  3223. =  nl();
  3224. -  pl("FILE NOT THERE); /* Delete this line */
  3225. +  prt(3,"This file is backed up on disk and is not on line for you to 
  3226. download.\r\n");
  3227. +  prt(3,"Would you like to leave feedback to the SysOp to put it online? : ");
  3228. +  if (yn()) {
  3229. +  strcpy(irt,"File Request.");
  3230. +  irt_name[0]=0;
  3231. +  email(1,0,0,0);
  3232. +  }
  3233. =  nl();
  3234. =  return(-1);
  3235. =}
  3236.  
  3237. That's it!  Change it,  re word it,  whatever you feel like doing.  It's all
  3238. there for fun!  Thanks and Call my board sometime!  All PIANOWARE is available
  3239. on there!
  3240.  
  3241. Milliways ]I[
  3242. The Spirit of Radio
  3243. 618-259-7707
  3244. WWIV v4.2e++
  3245. IceNET @6851
  3246. MODS! FILES! MESSAGES!
  3247. 24hrs/7days!
  3248. 1200/2400bps!
  3249.  
  3250. Fare well...
  3251.  
  3252.  
  3253.  
  3254.  
  3255.  
  3256.  
  3257.  
  3258. [29/99]: Mod help!
  3259. [Name ]: The Hacker #77 @6870
  3260. [Date ]: Sat Dec 21 22:42:36 1991
  3261. [From ]: Unknown System
  3262.  
  3263.     I have a  MOD that allows WWIV to make and use PCBoard doors (by making a 
  3264. pcboard.sys file), but I dfon't think the mod is for 4.2.  I'm not that great 
  3265. at C, but I could really use this one!  The problem with it is when I'm adding 
  3266. the changes, there is no case 1 (you are supposed to add a case 2).  If anyone 
  3267. would like to help out, I could post the mod on here for you to look at!
  3268.  
  3269.                                   ___
  3270.                                   /he /-/acker
  3271.  
  3272.  
  3273.  
  3274.  
  3275.  
  3276.  
  3277. [30/99]: help....
  3278. [Name ]: General Grande #63 @5052
  3279. [Date ]: Mon Dec 23 09:53:16 1991
  3280. [From ]: The Adventurer's Guild (Unknown Area)
  3281.  
  3282.  
  3283.      I have noticed that some people refer 
  3284. to using the Borland IDE to write and compile
  3285. thier MODS.  I have tried setting up a project
  3286. in the IDE that would compile it properly by 
  3287. pressing F9.  But after several hours of attempts
  3288. and no succesful compiles I have lost hope.  Can
  3289. someone either post or E-mail me how you succesfully
  3290. set up the IDE to create BBS.EXE & RETURN.EXE.  I have
  3291. both borland TC++ v1.0 and BC++ v3.0.  
  3292.      Argh...I have just about pulled my teeth out over
  3293. this and your help would be greatly appreciated.
  3294.               -^-Grande-.-
  3295.  
  3296.  
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302. [31/99]: Color Directory listing Mod for Version 420
  3303. [Name ]: The Duck #1 @853
  3304. [Date ]: Tue Dec 24 17:20:01 1991
  3305. [From ]: The Duck Pond (Okinawa, Japan) (Unknown Area)
  3306.  
  3307. /***************************************************************************
  3308.                  Color Directory List Mod for Version 420                      
  3309.        
  3310.                          Posted by The Duck 1@853
  3311.                             Mod information by
  3312.                             The Sandman 1@853
  3313.          Original 412 Mod (MyMod002) written by Keith Cohen 1@9969
  3314.  
  3315.      I Like this color dirlist mod better than others I have seen.
  3316.      I am not and probably never will be a C programer. But with 
  3317.      Fantastic Sysops like "The Sandman" I am getting my BBS set 
  3318.      up the way I want it to be. All that really changed from the 
  3319.      original Mod is one line (indicated by the *\Note*\) What the
  3320.      Mod does is shows the user the total number of files that are
  3321.      available to him/her and what directory they are in at that time.
  3322.      If you want to change the colors of the box, or any information 
  3323.      just change the number after the to a number or letter that
  3324.      matches your liking. By the way I take no credit of responsibility
  3325.      for this mod. You can do the same with your sublist. If anyone whats
  3326.      that Mod I will be Glad to post it. It requires no changes though
  3327.      and is called MyMod005.
  3328.  
  3329. Installation:  So Simple, a Rock like me did it with no errors in 30 Seconds
  3330.  
  3331. STEP 1    BACK UP YOUR SOURCE!!!!!!
  3332.  
  3333. STEP 2    In BBS.C, replace your void dirlist() with this one, and re-compile.
  3334.  
  3335. Now wasn't that easy?
  3336.  
  3337. ***************************************************************************/
  3338.  
  3339.  
  3340. void dirlist()
  3341. {
  3342.   int i,i1,i2,i3,abort;
  3343.   char s[160],s1[81];
  3344.  
  3345.   i3=0;
  3346.   abort=0;
  3347.   nl();
  3348.   if (okansi()) {
  3349.     pla(" Num Directory Name                           Files",&abort);
  3350.     pla("╔═══╦════════════════════════════════════════╦════╗ ",&abort);
  3351.   } else {
  3352.     pla("Num Directory Name                           Files",&abort);
  3353.   }
  3354.   i=0;
  3355.   while ((i<64) && (udir[i].subnum!=-1) && (!abort) && (!hangup)) {
  3356.     dliscan1(udir[i].subnum);
  3357.     if (okansi()) {
  3358.       sprintf(s,"║%3s║%-40s║%4d║",udir[i].keys,
  3359.            directories[udir[i].subnum].name,numf);
  3360.       i3+=numf;
  3361.     } else {
  3362.       sprintf(s,"%3s %-40s %4d",udir[i].keys,directories[udir[i].subnum].name,
  3363.           numf);
  3364.     }
  3365.     if (strcmp(udir[curdir].keys,udir[i].keys)==0) {
  3366.       strcat(s,"<You are here.");
  3367.     }
  3368.     pla(s,&abort);
  3369.     closedl();
  3370.     i++;
  3371.   }
  3372.   if (okansi()) {
  3373.     pla("╚═══╩════════════════════════════════════════╩════╝ ",&abort);
  3374.     itoa(i3,s1,10);
  3375.     npr("                                 Total Files:  %s\r\n",s1); /*Note */
  3376.     
  3377.   }
  3378.   if (i==0)
  3379.     pla("None.",&abort);
  3380.   nl();
  3381. }
  3382.  
  3383.  
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389. [32/99]: MOD -- Auto-Validation Password for newusers from 10@2315
  3390. [Name ]: The Man #10 @2315
  3391. [Date ]: Sun Dec 22 18:19:45 1991
  3392. [From ]: The Sci Fi BBS (Connecticut)
  3393.  
  3394. [Msg Status] Reply Wanted.
  3395. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  3396.  
  3397. ------------------------------------------------------------------------------
  3398. Filename:THEMAN02.MOD
  3399. File affected:NEWUSER.C
  3400. Purpose:Establishes an Auto-validation password for users that you told the 
  3401.         password to so that they don't need to wait to be validated.  This way
  3402.         you don't have to use a newuser password.
  3403. -----------------------------------------------------------------------------
  3404. Legend:
  3405. #....Exists
  3406. +....Add line
  3407.  
  3408.  
  3409. #    input_sex();
  3410. #    input_age(&thisuser);
  3411. #    input_comptype();
  3412. #    input_screensize();
  3413. #    nl();
  3414. #    npr("Random password: %s\r\n",thisuser.pw);
  3415. #    nl();
  3416. #    prt(5,"Do you want a different password (Y/N)? ");
  3417. #    if (yn())
  3418. #      input_pw();
  3419. +    prt(2,"What is the Auto-Validation Password? ");
  3420. +    mpl(20);
  3421. +    input(s,20);
  3422. +    if (stricmp(s,"RANDOM")==0) {    /*Change to your liking*/
  3423. +    thisuser.sl=60;
  3424. +    thisuser.dsl=60;
  3425. +    npr("Thank you, you have been validated.");
  3426. +    }
  3427. +    else if (stricmp(s,"RANDOM2")==0) {  /*Different level of access*/
  3428. +    thisuser.sl=120;
  3429. +    thisuser.dsl=60;
  3430. +    prt(6,"You have been validated with super access, call back after you are hung up");
  3431. +    } else {
  3432. +    npr("Don't worry about it, The Man will validate you himself");
  3433. +  }
  3434. #  }
  3435. #  if (!hangup)
  3436. #    do {
  3437. #      nl();
  3438. #      nl();
  3439. #      npr("1. Name          : %s\r\n",thisuser.name);
  3440. #      if (syscfg.sysconfig & sysconfig_no_alias)
  3441. #        npr("2. City, State   : %s\r\n",thisuser.realname);
  3442. ------------------------------------------------------------------------------
  3443. this mod is very flexible as you can also add AR's and DAR's to give to people
  3444. also.  Change it to your liking.  You can also fix it so that it reads in the
  3445. auto-val password from a file.
  3446.  
  3447. If you use this mod.  Please E-mail me and tell me how you like it.  And also
  3448. tell me how to fix it so that it will read the password from a file.  I was
  3449. too lazy to do that myself.  I use it so that when I want someone to call and
  3450. I know I won't be around, they can validate themselves.  And that way I can
  3451. still have an open board and keep out undesirable users.
  3452.  
  3453. The Man Sysop of The Magic Mountains BBS IceNET node 36
  3454. 203-869-0938 for MM BBS Greenwich, CT
  3455. also The Man 10@2315 WWIVnet SCI-Fi BB
  3456.  
  3457.  
  3458.  
  3459.  
  3460.  
  3461. [33/99]: Not a new mod, just improved......
  3462. [Name ]: Tanker #98 @5052
  3463. [Date ]: Tue Dec 24 23:04:26 1991
  3464. [From ]: The Adventurer's Guild (Unknown Area)
  3465.  
  3466. ┌─────────────────────────────────────────────────────────────────────────┐
  3467. │ Seamsg.Mod ── 12-24-91 ───  Merry Christmas ───  WWIV v4.11 v4.12 v4.20 │
  3468. │ Description: Savable Enhanced AutoMsg │ Experience: Simple Block Read!  │
  3469. │ Files Affected: MISCCMD.C             │ Steps: 3                        │
  3470. │  Original Mod By:         Re-Written By:                                │
  3471. │Phantom Lord #38 @ 2110 │  Tanker 1@15053  │   Scalawag 53@15053         │
  3472. │ The Spider Web         │   The Tankyard   │   Sysop of: Lunatic Fringe  │
  3473. │(???)-???-????          │  (510)-671-7006  │    (510)-676-1812           │
  3474. └─────────────────────────────────────────────────────────────────────────┘
  3475. Hi, I am kinda new to mods, but I put this mod in and I thought it was great
  3476. I also use it for a "Second Automsg" for the sysop only. I only had one
  3477. problem with it. When you enter the the new automsg it would always scroll
  3478. 9 lines and with 2 of these in it annoyed me and my users, so Scalawag and I
  3479. got together and figured out a way to set it to accept the '/S' command to
  3480. save it before 9 lines was up, granted if you need 9 lines you had them
  3481. available to you, but if you didnt you could type '/S' at the beginning of
  3482. any line and it will save it, We dont take any credit for this mod, all
  3483. credit should go to Phantom Lord, along with any problems.  :)
  3484.  
  3485. Phantom3.Mod, Auto-Msg Update. Color/80 Col./9 Lines! WORKS!
  3486. ┌─────────────────────────────────────────────────────────────────────────┐
  3487. │ Phantom3.Mod ── 12-07-91 ─── By Phantom Lord ─── WWIV v4.11 v4.12 v4.20 │
  3488. │ Description: Working Enhanced AutoMsg │ Experience: Simple Block Read!  │
  3489. │ Files Affected: MISCCMD.C             │ Steps: 3                        │
  3490. │ ───    GoldSystem Delayed. Still Typing Out. Keep Your Eyes Open    ─── │
  3491. └─────────────────────────────────────────────────────────────────────────┘
  3492.  Step 1:
  3493.  ──────
  3494.  Backup Your Source!!!
  3495.  ------------------------------------------------------------------------
  3496.  Step 2:
  3497.  ──────
  3498.  Load MISCCMD.C and delete void read_automessage(),
  3499.  void write_automessage1() and void write_automessage().
  3500.  ------------------------------------------------------------------------
  3501.  Step 3:
  3502.  ──────
  3503.  Block read the following 3 voids where read_automessage(),
  3504.  write_automessage1(), and write_automessage were.
  3505.  
  3506. void read_automessage()
  3507. {
  3508.   int i,i1,i2,i3,f,len,ptrbeg[10],ptrend[10];
  3509.   char s[81],l[10][81],anon,buf[512];
  3510.   slrec ss;
  3511.  
  3512.   sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  3513.   f=open(s,O_RDWR | O_BINARY);
  3514.   nl();
  3515.   anon=status.amsganon;
  3516.   if (f<1) {
  3517.     pl("No Auto-Post! Write One!");
  3518.   } else {
  3519.     len=read(f,(void *)buf,512);
  3520.     close(f);
  3521.     for (i=0; i<10; i++) {
  3522.       ptrbeg[i]=0;
  3523.       ptrend[i]=0;
  3524.     }
  3525.     i=0;
  3526.     i1=0;
  3527.     i2=0;
  3528.     for(i=0; i<len; i++) {
  3529.       if (i1) {
  3530.         if (buf[i]==10) {
  3531.           ptrbeg[i2]=i+1;
  3532.           i1=0;
  3533.         }
  3534.       } else {
  3535.         if (buf[i]==13) {
  3536.           ptrend[i2]=i-1;
  3537.           if (i2<9) {
  3538.             for (i3=ptrbeg[i2]; i3<=ptrend[i2]; i3++)
  3539.               l[i2][i3-ptrbeg[i2]]=buf[i3];
  3540.               l[i2][ptrend[i2]-ptrbeg[i2]+1]=0;
  3541.           }
  3542.           ++i2;
  3543.           i1=1;
  3544.         }
  3545.       }
  3546.     }
  3547.     ss=syscfg.sl[actsl];
  3548.     if (anon)
  3549.       if (ss.ability & ability_read_post_anony) {
  3550.         sprintf(s,"%s",&(l[0][0]));
  3551.       } else
  3552.         strcpy(s,"NoBoDy #xxx");
  3553.     else
  3554.       strcpy(s,&(l[0][0]));
  3555.     nl();
  3556.     npr("[══── Auto Post Entered By: %s ──══]\r\n",s);
  3557.     nl();
  3558.     i=1;
  3559.     while ((ptrend[i]) && (i<9)) {
  3560.       pl(&(l[i][0]));
  3561.       ++i;
  3562.     }
  3563.   }
  3564.   nl();
  3565. }
  3566.  
  3567. void write_automessage1()
  3568. {
  3569.   int i,i1,f,a;                    /*ADDED 'a' TO INT'S*/
  3570.   char s[81],l[10][81];
  3571.   slrec ss;
  3572.  
  3573.   nl();
  3574.   pl("Write Auto-Post! 9 Lines: Ctrl-P Colors Work Here!");
  3575.   pl("To save before 9 lines, type '/s' at beginning of line."); /*ADDED*/
  3576.   s[0]=0;
  3577.   nl();
  3578.   for (i=0; i<9; i++) {
  3579.     outchr(i+'1');
  3580.     outchr('>');
  3581.     inli(&(l[i][0]),s,77,1);
  3582.     if (l[i][0]=='/') {                         /*ADDED*/
  3583.       if ((l[i][1]=='s') || (l[i][1]=='S'))     /*ADDED*/
  3584.       for (i=i; i<9; i++) {                     /*ADDED*/
  3585.         for (a=0; a<78; a++)                    /*ADDED*/
  3586.         l[i][a]=0;                              /*ADDED*/
  3587.       }                                         /*ADDED*/
  3588.     } else                                      /*ADDED*/
  3589.     strcat(&(l[i][0]),"\r\n");
  3590.   }
  3591.   nl();
  3592.   ss=syscfg.sl[actsl];
  3593.   if (ss.ability & ability_post_anony) {
  3594.     prt(5,"Anonymous!? [Y/N]: ");
  3595.     if (yn())
  3596.       i1=anony_sender;
  3597.     else
  3598.       i1=0;
  3599.   } else
  3600.     i1=0;
  3601.   prt(5,"Is This Ok? [Y/N]: ");
  3602.   if (yn()) {
  3603.     status.amsganon=i1;
  3604.     status.amsguser=usernum;
  3605.     save_status();
  3606.     sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  3607.     f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  3608.     strcpy(s,nam(&thisuser,usernum));
  3609.     strcat(s,"\r\n");
  3610.     write(f,(void *)s,strlen(s));
  3611.     for (i=0; i<9; i++)
  3612.       write(f,(void *)&(l[i][0]),strlen(&(l[i][0])));
  3613.     sysoplog("-+*+- Changed Auto-Post!");
  3614.     for (i=0; i<9; i++) {
  3615.       strcpy(s,"   ");
  3616.       l[i][strlen(&(l[i][0]))-2]=0;
  3617.       strcat(s,&(l[i][0]));
  3618.       sysoplog(s);
  3619.     }
  3620.     nl();
  3621.     pl("Auto-Post Saved!");
  3622.     nl();
  3623.     close(f);
  3624.   }
  3625.  
  3626. }
  3627.  
  3628. void write_automessage()
  3629. {
  3630.   char ch;
  3631.   int done,okwrite;
  3632.   slrec ss;
  3633.  
  3634.   ss=syscfg.sl[actsl];
  3635.   if (ss.posts)
  3636.     okwrite=1;
  3637.   else
  3638.     okwrite=0;
  3639.   if (thisuser.restrict & restrict_automessage)
  3640.     okwrite=0;
  3641.   done=0;
  3642.   do {
  3643.     nl();
  3644.     if (okwrite) {
  3645.       prt(2,"Auto-Post! [Read/Write/Email/Quit]: ");
  3646.       ch=onek("QRWE");
  3647.     } else {
  3648.       prt(2,"Auto-Post! [Read/Email/Quit]: ");
  3649.       ch=onek("QRE");
  3650.     }
  3651.     switch(ch) {
  3652.       case 'Q':
  3653.         done=1;
  3654.         break;
  3655.       case 'R':
  3656.         read_automessage();
  3657.         break;
  3658.       case 'W':
  3659.         write_automessage1();
  3660.         break;
  3661.       case 'E':
  3662.         if (status.amsguser)
  3663.           email(status.amsguser,0,0,status.amsganon);
  3664.         break;
  3665.     }
  3666.   } while ((!done) && (!hangup));
  3667.  
  3668. }
  3669.  
  3670.  ------------------------------------------------------------------------
  3671.  What'd I Tell Ya... Easy As Hell Aint It? Sorry The GoldSystem Is So
  3672.  Late, I'm Still Writing Out The 4 Files For It... I'm Trying To Keep
  3673.  These In Chronological Order So That's Why This Is PHANTOM3 Instead
  3674.  Of PHANTOM2... If You Need Any Help With This Or Any Other Of My Mods,
  3675.  Let Me Know, Net-Mail Me.
  3676.                                                   -Phantom Lord
  3677.  ------------------------------------------------------------------------
  3678.  
  3679.  
  3680.  
  3681.  
  3682.  
  3683.  
  3684. [34/99]: LISTFILE.MOD          By RiffRaff 1@8354
  3685. [Name ]: Riffraff #1 @8354
  3686. [Date ]: Sunday, December 22 1991, 06:28 PM <EST>
  3687. [From ]: Unicorn Games (Florida)
  3688.  
  3689. Okay, I am finally back with my next mod, LISTFILE.MOD.  What this mod
  3690. does is, at dlmainmenu(), when the user types /L, it will list only the
  3691. files at exist on the hard drive at the time.  I put this mod in because
  3692. most of my users, to put it lightly, are not the brightest people in the
  3693. world.  Most of them can't figure that N/A means that it isn't there.
  3694. Anyway, on with the mod.
  3695.  
  3696. ------
  3697. Step #1
  3698. File:  xfer.c
  3699.  
  3700. Replace void listfiles() with the following void:
  3701.  
  3702. void listfiles(int xxx)
  3703. {
  3704.   char s[81],s2[129];
  3705.   int i,abort,next=0;
  3706.   uploadsrec u;
  3707.  
  3708.   dliscan();
  3709.   file_mask(s);
  3710.   abort=0;
  3711.   num_listed=0;
  3712.   printtitle(&abort);
  3713.   for (i=1; (i<=numf) && (!abort) && (!hangup); i++) {
  3714.     SETREC(i);
  3715.     read(dlf,(void *)&u,sizeof(uploadsrec));
  3716.     if (compare(s,u.filename)) {
  3717.       strcpy(s2,directories[udir[curdir].subnum].path);
  3718.       strcat(s2,u.filename);
  3719.       if (!xxx)
  3720.         printinfo(&u,&abort);
  3721.       else if (exist(s2))
  3722.         printinfo(&u,&abort);
  3723.     }
  3724.     else if (!empty())
  3725.       checka(&abort,&next);
  3726.   }
  3727.   closedl();
  3728.   if (!abort) {
  3729.     nl();
  3730.     nl();
  3731.     sprintf(s,"Files listed: %d",num_listed);
  3732.     pl(s);
  3733.     nl();
  3734.   }
  3735. }
  3736.  
  3737. -----
  3738. Step #2
  3739. File:  bbs.c
  3740. Function:  dlmainmenu()
  3741.  
  3742. Search for:
  3743.  
  3744. if ((strcmp(s,"UPLOADALL")...
  3745.  
  3746. and right before that add:
  3747.  
  3748. if (strcmp(s,"/L")==0)
  3749.   listfiles(1);
  3750.  
  3751. Now, find:
  3752.  
  3753.   case 'L':
  3754.     listfiles();
  3755.     break;
  3756.  
  3757. And change it to:
  3758.  
  3759.   case 'L':
  3760.     listfiles(0);
  3761.     break;
  3762.  
  3763. -----
  3764. Step #3
  3765.  
  3766. Run strip.exe (make fcns) to recreate fcns.h
  3767.  
  3768. -----
  3769.  
  3770. That is all.  Remember, I fully support all my mods!!!  So, if you have
  3771. any problems with this mod at all (you shouldn't), then don't hesitate
  3772. to contact me at:
  3773.  
  3774. Just some other...
  3775. RiffRaff 1@8354
  3776. Unicorn Games                                       '91
  3777.  
  3778.  
  3779.  
  3780.  
  3781.  
  3782.  
  3783. [35/99]: HELP!!!
  3784. [Name ]: Phantom Lord #38 @2110 [Fair Lawn, NJ]
  3785. [Date ]: Tuesday, December 24, 1991  <11:18 pm EST >
  3786. [From ]: The Spider's Web (New Jersey)
  3787.  
  3788. [Concerning] Help!!!!
  3789. [Written By] Camper #61 @5866
  3790.  
  3791. >       Does anybody have or know if there is any mod to access a cd rom
  3792. > disk through 4.20???
  3793. >                            -=≡≥ÇÄmPΣΓ≤≡=-
  3794. > ░▒▓│ The Computer Hideout ∞ 5866 ∞ 518-869-7641 ∞ 38400 ∞ Albany, New
  3795. > York│▓▒░
  3796.  
  3797.  set up the drive and pick NO UPLOADS
  3798.  
  3799. Origin: Thé Spïδêr's Wèb / (201)-797-3166 / Auto-Sysop Validation
  3800.                          Hayes V-series 9600
  3801.  
  3802.  
  3803.  
  3804.  
  3805.  
  3806.  
  3807. [36/99]: Apologies
  3808. [Name ]: Filo #1 @5252
  3809. [Date ]: Thu Dec 26 23:22:17 1991
  3810. [From ]:%The Dragon's Den [ASV] (South/Central Texas)
  3811.  
  3812. Apologies to all for the number of requests and other non-mod stuff that
  3813. got through during my holiday.  I am now back at the board with Net
  3814. Validate Toggled On so hopefully things will return to normal.
  3815.  
  3816. WWIVnet 5252                      Filo           WWIVLink 15252
  3817. VBBSnet 5120           The Dragon's Den BBS      Member [DSS]
  3818. FidoNet 1:397/5252   WWIV Core Support Board     Filo @Panam.BitNet
  3819.  
  3820.  
  3821.  
  3822.  
  3823.  
  3824.  
  3825.  
  3826.  
  3827.  
  3828. [37/99]: PIANO14.MOD - Do a '/COLORS' in message & change colors..:)
  3829. [Name ]: Piano Man #38 @6870
  3830. [Date ]: Fri Dec 27 14:38:32 1991
  3831. [From ]: Unknown System
  3832.  
  3833. ****************************************************************************
  3834.                                PIANO14.MOD
  3835. Written by : Piano Man 1@6851 (IceNET)
  3836. Written for: WWIV v4.2e (should work with older versions with no problems)
  3837. Difficulty : Easy!
  3838. Date       : December 21th, 1991 (Merry Christmas!)
  3839. While      : I was in a car wreck last night,  and now I'm sitting at home
  3840.                with RUSH (Working Man) playing in the background,  nothing
  3841.                else better to do,  so I thought I'd write a mod!  :)
  3842. Description: This mod allows you to do a '/COLORS' and change your default
  3843.                colors while in the message itself.  Some guy wrote a mod
  3844.                similar,  only it was '/MACROS',  which is where I got the
  3845.                idea for this one.  Anyway,  it just saves a trip to the
  3846.                defaults,  simple mod...  Try it!
  3847. ****************************************************************************
  3848.  
  3849. On with the mod:
  3850. Back up your source first...
  3851. Load up 'MSGBASE.C' and search for this:
  3852. And make the changes as they occur,  or you can mold and modify it as you wish
  3853. this mod isn't engraved in stone,  so change and add what you want.
  3854.  
  3855. Legend:
  3856. = Existing code
  3857. % Modify this line
  3858. - delete this line
  3859. + add this line
  3860. * search for this
  3861.  
  3862. Here:
  3863.  
  3864. = if (!fsed) {
  3865. %   sprintf(s,"Enter message now, max %u lines.",maxli);
  3866. =   pl(s);
  3867. =   nl();
  3868. +   prt(7,"Enter '/ES,/S' to save the message.\r\n");
  3869. +   prt(7,"Enter '/HELP' for help.\r\n");
  3870. +   prt(7,"Enter '/COLORS' to change your default colors.\r\n");
  3871. =   nl();
  3872.  
  3873. Now search for '/TI' and add this RIGHT above it!!  If you have the /MACROS
  3874. mod in,  then this goes right after that...
  3875.  
  3876. =       if (stricmp(s,"/RL")==0) {
  3877. =         savel=0;
  3878. =         if (curli) {
  3879. =           --curli;
  3880. =           pl("Replace:");
  3881. =         } else {
  3882. =           pl("Nothing to replace.");
  3883. =         }
  3884. =       }
  3885. +       if (stricmp(s,"/COLORS")==0) {
  3886. +       savel=0;
  3887. +       prt(2,"You may now edit your colors and change them as you 
  3888. wish...\r\n");
  3889. +       change_colors();
  3890. +       prt(5,"Please continue,  your new colors are now in effect...\r\n");
  3891. +       }
  3892. =       if (stricmp(s,"/TI")==0) {
  3893. =         savel=0;
  3894. =         helpl=26;
  3895.  
  3896. That's it!  Make changes to it,  reword it,  do whatever.  I don't mind.  But!
  3897. this mod should not screw anything up,  so don't come crying to me if your
  3898. house is blown up because of this mod.
  3899.  
  3900. Oh,  and don't worry,  I'm not hurt,  TOOOO badly.  I'll live...  My car's
  3901. totaly screwed,  poor mustang....  :(  see ya!
  3902.  
  3903. Milliways ]I[ The Spirit of Radio
  3904. 618-259-7707
  3905. WWIV v4.2e PIANOLIZED!
  3906. IceNET @6851
  3907. Home of The RUSH Fan Club NET!
  3908. 200/2400bps
  3909. 24hrs
  3910.  
  3911. Fare well......
  3912.  
  3913.  
  3914.  
  3915.  
  3916.  
  3917.  
  3918.  
  3919. [38/99]: Nite02.Mod : Color Messages & Save Dgroup.
  3920. [Name ]: Nitefyre #1 @6956
  3921. [Date ]: Fri Dec 27 23:01:51 1991
  3922. [From ]: The Dark Ages (Southern California)
  3923.  
  3924. ┌────────────────────────────────────────────────────────────────────────────┐
  3925. │ Mod Name:         Nite02                Mod Author: Nitefyre               │
  3926. │ Difficulty:       Basic                 Date:       December 29, 1991      │
  3927. │ WWIV Version:     4.20                                                     │
  3928. │ Description:      This mod saves a little Dgroup space while enabling      │
  3929. │                   colored message titles.                                  │
  3930. │ Affected Files:   Msgbase.C                                                │
  3931. │ Steps:            6                                                        │
  3932. └────────────────────────────────────────────────────────────────────────────┘
  3933.  
  3934.     Verbose Description:  There are plenty of mods out there to enable
  3935. colored message titles.  Actually anyone who knows even the slightest
  3936. bit of C code could figure out how to enable it by themselves.  This is
  3937. for the few novices that don't.  You'll also clean up some source too,
  3938. that you really didn't need in my opinion.
  3939.  
  3940.  
  3941. STEP ONE:
  3942.   Backup your source code.
  3943.  
  3944. STEP TWO:
  3945.     Load up Msgbase.C and search for "void inmsg".  Once down there,
  3946.  page down a little until you find the below code, then delete the
  3947.  marked lines.
  3948.  
  3949. =  nl();
  3950. =  helpl=6;
  3951. -   if (okansi()) {                           /* Delete from here */
  3952. -    prt(2,"Title: ");
  3953. -    mpl(60);
  3954. -    inputl(title,60);
  3955. -  } else {
  3956. -    pl("       (---=----=----=----=----=----=----=----=----=----=----=----)");
  3957. -    outstr("Title: ");
  3958. -    inputl(title,60);
  3959. -  }                                          /* Down to here */
  3960. =  if ((title[0]==0) && (needtitle)) {
  3961. =    pl("Aborted.");
  3962. =    m.stored_as=0xffffffff;
  3963.  
  3964. STEP THREE:
  3965.    In that same exact space, insert the following few marked lines.
  3966.  
  3967. =  nl();
  3968. =  helpl=6;
  3969. +  prt(2,"Title: ");                            /* Insert from here */
  3970. +  ro[0]=0;
  3971. +  inli(title,ro,70,1);
  3972. =  if ((title[0]==0) && (needtitle)) {            /* Down to here */
  3973. =    pl("Aborted.");
  3974. =    m.stored_as=0xffffffff;
  3975.  
  3976.  
  3977. STEP FOUR:
  3978.    Search down some more until you find the part that allows users
  3979.  to change message titles while editing a message.  It looks like
  3980.  the following.  Once again, delete the marked lines.
  3981.  
  3982. =       if (stricmp(s,"/TI")==0) {
  3983. =         savel=0;
  3984. =         helpl=26;
  3985. -         if (okansi()) {                     /* Delete from here */
  3986. -           prt(2,"Title: ");
  3987. -           mpl(60);
  3988. -           inputl(title,60);
  3989. -         } else {
  3990. -           pl("       
  3991. (---=----=----=----=----=----=----=----=----=----=----=----)");
  3992. -           outstr("Title: ");
  3993. -           inputl(title,60);                  /* Down to here */
  3994. =         }
  3995. =         pl("Continue...");
  3996.  
  3997. STEP FIVE:
  3998.     Now, once again in the same exact space, insert the following
  3999.   marked lines.
  4000.  
  4001. =       if (stricmp(s,"/TI")==0) {
  4002. =         savel=0;
  4003. =         helpl=26;
  4004. +         prt(2,"Title: ");                   /* Add from here */
  4005. +         ro[0]=0;
  4006. +         inli(title,ro,70,1);                /* Down to here */
  4007. =         pl("Continue...");
  4008.  
  4009. STEP SIX:
  4010.     Save and recompile your source code.  Very basic, like I said, most
  4011.   people probably won't even need the mod.  The idea will be useful to
  4012.   the experts, and the mod to the novices.  Until later, have fun
  4013.   and Merry Christmas (Mod was written during holiday season).
  4014.  
  4015.  
  4016.                            Nitefyre
  4017.               1@6956 (WWIVnet)  1@16976 (WWIVlink)
  4018.  
  4019.  
  4020.  
  4021.  
  4022.  
  4023.  
  4024. [39/99]: WMLOBAT.MOD  (ReRelease, by request)   -=VR=-
  4025. [Name ]: Vortex Rouge #163 @5853
  4026. [Date ]: Thu, Dec 26, 1991  12:38 am
  4027. [From ]: The Dark Side of the Moon BBS (Upstate New York)
  4028.  
  4029. -------    ---------     --------------        --------------       ---
  4030.   --------    --------    ---  A mod  from the Winds Master   -----   ----
  4031.  -----   -----  ----------     The Whirlwind of Information      ----- ---
  4032. -----   -------    -------     8 pm Friday to 6 am Monday,   -----    ----
  4033.   -------     ------------     (Weekends ONLY!) 765-3093.  ------    -----
  4034.  ----     -------    ------                                   ---------
  4035.    --------    -------------   I can be reached at 93 @5851 ---------   ---
  4036. -----    --------    ----  -------    ---------      ---------     ------
  4037.  
  4038. WMLOBAT.MOD
  4039.  
  4040.   This is a pretty simple, but super helpful mod.  It simply runs
  4041. LOGOFF.BAT after the user has been logged off and carrier dropped.  I use
  4042. it to copy the log files, and I will be using it to pre-run the top ten
  4043. user maker.
  4044.  
  4045.   Pre-running the top ten user maker saves about 30 seconds of waiting 
  4046. time for the user.  I will just run TOPTEN >GFILES\TOPTEN.MSG
  4047. then in void logon(), somewhere add printfile("TOPTEN.MSG"); and you're
  4048. all done.  You users will probably love you for it if you have been
  4049. running it in the logon batch..
  4050.  
  4051. This mod is for v4.20 but should work on any lower version..
  4052.  
  4053. ON WITH THE MOD!                                            
  4054.  
  4055.   key-
  4056.     = original code
  4057.     + add line
  4058.     ! modify line
  4059.  
  4060.  
  4061. in lilo.c, void logoff();
  4062.  
  4063. =   void logoff()
  4064. =   {
  4065. =     long l;
  4066. =     int f,r,w,t,i;
  4067. !     char s[81],x[81];
  4068. =     mailrec m;
  4069. =     shortmsgrec sm;
  4070. =     double ton;
  4071.  
  4072.  
  4073. then, at the bottom of the function
  4074.  
  4075.  
  4076. =     remove_from_temp("*.*", syscfg.tempdir, 0);
  4077. =     remove_from_temp("*.*", syscfg.batchdir, 0);
  4078. =
  4079. =     if (numbatch && (numbatch != numbatchdl)) {
  4080. =       for (i=0; i<numbatch; i++) {
  4081. =        if (!batch[i].sending) {
  4082. =          didnt_upload(i);
  4083. =        }
  4084. =       }
  4085. =     }
  4086. =
  4087. +     sprintf(s,"LOGOFF.BAT");
  4088. +     if (exist(s))
  4089. +     {
  4090. +       sprintf(x,"%s /C %s", getenv("COMSPEC"), s);
  4091. +       do_it(x);
  4092. +     }
  4093. =
  4094. =   }
  4095.  
  4096. that's it..  easy, eh?
  4097.  
  4098. just create LOGOFF.BAT and put in it whatever you want.  
  4099.  
  4100. (BTW:  The user user does not see whatever happens in the bat file..)
  4101.  
  4102. \/\/    /\/\    \/\/    /\/\  \/\/inds /\/\aster
  4103.  
  4104.  
  4105.  
  4106.  
  4107.  
  4108.  
  4109.  
  4110.  
  4111. [40/99]: RE: Major bug with SYSMENU mod
  4112. [Name ]: Stingray #52 @5060
  4113. [Date ]: Sun Dec 29 13:21:02 1991
  4114. [From ]: Fuzzball Land (Unknown Area)
  4115.  
  4116. About the bug reported by The Nut... Did you check this?  I don't think you 
  4117. did, because I made quite sure that a user at the NN: prompt would NOT be able 
  4118. to access it!  In the check before I enter it, I check for
  4119. ((cs()) && (okmacro))
  4120. the cs() part checks if the user is a cosysop. BUT, the OKMACRO part will not 
  4121. let the user call up the menu at anywhere that is NOT a valid place for using 
  4122. macros!  Note; macros are not allowed until the user has completed his or her 
  4123. logon. Hence, the menu will NOT respond at the NN: prompt.
  4124. Test the bugs before reporting them..
  4125. -----
  4126. Stingray
  4127.  
  4128.  
  4129.  
  4130.  
  4131.  
  4132.  
  4133.  
  4134.  
  4135. [41/99]: Similar problem, though NOT through the IDE
  4136. [Name ]: Rob Miller #5 @18
  4137. [Date ]: Sun Dec 29 07:13:47 1991
  4138. [From ]: The Federation (Southern California)
  4139.  
  4140. RE: help....
  4141. BY: General Grande #63 @5052
  4142.  
  4143. I've checked and rechecked everything I possibly can, and I can't get the damn 
  4144. thing to make via the non IDE way. I've set up the makefile with all the 
  4145. directories pointing to the proper places, and all I get is a DGROUP error at 
  4146. link time.
  4147.  
  4148. Being quite familiar with DGROUP errors, this really ticks me off since I 
  4149. haven't made ANY changes to the code. The code IS genuine as I just got it 
  4150. from Wayne's BBS the other day. 
  4151.  
  4152. Also, it's version 4.20.
  4153.  
  4154. Anyone have any similar problems? What did you do to solve it?
  4155.  
  4156. Thanks in advance...
  4157.  
  4158. Rob Miller
  4159. Soon-to-be-Sysop: The Loop
  4160. 805-520-0800
  4161.  
  4162.  
  4163.  
  4164.  
  4165.  
  4166.  
  4167. [42/99]: EDO006.420 Multiple autoSysOp validation mod
  4168. [Name ]: Ed O'Brien #1 @7350
  4169. [Date ]: Mon Dec 30 12:13:22 1991
  4170. [From ]:^Data Xfer BBS [AVS] (Houston, Texas)
  4171.  
  4172.  
  4173. ┌────────────────────────────────────────────────────────────────────────────┐
  4174. │ Mod Name: EDO006.420                    Mod Author: Ed O'Brien 1@7350      │
  4175. │ Difficulty: EASY                        Date: 12/27/91                     │
  4176. │ WWIV Version: 420e                                                         │
  4177. │ Description: Select Full Screen Editor, Default Protocol, Auto SysOp       │
  4178. │ Validation. Sends SysOp message via SMW.DAT of auto-validation and type.   │
  4179. └────────────────────────────────────────────────────────────────────────────┘
  4180.  
  4181. OK, first of all let me thank all the original authors of the FSEDDPAV mods
  4182. as this is basically their idea only expanded upon with many extra features.
  4183.  
  4184. For the most part this mod is simply a block read to the NEWUSER.C file but
  4185. you will need to create several printfile("xxxxxxxx")'s for each type of
  4186. SysOp you want to autovalidate.
  4187.  
  4188. As you may or may not know, Lance Halle, has established a list of boards
  4189. that use either a GUEST account or SysOp autovalidation to make it easier
  4190. for SysOps to have a place to get their mods.  I have always kept my source
  4191. mods separate from the addon files to prevent users that do NOT have their
  4192. WWIV registered from accessing the source mods and feel EVERYONE should do
  4193. the same to cut down on the illegal distribution of the source code.
  4194.  
  4195. Anyway what this mod will do is allow you several choices of type of SysOp's
  4196. you will autovalidate and the SL's you will grant each type.  It will also
  4197. send the SysOp of the board a message that so and so was autovalidated as a
  4198. xxxxxx type of SysOp along with "So and so read your mail" at logon.
  4199.  
  4200. On with the mod...
  4201.  
  4202. 1. Load up NEWUSER.C, ^QF void logon and insert the following void right
  4203.    before it.
  4204.  
  4205. /* Begin block read */
  4206.  
  4207. void fullscred_protocol_autoval()            /* New Version 12/27/91 */
  4208. {
  4209.   int i,sysnumber;
  4210.   char sysnum[5],ph1[12],ph[12],sysname[35],s[40],s1[81],ch;
  4211.   net_system_list_rec *csne;
  4212.  
  4213.   thisuser.defprot=0;
  4214.   thisuser.defed=0;
  4215.   if (okansi()) {
  4216.   nl();
  4217.   prt(5,"Select a full-screen editor? ");
  4218.   if (ny())
  4219.    select_editor();
  4220.   }
  4221.    nl();
  4222.   prt(5,"Select a default transfer protocol? ");
  4223.   if (ny()) {
  4224.   nl();
  4225.   pl("Enter your default protocol, 0 for none.");
  4226.   nl();
  4227.   i=get_protocol(1);
  4228.   if (i>=0)
  4229.   thisuser.defprot=i;
  4230.  }
  4231.   thisuser.sl=syscfg.newusersl;         /* Validation starts here */
  4232.   thisuser.dsl=syscfg.newuserdsl;       /* Mostly new code        */
  4233.   thisuser.ar=0;
  4234.   thisuser.dar=0;
  4235.   thisuser.exempt=0;
  4236.   nl();
  4237.   prt(5,"Are you CURRENTLY the SysOp of a BBS? (no Co-SysOps) ");
  4238.    if (yn()) {
  4239.     printfile("VALID");                                    /* see note */
  4240.     outstr("Which? 1-4,N : ");
  4241.     ch=onek("N1234");
  4242.       switch(ch) {
  4243. /*************************************************************************
  4244. This will autovalidate an unregistered WWIV SysOp NOT in WWIVnet and ONLY
  4245. allow access to the addon directory of the BBS and NO other areas anywhere.
  4246. *************************************************************************/
  4247.       case '1':
  4248.         pl("Please enter your BBS NAME and PHONE NUMBER.");
  4249.         outstr(":");
  4250.         inputl(thisuser.note,40);
  4251.         sprintf(s1,"%s validated as WWIV SysOp (no net)",thisuser.name);
  4252.         ssm(1,0,s1);      /* sends SMW note to SysOp at logon */
  4253.         sysoplog("#*#*#* Auto-validation of WWIV SysOp (no net)");
  4254.         thisuser.sl=70;              /* Change this to suit your needs */
  4255.         thisuser.dsl=70;             /*   "     "   "   "    "     "   */
  4256.         thisuser.exempt=1;           /*   "     "   "   "    "     "   */
  4257.         thisuser.restrict=24;        /*   "     "   "   "    "     "   */
  4258.         thisuser.ar=33;              /* AR bits A,F                    */
  4259.         thisuser.dar=4096;           /* DAR bit M                      */
  4260.         nl();
  4261.         printfile("WWIVSOP");        /* see note */
  4262.         nl();
  4263.         pausescr();
  4264.         break;
  4265. /*************************************************************************
  4266. Does the same as case '1' but for unregisterd WWIVnet SysOps and only
  4267. allows them access to non source areas of the BBS.
  4268. *************************************************************************/
  4269.       case '2':
  4270.         pl("Please enter your BBS NAME and PHONE NUMBER.");
  4271.         outstr(":");
  4272.         inputl(thisuser.note,40);
  4273.         sprintf(s1,"%s validated as UNregistered WWIVnet SysOp",thisuser.name);
  4274.         ssm(1,0,s1);      /* sends SMW note to SysOp at logon */
  4275.         sysoplog("#*#*#* Auto-validation of Unregistered WWIVnet SysOp");
  4276.         thisuser.sl=70;              /* Change this to suit your needs */
  4277.         thisuser.dsl=70;             /*   "     "   "   "    "     "   */
  4278.         thisuser.exempt=1;           /*   "     "   "   "    "     "   */
  4279.         thisuser.restrict=24;        /*   "     "   "   "    "     "   */
  4280.         thisuser.ar=33;              /* AR bits A,F                    */
  4281.         thisuser.dar=4096;           /* DAR bit M                      */
  4282.         nl();
  4283.         printfile("WWNETSOP");       /* see note */
  4284.         nl();
  4285.         pausescr();
  4286.         break;
  4287. /************************************************************************
  4288. This will autovalidated a SysOp who belongs to WWIVnet and has registered
  4289. WWIV.  It checks for a valid NODE number and an accompanying valid phone
  4290. number. It also gives the visiting SysOp full run of the BBS.
  4291. ************************************************************************/
  4292.       case '3':
  4293.         nl();
  4294.         pl ("Please enter your NODE number");
  4295.         outstr(":");
  4296.         input(sysnum,5);
  4297.         sysnumber=atoi(sysnum);
  4298.         csne=next_system(sysnumber);
  4299.         strcpy(ph,csne->phone);
  4300.         strcpy(sysname,csne->name);
  4301.         nl();
  4302.         pl ("Please enter your SYSTEM phone number\r\n ###-###-####");
  4303.         outstr(":");
  4304.         input(ph1,12);
  4305.       if (compare(ph,ph1)) {
  4306.         sprintf(s,"Sysop @%u %s",sysnumber,sysname);
  4307.         strcpy(thisuser.note,s);
  4308.         sprintf(s1,"%s validated as registered WWIVnet SysOp",thisuser.name);
  4309.         ssm(1,0,s1);       /* Sends SMW message to SysOp at logon */
  4310.         sysoplog("#*#*#* Auto-validation of registered WWIVnet SysOp");
  4311.         sysoplog(s);
  4312.         thisuser.sl=90;              /* Change this to suit your needs */
  4313.         thisuser.dsl=90;             /*   "     "   "   "    "     "   */
  4314.         thisuser.exempt=9;           /*   "     "   "   "    "     "   */
  4315.         thisuser.restrict=24;        /*   "     "   "   "    "     "   */
  4316.         thisuser.ar=8225;            /* AR bits A,F,N                  */
  4317.         thisuser.dar=4097;           /* DAR bits A, M                  */
  4318.         nl();
  4319.         printfile("WWIVSYSP");       /* see note */
  4320.         nl();nl();
  4321.         printfile("WWIVSOP1");       /* see note */
  4322.         nl();
  4323.         pausescr();
  4324.         enter_regnum();              /* requests WWIV Reg # if all tests */
  4325.       } else {                       /* are passed */
  4326.         nl();
  4327.         printfile("WWIVSOP2");       /* see note */
  4328.         nl();
  4329.         sprintf(s,"Attemped WWIV sysop autovalidation.");
  4330.         strcpy(thisuser.note,s);
  4331.       }
  4332.         break;
  4333. /************************************************************************
  4334. Here is where I autovalidate NON-WWIV SysOp running other BBS software.
  4335. Mine requests they are ONLY from my local area because I'm cheap and don't
  4336. want to call LD to verify their authenticity.  It also give the visiting
  4337. SysOp full run of my board, so be careful here. You may want to change it.
  4338. *************************************************************************/
  4339.       case '4':
  4340.         nl();
  4341.         pl("Please enter your BBS NAME and PHONE NUMBER. (local to Houston)");
  4342.         outstr(":");
  4343.         inputl(thisuser.note,40);
  4344.         sprintf(s1,"%s validated as NON-WWIV SysOp",thisuser.name);
  4345.         ssm(1,0,s1);      /* send SMW message to SysOp at logon */
  4346.         sysoplog("#*#*#* Auto-validation of a Non-WWIV Local SysOp");
  4347.         thisuser.sl=70;              /* Change this to suit your needs */
  4348.         thisuser.dsl=30;             /*   "     "   "   "    "     "   */
  4349.         thisuser.exempt=0;           /*   "     "   "   "    "     "   */
  4350.         thisuser.restrict=24;        /*   "     "   "   "    "     "   */
  4351.         thisuser.ar=8225;            /* AR bits A,F,N                  */
  4352.         thisuser.dar=1;              /* DAR bit A                      */
  4353.         nl();
  4354.         printfile("NONWWSOP");       /* see note */
  4355.         nl();
  4356.         pausescr();
  4357.         break;
  4358. /************************************************************************
  4359. Gives them the option of getting out of the autovalidation process if they
  4360. are honest. WARNING - some DO claim to be what they are not.
  4361. *************************************************************************/
  4362.       case 'N':
  4363.         nl();
  4364.         thisuser.note[0]=0;
  4365.         thisuser.exempt=0;
  4366.         thisuser.restrict=syscfg.newuser_restrict;
  4367.         break;
  4368.     }
  4369.    nl();
  4370.   }
  4371.   reset_act_sl();       /* resets thisuser.sl so they have */
  4372. }                       /* use of the board */
  4373.  
  4374. /* end block read */
  4375.  
  4376.  
  4377. 3. Search for 'input_ansistat' and put
  4378. fullscred_protocol_autoval();
  4379. on the line AFTER it.
  4380.  
  4381. 4. Load up FNCS.H and search for 'void newuser()' and put the following
  4382. line before it:
  4383. void fullscred_protocol_autoval();
  4384.  
  4385. OK, that's it for the source modding.
  4386.  
  4387. NOTE:  You will need to create several messages to be placed in your
  4388.        GFILES directory.  Mine are as follows but you may wish to reword
  4389.        them somewhat according to how your system is set up.
  4390.  
  4391. VALID.MSG  (This is the menu screen)
  4392.  
  4393.     Which type of BBS is this?  Must be CURRENTLY operational.
  4394.  
  4395.  1. Plain WWIV (no net/no registration #)  
  4396.  2. Unregistered WWIVnet (no registration #)
  4397.  3. Registered WWIVnet (MUST have valid Reg #)                    
  4398.  4. Running other BBS Software (Local to Houston ONLY)
  4399.  N. None of the above
  4400.  
  4401. WWIVSOP.MSG (This is the message WWIV (no net) SysOps will see.
  4402.  
  4403. You have been auto-validated as an unregistered WWIV
  4404. SysOp. If I find any of this information to be false,
  4405. your account will be deleted and other WWIV SysOps
  4406. informed about you.
  4407.  
  4408. WWNETSOP.MSG
  4409.  
  4410. You have been auto-validated as an unregistered
  4411. WWIVnet SysOp. If I find any of this information
  4412. to be false your account will be deleted and othur2[0;37;40mM
  4413. WWIVnet`S╣sOps`╖ill`óe`⌐nformed`íbout`╣ounM
  4414.  
  4415. WWIVSYSP.MSG
  4416.  
  4417. You have been auto-validated as a WWIVnet SysOp.
  4418. If I find any of this information to be false, I will
  4419. delete your account and inform others about you!
  4420.  
  4421. WWIVSOP1.MSG (requests them to send E-Mail from their boards)
  4422.  
  4423. IMPORTANT!!!  You MUST send net E-Mail to 1@7350
  4424. from YOUR system to verify this account or it
  4425. will be deleted in 7 days.
  4426.  
  4427. WWIVSOP2.MSG (for those that fail the autovalidation tests)
  4428.  
  4429. The information you provided does NOT match WWIVnet files.
  4430. Application for SysOp status is denied!!!
  4431.  
  4432. Your attempt to gain access to this BBS as a WWIV SysOp will
  4433. be posted on the "WWIVnet AC's & GC's" sub board.
  4434.  
  4435. NONWWSOP.MSG (for those SysOps running other than WWIV software. Since
  4436. there is currently no good way to check their statements for validity I
  4437. simply autovalidate them as regular users until I have a chance to call
  4438. them voice, then upgrade them to visiting SysOps.)
  4439.  
  4440. The information you have provided will
  4441. be verified.  In the meantime you have 
  4442. been validated as a prefered user. Upon
  4443. verification that your BBS exists your
  4444. account will be upgraded to that of a
  4445. visiting SysOp.
  4446.  
  4447. If I find any of this info to be false,
  4448. or I can NOT find your BBS listed in the
  4449. current Houston BBS list, I will delete
  4450. your account and inform other local
  4451. SysOps about you.
  4452.  
  4453. You may have to make some changes as to how your BBS is set up or make
  4454. changes to the SL's DSL's etc. above.  Mine is set up to ONLY allow
  4455. unregistered WWIV and WWIVnet SysOps access to the WWIV addon programs in
  4456. the transfer section and nothing else on the BBS.  The registered WWIVnet
  4457. SysOps have full run of the board. (ALL areas).
  4458.  
  4459. For those of you that don't know thisuser.exempt, thisuser.restrict,
  4460. thisuser.ar and thisuser.dar are all bit mapped.  It is a rather long
  4461. explanation on how to do this but I will give a minimal example:
  4462.  
  4463. A=1, B=2, C=4, D=8, E=16 etc., doubling for each letter. To give an AR of
  4464. A & B you would simply add the numbers together equaling 3, to give an AR
  4465. of A,B,C you just add the numbers 1+2+4=7.  Very easy!
  4466.  
  4467. If you have any problems with the mod I will not be held responsible, it
  4468. works for me and a few others.
  4469.  
  4470. Any questions or problems I can be reached as 1@7350.
  4471.  
  4472.  
  4473.  
  4474.  
  4475.  
  4476.  
  4477.  
  4478.  
  4479. [43/99]: The easist mod in the world.
  4480. [Name ]: Sawmill #1 @3750
  4481. [Date ]: Mon Dec 30 23:41:20 1991
  4482. [From ]: Bill and Ted's Excellent BBS (Indiana)
  4483.  
  4484.  
  4485. ModName    : TOPSCRN.MOD
  4486. WWIV Ver   : Written on v4.12, but should work on ANY version
  4487. Files      : CONIO.C
  4488. Difficulty : See Title
  4489. Why        : Because I haven't seen anyone doe this before.
  4490.  
  4491.  
  4492.  
  4493. Well, I hardly consider this a mod, but thought it was just helpful enough
  4494. to post.  This is REALLY simple.  I have a combination Elric FROM Mod and
  4495. another FROM mod that I can't remember the name of right now.  Anyway, since
  4496. I had a decent amount of long distance callers, I thought it would be nice
  4497. to see where they were calling from from the TOPSCREEN.  If someone has done
  4498. this before, a thousand pardons, but I thought this was SO simple that
  4499. perhaps it had been overlooked.  This is one of those mods that I added,
  4500. and never thought to release 'cause it was SO simple.  SO simple, that no
  4501. one else had released it.  :)  :)
  4502.  
  4503. Anyway, on with the super-mini-mod.
  4504.  
  4505. This puts the thisuser.citystate in place of "Com Disabled".  It does NOT
  4506. disable this feature, if just takes if off the topscreen and replaces it
  4507. with where the user is calling from.  You must have some type of FROM mod
  4508. installed which uses thisuser.citystate (or whatever)
  4509.  
  4510. Load up CONIO.C
  4511. Do a search for "Comm Disabled"
  4512. It should look something like this:
  4513.  
  4514.   if (topdata)
  4515.   {
  4516.     movecsr(6,ln);
  4517.     if ((using_modem) && (!incom))
  4518.       outs("Comm Disabled");
  4519.     else
  4520.       outs("═════════════");
  4521.  
  4522.     movecsr(24,ln);
  4523.     if ((realsl !=255) && (thisuser.sl==255))
  4524.       outs("Temp Sysop");
  4525.  
  4526. Now, replace the "Comm Disabled" and the "═════════════" with
  4527. thisuser.citystate.  It should look something like this now:
  4528.  
  4529.   if (topdata)
  4530.   {
  4531.     movecsr(6,ln);
  4532.     if (!incom)
  4533.       outs(thisuser.citystate);
  4534.     else
  4535.       outs(thisuser.citystate);
  4536.  
  4537.     movecsr(24,ln);
  4538.     if ((realsl !=255) && (thisuser.sl==255))
  4539.       outs("Temp Sysop");
  4540.  
  4541.  
  4542. That was SO simple that it about makes you sick, huh?  Your F-3 key will still
  4543. work, but it won't tell you that it is.  I suppose you could make it where it
  4544. would display the thisuser.citystate UNLESS F3 was pressed, but since I never
  4545. use it (I disable modem OUTPUT, so the user can't see what I'm doing) I didn't
  4546. bother.
  4547. As always, make a backup of your source before EVERY mod, although if you mess
  4548. this up...  (Or do like me, do little crap mods like this all at once, try to
  4549. compile and then trace it down.  Twice the work, half the production)
  4550.  
  4551. Sawmill
  4552.  
  4553.   ╓──────────────────────Bill and Ted's Excellent BBS───────────────────────╖
  4554.   ║       Snarfable - USR HST v.42bis - AutoVal - WWIV Support Files        ║
  4555.   ╙──────(317) 452-0945  WWIVLink @13752  WWIVNet @3750 SysOp:Sawmill───────╜
  4556.  
  4557.  
  4558.  
  4559.  
  4560.  
  4561.  
  4562. [44/99]: Not a Mod, persae....
  4563. [Name ]: Electric Dragon #1 @6977 [Sysop God!]
  4564. [Date ]: Tue Dec 31 17:03:33 1991
  4565. [From ]: Dragon's Aerie BBS (Southern California)
  4566.  
  4567. #############################################################################
  4568. #
  4569. # This is the makefile for TC v2.0 and TC++ (1.0).
  4570. #
  4571. # Rename this file to 'makefile.mak' to use it.
  4572. #
  4573.  
  4574.  
  4575. #############################################################################
  4576. #
  4577. # Specify directories to use
  4578. #
  4579.  
  4580. !if $(__MAKE__) >= 0x0300
  4581. TC  = d:\tc
  4582. !else
  4583. TC  = d:\tc
  4584. !endif
  4585.  
  4586. OBJ = d:\source\\
  4587.  
  4588. EXE = d:\source\\
  4589.  
  4590.  
  4591. #############################################################################
  4592. #
  4593. # Get 286 and 87 options.  Define the env-var "87" or "286" and the
  4594. # corresponding type of executable will be built automatically
  4595. #
  4596.  
  4597. !if $d(87)
  4598. OPS87=-f87
  4599. LIB87=fp87
  4600. !else
  4601. LIB87=emu
  4602. !endif
  4603.  
  4604. !if $d(286)
  4605. OPS286=-1
  4606. !endif
  4607.  
  4608.  
  4609. #############################################################################
  4610. #
  4611. # Decide if we want to use TC++ or TC 1.5/2.0.  If make version is 3.0, then
  4612. # assume the user has TC++.  If this is not correct, fix it yourself.
  4613. #
  4614.  
  4615. !if $(__MAKE__) >= 0x0300
  4616. C_PLUS_PLUS = YES
  4617. USE_OVERLAYS = YES
  4618. !endif
  4619.  
  4620. !if $d(USE_OVERLAYS)
  4621. OVER_START = /o
  4622. OVER_END = /o-
  4623. OVER_LIB = $(TC)\lib\overlay
  4624. !endif
  4625.  
  4626.  
  4627. #############################################################################
  4628. #
  4629. # Define command lines to use.
  4630. #
  4631. #
  4632.  
  4633. TCOPTS= -O -d -r -ml -N- -Z -c $(OPS87) $(OPS286)
  4634.  
  4635. TCC = tcc $(TCOPTS) $(TCC_OPTS) -I$(TC)\include -n$(OBJ) $&.c
  4636.  
  4637.  
  4638. !if $d(USE_OVERLAYS)
  4639. TCC_NRM = tcc $(TCOPTS) $(TCC_OPTS) -Y -I$(TC)\include -n$(OBJ) $&.c
  4640. TCC_OVL = tcc $(TCOPTS) $(TCC_OPTS) -Yo -I$(TC)\include -n$(OBJ) $&.c
  4641.  
  4642. !else
  4643. TCC_NRM = $(TCC)
  4644. TCC_OVL = $(TCC)
  4645. !endif
  4646.  
  4647.  
  4648.  
  4649. #############################################################################
  4650. #
  4651. #
  4652. # Normal, non-overlaid bbs files
  4653. #
  4654. BBS_NRM = \
  4655.         $(OBJ)bbs.obj $(OBJ)bbsutl.obj $(OBJ)bbsutl1.obj $(OBJ)com.obj\
  4656.         $(OBJ)conio.obj $(OBJ)connect1.obj $(OBJ)extrn.obj $(OBJ)modem.obj\
  4657.         $(OBJ)msgbase.obj $(OBJ)msgbase1.obj $(OBJ)shrink.obj $(OBJ)sr.obj\
  4658.         $(OBJ)utility.obj $(OBJ)xfer.obj $(OBJ)netsup.obj
  4659. #
  4660. # Overlaid bbs files
  4661. #
  4662. BBS_OVL = \
  4663.         $(OBJ)newuser.obj $(OBJ)sysopf.obj $(OBJ)voteedit.obj\
  4664.         $(OBJ)gfledit.obj $(OBJ)tedit.obj $(OBJ)chnedit.obj\
  4665.         $(OBJ)uedit.obj $(OBJ)diredit.obj $(OBJ)subedit.obj\
  4666.         $(OBJ)xferovl.obj $(OBJ)multmail.obj $(OBJ)gfiles.obj\
  4667.         $(OBJ)defaults.obj $(OBJ)misccmd.obj $(OBJ)xinit.obj\
  4668.         $(OBJ)batch.obj \
  4669.         $(OBJ)lilo.obj $(OBJ)ansi.obj\
  4670.         $(OBJ)pulldown.obj $(OBJ)autoval.obj $(OBJ)snark.obj
  4671.  
  4672. #############################################################################
  4673. #
  4674. # Building everything requires bbs.exe, return.exe, and bbs.com.
  4675. #
  4676.  
  4677. all: $(EXE)bbs.exe $(EXE)return.exe $(EXE)bbs.com
  4678.  
  4679. #############################################################################
  4680. #
  4681. # Building return.exe and bbs.com is easy and the same everywhere.
  4682. #
  4683.  
  4684. $(EXE)return.exe: $(OBJ)return.obj
  4685.   tlink /c /x $(TC)\lib\c0l+$(OBJ)return,$(EXE)return,,$(TC)\lib\$(LIB87)+\
  4686.     $(TC)\lib\mathl+$(TC)\lib\cl
  4687.  
  4688. $(EXE)bbs.com  : loader.asm
  4689.   @echo You do not really need to compile loader.asm, as bbs.com comes with
  4690.   @echo the source code already.  Put it in the $(EXE) directory to avoid
  4691.   @echo this error if you do not have tasm installed.
  4692.   tasm loader,$(OBJ)loader.obj
  4693.   tlink /c /x /t $(OBJ)loader,$(EXE)bbs.com
  4694.  
  4695.  
  4696. #############################################################################
  4697. #
  4698. # make v3.0 supports response files, previous versions were brain-dead.
  4699. #
  4700.  
  4701. !if $(__MAKE__) >= 0x0300
  4702.  
  4703. $(EXE)bbs.exe: $(BBS_NRM) $(BBS_OVL)
  4704.   tlink /c /m @&&^
  4705. $(TC)\lib\c0l.obj $(BBS_NRM) $(OVER_START) $(BBS_OVL) $(OVER_END)
  4706. $(EXE)bbs
  4707. bbs.map
  4708. $(TC)\lib\$(LIB87) $(TC)\lib\mathl $(OVER_LIB) $(TC)\lib\cl
  4709. ^
  4710.  
  4711. !else
  4712.  
  4713. $(EXE)bbs.exe: $(BBS_NRM) $(BBS_OVL) linkfile
  4714.   tlink /c /x 
  4715. @linkfile,$(EXE)bbs,bbs.map,$(TC)\lib\$(LIB87)+$(TC)\lib\mathl+$(TC)\lib\cl
  4716.  
  4717. linkfile: makefile.mak makelf.bat
  4718.   @command /c makelf $(TC) $(OBJ)
  4719.  
  4720. !endif
  4721.  
  4722. #############################################################################
  4723. #
  4724. # How each of the .OBJ files depends upon source files.
  4725. #
  4726.  
  4727.  
  4728. $(OBJ)bbs.obj     : bbs.c      vars.h vardec.h net.h
  4729.   $(TCC_NRM)
  4730. $(OBJ)modem.obj   : modem.c    vars.h vardec.h net.h
  4731.   $(TCC_NRM)
  4732. $(OBJ)bbsutl.obj  : bbsutl.c   vars.h vardec.h net.h
  4733.   $(TCC_NRM)
  4734. $(OBJ)bbsutl1.obj : bbsutl1.c  vars.h vardec.h net.h
  4735.   $(TCC_NRM)
  4736. $(OBJ)com.obj     : com.c      vars.h vardec.h net.h
  4737.   $(TCC_NRM)
  4738. $(OBJ)conio.obj   : conio.c    vars.h vardec.h net.h
  4739.   $(TCC_NRM)
  4740. $(OBJ)connect1.obj: connect1.c vars.h vardec.h net.h
  4741.   $(TCC_NRM)
  4742. $(OBJ)extrn.obj   : extrn.c    vars.h vardec.h net.h
  4743.   $(TCC_NRM)
  4744. $(OBJ)msgbase.obj : msgbase.c  vars.h vardec.h net.h
  4745.   $(TCC_NRM)
  4746. $(OBJ)msgbase1.obj: msgbase1.c vars.h vardec.h net.h
  4747.   $(TCC_NRM)
  4748. $(OBJ)newuser.obj : newuser.c  vars.h vardec.h net.h
  4749.   $(TCC_OVL)
  4750. $(OBJ)shrink.obj  : shrink.c   vars.h vardec.h net.h
  4751.   $(TCC_NRM)
  4752. $(OBJ)sr.obj      : sr.c       vars.h vardec.h net.h
  4753.   $(TCC_NRM)
  4754. $(OBJ)sysopf.obj  : sysopf.c   vars.h vardec.h net.h
  4755.   $(TCC_OVL)
  4756. $(OBJ)utility.obj : utility.c  vars.h vardec.h net.h
  4757.   $(TCC_NRM)
  4758. $(OBJ)xfer.obj    : xfer.c     vars.h vardec.h net.h
  4759.   $(TCC_NRM)
  4760. $(OBJ)netsup.obj  : netsup.c   vars.h vardec.h net.h
  4761.   $(TCC_NRM)
  4762. $(OBJ)voteedit.obj: voteedit.c vars.h vardec.h net.h
  4763.   $(TCC_OVL)
  4764. $(OBJ)gfledit.obj : gfledit.c  vars.h vardec.h net.h
  4765.   $(TCC_OVL)
  4766. $(OBJ)tedit.obj   : tedit.c    vars.h vardec.h net.h
  4767.   $(TCC_OVL)
  4768. $(OBJ)chnedit.obj : chnedit.c  vars.h vardec.h net.h
  4769.   $(TCC_OVL)
  4770. $(OBJ)uedit.obj   : uedit.c    vars.h vardec.h net.h
  4771.   $(TCC_OVL)
  4772. $(OBJ)diredit.obj : diredit.c  vars.h vardec.h net.h
  4773.   $(TCC_OVL)
  4774. $(OBJ)subedit.obj : subedit.c  vars.h vardec.h net.h
  4775.   $(TCC_OVL)
  4776. $(OBJ)xferovl.obj : xferovl.c  vars.h vardec.h net.h
  4777.   $(TCC_OVL)
  4778. $(OBJ)multmail.obj: multmail.c vars.h vardec.h net.h
  4779.   $(TCC_OVL)
  4780. $(OBJ)gfiles.obj  : gfiles.c   vars.h vardec.h net.h
  4781.   $(TCC_OVL)
  4782. $(OBJ)defaults.obj: defaults.c vars.h vardec.h net.h
  4783.   $(TCC_OVL)
  4784. $(OBJ)misccmd.obj : misccmd.c  vars.h vardec.h net.h
  4785.   $(TCC_OVL)
  4786. $(OBJ)xinit.obj   : xinit.c    vars.h vardec.h net.h
  4787.   $(TCC_OVL)
  4788. $(OBJ)xfertmp.obj : xfertmp.c  vars.h vardec.h net.h
  4789.   $(TCC_OVL)
  4790. $(OBJ)batch.obj   : batch.c    vars.h vardec.h net.h
  4791.   $(TCC_OVL)
  4792. $(OBJ)lilo.obj    : lilo.c     vars.h vardec.h net.h
  4793.   $(TCC_OVL)
  4794. $(OBJ)ansi.obj   : ansi.c     vars.h vardec.h net.h
  4795.   $(TCC_OVL)
  4796. $(OBJ)pulldown.obj : pulldown.c vars.h vardec.h net.h
  4797.   $(TCC_OVL)
  4798. $(OBJ)autoval.obj  : autoval.c vars.h vardec.h net.h
  4799.   $(TCC_OVL)
  4800. $(OBJ)return.obj  : return.c   vars.h vardec.h net.h
  4801.   $(TCC)
  4802. $(OBJ)snark.obj   : snark.c vars.h vardec.h net.h
  4803.   $(TCC)
  4804.  
  4805.  
  4806. #############################################################################
  4807. #
  4808. # routine to make fcns.h
  4809. #
  4810.  
  4811. !if $(__MAKE__) >= 0x0300
  4812.  
  4813. fcns:
  4814.   strip fcns.h &&^
  4815. $(BBS_NRM) $(BBS_OVL)
  4816. ^
  4817. !endif
  4818.  
  4819.  
  4820.  
  4821.  
  4822.  
  4823.  
  4824.  
  4825. [45/99]: The previous post...
  4826. [Name ]: Electric Dragon #1 @6977 [Sysop God!]
  4827. [Date ]: Tue Dec 31 17:09:51 1991
  4828. [From ]: Dragon's Aerie BBS (Southern California)
  4829.  
  4830. IRT: Not a Mod, persae....
  4831. BY: Electric Dragon #1 @6977 [Sysop God!]
  4832.  
  4833. ...was a working makefile.mak, I read a few posts in here and some in the
  4834. 'Talk' sub and decided to post it. I have several "unusual" .C files in there
  4835. so to change it just follow the format and you should be all set. Make sure
  4836. to check the drive spec's also to fit your needs. Also, make sure ?:\TC\BIN
  4837. and ?:\TASM along with your source directory are in your path.
  4838.  
  4839.                              »»»ε│êç┼τìç Dτâgôn«««
  4840.  
  4841. p.s. I don't think a disclaimer is needed here...but just in case..I didn't do
  4842. it..if you have problems e-mail me and I will try to help.
  4843.  
  4844.  
  4845.               ─────────═══════════════════════════════════─────────
  4846.                  Dragon's Aerie 619-223-9239 24oo-384oo NET@6977      
  4847.               ─────────═══════════════════════════════════─────────
  4848.  
  4849.  
  4850.  
  4851.  
  4852.  
  4853.  
  4854. [46/99]: Suggestions...
  4855. [Name ]: Daniel Duerr #1 @4801
  4856. [Date ]: Mon Dec 30 01:32:55 1991
  4857. [From ]: The Cutting Edge (Central California)
  4858.  
  4859. Here are some of the 'little' mods I made on mine...
  4860.  
  4861. 1) Change the "Post/Call Ratio is nnn.  You need a ratio of xxx to Download" to "Your Message Posts Per Call Ratio is nnn.  You must have a ratio of xxx to 
  4862. Download."
  4863.  
  4864. 2) Add the Name of the Current Sub above the Read prompt:
  4865.  
  4866.      Current Area: « General Mail »
  4867.      Read (1-1,^1):
  4868.  
  4869. Some More coming Later on...
  4870.  
  4871.                                                   Daniel Duerr
  4872.  
  4873.  
  4874.  
  4875.  
  4876.  
  4877.  
  4878.  
  4879. [47/99]: DEFRAG.C v1.10 Explanation                         <Program>
  4880. [Name ]: East Bay Ray #1 @9964
  4881. [Date ]: Wed Jan 01 18:17:49 1992
  4882. [From ]: East Carolina Connection (North Carolina)
  4883.  
  4884. The following is the source code to my own version of BASEPACK.  I still have 
  4885. A LOT of speed improvements to do, as well as a lot of features to add, but I 
  4886. thought that everyone who is having trouble with BASEPACK should try this.  I 
  4887. have only tested it on my system, so I don't give any guarantees for anyone 
  4888. else's system.
  4889.  
  4890. It uses only slightly modded WWIV message base routines.
  4891.  
  4892. Features available now (over BASEPACK):
  4893.      -    No messy cursor-all-over-the-place screen interface.
  4894.      -    Doesn't trash messages.  I used straight WB v4.20 message
  4895.           reading code.
  4896.      -    Doesn't leave those messy TEMP*.$$$ message files whenever
  4897.           a base doesn't exist.
  4898.      -    Compresses the *.SUB files too.
  4899.      -    Compact DATA\EMAIL.DAT and MSGS\EMAIL.DAT.  BASEPACK never touches
  4900.           either of these.
  4901.      -    Removes messages with no text.
  4902.      -    Generates on-screen report when done.  Message base stats, 
  4903.           damaged files, etc.
  4904.  
  4905. Features coming soon:
  4906.      -    Keep files open until done.  Drastically increases speed.
  4907.      -    Will fix damaged type-2s on the fly, just like FIX.EXE by 1@1.
  4908.      -    Optionally generate a disk log of all activities.
  4909.      -    WWIV v4.21 huge Type-2 file support (> 1 MB message files).
  4910.  
  4911.  
  4912.  
  4913.  
  4914.  
  4915.  
  4916. [48/99]: DEFRAG.C v1.10 Source Code                         <Program>
  4917. [Name ]: East Bay Ray #1 @9964
  4918. [Date ]: Wed Jan 01 18:18:33 1992
  4919. [From ]: East Carolina Connection (North Carolina)
  4920.  
  4921. /*  DEFRAGMENT WWIV TYPE-2 MESSAGE BASES */
  4922.  
  4923. /*  Written by Jeff Garzik (East Bay Ray), 11-24-1991                    */
  4924. /*  Copyright (c) 1991 Jeff M. Garzik                                    */
  4925. /*  Compiled and tested using Borland C++ - Version 2.0                  */
  4926. /*  License granted to freely distribute without compensation and to     */
  4927. /*  modify as needed "to get the job done."  Use at your own risk.       */
  4928. /*  Distributed "as is".  No warranty or guarantee.                      */
  4929. /*  Cannot be used or sold COMMERCIALLY without prior written permission */
  4930. /*  of the author, Jeff Garzik.                                          */
  4931. /*  Portions Copyright (c) 1988-1991 by Wayne Bell.                      */
  4932.  
  4933. /*  Jeff Garzik    v1.00     Initial Release.                            */
  4934. /*  Jeff Garzik    v1.10     Searches correct drive for free space.      */
  4935. /*                           Processes command line arguments /E, /C.    */
  4936. /*                           Compresses EMAIL.DAT.                       */
  4937. /*                           Processes command line argument /O.         */
  4938. /*                           Prints out report upon completion.          */
  4939. /*                           Removes messages with no text.              */
  4940. /*                           Automated mode support shell added.  No     */
  4941. /*                             real code is in place for this one.  This */
  4942. /*                             will be for the "fix" feature in the next */
  4943. /*                             release of the program.  If automated     */
  4944. /*                             mode is on, then the program will not ask */
  4945. /*                             any questions like FIX does, and will     */
  4946. /*                             simply assume you want these fixed (or    */
  4947. /*                             not fixed, depending on how you set your  */
  4948. /*                             options).                                 */
  4949.  
  4950. /*  Compile using "bcc -ml defrag.c" */
  4951.  
  4952. #include <stdio.h>
  4953. #include <io.h>
  4954. #include <fcntl.h>
  4955. #include <string.h>
  4956. #include <stdlib.h>
  4957. #include <sys\stat.h>
  4958. #include <dos.h>
  4959. #include <alloc.h>
  4960. #include <time.h>
  4961. #include <mem.h>
  4962. #include <dir.h>
  4963. #include <errno.h>
  4964. #include "vardec.h"
  4965.  
  4966. #define DEFRAG_VER "1.10"
  4967.  
  4968. configrec syscfg;
  4969. statusrec status;
  4970. subboardrec subboards[MAX_SUBS];
  4971. unsigned int num_subs, nummsgs;
  4972. postrec *msgs;
  4973. char gatfn[81];
  4974. short *gat;
  4975. int curdrive, conf_count, conf_scan[MAX_SUBS], scan_email, automated, assume_y;
  4976. long messages, totmsgsize, msg_no_text;
  4977. time_t program_start;
  4978.  
  4979.  
  4980. /*************************************************************************/
  4981. /****************** Wayne Bell's Code (slightly modified) ****************/
  4982. /*************************************************************************/
  4983.  
  4984.  
  4985. long dfree(int dr)
  4986. /* returns number of bytes available on specified drive */
  4987. {
  4988.   long d;
  4989.   struct dfree df;
  4990.  
  4991.   getdfree(dr,&df);
  4992.   d = df.df_avail;
  4993.   d *= (df.df_bsec);
  4994.   d *= (df.df_sclus);
  4995.   if (df.df_sclus<0)
  4996.     d = -1.0;
  4997.   return(d);
  4998. }
  4999.  
  5000.  
  5001. void save_status()
  5002. /* saves system status in memory to disk */
  5003. {
  5004.   char s[80];
  5005.   int statusfile;
  5006.  
  5007.   sprintf(s,"%sSTATUS.DAT",syscfg.datadir);
  5008.   statusfile=open(s,O_RDWR | O_BINARY);
  5009.   write(statusfile, (void *)(&status), sizeof(statusrec));
  5010.   close(statusfile);
  5011. }
  5012.  
  5013.  
  5014. void get_status()
  5015. /* retrieves system status from disk into memory */
  5016. {
  5017.   char s[81];
  5018.   int statusfile;
  5019.  
  5020.   sprintf(s,"%sSTATUS.DAT",syscfg.datadir);
  5021.   statusfile=open(s,O_RDWR | O_BINARY);
  5022.   if (statusfile>=0) {
  5023.     read(statusfile,(void *)(&status), sizeof(statusrec));
  5024.     close(statusfile);
  5025.   } else
  5026.     status.wwiv_version = 0;
  5027. }
  5028.  
  5029.  
  5030. void iscan(int b)
  5031. /* loads information about message base #b into memory */
  5032. {
  5033.   int f;
  5034.   char s[81];
  5035.  
  5036.   nummsgs = 0;
  5037.   sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[b].filename);
  5038.   f = open(s, O_BINARY | O_RDWR);
  5039.   if (f == -1) {
  5040.     f = open(s, O_BINARY | O_RDWR | O_CREAT,S_IREAD | S_IWRITE);
  5041.     msgs[0].owneruser = 0;
  5042.     write(f, (void *)(&msgs[0]), sizeof(postrec));
  5043.   }
  5044.   lseek(f, 0L, SEEK_SET);
  5045.   nummsgs = (read(f, (void *)(&msgs[0]),255*sizeof(postrec)) / 
  5046. sizeof(postrec))-1;
  5047.   nummsgs = msgs[0].owneruser;
  5048.   close(f);
  5049. }
  5050.  
  5051.  
  5052. void savebase(int b)
  5053. /* saves message information in memory to disk */
  5054. {
  5055.   int f;
  5056.   char s[81];
  5057.  
  5058.   sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[b].filename);
  5059.   f = open(s, O_RDWR | O_BINARY | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE);
  5060.   lseek(f, 0L, SEEK_SET);
  5061.   msgs[0].owneruser = nummsgs;
  5062.   write(f, (void *)(&msgs[0]), ((nummsgs+1) * sizeof(postrec)));
  5063.   close(f);
  5064. }
  5065.  
  5066.  
  5067. int open_file(char *fn)
  5068. /* opens a WWIV Type-2 data file */
  5069. {
  5070.   int f,i;
  5071.   char s[81];
  5072.  
  5073.   sprintf(s,"%s%s.DAT",syscfg.msgsdir,fn);
  5074.   f=open(s,O_RDWR | O_BINARY);
  5075.   if (f<0) {
  5076.     f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  5077.     for (i=0; i<2048; i++)
  5078.       gat[i]=0;
  5079.     write(f,(void *)gat,4096);
  5080.     strcpy(gatfn,fn);
  5081. /*    chsize(f,4096L + (75L * 1024L)); */
  5082.   }
  5083.   if (strcmp(gatfn,fn)) {
  5084.     lseek(f,0L,SEEK_SET);
  5085.     read(f,(void *)gat,4096);
  5086.     strcpy(gatfn,fn);
  5087.   }
  5088.   return(f);
  5089. }
  5090.  
  5091.  
  5092. void remove_link(messagerec *m1, char *aux)
  5093. /* deletes a message */
  5094. {
  5095.   messagerec m;
  5096.   char s[81],s1[81];
  5097.   int f;
  5098.   long csec,nsec;
  5099.  
  5100.   m=*m1;
  5101.   strcpy(s,syscfg.msgsdir);
  5102.   switch(m.storage_type) {
  5103.     case 0:
  5104.     case 1:
  5105.       ltoa(m.stored_as,s1,16);
  5106.       if (m.storage_type==1) {
  5107.         strcat(s,aux);
  5108.         strcat(s,"\\");
  5109.       }
  5110.       strcat(s,s1);
  5111.       unlink(s);
  5112.       break;
  5113.     case 2:
  5114.       f=open_file(aux);
  5115.       csec=m.stored_as;
  5116.       while ((csec>0) && (csec<2048)) {
  5117.         nsec=(long) gat[csec];
  5118.         gat[csec]=0;
  5119.         csec=nsec;
  5120.       }
  5121.       lseek(f,0L,SEEK_SET);
  5122.       write(f,(void *)gat,4096);
  5123.       close(f);
  5124.       break;
  5125.     default:
  5126.       /* illegal storage type */
  5127.       break;
  5128.   }
  5129. }
  5130.  
  5131.  
  5132. void savefile(char *b, long l1, messagerec *m1, char *aux)
  5133. /* saves a message in memory to disk */
  5134. {
  5135.   int f,gatp,i5,i4,gati[128];
  5136.   messagerec m;
  5137.   char s[81],s1[81];
  5138.  
  5139.   m=*m1;
  5140.   switch(m.storage_type) {
  5141.     case 0:
  5142.     case 1:
  5143.       m.stored_as=status.qscanptr++;
  5144.       save_status();
  5145.       ltoa(m.stored_as,s1,16);
  5146.       strcpy(s,syscfg.msgsdir);
  5147.       if (m.storage_type==1) {
  5148.         strcat(s,aux);
  5149.         strcat(s,"\\");
  5150.       }
  5151.       strcat(s,s1);
  5152.       f=open(s,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
  5153.       write(f, (void *)b,l1);
  5154.       close(f);
  5155.       break;
  5156.     case 2:
  5157.       f=open_file(aux);
  5158.       gatp=0;
  5159.       i5=(int) ((l1 + 511L)/512L);
  5160.       i4=1;
  5161.       while ((gatp<i5) && (i4<2048)) {
  5162.         if (gat[i4]==0)
  5163.           gati[gatp++]=i4;
  5164.         ++i4;
  5165.       }
  5166.       gati[gatp]=-1;
  5167.       for (i4=0; i4<i5; i4++) {
  5168.         lseek(f,4096L + 512L * (long)(gati[i4]),SEEK_SET);
  5169.         write(f,(void *)(&b[i4*512]),512);
  5170.         gat[gati[i4]]=gati[i4+1];
  5171.       }
  5172.       lseek(f,0L,SEEK_SET);
  5173.       write(f,(void *)gat,4096);
  5174.       close(f);
  5175.       m.stored_as=(long) gati[0];
  5176.       break;
  5177.     case 255:
  5178.       f=open(aux,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
  5179.       write(f, (void *)b,l1);
  5180.       close(f);
  5181.       break;
  5182.     default:
  5183. /*      printf("Illegal storage type of %u on save!", m.storage_type); */
  5184.       break;
  5185.   }
  5186.   farfree((void *)b);
  5187.   *m1=m;
  5188. }
  5189.  
  5190.  
  5191. char *readfile(messagerec *m1, char *aux, long *l)
  5192. /* reads a message from disk into memory */
  5193. {
  5194.   int f,i,i1,csec;
  5195.   long l1,l2;
  5196.   char *b,s[81],s1[81];
  5197.   messagerec m;
  5198.  
  5199.   *l=0L;
  5200.   m=*m1;
  5201.   switch(m.storage_type) {
  5202.     case 0:
  5203.     case 1:
  5204.       strcpy(s,syscfg.msgsdir);
  5205.       ltoa(m.stored_as,s1,16);
  5206.       if (m.storage_type==1) {
  5207.         strcat(s,aux);
  5208.         strcat(s,"\\");
  5209.       }
  5210.       strcat(s,s1);
  5211.       f=open(s,O_RDONLY | O_BINARY);
  5212.       if (f==-1) {
  5213.         *l=0L;
  5214.         return(NULL);
  5215.       }
  5216.       l1=filelength(f);
  5217.       if ((b=farmalloc(l1))==NULL) {
  5218.         close(f);
  5219.         return(NULL);
  5220.       }
  5221.       read(f,(void *)b,l1);
  5222.       close(f);
  5223.       *l=l1;
  5224.       break;
  5225.     case 2:
  5226.       f=open_file(aux);
  5227.       csec=m.stored_as;
  5228.       l1=0;
  5229.       while ((csec>0) && (csec<2048)) {
  5230.         l1+=512L;
  5231.         csec=gat[csec];
  5232.       }
  5233.       if (!l1) {
  5234. /*        printf("\nNo message found.\n\n"); */
  5235.         return(NULL);
  5236.       }
  5237.       if ((b=farmalloc(l1))==NULL)
  5238.         return(NULL);
  5239.       csec=m.stored_as;
  5240.       l1=0;
  5241.       while ((csec>0) && (csec<2048)) {
  5242.         lseek(f,4096L + 512L*csec,SEEK_SET);
  5243.         l1+=(long)read(f,(void *)(&(b[l1])),512);
  5244.         csec=gat[csec];
  5245.       }
  5246.       close(f);
  5247.       l2=l1-512;
  5248.       while ((l2<l1) && (b[l2]!=26))
  5249.         ++l2;
  5250.       *l=l2;
  5251.       break;
  5252.     case 255:
  5253.       f=open(aux,O_RDONLY | O_BINARY);
  5254.       if (f==-1) {
  5255.         *l=0L;
  5256.         return(NULL);
  5257.       }
  5258.       l1=filelength(f);
  5259.       if ((b=farmalloc(l1+256L))==NULL)
  5260.         return(NULL);
  5261.       read(f,(void *)b,l1);
  5262.       close(f);
  5263.       *l=l1;
  5264.       break;
  5265.     default:
  5266.       /* illegal storage type */
  5267.       *l=0L;
  5268.       b=NULL;
  5269.       break;
  5270.   }
  5271.   return(b);
  5272. }
  5273.  
  5274.  
  5275. /*************************************************************************/
  5276. /****************** Wayne Bell's Code (slightly modified) ****************/
  5277. /*************************************************************************/
  5278.  
  5279.  
  5280. int get_next_email(int inf, int outf, mailrec *m)
  5281. {
  5282.   int rc=1;
  5283.   mailrec m1, m2;
  5284.   long l, l1;
  5285.  
  5286.   read(inf, (void *)(&m1), sizeof(mailrec));
  5287.   if (m1.status & status_multimail) {
  5288.     lseek(outf, 0, SEEK_SET);
  5289.     l = filelength(outf) / sizeof(mailrec);
  5290.     l1 = 0;
  5291.     while (l1 < l) {
  5292.       l1++;
  5293.       read(outf, (void *)(&m2), sizeof(mailrec));
  5294.       if (m2.msg.stored_as == m1.msg.stored_as)
  5295.         l1 = 0xFFFFFFFF;
  5296.     }
  5297.     lseek(outf, 0, SEEK_END);
  5298.   }
  5299.   if (l1 == 0xFFFFFFFF)
  5300.     rc = 0;
  5301.   *m = m1;
  5302.   return(rc);
  5303. }
  5304.  
  5305.  
  5306. void defrag_email()
  5307. {
  5308.   char s[81], s1[81], s2[81], *temp_msg_buf;
  5309.   int f, f1, f2, i, i1, i2;
  5310.   long len, num_email;
  5311.   mailrec mr;
  5312.  
  5313.   printf("Reading EMAIL.DAT...\r");
  5314.   sprintf(s1, "%sTEMP$$$!.DAT", syscfg.msgsdir);
  5315.   unlink(s1);
  5316.   sprintf(s1, "%sTEMP$$$!.DAT", syscfg.datadir);
  5317.   unlink(s1);
  5318.   sprintf(s, "%sEMAIL.DAT", syscfg.datadir);
  5319.   f1 = open(s, O_RDWR | O_BINARY);
  5320.   if (f1 < 0) {
  5321.     printf("%s NOT FOUND.\n", s);
  5322.     exit(1);
  5323.   }
  5324.   num_email = (filelength(f1) / sizeof(mailrec));
  5325.   sprintf(s1, "%sTEMP$$$!.DAT", syscfg.datadir);
  5326.   f2 = open(s1, O_RDWR | O_CREAT | O_BINARY | O_TRUNC, S_IREAD | S_IWRITE);
  5327.   if (f2 < 0) {
  5328.     printf("%s NOT CREATED.\n", s);
  5329.     close(f1);
  5330.     exit(1);
  5331.   }
  5332.   i1 = 0;
  5333.   f = open_file("EMAIL");
  5334.   if ((dfree(curdrive) > filelength(f)) && (f > 0)) {
  5335.     close(f);
  5336.     for (i1 = 0; i1 < num_email; i1++) {
  5337.       printf("De-fragging EMAIL.DAT (%d/%d)...\r", (i1 + 1), num_email);
  5338.       if (get_next_email(f1, f2, &mr))
  5339.         if ((mr.touser != 0) || (mr.tosys != 0)) {
  5340.           temp_msg_buf = readfile(&mr.msg, "EMAIL", &len);
  5341.           if (temp_msg_buf != NULL) {
  5342.             totmsgsize += len;
  5343.             savefile(temp_msg_buf, len, &mr.msg, "TEMP$$$!");
  5344.           } else {
  5345.             msg_no_text++;
  5346.             mr.touser = 0;
  5347.             mr.tosys = 0;
  5348.           }
  5349.         }
  5350.       messages++;
  5351.       if ((mr.touser != 0) || (mr.tosys != 0))
  5352.         write(f2, (void *)(&mr), sizeof(mailrec));
  5353.     }
  5354.     sprintf(s, "%sEMAIL.DAT", syscfg.msgsdir);
  5355.     sprintf(s1, "%sTEMP$$$!.DAT", syscfg.msgsdir);
  5356.     unlink(s);
  5357.     f = rename(s1, s);
  5358.     if (f == 0) {
  5359.       printf("\n");
  5360.       sprintf(s, "%sEMAIL.DAT", syscfg.datadir);
  5361.       sprintf(s1, "%sTEMP$$$!.DAT", syscfg.datadir);
  5362.       unlink(s);
  5363.       f = rename(s1, s);
  5364.       if (f != 0) {
  5365.         printf("De-fragging EMAIL.DAT (ERROR!)...    \n");
  5366.         switch(errno) {
  5367.           case ENOENT:
  5368.             strcpy(s2, "No such file");
  5369.             break;
  5370.           case EACCES:
  5371.             strcpy(s2, "Permission denied");
  5372.             break;
  5373.           case ENOTSAM:
  5374.             strcpy(s2, "Not same device");
  5375.             break;
  5376.         }
  5377.         printf("  (Could not rename temporary file; REASON: %s\n", s2);
  5378.         unlink(s1);
  5379.         sprintf(s, "%sEM+N╩ëTò    iW═ìÖ¥╣k═¥═æÑΦºë$$$HHHÉ]█╢╡nk(s);
  5380.       }
  5381.     } else {
  5382.       printf("De-fragging EMAIL.DAT (ERROR!)...    \n");
  5383.       switch(errno) {
  5384.         case ENOENT:
  5385.           strcpy(s2, "No such file");
  5386.           break;
  5387.         case EACCES:
  5388.           strcpy(s2, "Permission denied");
  5389.           break;
  5390.         case ENOTSAM:
  5391.           strcpy(s2, "Not same device");
  5392.           break;
  5393.       }
  5394.       printf("  (Could not rename temporary file; REASON: %s\n", s2);
  5395.       unlink(s1);
  5396.       sprintf(s, "%sEMAIL.DAT", syscfg.datadir);
  5397.       sprintf(s1, "%sTEMP$$$!.DAT", syscfg.datadir);
  5398.       unlink(s);
  5399.       unlink(s1);
  5400.     }
  5401.   } else {
  5402.     if (f > 0)
  5403.       close(f);
  5404.     printf("Reading EMAIL.DAT (NOT ENOUGH DISK SPACE!)...\n");
  5405.   }
  5406. }
  5407.  
  5408.  
  5409. void delete(int mn)
  5410. {
  5411.   int i;
  5412.  
  5413.   if ((mn > 0) && (mn <= nummsgs)) {
  5414.     for (i = mn; i < nummsgs; i++)
  5415.       msgs[i] = msgs[i + 1];
  5416.     nummsgs--;
  5417.   }
  5418. }
  5419.  
  5420.  
  5421. void defrag(int b)
  5422. {
  5423.   char s[81], s1[81], s2[81], *temp_msg_buf;
  5424.   int f, i, i1, i2;
  5425.   long len;
  5426.  
  5427.   printf("Reading %s...\r", subboards[b].name);
  5428.   sprintf(s1, "%sTEMP$$$!.DAT", syscfg.msgsdir);
  5429.   unlink(s1);
  5430.   iscan(b);
  5431.   i1 = 0;
  5432.   if (subboards[b].storage_type == 2) {
  5433.     f = open_file(subboards[b].filename);
  5434.     if ((dfree(curdrive) > filelength(f)) && (f > 0)) {
  5435.       close(f);
  5436.       for (i1 = 1; i1 <= nummsgs; i1++) {
  5437.         temp_msg_buf = readfile(&msgs[i1].msg, subboards[b].filename, &len);
  5438.         if (temp_msg_buf != NULL) {
  5439.           savefile(temp_msg_buf, len, &msgs[i1].msg, "TEMP$$$!");
  5440.           totmsgsize += len;
  5441.         } else {
  5442.           delete(i1);
  5443.           msg_no_text++;
  5444.         }
  5445.         messages++;
  5446.         printf("De-fragging %s (%d/%d)...\r", subboards[b].name, i1, nummsgs);
  5447.       }
  5448.       sprintf(s, "%s%s.DAT", syscfg.msgsdir, subboards[b].filename);
  5449.       sprintf(s1, "%sTEMP$$$!.DAT", syscfg.msgsdir);
  5450.       unlink(s);
  5451.       f = rename(s1, s);
  5452.       if (f == 0) {
  5453.         printf("\n");
  5454.         savebase(b);
  5455.       } else {
  5456.         printf("De-fragging %s (ERROR!)...    \n", subboards[b].name);
  5457.         switch(errno) {
  5458.           case ENOENT:
  5459.             strcpy(s2, "No such file");
  5460.             break;
  5461.           case EACCES:
  5462.             strcpy(s2, "Permission denied");
  5463.             break;
  5464.           case ENOTSAM:
  5465.             strcpy(s2, "Not same device");
  5466.             break;
  5467.         }
  5468.         printf("  (Could not rename temporary file; REASON: %s\n", s2);
  5469.         unlink(s);
  5470.         unlink(s1);
  5471.         sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[b].filename);
  5472.         unlink(s);
  5473.       }
  5474.     } else {
  5475.       if (f > 0)
  5476.         close(f);
  5477.       printf("Reading %s (NOT ENOUGH DISK SPACE!)...\n", subboards[b].name);
  5478.     }
  5479.   } else {
  5480.     printf("Reading %s...Ignored.  (Storage type not 2)\n", subboards[b].name);
  5481.   }
  5482. }
  5483.  
  5484.  
  5485. void report()
  5486. {
  5487.   time_t end_run;
  5488.  
  5489.   printf("\n\n");
  5490.   printf("========================================\n");
  5491.   printf("%10ld messages processed.\n", messages);
  5492.   printf("%10ld bytes (%ldk) processed.\n", totmsgsize);
  5493.   printf("%10ld bytes per average message.\n", (totmsgsize / messages));
  5494.   time(&end_run);
  5495.   printf("%10ld seconds elapsed.\n", (end_run - program_start));
  5496.   if (msg_no_text)
  5497.     printf("%10ld message(s) with no text removed.\n", msg_no_text);
  5498.   printf("========================================\n\n");
  5499. }
  5500.  
  5501.  
  5502. void main(int argc, char *argv[])
  5503. {
  5504.   char s[81], s1[81], s2[81], ch;
  5505.   int f, i, i1, i2;
  5506.   long len;
  5507.  
  5508.   time(&program_start);
  5509.   conf_count = 0;
  5510.   scan_email = 0;
  5511.   messages = 0;
  5512.   totmsgsize = 0;
  5513.   msg_no_text = 0;
  5514.   automated = 0;
  5515.   assume_y = 0;
  5516.   printf("\nDeFrag v%s - Defragment (compress) WWIV type-2 message bases\n", 
  5517. DEFRAG_VER);
  5518.   printf("Copyright (c) 1991 by Jeff Garzik\n\n");
  5519.   sprintf(s, "CONFIG.DAT");
  5520.   f = open(s, O_RDWR | O_BINARY);
  5521.   if (f < 0) {
  5522.     printf("%s NOT FOUND.\n", s);
  5523.     exit(1);
  5524.   }
  5525.   read(f, (void *)(&syscfg), sizeof(configrec));
  5526.   close(f);
  5527.   get_status();
  5528.   if (status.wwiv_version == 0) {
  5529.     printf("STATUS.DAT NOT READ.\n");
  5530.     exit(1);
  5531.   }
  5532.   itoa(status.wwiv_version, s, 10);
  5533.   s[5] = s[4];
  5534.   s[4] = s[3];
  5535.   s[3] = s[2];
  5536.   s[2] = s[1];
  5537.   s[1] = '.';
  5538.   printf("Compiled under %s, running under WWIV v%s.\n\n", VERSION_NUMBER, s);
  5539.   sprintf(s, "%sSUBS.DAT", syscfg.datadir);
  5540.   f = open(s, O_RDWR | O_BINARY);
  5541.   if (f < 0) {
  5542.     printf("%s NOT FOUND.\n", s);
  5543.     exit(1);
  5544.   }
  5545.   num_subs = (read(f, subboards, (MAX_SUBS*sizeof(subboardrec))))/
  5546.            sizeof(subboardrec);
  5547.   close(f);
  5548.   if (num_subs < 1) {
  5549.     printf("No subs to compress.\n");
  5550.     exit(1);
  5551.   }
  5552.   for (i=1; i<argc; i++) {
  5553.     strcpy(s,argv[i]);
  5554.     if ((s[0]=='-') || (s[0]=='/')) {
  5555.       ch = toupper(s[1]);
  5556.       switch(ch) {
  5557.         case 'A':                      /* enable/disable unattended mode */
  5558.           switch (s[2]) {
  5559.             case 0:
  5560.             case '+':
  5561.               automated = 1;
  5562.               break;
  5563.             case '-':
  5564.               automated = 0;
  5565.               break;
  5566.           }
  5567.           break;
  5568.         case 'C':                      /* select subs to defrag */
  5569.           if (conf_count < 0)
  5570.             conf_count = 0;
  5571.           i1 = atoi(&(s[2]));
  5572.           if ((conf_count == 0) && (i1 >= 0) && (i1 < num_subs)) {
  5573.             conf_scan[conf_count] = i1;
  5574.             conf_count++;
  5575.           } else {
  5576.             for (i2 = 0; i2 < conf_count; i2++)
  5577.               if (conf_scan[i2] == i1)
  5578.                 break;
  5579.             if (i2 >= conf_count) {
  5580.               conf_scan[conf_count] = i1;
  5581.               conf_count++;
  5582.             }
  5583.           }
  5584.           break;
  5585.         case 'E':                      /* enable/disable EMAIL.DAT defrag */
  5586.           switch (s[2]) {
  5587.             case 0:
  5588.             case '+':
  5589.               scan_email = 1;
  5590.               break;
  5591.             case '-':
  5592.               scan_email = 0;
  5593.               break;
  5594.           }
  5595.           break;
  5596.         case 'O':                      /* only scan EMAIL.DAT */
  5597.           conf_count = -1;
  5598.           scan_email = 1;
  5599.           break;
  5600.         case 'Y':                      /* How to answer Y/N questions */
  5601.           switch (s[2]) {              /* in unattended mode          */
  5602.             case 0:
  5603.             case '+':
  5604.               assume_y = 1;
  5605.               break;
  5606.             case '-':
  5607.               assume_y = 0;
  5608.               break;
  5609.           }
  5610.           break;
  5611.       }
  5612.     }
  5613.   }
  5614.   msgs = (postrec *)farmalloc((long)(255 * sizeof(postrec)));
  5615.   if (msgs == NULL) {
  5616.     printf("Not enough memory.\n");
  5617.     exit(1);
  5618.   }
  5619.   gat = (short *)farmalloc(2048 * sizeof(short));
  5620.   if (gat == NULL) {
  5621.     printf("Not enough memory.\n");
  5622.     exit(1);
  5623.   }
  5624.   if (syscfg.msgsdir[1] == ':')
  5625.     curdrive = (int)(syscfg.msgsdir[0] - 'A' + 1);
  5626.   else
  5627.     curdrive = getdisk();
  5628.   if (scan_email)
  5629.     defrag_email();
  5630.   if (conf_count == 0) {
  5631.     for (i = 0; i < num_subs; i++)
  5632.       defrag(i);
  5633.   } else {
  5634.     for (i = 0; i < conf_count; i++)
  5635.       defrag(conf_scan[i]);
  5636.   }
  5637.   report();
  5638. }
  5639.  
  5640.  
  5641.  
  5642.  
  5643.  
  5644.  
  5645.  
  5646. [49/99]: TJ-ARJAD.MOD.....Revision of TESTUL13 by Cpt Learjet.
  5647. [Name ]: Trader Jack #1 @8315
  5648. [Date ]: Wednesday, January 1, 1992  4:43 pm <EST>
  5649. [From ]: The Trading Post (South Carolina)
  5650.  
  5651. [Msg Status]: Replies Wanted
  5652. ┌────────────────────────────────────────────────────────────────────────────┐
  5653. │ Mod Name: TJ-ARJAD.MOD                  Mod Author: Captain Learjet 1@8755 │
  5654. │                                        Revision by: Trader Jack 1@8315     │
  5655. │ Difficulty: Easy                        Date: 01-01-91                     │
  5656. │ WWIV Version: 4.12+ with TESTUL13.MOD installed. Should work on 4.2x.      │
  5657. │ Description: Adds the ARJ Compression Protocol to Captain Learjet's        │
  5658. │              Test Upload 1.3 Mod.                                          │
  5659. └────────────────────────────────────────────────────────────────────────────┘
  5660.  
  5661.         Firstly, I take no credit for this code.  All that I did was take
  5662. Captain Learjet's mod and add in a few lines.  I am including the entire mod
  5663. in case you do not have TESTUL13.MOD installed.  If you already have it in, all
  5664. you need do is add the lines that are commented /*TJ-ARJAD*/ and you'll be set.
  5665. The colors I use are my preferences and you may want to change them.  Please
  5666. remember that the ^P^C # are literal for Borland C++ and Turbo C++.
  5667.  
  5668. Insert your favorite disclaimer here.
  5669.  
  5670. If I need to tell you to back up your source, you don't need to be modding.
  5671.  
  5672. Here goes....
  5673.  
  5674. <<  Step one:  >>   
  5675.  
  5676.      Load FCNS.H (bleck!) and add the following four functions at the
  5677. bottom of XFER.C: (This step is optional, and was not done in the original mod.
  5678. If you put the functions right at the very begining of XFER.C, all should be
  5679. well.  The way I understand it, it is just the proper way to do it.)
  5680.  
  5681. void test_upload(int l, int sysop, char *s);               /*TJ-ARJAD*/
  5682. void test_arc();                                           /*TJ-ARJAD*/
  5683. void add_comment();                                        /*TJ-ARJAD*/
  5684. void check_for_virus();                                    /*TJ-ARJAD*/
  5685.  
  5686. <<  Step two:  >>
  5687.  
  5688.  
  5689.  
  5690.     Load BBS.C and do this in void dlmainmenu() :
  5691.  
  5692.   if (strcmp(s,"/O")==0)
  5693.     hangup=1;
  5694.   if ((strcmp(s,"/?")==0) && (dcs()))      /*   <--  Search for this. */
  5695.     printmenu(8);
  5696.   if (strcmp(s,"/T")==0)                                  /*  ADD  */
  5697.     test_arc();                                           /*  ADD  */
  5698.   if (strcmp(s,"/V")==0)                                  /*  ADD  */
  5699.     check_for_virus();                                    /*  ADD  */
  5700.   if ((strcmp(s,"/K")==0) && (dcs()))                     /*  ADD  */
  5701.      add_comment();                                       /*  ADD  */
  5702.   if ((strcmp(s,"UPLOADALL")==0) && (dcs())) {       /* original code   */
  5703.  
  5704.     Save BBS.C
  5705.  
  5706. <<  Step three:  >>
  5707.  
  5708.     Load XFER.C and add the following FOUR functions near the top
  5709.       of the file:
  5710.  
  5711.  
  5712. void test_upload(int l, int sysop, char *s)
  5713. {
  5714.   char s1[81],s2[81],s3[81];
  5715.   int i,i1,type,abort,next;
  5716.   uploadsrec u;
  5717.  
  5718.   type=abort=next=0;
  5719.  
  5720.   if (l) {
  5721.     align(s);
  5722.     dliscan();
  5723.   }
  5724.   i=recno(s);
  5725.   do {
  5726.     if (i>0) {
  5727.       SETREC(i);
  5728.       read(dlf,(void *)&u,sizeof(uploadsrec));
  5729.       if (l==0 || l==1) {
  5730.         if ((compare(u.filename,"????????.ARC")) ||
  5731.             (compare(u.filename,"????????.LZH")) ||
  5732.             (compare(u.filename,"????????.PAK")) ||
  5733.             (compare(u.filename,"????????.ARJ")) ||        /*TJ-ARJAD*/
  5734.             (compare(u.filename,"????????.ZIP"))) {
  5735.           if (!sysop)
  5736.             sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,
  5737.                     stripfn(u.filename));
  5738.           else
  5739.             sprintf(s1,"%s%s",directories[0].path,stripfn(u.filename));
  5740.           if (exist(s1)) {
  5741.             ansic(2);
  5742.             print("Testing archive integrity of ",u.filename,":","");
  5743.             nl();
  5744.             if (strstr(u.filename,".ARC"))
  5745.               sprintf(s2,"PKUNPAK -T %s",s1);
  5746.             if (strstr(u.filename,".LZH"))
  5747.               sprintf(s2,"LHARC T %s",s1);
  5748.             if (strstr(u.filename,".PAK"))
  5749.               sprintf(s2,"PAK T %s",s1);
  5750.             if (strstr(u.filename,".ARJ"))                 /*TJ-ARJAD*/
  5751.               sprintf(s2,"ARJ T %s",s1);                   /*TJ-ARJAD*/
  5752.             if (strstr(u.filename,".ZIP"))
  5753.               sprintf(s2,"PKUNZIP -T %s",s1);
  5754.             i1=run_external1(s2);
  5755.             prt(2,u.filename);
  5756.             if (i1) {
  5757.               pl(" ^P^C6 \7FAILED\7 ^P^C2 the archive test!");
  5758.               nl();
  5759.               sprintf(s2,"^P^C2%s ^P^C6FAILED ^P^C2 an archive test. Please che
  5760. ck the file!",u.filename);               ssm(1,0,s2);
  5761.               sysoplog(s2);
  5762.               if (l)
  5763.                 closedl();
  5764.               return;
  5765.             } else {
  5766.               prt(5," PASSED ^P^C2 the archive test.");nl();
  5767.             }
  5768.           }
  5769.           checka(&abort,&next);
  5770.         }
  5771.       }
  5772.       if (l==0 || l==2) {
  5773.         if ((compare(u.filename,"????????.ARC")) ||
  5774.             (compare(u.filename,"????????.LZH")) ||
  5775.             (compare(u.filename,"????????.PAK")) ||
  5776.             (compare(u.filename,"????????.ARJ")) ||        /*TJ-ARJAD*/
  5777.             (compare(u.filename,"????????.ZIP")))
  5778.           type=1;
  5779.         if ((compare(u.filename,"????????.EXE")) ||
  5780.             (compare(u.filename,"????????.COM")))
  5781.           type=2;
  5782.         if (type) {
  5783.           if (!sysop)
  5784.             sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,
  5785.                     stripfn(u.filename));
  5786.           else
  5787.             sprintf(s1,"%s%s",directories[0].path,stripfn(u.filename));
  5788.           if (exist(s1)) {
  5789.             nl();
  5790.             ansic(2);
  5791.             print("Scanning ",u.filename," for viruses:","");
  5792.             nl();
  5793.             prt(3,"Please be patient...");nl();
  5794.             if (type==1) {
  5795.               if (strstr(u.filename,".ARC"))
  5796.                 sprintf(s2,"PKUNPAK %s %s",s1,syscfg.tempdir);
  5797.               if (strstr(u.filename,".LZH"))
  5798.                 sprintf(s2,"LHARC X %s %s",s1,syscfg.tempdir);
  5799.               if (strstr(u.filename,".PAK"))
  5800.                 sprintf(s2,"PAK E %s %s",s1,syscfg.tempdir);
  5801.               if (strstr(u.filename,".ARJ"))                 /*TJ-ARJAD*/
  5802.                 sprintf(s2,"ARJ E %s %s",s1,syscfg.tempdir); /*TJ-ARJAD*/
  5803.               if (strstr(u.filename,".ZIP"))
  5804.                 sprintf(s2,"PKUNZIP %s %s",s1,syscfg.tempdir);
  5805.               run_external(s2);
  5806.               sprintf(s3,"SCAN /nomem %s*.*",syscfg.tempdir);
  5807.               i1=run_external1(s3);
  5808.               remove_from_temp("*.*",0);
  5809.             } else {
  5810.               sprintf(s2,"SCAN /nomem %s",s1),
  5811.               i1=run_external1(s2);
  5812.             }
  5813.             prt(2,u.filename);
  5814.             if (i1==1) {
  5815.               pl(" ^P^C6 \7FAILED\7 ^P^C2 the virus test! ^P^C0");
  5816.               nl();
  5817.               sprintf(s2,"%s FAILED the virus test. Please delete the file!",
  5818.                       u.filename);
  5819.               ssm(1,0,s2);
  5820.               sysoplog(s2);
  5821.               if (l)
  5822.                 closedl();
  5823.               return;
  5824.             } else {
  5825.               pl(" ^P^C5PASSED ^P^C2 the virus test. ^P^C0");
  5826.               nl();
  5827.             }
  5828.           }
  5829.           checka(&abort,&next);
  5830.         }
  5831.       }
  5832.       if (l==0 || l==3) {
  5833.         if (compare(u.filename,"????????.ZIP")) {
  5834.           sprintf(s3,"Adding comment to %s",u.filename);
  5835.           prt(2,s3);nl();
  5836.           if (!sysop)
  5837.             sprintf(s1,"PKZIP -z %s%s < %sCOMMENT.TXT",
  5838.                     directories[udir[curdir].subnum].path,stripfn(u.filename),
  5839.                     syscfg.gfilesdir);
  5840.           else
  5841.             sprintf(s1,"PKZIP -z %s%s < %sCOMMENT.TXT",
  5842.                     directories[0].path,stripfn(u.filename),syscfg.gfilesdir);
  5843.           run_external(s1);
  5844.         }
  5845.         checka(&abort,&next);
  5846.       }
  5847.     }
  5848.     i=nrecno(s,i);
  5849.   } while ((i>0) && (!hangup) && (!abort));
  5850.   if (l)
  5851.     closedl();
  5852. }
  5853.  
  5854. void test_arc()
  5855. {
  5856.   char s[81];
  5857.  
  5858.   nl();
  5859.   prt(2,"Archive to Test: ");
  5860.   mpl(12);
  5861.   input(s,12);
  5862.   if (strchr(s,'.')==NULL)
  5863.     strcat(s,".*");
  5864.   test_upload(1,0,s);
  5865.   topscreen();
  5866. }
  5867.  
  5868. void check_for_virus()
  5869. {
  5870.   char s[81];
  5871.  
  5872.   nl();
  5873.   prt(2,"Archive to Scan: ");
  5874.   mpl(12);
  5875.   input(s,12);
  5876.   if (strchr(s,'.')==NULL)
  5877.     strcat(s,".*");
  5878.   test_upload(2,0,s);
  5879.   topscreen();
  5880. }
  5881.  
  5882. void add_comment()
  5883. {
  5884.   char s[81];
  5885.  
  5886.   nl();
  5887.   prt(2,"Add Comment to: ");
  5888.   mpl(12);
  5889.   input(s,12);
  5890.   if (strchr(s,'.')==NULL)
  5891.     strcat(s,".*");
  5892.   test_upload(3,0,s);
  5893.   topscreen();
  5894. }
  5895.  
  5896. << Step four: >>
  5897.  
  5898. In the function void upload(int dn) add this stuff:
  5899.  
  5900.  
  5901.           sprintf(s,"+%s uploaded on %s",u.filename,directories[dn].name);
  5902.           sysoplog(s);                       /* search for the above line */
  5903.           if (!incom) {                      /* ADD */
  5904.             nl();                            /* ADD */
  5905.             prt(5,"Test the File? ");        /* ADD */
  5906.             if (yn())                        /* ADD */
  5907.               test_upload(0,0,u.filename);   /* ADD */
  5908.           } else {                           /* ADD */
  5909.             if (!dn)                         /* ADD */
  5910.               test_upload(0,1,u.filename);   /* ADD */
  5911.             else                             /* ADD */
  5912.               test_upload(0,0,u.filename);   /* ADD */
  5913.           }                                  /* ADD */
  5914.           nl();
  5915.           pl("File uploaded.");              /* Original code continues */
  5916.  
  5917.     Save XFER.C
  5918.  
  5919. << Step four: >>
  5920.  
  5921.    If you're in the IDE, punch F-9 and let 'er fly.  Go get a beer at the local
  5922.    bar if you have an 8088, because the whole thing has to be re-compiled.
  5923.  
  5924.    If you use the MAKEFILE, I hope you know what to do because I don't!  I use
  5925.    Borland C++ IDE.
  5926.  
  5927.  
  5928. << Notes: >>
  5929.  
  5930.    If you are currently using Test Upload 1.2 or before, you must replace
  5931.    all the functions with the new ones.  The new functions are more portable.
  5932.    You no longer have to hard code your temporary directory into the function.
  5933.    You must now have your COMMENT.TXT file in your GFILES directory.
  5934.  
  5935.    You must have SCAN, PKUNPAK, LHarc, PAK, PKZIP PKUNZIP and ARJ in your
  5936.    WWIV directory. If you don't have all of these get them. Or if you don't
  5937.    allow uploads of all types of archives, edit this file accordingly.
  5938.  
  5939.    Once again, I take no credit for the TESTUL13.MOD, just the additions.  If
  5940.    you use this mod, PLEASE drop me a note so I know SOMEONE is using it.  If
  5941.    you have any problems, please contact me at:
  5942.  
  5943.                                 -=<*Trader Jack 1@8315*>=-
  5944.  
  5945. ===============================================================================
  5946.  Origin:  8315  The Trading Post BBS  803-787-9783  USR DS  WOMRable SNARFable
  5947.  
  5948.  
  5949.  
  5950.  
  5951.  
  5952.  
  5953. [50/99]: LASTON -- Re-format LASTON.TXT and USER.LOG entries
  5954. [Name ]: Dave Wallace #1 @5806
  5955. [Date ]: Tue Dec 31 11:13:07 1991
  5956. [From ]:^Reality (Massachusetts)
  5957.  
  5958. +---------------------------------------------------------------------------+
  5959. | Mod Name:     LASTON.MOD                Mod Author: Dave Wallace (1@5806) |
  5960. | Difficulty:   simple                    Date:       12/30/91              |
  5961. | WWIV Version: 4.12                                                        |
  5962. | Description:  Re-formats & adds logon time to the entry in the LASTON.TXT |
  5963. |               and USER.LOG files, making for a more pleasing and more     |
  5964. |               informative report at logon or from the 'L' command.        |
  5965. | Status:       Initial Release                                             |
  5966. +---------------------------------------------------------------------------+
  5967.  
  5968. I'm a compulsive picture-straightener.  So I designed this mod to make the
  5969. report generated from the 'L' command tabulate the columns better.  And just
  5970. so the mod isn't totally trivial, I decided it might be nice to let the users
  5971. know WHEN people had been logging in, too.  Anyway, the change is less than
  5972. a screen's worth of code -- should take you all of ten minutes to do.
  5973.  
  5974. 1.      Don't you think it's time you backed up the BBS?
  5975.  
  5976. 2.      In File BBSUTL.C:
  5977.  
  5978. Find the function void logon().  Make the following change:
  5979.  
  5980. // -LASTON         sprintf(s,"%ld: %s   %s - %d",
  5981. // -LASTON               status.callernum1,
  5982. // -LASTON               nam(&thisuser,usernum),
  5983. // -LASTON               curspeed,
  5984. // -LASTON               thisuser.ontoday);
  5985. /* +LASTON */      sprintf(s,"%6ld: %-42s %10s - %3d   %s",
  5986. /* +LASTON */            status.callernum1,
  5987. /* +LASTON */            nam(&thisuser,usernum),
  5988. /* +LASTON */            curspeed,
  5989. /* +LASTON */            thisuser.ontoday,
  5990. /* +LASTON */            times());
  5991.  
  5992. 3.      Re-compile.  (Should be quick; there's only one file affected.)
  5993.  
  5994. 4.      There you are.  Of course, the users that already have logged in will
  5995.         still be reported in the ugly old-fashioned way, but that junk should
  5996.         scroll off in a few hours, so who cares?  And the newer logins will
  5997.         have this sexy new report.
  5998.  
  5999. A couple of notes:  First, the tabulation will break down when the caller
  6000. number exceeds 999,999.  No biggie, except the report record then exceeds 80
  6001. characters!  That's a problem.  If anybody's close to that logon count, it'd
  6002. be a good idea to adjust the format string.  You can sacrifice a few spaces
  6003. and do something like:
  6004.                         "%8ld: %-42s %10s - %3d %s"
  6005. If you ever need more than eight digits for caller number, I'll probably not be
  6006. around to complain to. :)
  6007.  
  6008. Second, I'd like to move the user number info to the right-hand end of the
  6009. field, by modding the nam() function in BBSUTL.C, but (1) I don't know what may
  6010. break if I did and (2) the user number would then be most of the way across the
  6011. screen, making it hard to associate it with a short handle.  So I left it alone
  6012. (for now, anyway).
  6013.  
  6014. Finally, I didn't check the 4.20 code, but there's a good chance that the same
  6015. change to the same function can be made there.  But logon() is probably in the
  6016. LILO.C file.  I leave that one as an excersize to the student...
  6017.  
  6018.  
  6019.  
  6020.  
  6021.  
  6022.  
  6023. [51/99]: here is a fix I worked out...
  6024. [Name ]: Symbiote #1 @8374
  6025. [Date ]: Mon Dec 30 22:56:34 1991
  6026. [From ]: Judgement Day [PaCt] (Florida)
  6027.  
  6028.  
  6029.  
  6030. Random Title Fix...
  6031.   By Symbiote #1 @8374....
  6032.  
  6033. there was a small bug in this mod when I put it on my system...
  6034. this is a good mod and although there is a new version out with Random
  6035. Subbases and Random Taglines, some people, like me, don't want those
  6036. extra things, and it is kinda hard to separate the two...so here is the
  6037. fix, if you just want the Random Titles...
  6038.  
  6039.                         RANDOM TITLE MODIFICATION
  6040.                         -------------------------
  6041. Introduction                                               November  8, 1989
  6042. ------------                                               -----------------
  6043.  
  6044.         This modification is intended for the use of "Random Titles" to be
  6045. used as a title for a message if the user does so desire.  It adds a menu
  6046. selection to the main menu and allows the user to add to a list of Random
  6047. Titles already present from previous additions from other users.  When a user
  6048. wants to leave a message and he is too lazy to think of a title himself or
  6049. whatever, he just hits [RETURN] when prompted for a title title and the system
  6050. picks a title at random from the list of titles on file.
  6051.  
  6052.         On the sysop side of things, it does create a little more maintenance
  6053. for the board, but very simple and not very time consuming.  The sysop must
  6054. "Validate" each of the titles added so to ensure that no obscene words get into
  6055. the system.  For the user, it will only list three options: List, Add, or Quit.
  6056. For the sysop, it will list another option, Validate, to make the new titles
  6057. recently added to the list available for use.
  6058.  
  6059.         Also, there is a new command from the Waiting-For-Caller screen to
  6060. enable you to validate the new titles from there.  That command is 'V'.
  6061.  
  6062.         Random Titles are pretty popular around Jacksonville so I hope that you
  6063. will want to try them out and see what your users think of them.
  6064.  
  6065.         If you have any questions and/or comments or you just want to send me a
  6066. message telling me how STUPID this Random Title modification is, then just send
  6067. me Net mail or you can optionally call my board.  The information is:
  6068.  
  6069.                 The Enchanted Caverns
  6070.                 User #1 @ 9403
  6071.                 904-721-2294
  6072.                 300/1200/2400 baud, 24 hours a day, eight days a week.
  6073.  
  6074.  
  6075.  
  6076.         Steps to install the RANDOM TITLE modification:
  6077.  
  6078. First
  6079. -----
  6080.         Load up BBS.C and add the following to the list of includes:
  6081.  
  6082.         #include <io.h>
  6083.         #include <sys\stat.h>
  6084.         #include <fcntl.h>
  6085.                                                                       
  6086. Second
  6087. ------
  6088.         Now add the following block of code to the end of BBS.C:
  6089.  
  6090. void random_title()
  6091. {
  6092.  
  6093.   int f,f1,i,i1,done,color_title,abort;
  6094.   char s[81],s1[81],ch,ch1;
  6095.   char colored_title[55];
  6096.  
  6097.   abort=0;
  6098.   done=0;
  6099.   color_title=1;
  6100.   for(i=0; i<55; i++) {
  6101.   s[i]=0;
  6102.   }
  6103.   i=0;
  6104.   do  {
  6105.     if (abort != 0)
  6106.       break;
  6107.     if ((thisuser.sl == 255)) {
  6108.       nl();
  6109.       nl();
  6110.       prt(5,"Random Titles - A)dd, L)ist, V)alidate, Q)uit :");
  6111.     } else {
  6112.       nl();
  6113.       nl();
  6114.       prt(5,"Random Titles - A)dd, L)ist, Q)uit :");
  6115.     }
  6116.     ch=onek("QLAV");
  6117.     switch(ch)  {
  6118.       case 'Q':
  6119.         done=1;
  6120.         break;
  6121.       case 'L':
  6122.         outstr("\x0c");
  6123.         nl();
  6124.         prt(2,"Random Titles Available");
  6125.         nl();
  6126.         prt(2,"-----------------------");
  6127.         nl();
  6128.         strcpy(s1,syscfg.gfilesdir);
  6129.         strcat(s1,"RANTITLE.MSG");
  6130.         if((f=open(s1,O_RDONLY))==-1) {
  6131.           close(f);
  6132.           break;
  6133.         }
  6134.         lseek(f,0L,SEEK_SET);
  6135.     i=filelength(f)/55;
  6136.         if (i == 0)  {
  6137.           nl();
  6138.           prt(3, "Sorry, There are no titles available.");
  6139.           nl();
  6140.           close(f);
  6141.           break;
  6142.         }
  6143.     for (i1=0,(i=filelength(f)/55); i1<i; i1++)
  6144.       {
  6145.           if (color_title > 5)
  6146.             color_title = 1;
  6147.       lseek(f,((long) (i1*55)),SEEK_SET);
  6148.       read(f,colored_title,55);
  6149.           ansic(color_title);
  6150.           pla(colored_title,&abort);
  6151.           color_title = color_title++;
  6152.           if (color_title == 4)
  6153.             color_title++;
  6154.       }
  6155.       nl();
  6156.       close(f);
  6157.       break;
  6158.     case 'A':
  6159.         if((thisuser.sl<=10))  {
  6160.           nl();
  6161.           nl();
  6162.           pl("You must be a validated user to add to the Random Title list.");
  6163.           nl();
  6164.           break;
  6165.         }
  6166.         nl();
  6167.         if(okansi())  {
  6168.           prt(2,"Enter Random Title: ");
  6169.           mpl(40);
  6170.           inputl(s1,40);
  6171.         }  else  {
  6172.           pl("                    (---=----=----=----=----=----=----=----)");
  6173.           outstr("Enter Random Title: ");
  6174.           inputl(s1,40);
  6175.         }
  6176.         if(s1[0]==0) {
  6177.           nl();
  6178.           prt(3, "Aborted");
  6179.           nl();
  6180.           break;
  6181.         }
  6182.         strcpy(s,s1);
  6183.         for(i=strlen(s); i<41; i++)
  6184.           s[i]=32;
  6185.         nl();
  6186.         nl();
  6187.         pl(s);
  6188.         nl();
  6189.         prt(5,"Is this correct? ");
  6190.         if (yn())  {
  6191.           strcpy(s1,syscfg.gfilesdir);
  6192.           strcat(s1,"RANTITLE.NEW");
  6193.           f=open(s1,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
  6194.           if(filelength(f))  {
  6195.             lseek(f,-1L,SEEK_END);
  6196.             read(f,((void *)&ch1),1);
  6197.             if(ch1==26)
  6198.               lseek(f,-1L,SEEK_END);
  6199.           }
  6200.         s[40]=0;
  6201.         write(f,(void *)s,41);
  6202.         close(f);
  6203.         nl();
  6204.         pl("You have just added to the Random Title List.");
  6205.         }
  6206.         break;
  6207.       case 'V':
  6208.         if ((thisuser.sl != 255))
  6209.           break;
  6210.         else {
  6211.         strcpy(s1,syscfg.gfilesdir);
  6212.         strcat(s1,"RANTITLE.NEW");
  6213.         f=open(s1,O_RDWR | O_BINARY);
  6214.         i = filelength(f);
  6215.         if (i == 0)  {
  6216.           nl();
  6217.           nl();
  6218.           prt(6,"There are no new titles to validate.");
  6219.           break;
  6220.         }
  6221.         while (i > 0)  {
  6222.           i = filelength(f);
  6223.           i1 = ((i/41)-1);
  6224.           lseek(f,(long) (i1 * 41), SEEK_SET);
  6225.           read(f,s,41);
  6226.           nl();
  6227.           nl();
  6228.           prt(2,s);
  6229.           nl();
  6230.           prt(5,"Validate this title ?");
  6231.           if (yn())  {
  6232.             s[40]='[';
  6233.             s[41]='R';
  6234.             s[42]='a';
  6235.             s[43]='n';
  6236.             s[44]='d';
  6237.             s[45]='o';
  6238.             s[46]='m';
  6239.             s[47]=' ';
  6240.             s[48]='T';
  6241.             s[49]='i';
  6242.             s[50]='t';
  6243.             s[51]='l';
  6244.             s[52]='e';
  6245.             s[53]=']';
  6246.             s[54]=0;
  6247.             strcpy(s1,syscfg.gfilesdir);
  6248.             strcat(s1,"RANTITLE.MSG");
  6249.             f1=open(s1,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
  6250.             chsize(f1,(long) (filelength(f1)+55));
  6251.             lseek(f1,(long) (filelength(f1)-55),SEEK_SET);
  6252.             write(f1,(void *)s,55);
  6253.             close(f1);
  6254.             i=(i-41);
  6255.             {
  6256.             if(chsize(f,(long) (i)) == -1) {
  6257.               nl();
  6258.               prt(6,"Deletion of last title failed!");
  6259.               }
  6260.             }
  6261.           }  else  {
  6262.             i=(i-41);
  6263.             if(chsize(f,(long) (i)) == -1) {
  6264.             nl();
  6265.             prt(6,"Deletion of title failed!");
  6266.             }
  6267.           }
  6268.         }
  6269.         close(f);
  6270.         }
  6271.         break;
  6272.       }
  6273.     } while ((!done) && (!hangup));
  6274. }
  6275.  
  6276. Third
  6277. -----
  6278.         Now scroll up and find "void getcaller()" and look for the following
  6279. code and make the appropriate changes/additions:
  6280.                                                                
  6281.                                                         *------------------*
  6282.                                                         | == Existing Line |
  6283.                                                 LEGEND: | += Change Line   |
  6284.                                                         | ++ Add line      |
  6285.                                                         *------------------*
  6286. ==      case 'U':
  6287. ==        okskey=1;
  6288. ==        if (ok_local()) {
  6289. ==          holdphone(1);
  6290. ==          uedit(1,0);
  6291. ==          holdphone(0);
  6292. ==        }
  6293. ==        okskey=0;
  6294. ==        break;
  6295. ++      case 'V':                /* Validate Random Titles from WFC */
  6296. ++        if (ok_local()) {
  6297. ++          holdphone(1);
  6298. ++          random_title();
  6299. ++          holdphone(0);
  6300. ++        }
  6301. ++        break;
  6302. ==      case 'W':
  6303. ==        if (ok_local()) {
  6304.  
  6305.  
  6306. Fourth
  6307. ------
  6308.         Now scroll up again and find "void mainmenu()" and look for the
  6309. following code and make the appropriate changes/additions:
  6310.  
  6311. ==        if (strcmp(s,"/N")==0)
  6312. ==          nscan(cursub);
  6313. ++        if (strcmp(s,"/R")==0)
  6314. ++          random_title();
  6315. ==        if (strcmp(s,"/C")==0) {
  6316. ==          thisuser.sysstatus ^= sysstatus_funky_colors;
  6317. ==          nl();
  6318.  
  6319.  
  6320. Fifth
  6321. -----
  6322.         Now press F2 and save the changes you made to BBS.C
  6323.  
  6324.         Installation continues next message...
  6325.  
  6326.  
  6327.  
  6328. Sixth
  6329. -----
  6330.  
  6331.         After you have saved the modified BBS.C, load MSGBASE.C and look for:
  6332. void inmsg(messagerec *m1, char *title, int *anony, int needtitle, char *aux,
  6333. int fsed)
  6334.         When you find that (about line 425 from the top of the Copywrite
  6335. notice) , then scroll down, find, and change accordingly, the following code:
  6336.  
  6337.                                                         *------------------*
  6338.                                                         | == Existing Line |
  6339.                                                 LEGEND: | += Change Line   |
  6340.                                                         | ++ Add line      |
  6341.                                                         | -- Delete Line   |
  6342.                                                         *------------------*
  6343.  
  6344. ==  nl();
  6345. ==  helpl=6;
  6346. ==  if (okansi()) {
  6347. ++    prt(2,"Enter Title or Press [Return] for a Random Title.");
  6348. ++    nl();
  6349. ++    prt(2,"Title :");
  6350. ++    mpl(60);
  6351. ++    inputl(title,60);
  6352. ++    if ((title[0]==0) && (needtitle)) {
  6353. ++      get_random_title(ran_title);
  6354. ++      strcpy(title,ran_title);
  6355. ++      nl();
  6356. ++      pl(title);
  6357. ++    }
  6358. ++  } else {
  6359. ++    pl("Enter Title or Press [Return] for a Random Title.");
  6360. ++    pl("       
  6361. (---=----=----=----=----=----=----=----=----=----=----=----)");
  6362.                        /* Note - There are 7 spaces between the " and ( */
  6363. ++    outstr("Title :");
  6364. ++    inputl(title,60);
  6365. ++    if ((title[0]==0) && (needtitle)) {
  6366. ++      get_random_title(ran_title);
  6367. ++      strcpy(title,ran_title);
  6368. ++      nl();
  6369. ++      pl(title);
  6370. ++    }
  6371. ++  }
  6372.  
  6373. --  if ((title[0]==0) && (needtitle)) {  /* This section is RIGHT AFTER the */
  6374. --    pl("Aborted.");                    /* code which you just replaced.   */
  6375. --    m.stored_as=0xffffffff;            /* It originally aborted if a C/R  */
  6376. --    *m1=m;                             /* was detected. This section you  */
  6377. --    if (!fsed)                         /* must delete!                    */
  6378. --      farfree((void *)lin);
  6379. --    return;
  6380. --  }
  6381.  
  6382. Seventh
  6383. -------
  6384.         Scroll up to the declariations of void mainmenu(.....) and add this to
  6385. them:
  6386.  
  6387.         char ran_title[55];
  6388. ===========================================================================
  6389.  
  6390. FIX ::::  this is where the Error was...
  6391.           you must put the declaration of RAN_TITLE *seen above* into
  6392.           void mainmenu, as it says, and also in void inmsg, found in
  6393.           MSGBASE.C....
  6394.  
  6395. so...to fix this...just load up MSGBASE.C
  6396.         Search for 'void inmsg' and insert 'char ran_title[55];' into
  6397.         the variable declarations somewhere
  6398.  
  6399. that should fix the problem...finish up the mod and run it...
  6400. ============================================================================
  6401.  
  6402. Eighth
  6403. ------
  6404.         Scroll down to the end of MSGBASE.C and add the following block of code
  6405. to it:
  6406.  
  6407.  
  6408. void get_random_title(ran_title)
  6409.  
  6410. char *ran_title;
  6411.  
  6412. {
  6413.   int f,i,i1;
  6414.   char s1[81];
  6415.  
  6416.   strcpy(s1,syscfg.gfilesdir);
  6417.   strcat(s1,"RANTITLE.MSG");
  6418.   if ((f=open(s1,O_RDONLY))==-1)
  6419.     {
  6420.       nl();
  6421.       nl();
  6422.       pl("Random Titles are not available at this time.");
  6423.       nl();
  6424.       return;
  6425.     }
  6426.     lseek(f,0L,SEEK_SET);
  6427.     i=filelength(f)/55;
  6428.     {
  6429.       if(i==0) {
  6430.         nl();
  6431.         nl();
  6432.         prt(5,"There are no Random Titles listed.");
  6433.         nl();
  6434.         return;
  6435.       }
  6436.       randomize();
  6437.       i1=random(i);
  6438.       lseek(f,(long)  (i1 * 55),SEEK_SET);
  6439.       read(f,ran_title,55);
  6440.       close(f);
  6441.     }
  6442. }
  6443.  
  6444.         Now SAVE MSGBASE.C!!!!
  6445.  
  6446. Nineth
  6447. ------
  6448.  
  6449.         Add the following function declarations at the end of FCNS.H
  6450.  
  6451. void random_title();
  6452. void get_random_title();
  6453.  
  6454. Tenth
  6455. -----
  6456.         Hit F9 in Turbo C and re-compile the BBS!
  6457.  
  6458. And Lastly
  6459. ----------
  6460.         After the BBS compiles, you need to change your main menu to show
  6461. the new command, which is '/R'.  After you get everything installed, tell
  6462. your users to have fun compliments of Fornax from The Enchanted Caverns.
  6463.  
  6464. DISCLAIMER
  6465. ----------
  6466.         This is the part that I dread to write.  After extensive testing, I
  6467. have found that this modification causes no problems with my system.  This is
  6468. not to say that it won't cause problems with yours, but I feel confident that
  6469. you should have no problems.  If you DO have a problem, then PLEASE inform me
  6470. of it through my BBS, The Enchanted Caverns - @9403 -- 904-721-2294.
  6471.  
  6472. CREDITS
  6473. -------
  6474.         To, of course, Wayne Bell, who without the program in the first place,
  6475. I would not have the pleasure of running the BBS for there is no other BBS that
  6476. I have seen that fills the needs of my users such as WWIV v4.10.
  6477.  
  6478.  
  6479.  
  6480.  
  6481.  
  6482.  
  6483.  
  6484.  
  6485.  
  6486.  
  6487. [52/99]: DownLoad ANY File for Co/SysOps
  6488. [Name ]: Radman #226 @7652 [South Wales, NY]
  6489. [Date ]: Wednesday, January 1, 1992  at  7:59 pm <EST>
  6490. [From ]: BoardWalk [DSS] (Upstate New York)
  6491.  
  6492.                                 RadMan's Mods
  6493.  
  6494.     MOD: DL_ANY.MOD
  6495.     USE: Allows CoSysOps/Remote SysOps to download ANY file from ANYWHERE.
  6496.  
  6497.  RATING: ████████▒▒      INSTALATION TIME: 2min + compile      VER: 4.12
  6498.  
  6499. Instructions:
  6500.  
  6501. Step 1 - Load up XFER.C and place the function dl_any() after void download.
  6502.  
  6503. void dl_any()
  6504. {
  6505.   char s[80];
  6506.   int i;
  6507.  
  6508.   s[0]=0;
  6509.   nl();
  6510.   nl();
  6511.   prt(1,"File: ");
  6512.   mpl(60);
  6513.   inputl(s,60);
  6514.   for(i=strlen(s)-1;i>=0 && s[i]==12;i--);
  6515.   s[i+1]=0;
  6516.   nl();
  6517.   pl("Zmodem Send Commencing...");
  6518.   extern_prot(0,s,1);
  6519. }
  6520.  
  6521. Step 2 - Load BBS.C, and in function dlmainmenu(), search for:
  6522.  
  6523. if ((strcmp(s,"/?")==0) && (dcs()))
  6524.   printmenu(8);
  6525.  
  6526. and add this on the next 2 lines:
  6527.  
  6528. if ((strcmp(s,"/%")==0) && (dcs()))
  6529.   dl_any();
  6530.  
  6531. Step 3 - Go to the nearest airport, take a flight to Hawaii, party for a few
  6532.          hours while the BBS.EXE is compiling, then return home and try it 
  6533.          out: press /% in the transfer section.
  6534.  
  6535. NOTE: DSZ Must be installed for this to work right.
  6536.  
  6537. Disclamer: If your computer suddenly starts a bad habit like smoking 2 packs
  6538.            a day, or having a beer every hour on the hour, my mod DIDN'T do 
  6539.            it. If it doesn't work right, tough. It ain't my problem, and it
  6540.            is small enough so that I feel that you would be capable of 
  6541.            removing it yourself without seeking professional help.
  6542.  
  6543.  
  6544.  *> The BoardWalk [DSS] ■ @7652/@17650 ■ 716-684-7939 ■ WWIV Support Board <*
  6545.  
  6546.  
  6547.  
  6548.  
  6549.  
  6550.  
  6551. [53/99]: I tested it on clean source this time.  RANQUOTE v2.00...
  6552. [Name ]: Greeny #8 @6910
  6553. [Date ]: Wed Jan 08 10:31:58 1992
  6554. [From ]: The Promised Land (New Jersey)
  6555.  
  6556.                   RANDOM MULTI-LINE QUOTES AT MENU PROMPTS
  6557.  
  6558.                                 GREENY01.MOD
  6559.                                 Version 2.00
  6560.  
  6561. Here's a mod that will allow random quotes at each main menu and transfer
  6562. menu prompt.  It's mostly block read in, and unless you really want to you
  6563. won't have to recompile your whole source code.
  6564.  
  6565. To edit the entire quote list (add quotes to the list, delete any quote from
  6566. the list, or view the entire list) type //QUOTEEDIT from the main menu, or
  6567. hit the quote key (") when it's waiting for a caller.  It will create and
  6568. update a data file called RANQUOTE.DAT, in the gfiles directory.
  6569.  
  6570. Unlike version 1.00, this has been tested by installing it into vanilla 4.20
  6571. source.  (Version 1.00 worked perfectly after two minor bug fixes, which are
  6572. both marked.)  Also, the functions that are block read in have been
  6573. considerably improved since 1.00, but they should have worked all right
  6574. before...
  6575.  
  6576.  
  6577.  
  6578. To install the mod, do this:
  6579.  
  6580.  
  6581. 1) Back up your source code.  (I use arj a -jm1 source *.c *.h *.prj, in a
  6582.    batch file that deletes the old source.arj file first.  If you prefer
  6583.    zip or something, it's your choice...)
  6584.  
  6585.  
  6586. 2) You must prototype the three new functions.  The easy way to do this
  6587.    is to stick them into the beginning of the file BBS.C.  Right after the
  6588.    line #define modem_time 3.5 is a good place.  The function prototypes look
  6589.    like this:
  6590.  
  6591. void random_quote();
  6592. char *get_random_quote();
  6593. void thump();
  6594.  
  6595.    Just add them into your source code, each on a seperate line.
  6596.  
  6597.  
  6598. 3) Now find the function "void main()".  To do a search in Turbo C, or TC++,
  6599.    Hit Control-Q Control-F, and type in void main() on the line it gives you.
  6600.    Near the beginning of void main(), you'll find the following code.  Add
  6601.    the line indicated, and change the other.  (== means this line is already
  6602.    there, ++ means add this line, += means modify the existing line.)
  6603.  
  6604. ==  char *s, s1[81],s2[81];
  6605. +=  int i,abort=0;                      /* change from V1.00 */
  6606. ==  long l;
  6607. ==
  6608. ==  if ((sysstatus_expert & thisuser.sysstatus)==0)
  6609. ==    printmenu(0);
  6610. ==
  6611. ==  nl();
  6612. ++  thump(get_random_quote(),&abort);
  6613. ==  nl();
  6614. ==  tleft(1);
  6615.  
  6616.  
  6617. 4) About one screen down from the last change you should see this.  Add the
  6618.    four lines indicated.
  6619.  
  6620. ==/**************************************************/
  6621. ==  if (so()) {
  6622. ++    if (strcmp(s,"QUOTEEDIT")==0) {
  6623. ++      sysoplog("@ Ran QuoteEdit");
  6624. ++      random_quote();
  6625. ++    }
  6626. ==    if (strcmp(s,"BOARDEDIT")==0) {
  6627. ==      sysoplog("@ Ran Boardedit");
  6628. ==      boardedit();
  6629. ==    }
  6630.  
  6631.  
  6632. 5) Next, search for the function "void dlmainmenu()" and modify the one line
  6633.    and insert the other line, near the beginning.
  6634.  
  6635. ==  char *s, s1[81],s2[81],ch;
  6636. +=  int i,i1,i2,abort=0,next;          /* change from V1.00 */
  6637. ==  messagerec m;
  6638. ==
  6639. ==  if ((sysstatus_expert & thisuser.sysstatus)==0)
  6640. ==  if ((sysstatus_expert & thisuser.sysstatus)==0)
  6641. ==    printmenu(3);
  6642. ==
  6643. ==  nl();
  6644. ++  thump(get_random_quote(),&abort);
  6645. ==  nl();
  6646. ==  tleft(1);
  6647.  
  6648.  
  6649. 6) Now search for the function "void getcaller()" and add these three lines.
  6650.    (They're about three screens down from the beginning...)
  6651.  
  6652. ==      switch(ch) {
  6653. ++        case '\"':
  6654. ++          if (ok_local()) random_quote();
  6655. ++          break;
  6656. ==        case '?':
  6657. ==          if (ok_local()) {
  6658.  
  6659.  
  6660. 7) Those are all the changes that need to be made to the existing code.  Now
  6661.    we add some new functions.  These can be block read in if you don't feel
  6662.    like typeing them.  (To block read something in, hit Control-K Control-R,
  6663.    tell it the file name, and then hit Control-K Control-H to put the colors
  6664.    back to normal.  Just block read in this entire mod at the end of BBS.C
  6665.    and delete all the lines before and after the functions.  (Control-Y will
  6666.    delete the line your cursor is currently on.)
  6667.  
  6668.  
  6669. /* BEGINNING OF BLOCK READ FOR GREENY'S RANDOM QUOTE MOD */
  6670.  
  6671. /* These are all changed from 1.00 */
  6672.  
  6673. void random_quote()
  6674. {
  6675.  
  6676. #define QUOTE_LINES 3
  6677. #define QUOTE_SIZE ((80*QUOTE_LINES)+1)
  6678.  
  6679.   long int f,f1,i,i1,i42,offset;
  6680.   int abort;
  6681.   char s[QUOTE_SIZE],s1[100],ch,ch1;
  6682.  
  6683.   for(i=0; i<QUOTE_SIZE; i++) {
  6684.   s[i]=0;
  6685.   }
  6686.   i=0;
  6687.   do  {
  6688.     abort=0;
  6689.     lines_listed=0;
  6690.     nl();
  6691.     nl();
  6692.     prt(5,"Random Quotes - A)dd, L)ist, D)elete, Q)uit :");
  6693.     ch=toupper(getch());
  6694.     nl();
  6695.     switch(ch)  {
  6696.       case 'Q':
  6697.         return;
  6698.       case 'L':
  6699.         nl();
  6700.         prt(2,"Random Quotes Available");
  6701.         nl();
  6702.         prt(2,"-----------------------");
  6703.         nl();
  6704.         strcpy(s1,"RANQUOTE.DAT");
  6705.         if((f=open(s1,O_RDONLY))!=-1) {
  6706.           lseek(f,0L,SEEK_SET);
  6707.           i=filelength(f)/QUOTE_SIZE;
  6708.           if (i) {
  6709.             for (i1=0,(i=filelength(f)/QUOTE_SIZE); i1<i; i1++) {
  6710.               lseek(f,((long) (i1*QUOTE_SIZE)),SEEK_SET);
  6711.               read(f,s,QUOTE_SIZE);
  6712.               sprintf(s1,"%04d:",i1+1);
  6713.               if(!abort) {
  6714.                 ansic(4);
  6715.                 pl(s1);
  6716.                 ansic(0);
  6717.               }
  6718.               thump(s,&abort);
  6719.               nl();
  6720.             }
  6721.           nl();
  6722.           close(f);
  6723.           } else {
  6724.             close(f);
  6725.             goto NOPE;
  6726.           }
  6727.         } else goto NOPE;
  6728.         break;
  6729. NOPE:
  6730.         prt(3, "There are no quotes available.");
  6731.         nl();
  6732.         break;
  6733.     case 'A':
  6734.         nl();
  6735.  
  6736.         prt(2,"Enter Random Quote...");
  6737.         nl();
  6738.          sprintf(s1,"Enter Random quote, %d lines maximum",QUOTE_LINES);
  6739.         pl(s1);
  6740.         s1[0]=0;
  6741.         s[0]=0;
  6742.         for (i=0; i<3; i++) {
  6743.           inli(s+strlen(s),s1,i<2 ? QUOTE_SIZE-strlen(s)-5 :
  6744.                (QUOTE_SIZE-strlen(s)-5>78 ? 78 : QUOTE_SIZE-strlen(s)-5),
  6745.                i <2 ? 1:0 );
  6746.           if(s[0]==0) break;
  6747.           if(strlen(s)>3) {
  6748.             if(s[strlen(s)-3]!='\n') sprintf(s+strlen(s),"\n%c0",3);
  6749.             else break;
  6750.           }
  6751.         }
  6752.         if(s[0]==0) {
  6753.           nl();
  6754.           prt(3, "Aborted");
  6755.           nl();
  6756.           break;
  6757.         }
  6758.         strcpy(s1,"RANQUOTE.DAT");
  6759.         f=open(s1,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
  6760.         if(filelength(f))  {
  6761.           lseek(f,-1L,SEEK_END);
  6762.           read(f,((void *)&ch1),1);
  6763.           if(ch1==26) lseek(f,-1L,SEEK_END);
  6764.         }
  6765.         s[QUOTE_SIZE-1]=0;
  6766.         write(f,(void *)s,QUOTE_SIZE);
  6767.         close(f);
  6768.         break;
  6769.       case 'D':
  6770.         prt(6,"Number of quote to delete : ");
  6771.         mpl(4);
  6772.         inputl(s,4);
  6773.         i42=atoi(s);
  6774.         if(i42<1) break;
  6775.         strcpy(s1,"RANQUOTE.DAT");
  6776.         f=open(s1,O_RDWR | O_BINARY);
  6777.         if(f>-1) {
  6778.           i1=filelength(f);
  6779.           if(i42>i1/QUOTE_SIZE) {
  6780.             close(f);
  6781.             break;
  6782.           }
  6783.           i42--;
  6784.           lseek(f,(long) (i42 * QUOTE_SIZE), SEEK_SET);
  6785.           read(f,s,QUOTE_SIZE);
  6786.           nl();
  6787.           nl();
  6788.           thump(s,&abort);
  6789.           nl();
  6790.           prt(5,"Delete this Quote ?");
  6791.           if (yn())  {
  6792.             if(i42<(i1/QUOTE_SIZE)-1) {
  6793.               for(i=i42; i<(i1/QUOTE_SIZE)-1; i++) {
  6794.                 lseek(f,(long) (QUOTE_SIZE * (i+1)),SEEK_SET);
  6795.                 read(f,(void *)s,QUOTE_SIZE);
  6796.                 lseek(f,(long) (QUOTE_SIZE * i),SEEK_SET);
  6797.                 write(f,(void *)s,QUOTE_SIZE);
  6798.               }
  6799.             }
  6800.             chsize(f,(long) (i1-QUOTE_SIZE));
  6801.             pl("Quote deleted");
  6802.           }
  6803.           close(f);
  6804.         }
  6805.         break;
  6806.       }
  6807.     } while (1);
  6808. }
  6809.  
  6810. char *get_random_quote()
  6811. {
  6812.   long int f,i,i1;
  6813.   static char s1[QUOTE_SIZE];
  6814.   char s[100];
  6815.  
  6816.   s1[0]=0;
  6817.   strcpy(s,"RANQUOTE.DAT");
  6818.   if ((f=open(s,O_RDONLY))!=-1)
  6819.     {
  6820.     lseek(f,0L,SEEK_SET);
  6821.     i=filelength(f)/QUOTE_SIZE;
  6822.     if(i) {
  6823.       i1=random(i);
  6824.       lseek(f,(long)  (i1 * QUOTE_SIZE),SEEK_SET);
  6825.       read(f,s1,QUOTE_SIZE);
  6826.     }
  6827.     close(f);
  6828.   }
  6829.   return s1;
  6830. }
  6831.  
  6832. void thump(char *s, int *abort)
  6833. {
  6834.   int i=0,what=0,glurk;
  6835.   while(s[i]) {
  6836.     if(!(*abort)) {
  6837.       if(s[i]=='\n') {
  6838.         glurk=curatr;
  6839.         ansic(0);
  6840.         nl();
  6841.         setc(glurk);
  6842.       }
  6843.       else outchr(s[i]);
  6844.     }
  6845.     checka(abort,&what);
  6846.     i++;
  6847.   }
  6848.   ansic(0);
  6849. }
  6850.  
  6851. /* END OF BLOCK READ FOR GREENY'S RANDOM QUOTE MOD */
  6852.  
  6853.  
  6854.  
  6855. 8) Now save off the file by hitting F2, and compile it.  (If you haven't
  6856.    figured out how to set up a decent project file for F9, figure out how to
  6857.    do so and in the mean time drop to dos and use random's make file.)
  6858.  
  6859.  
  6860. 9) Send me some email.  I have an account as user #8 at WWIVnet node @6910.
  6861.  
  6862.  
  6863. NOTE: you can change color in a quote with the standard CTRL-P sequences.  On
  6864. every line except the last one this won't shorten the length before it
  6865. wordwraps.
  6866.  
  6867. ANOTHER NOTE: you can change the maximum number of lines in each quote by
  6868. changing the #define QUOTE_SIZE, but you'll have to delete your old
  6869. RANQUOTE.DAT file and start a new one if you've already entered a bunch of
  6870. quotes of the old size.  3 lines is a good size, especially since the vast
  6871. majority of quotes are likely to be one or two lines, and the full amount of
  6872. disk space is allocated to store each quote even if you only enter one
  6873. letter.
  6874.  
  6875. Thanks for being patient about version 2...  I'm in college, you know.  Takes
  6876. up a lot of one's time.
  6877.  
  6878. (GREENY)
  6879. THE PROMISED LAND Delran NJ 609-764-7144  Reg. #91223
  6880. HOST OF SUB 42 - DEEP THOUGHT: THE INTERNATIONAL MENSA NET
  6881. USR 38400/HST/HST/V.32/V.32-BIS/LAPM/V.42/V.42-BIS/MNP/ARQ/ASL
  6882.  
  6883.  
  6884.  
  6885.  
  6886.  
  6887.  
  6888. [54/99]: DEFRAG.C v1.10 Warning                             <Program>
  6889. [Name ]: East Bay Ray #1 @9964
  6890. [Date ]: Thu Jan 02 15:49:23 1992
  6891. [From ]: East Carolina Connection (North Carolina)
  6892.  
  6893. Do not use v1.10 of DEFRAG!  Random 1@1 pointed out a couple bugs which should 
  6894. not have happened, but because of my special testing situation here at the ECC, did.  I apologize to all who use v1.10, and thank you for using my programs.
  6895. -----
  6896. Roses are red,violets are blue,you think this will rhyme but it ain't gonna.
  6897.  
  6898.  
  6899.  
  6900.  
  6901.  
  6902.  
  6903. [55/99]: Correction to EDO006.420/EDO006.ZIP
  6904. [Name ]: Ed O'Brien #1 @7350
  6905. [Date ]: Thu Jan 02 10:54:40 1992
  6906. [From ]:^Data Xfer BBS [AVS] (Houston, Texas)
  6907.  
  6908. I made a typo in the instructions for the above mod.  They should read:
  6909.  
  6910. Load NEWUSER.C, ^QF void newuser and block read the following right before it.
  6911.  
  6912. Sorry for any inconvenience this may have caused.
  6913. ═══════════════════════════════════════════════════════════════════════════════
  6914. The BEST to you and yours!!!
  6915.  
  6916.  
  6917.                        -= Data Xfer BBS * 713-937-0884 =-
  6918.                    -= Files * Messages * Games * WWIV Mods =-
  6919.                  -= PCPursuitable @ TXHOU * SNARFable v1.02 =- 
  6920.  
  6921.  
  6922.  
  6923.  
  6924.  
  6925.  
  6926.  
  6927. [56/99]: BBSSTAT.C             By RiffRaff 1@8354
  6928. [Name ]: Riffraff #1 @8354
  6929. [Date ]: Thursday, January 02 1992, 00:15 AM <EST>
  6930. [From ]: Unicorn Games (Florida)
  6931.  
  6932. The next file is my bbsstat.c file....
  6933.  
  6934. Just some other...
  6935. RiffRaff 1@8354
  6936. Unicorn Games
  6937.  
  6938.  
  6939.  
  6940.  
  6941.  
  6942.  
  6943. [57/99]: BBSSTAT.C
  6944. [Name ]: Riffraff #1 @8354
  6945. [Date ]: Thursday, January 02 1992, 00:16 AM <EST>
  6946. [From ]: Unicorn Games (Florida)
  6947.  
  6948. #include <stdio.h>
  6949. #include <string.h>
  6950. #include <mem.h>
  6951. #include <io.h>
  6952. #include <fcntl.h>
  6953. #include <sys\stat.h>
  6954. #include <time.h>
  6955. #include "vardec.h"
  6956. #define inact_deleted 0x01
  6957.  
  6958. extern userrec;
  6959.  
  6960. char *ctypes[] = {
  6961.   "IBM PC (8088)",
  6962.   "IBM AT (80286)",
  6963.   "IBM 80386/80486",
  6964.   "IBM PS/2",
  6965.   "Apple 2",
  6966.   "Apple Mac",
  6967.   "Commodore Amiga",
  6968.   "Commodore",
  6969.   "Atari",
  6970.   "Other",
  6971.   0L,
  6972. };
  6973.  
  6974. int computers[10]={0,0,0,0,0,0,0,0,0,0};
  6975.  
  6976. void main()
  6977. {
  6978.   int userfile,i,j;
  6979.   unsigned int loop,num=0;
  6980.   unsigned long len;
  6981.   userrec thisuser;
  6982.   int males=0,females=0,age_14=0,age_18=0,age_21=0,age_22=0;
  6983.         unsigned long int uk=0,dk=0;
  6984.         unsigned long int tuk,duk;
  6985.         unsigned int actual_users,ibm_users;
  6986.         FILE *fp;
  6987.         time_t *secsnow;
  6988.         char *str_now;
  6989.               /* change to path of user.lst */
  6990.   userfile=open("d:\\wwiv\\data\\user.lst",O_RDWR | O_BINARY,S_IREAD | 
  6991. S_IWRITE);
  6992.   printf("Now reading bbs stats.\n\r");
  6993.  
  6994.   len=filelength(userfile);
  6995.   num=(len/sizeof(userrec));
  6996.   actual_users=num;
  6997.   lseek(userfile,((long) sizeof(userrec))*1,SEEK_SET);
  6998.   for(loop=1;loop<num;loop++) {
  6999.     read(userfile,(void *)&thisuser,sizeof(userrec));
  7000.     if (!(thisuser.inact & inact_deleted)) {
  7001.       if (thisuser.sex=='M')
  7002.         males++;
  7003.       else
  7004.         females++;
  7005.       if (thisuser.age<14)
  7006.         age_14++;
  7007.       else
  7008.         if (thisuser.age>=14 && thisuser.age<=18)
  7009.           age_18++;
  7010.         else
  7011.           if (thisuser.age>=19 && thisuser.age<=21)
  7012.             age_21++;
  7013.           else
  7014.             age_22++;
  7015.       computers[thisuser.comp_type]++;
  7016.       uk+=thisuser.uk;
  7017.       dk+=thisuser.dk;
  7018.     }
  7019.     else
  7020.       actual_users--;
  7021.   }
  7022.   close(userfile);
  7023.  
  7024.           /* change to path of gfiles dir */
  7025.   fp=fopen("d:\\wwiv\\gfiles\\bbsstat\\bbsstat.txt","wt+");
  7026.   
  7027. fprintf(fp,"==============================================================================\n");
  7028.   fprintf(fp,"System user statistics\n");
  7029.   fprintf(fp,"----------------------\n\n");
  7030.   fprintf(fp,"Number of Users %u\n",actual_users);
  7031.   fprintf(fp,"Males    %u\t\t\t\tFemales      %u\n\n\n",males,females);
  7032.   fprintf(fp,"Age of Users\n");
  7033.   fprintf(fp,"------------\n");
  7034.   fprintf(fp,"Number of users under 14    %u\t\tUsers 14 to 18   
  7035. %u\n",age_14,age_18);
  7036.   fprintf(fp,"          Users 19 to 21    %u\t\tUsers over  21   
  7037. %u\n\n\n",age_21,age_22);
  7038.   fprintf(fp,"Computers Represented\n");
  7039.   fprintf(fp,"---------------------\n");
  7040.   fprintf(fp,"%-20.20s %3u  %-20.20s %3u  %-20.20s 
  7041. %3u\n",ctypes[0],computers[0],ctypes[1],computers[1],ctypes[2],computers[2]);
  7042.   fprintf(fp,"%-20.20s %3u  %-20.20s %3u  %-20.20s 
  7043. %3u\n",ctypes[3],computers[3],ctypes[4],computers[4],ctypes[5],computers[5]);
  7044.   fprintf(fp,"%-20.20s %3u  %-20.20s 
  7045. %3u\n",ctypes[6],computers[6],ctypes[7],computers[7]);
  7046.   fprintf(fp,"%-20.20s %3u  %-20.20s 
  7047. %3u\n",ctypes[8],computers[8],ctypes[9],computers[9]);
  7048.   ibm_users=computers[0]+computers[1]+computers[2]+computers[3];
  7049.         tuk=uk;
  7050.         duk=dk;
  7051.         fprintf(fp,"Total IBM users     %u\n\n",ibm_users);
  7052.         fprintf(fp,"Total uploaded K    %-10lu       Total downloaded      
  7053. %-10lu\n",tuk,duk);
  7054.         fprintf(fp,"Average uploaded K  %-7.3f       Average downloaded K  
  7055. %-7.3f\n",((float)tuk)/((float)actual_users),((float)duk)/((float)actual_users));
  7056.  
  7057.         fprintf(fp,"==============================================================================\n\n");
  7058.  
  7059.   time(secsnow);
  7060.   str_now=ctime(secsnow);
  7061.   fprintf(fp,"Run at %s",str_now);
  7062.   fclose(fp);
  7063.  
  7064.   printf("BBSSTAT completed.\n");
  7065. }
  7066.  
  7067.  
  7068.  
  7069.  
  7070.  
  7071.  
  7072. [58/99]: < The Dungeon's SUBLIST mod >
  7073. [Name ]: Master Daarkhan #1 @7653
  7074. [Date ]: Fri Jan 03 03:12:52 1992
  7075. [From ]: The Dungeon (Upstate New York)
  7076.  
  7077.  
  7078. The Dungeon's Sublist Modification                    By DaarKhan 1@7653
  7079.  
  7080.  
  7081.     This is a real simple mod (can you block read?) that I use to simplify
  7082. the listing of my subbases. It is set up for a board with the 64 subbase mod
  7083. installed. Without the 64 subbase mod, you really don't need this, but if you
  7084. want to install it anyways, you're on your own re-configuring it!
  7085.  
  7086.     What it does is let the user select if they want to see the LOCAL subs,
  7087. or the NET subs, and I also have it configured to list my ROLE-PLAYING subs.
  7088. You can change the later to be whatever you want, just include a certain
  7089. string in the TITLE of the subbases you want to seperate from the rest (e.g.
  7090. all of my role-playing subs have "RPG" in the title, so that this mod can
  7091. seperate them. You can change it to whatever you want (for example, if you
  7092. carry a lot of ANSI art subs, change it so that all of your ANSI art subs
  7093. have the string "ANSI" in the title, and your all set.)
  7094.  
  7095.     Just block read this puppy in as your new void sublist() in BBS.C (I
  7096. think). Like I said, I just yanked this out of my code and and printing it
  7097. for you, so if there are any little subtle problems with it (like a variable
  7098. that you don't have declared or something), then Email me and I'll help you
  7099. out. This should work 100% though (BTW: I run WWIV 4.12, but it should work
  7100. with any WWIV version with the 64 sub mod installed).
  7101.  
  7102.     I support my mods, but if your computer blows up, I'm not responsible and
  7103. [insert standard disclaimer here], but I will try and help you out if
  7104. possible. Ask anyone who subscribes to one of my subs, I'm a real nice guy
  7105. (evil grin).
  7106.  
  7107. ______________________BLOCK READ BEGIN___________________________
  7108.  
  7109. void sublist()
  7110. {
  7111.      int i,abort;
  7112.      char ch,s[80],s1[80],a[80],b[80],d[80];
  7113.  
  7114.      do {
  7115.           prt(2,"Sublist [L,N,R,*,Q,?] : ");
  7116.           ch=onek("LNR*Q?");
  7117.           switch (ch) {
  7118.                case '?':
  7119.                     prt(3,"Help");
  7120.                     nl();
  7121.                     printfile("SUB_MENU");       /* Make this file! */
  7122.                     break;
  7123.                case 'Q':
  7124.                     prt(3,"Quit");
  7125.                     nl();
  7126.                     return;
  7127.                case 'L':
  7128.                     prt(3,"Local subs");
  7129.                     nl();
  7130.                     break;
  7131.                case 'N':
  7132.                     prt(3,"Network subs");
  7133.                     nl();
  7134.                     break;
  7135.                case 'R':
  7136.                     prt(3,"Role-playing subs");  /* Change if you want */
  7137.                     nl();
  7138.                     break;
  7139.                case '*':
  7140.                     prt(3,"All subs");
  7141.                     nl();
  7142.                     break;
  7143.           }
  7144.      } while (ch=='?');
  7145.      abort=0;
  7146.      i=0;
  7147.  
  7148.      while ((i<64) && (usub[i].subnum!=-1)) {
  7149.           if (usub[i].subnum<32) {
  7150.                if ((1L << (usub[i].subnum)) & thisuser.qscn)
  7151.                     strcpy(a,usub[i].keys);
  7152.                else
  7153.                     strcpy(a,"--");
  7154.           } else {
  7155.                if ((1L << (usub[i].subnum-32)) & thisuser.qscn2)
  7156.                     strcpy(a,usub[i].keys);
  7157.                else
  7158.                     strcpy(a,"--");
  7159.           }
  7160.  
  7161.           if (syscfg.systemnumber) {
  7162.                if (subboards[usub[i].subnum].type) {
  7163.                     if (subboards[usub[i].subnum].anony & anony_val_net)
  7164.                          strcpy(b,"[Net]");
  7165.                     else
  7166.                          strcpy(b,"<Net>");
  7167.                } else
  7168.                     strcpy(b,"     ");
  7169.           }
  7170.  
  7171.           strcpy(d,subboards[usub[i].subnum].name);
  7172.  
  7173.  
  7174.           sprintf(s,"     %2.2s   %-5.5s    %-50.50s ",a,b,d);
  7175.  
  7176.           switch (ch) {
  7177.                case 'L':
  7178.                     if (!subboards[usub[i].subnum].type) pla(s,&abort);
  7179.                     break;
  7180.                case 'N':
  7181.                     if (subboards[usub[i].subnum].type) pla(s,&abort);
  7182.                     break;
  7183.                case 'R':
  7184.                     if (strstr(subboards[usub[i].subnum].name,"RPG")!=NULL)
  7185.                         pla(s,&abort);
  7186.                     break;
  7187.                case '*':
  7188.                     pla(s,&abort);
  7189.                     break;
  7190.           }
  7191.           i++;
  7192.      }
  7193.      if (i==0)
  7194.           pla("None.",&abort);
  7195.      nl();
  7196. }
  7197.  
  7198. _____________________BLOCK READ END_______________________
  7199.  
  7200.  
  7201.     There you go! Like I said, if you have any problems, please get in touch
  7202. with me!
  7203.  
  7204. ┌┐┌┐┌┐┌┐┌┐
  7205. │Daarkhan│
  7206. └┘└┘└┘└┘└┘
  7207.  
  7208.  
  7209.  
  7210.  
  7211.  
  7212.  
  7213.  
  7214. [59/99]: A One MEg Dgroup mod..EXCELLENT!!!!!!!!!
  7215. [Name ]: Bad Medicine #1 @2541
  7216. [Date ]: Sat Jan 04 04:50:19 1992
  7217. [From ]: Just Killing Time BBS (Alabama)
  7218.  
  7219. Status: Reply Wanted!
  7220.  
  7221.  I found this an had to post it, I needed it had 0 Dgroup Left!
  7222.  
  7223.                                             BÆD Mεdïcïnε 1@2541
  7224.  
  7225.                                 Anti-DGROUP Mod
  7226.                                       by:
  7227.                              One Eyed Willy @ 18852
  7228.                                    typed by:
  7229.                                   Xtc @ 18855
  7230.  
  7231.      Ever since people started modifying WWIV BBSes, there's always been the
  7232. dreaded DGROUP error.  This error occurs when more than 64k of text and
  7233. data space is used up.  And until now, the only way to circumvent this error
  7234. was to either install a hard-to-use external string manager, or to shorten
  7235. your messages.  Turbo C actually has a larger compiling model called "Huge",
  7236. but trying to compile a normal WWIV board under that will result in
  7237. a blank screen.
  7238.  
  7239.      This mod will correct that problem, allowing you to compile WWIV
  7240. in huge using TC++ 1.0 (PATCHES MUST BE INSTALLED), or Borland C++ 2.0 or
  7241. higher.
  7242.  
  7243. /******KEY*******/
  7244. /*              */
  7245. /* = Origanal   */
  7246. /* + Add        */
  7247. /* * Modify     */
  7248. /* - Delete     */
  7249. /*              */
  7250. /****************/
  7251.  
  7252.      First, load the file COM.C in to your favorite editor and
  7253.      modify/add/delete the following.
  7254.  
  7255. Search for "void execute_ansi()" and make the following modifications.
  7256.  
  7257. =  int args[10], argptr, count, ptr, tempptr, ox, oy;
  7258. =  char cmd, temp[10], teol[81], *clrlst = "04261537";
  7259.  
  7260. +  union REGS r;       /***** add ******/
  7261.  
  7262. Next search for "case 'K'" and replace it with this one.
  7263.  
  7264.                 case 'K':
  7265.                   ox = wherex();
  7266.                   oy = wherey();
  7267.                   r.x.cx = 80 - ox;
  7268.                   r.h.ah = 0x09;
  7269.                   r.h.bh = 0x00;
  7270.                   r.h.al = 32;
  7271.                   r.h.bl = curatr;
  7272.                   int86(0x10,&r,&r);
  7273.                   movecsr(ox, oy);
  7274.                   break;
  7275.  
  7276. Save COM.C and load up CONIO.C.
  7277. Search for "#define TWO_WAY" and after this do these modification.
  7278.  
  7279.  
  7280. - #define SCROLL_UP(t,b,l) \
  7281. -  _CH=t;\
  7282. -  _DH=b;\
  7283. -  _BH=curatr;\
  7284. -  _AL=l;\
  7285. -  _CL=0;\
  7286. -  _DL=79;\
  7287. -  _AH=6;\
  7288. -  my_video_int();
  7289.  
  7290. /* Add the following function after the #define TWO_WAY */
  7291.  
  7292. void SCROLL_UP(int t, int b, int l)
  7293. {
  7294.   union REGS r;
  7295.  
  7296.   r.h.ch=t;
  7297.   r.h.dh=b;
  7298.   r.h.bh=curatr;
  7299.   r.h.al=l;
  7300.   r.h.cl=0;
  7301.   r.h.dl=79;
  7302.   r.h.ah=6;
  7303.   int86(0x10,&r,&r);
  7304. }
  7305.  
  7306. A little farther down:
  7307.  
  7308. search for "void my_video_int" and remove it or comment it out.
  7309.  
  7310. search for "void movecsr(int x,int y)".
  7311.  
  7312. = void movecsr(int x,int y)
  7313. = /* This, obviously, moves the cursor to the location specified, offset from
  7314. =  * the protected dispaly at the top of the screen
  7315. =  */
  7316. = {
  7317. +  union REGS r;
  7318.  
  7319. A little farther down.
  7320.  
  7321. =  if (y>screenbottom)
  7322. =       y=screenbottom;
  7323.  
  7324. +   r.h.bh=0x00;
  7325. +   r.h.dh=y;
  7326. +   r.h.dl=x;
  7327. +   r.h.ah=0x02;
  7328. +   int86(0x10,&r,&r);
  7329. = }
  7330.  
  7331. Next replace the following functions with these ones.
  7332.  
  7333. int wherex()
  7334. /* This function returns the current X cursor position, as the number of
  7335.  * characters from the left hand side of the screen.  An X position of zero
  7336.  * means the cursor is at the left-most position
  7337.  */
  7338. {
  7339.  
  7340. /****** Replace whole void  ******/
  7341.  
  7342.   union REGS r;
  7343.  
  7344.   r.h.bh=0x00;
  7345.   r.h.ah=0x03;
  7346.   int86(0x10,&r,&r);
  7347.   tempio=r.h.dl;
  7348.   return(tempio);
  7349. }
  7350.  
  7351.  
  7352.  
  7353. int wherey()
  7354. /* This function returns the Y cursor position, as the line number from
  7355.  * the top of the logical window.  The offset due to the protected top
  7356.  * of the screen display is taken into account.  A wherey() of zero means
  7357.  * the cursor is at the top-most position it can be at.
  7358.  */
  7359.  
  7360. /******** Replace whole void ********/
  7361.  
  7362. {
  7363.   union REGS r;
  7364.  
  7365.   r.h.bh=0x00;
  7366.   r.h.ah=0x03;
  7367.   int86(0x10,&r,&r);
  7368.   tempio=r.h.dh;
  7369.   return(tempio-topline);
  7370. }
  7371.  
  7372.  
  7373.  
  7374. void lf()
  7375. /* This function performs a linefeed to the screen (but not remotely) by
  7376.  * either moving the cursor down one line, or scrolling the logical screen
  7377.  * up one line.
  7378.  */
  7379.  
  7380. /***** Replace whole void *****/
  7381.  
  7382. {
  7383.   union REGS r;
  7384.  
  7385.   r.h.bh=0x00;
  7386.   r.h.ah=0x03;
  7387.   int86(0x10,&r,&r);
  7388.   tempio=r.h.dl;
  7389.   if (r.h.dh==screenbottom) {
  7390.         SCROLL_UP(topline,screenbottom,1);
  7391.         r.h.dl=tempio;
  7392.         r.h.dh=screenbottom;
  7393.         r.h.bh=0;
  7394.         r.h.ah=0x02;
  7395.         int86(0x10,&r,&r);
  7396.   } else {
  7397.         tempio=r.h.dh+1;
  7398.         r.h.dh=tempio;
  7399.         r.h.ah=0x02;
  7400.         int86(0x10,&r,&r);
  7401.   }
  7402. }
  7403.  
  7404.  
  7405.  
  7406. void cr()
  7407. /* This short function returns the local cursor to the left-most position
  7408.  * on the screen.
  7409.  */
  7410.  
  7411.  
  7412. /***** Replace whole void ******/
  7413.  
  7414. {
  7415.   union REGS r;
  7416.  
  7417.   r.h.bh=0x00;
  7418.   r.h.ah=0x03;
  7419.   int86(0x10,&r,&r);
  7420.   r.h.dl=0x00;
  7421.   r.h.ah=2;
  7422.   int86(0x10,&r,&r);
  7423. }
  7424.  
  7425. Next, page-down about one time and replace some more functions.
  7426.  
  7427. void bs()
  7428. /* This function moves the cursor one position to the left, or if the cursor
  7429.  * is currently at its left-most position, the cursor is moved to the end of
  7430.  * the previous line, except if it is on the top line, in which case nothing
  7431.  * happens.
  7432.  */
  7433. {
  7434.  
  7435.  
  7436. /******* Replace whole void */
  7437.  
  7438.   union REGS r;
  7439.  
  7440.   r.h.bh=0;
  7441.   r.h.ah=3;
  7442.   int86(0x10,&r,&r);
  7443.   if (r.h.dl==0) {
  7444.         if (r.h.dh != topline) {
  7445.           r.h.dl=79;
  7446.           tempio=r.h.dh-1;
  7447.           r.h.dh=tempio;
  7448.           r.h.ah=2;
  7449.           int86(0x10,&r,&r);
  7450.         }
  7451.   } else {
  7452.         r.h.dl--;
  7453.         r.h.ah=2;
  7454.         int86(0x10,&r,&r);
  7455.   }
  7456. }
  7457.  
  7458.  
  7459.  
  7460. void out1chx(unsigned char ch)
  7461. /* This function outputs one character to the screen, then updates the
  7462.  * cursor position accordingly, scolling the screen if necessary.  Not that
  7463.  * this function performs no commands such as a C/R or L/F.  If a value of
  7464.  * 8, 7, 13, 10, 12 (backspace, beep, C/R, L/F, TOF), or any other command-
  7465.  * type characters are passed, the appropriate corresponding "graphics"
  7466.  * symbol will be output to the screen as a normal character.
  7467.  */
  7468.  
  7469. /******** Replace whoooooole void */
  7470.  
  7471. {
  7472.    union REGS r;
  7473.  
  7474.   r.h.bl=curatr;
  7475.   r.h.bh=0x00;
  7476.   r.x.cx=0x01;
  7477.   r.h.al=ch;
  7478.   r.h.ah=0x09;
  7479.   int86(0x10,&r,&r);
  7480.   r.h.bh=0x00;
  7481.   r.h.ah=0x03;
  7482.   int86(0x10,&r,&r);
  7483.   ++(r.h.dl);
  7484.   if (r.h.dl==80) {
  7485.         r.h.dl=0;
  7486.         if (r.h.dh==screenbottom) {
  7487.           SCROLL_UP(topline,screenbottom,1);
  7488.           r.h.dh=screenbottom;
  7489.           r.h.dl=0;
  7490.           r.h.bh=0;
  7491.           r.h.ah=0x02;
  7492.           int86(0x10,&r,&r);
  7493.         } else {
  7494.           tempio=r.h.dh+1;
  7495.           r.h.dh=tempio;
  7496.           r.h.ah=0x02;
  7497.           int86(0x10,&r,&r);
  7498.         }
  7499.   } else {
  7500.         r.h.ah=0x02;
  7501.         int86(0x10,&r,&r);
  7502.   }
  7503. }
  7504.  
  7505. Now, search for "void set_protect(int l)" and replace it or modify it to
  7506. match mine.
  7507.  
  7508.  
  7509. void set_protect(int l)
  7510. /* set_protect sets the number of lines protected at the top of the screen. */
  7511. {
  7512.   union REGS r;   /** Add   */
  7513.  
  7514.   if (l!=topline) {
  7515.         if (l>topline) {
  7516.           if ((wherey()+topline-l) < 0) {
  7517.                 r.h.ch=topline;   /** Add       */
  7518.                 r.h.dh=screenbottom+1;
  7519.                 r.h.al=l-topline;
  7520.                 r.h.cl=0;
  7521.                 r.h.dl=79;
  7522.                 r.h.bh=0x07;
  7523.                 r.h.ah=7;
  7524.                 int86(0x10,&r,&r);  /* To here */
  7525.                 movecsr(wherex(),wherey()+l-topline);
  7526.           } else {
  7527.                 oldy += (topline-l);
  7528.           }
  7529.         } else {
  7530.           SCROLL_UP(l,topline-1,0);
  7531.           oldy += (topline-l);
  7532.         }
  7533.   }
  7534.   topline=l;
  7535.   if (using_modem)
  7536.         screenlinest=thisuser.screenlines;
  7537.   else
  7538.         screenlinest=defscreenbottom+1-topline;
  7539. }
  7540.  
  7541. Save CONIO.C and load up EXTRN.C and search for "SCROLL_UP".
  7542.  
  7543. Remove it or comment it out.  Save EXTRN.C.
  7544.  
  7545.      You're almost done.  Last thing to do is, in your TC or BC editor, hit
  7546. alt-o, c, c, and set it to compile in HUGE.  Next hit alt-o, s, <enter>.
  7547. Last hit alt-c, b.
  7548.  
  7549.      You now get to have loads of fun.  For those of you on 286 machines or
  7550. slower, I'm sorry, go take a nice LONG summer vacation while your whole board
  7551. re-compiles.  If you have 386, go get some lunch.  For those of you with a
  7552. 486, you're done.
  7553.  
  7554.      I just want to say that without One Eyed Willy, we would still be stuck
  7555. with those damn External String Managers.  Those who have made those ESM mods,
  7556. we all thank you for what you've done for us.  But now we have a much easier
  7557. way.  There will still be a DGROUP at 1 meg, but I doubt anyone will have that
  7558. much text in their code.  If you do, have fun with the ESM's. :)
  7559.  
  7560. Disclaimer: If your compiler spits at you, spit back and set it for HUGE.
  7561.             If your cat scratches your log and you through-up on the floor,
  7562.             and then slip in it and land on a grenade and blow up the world,
  7563.             it's not this mods fault.  Have a nice day. :)
  7564.  
  7565.    The Just Killin Time BBS (205)456-2445) 300-38.4k 700 Megs Online
  7566.     WWIV Net Node @2541 Link @12541 FidoNet 1:3607/30.1 VNet @2052
  7567.  
  7568.  
  7569.  
  7570.  
  7571.  
  7572.  
  7573.  
  7574.  
  7575.  
  7576. [60/99]: MULTNODE.C - The Beginnings of a Multi-Node WWIV
  7577. [Name ]: East Bay Ray #1 @9964
  7578. [Date ]: Fri Jan 03 19:06:19 1992
  7579. [From ]: East Carolina Connection (North Carolina)
  7580.  
  7581. The following is the beginning of my project to make WWIV multi-line.  If there is enough interest among the programming community, then I will form a sub or 
  7582. mailing list specifically for that purpose.  E-mail me if interested.
  7583.  
  7584. /****************************************************************************/
  7585.  BEGIN MULTNODE.C - File sharing routines to be called from other modules
  7586. /****************************************************************************/
  7587.  
  7588. #include "vars.h"
  7589.  
  7590. #pragma hdrstop
  7591.  
  7592. #include <fcntl.h>
  7593. #include <sys\stat.h>
  7594. #include <share.h>
  7595. #include <io.h>
  7596. #include <time.h>
  7597.  
  7598.  
  7599. int sopen_to(char *path, int access, int shflag, int mode, int timeout)
  7600. /* sopen - with timeout support; returns -2 if routine timed out */
  7601. {
  7602.   long t, t1;
  7603.   int handle = -1;
  7604.   
  7605.   time(&t);
  7606.   time(&t1);
  7607.   handle = sopen(path, access, shflag, mode);
  7608.   while (((handle < 0) && (errno == EACCES)) && ((t1 - t) < timeout)) {
  7609.     handle = sopen(path, access, shflag, mode);
  7610.     time(&t1);
  7611.   }
  7612.   if (((t1 - t) >= timeout) && (handle < 0) && (errno == EACCES))
  7613.     handle = -2;
  7614.   return(handle);
  7615. }
  7616.  
  7617.  
  7618. int lock_to(int handle, long offset, long length, int timeout)
  7619. /* lock - with timeout support; returns -1 if cannot lock */
  7620. {
  7621.   long t, t1;
  7622.   int result = -1;
  7623.   
  7624.   time(&t);
  7625.   time(&t1);
  7626.   result = lock(handle, offset, length);
  7627.   while ((result != 0) &&  ((t1 - t) < timeout)) {
  7628.     result = lock(handle, offset, length);
  7629.     time(&t1);
  7630.   }
  7631.   return(result);
  7632. }
  7633.  
  7634.  
  7635. int share_installed()
  7636. /* detects if SHARE is installed - only in DOS versions 4 or later */
  7637. /* returns FALSE if DOS version less than 4 or not installed */
  7638. {
  7639.   if (_osmajor >= 4) {
  7640.     asm {                          
  7641.       mov   ax, 0x0600
  7642.       int   0x2F
  7643.     }
  7644.   } else {
  7645.     _AL = 0xFF;
  7646.   }
  7647.   if (_AL == 0xFF)
  7648.     return(1);
  7649.   else
  7650.     return(0);
  7651. }
  7652.  
  7653.  
  7654.  
  7655.  
  7656.  
  7657.  
  7658. [61/99]: TJ-NEW01.MOD  (if you can call it a mod)
  7659. [Name ]: Trader Jack #1 @8315
  7660. [Date ]: Thursday, January 2, 1992 10:04 pm <EST>
  7661. [From ]: The Trading Post (South Carolina)
  7662.  
  7663. ┌────────────────────────────────────────────────────────────────────────────┐
  7664. │ Mod Name: TJ-NEW01.MOD                  Mod Author: Trader Jack 1@8315     │
  7665. │ Difficulty: Too easy!                   Date: 01-02-92                     │
  7666. │ WWIV Version: 4.12 and 4.20                                                │
  7667. │ Description: If user enters unknown name at NN:, he is asked if he is new, │
  7668. │              and if so, is taken straight to new user process.             │
  7669. └────────────────────────────────────────────────────────────────────────────┘
  7670.  
  7671. << Step one: >>
  7672.  
  7673.         Backup 'dem Sourcies!
  7674.  
  7675. << Step two: >>
  7676.  
  7677. In 4.12 it's in BBSUTL.C in void getuser, in 4.20 it's in LILO.C, search and
  7678. add the three lines indicated.
  7679.  
  7680.       if (usernum==-1) {                        /* Search for this*/
  7681.         newuser();
  7682.         ok=1;
  7683.       } else
  7684.         if (usernum==0) {
  7685.    if (net_only)
  7686.      nl();
  7687.    else
  7688.             pl("Unknown User!");                /*original code*/
  7689.             prt(0,"Are you new here? [Y/N] ");  /*add me*/
  7690.             if (ny())                           /*add me*/
  7691.             newuser();                          /*add me*/
  7692.         } else                                  /*original code continues*/
  7693.    if ((usernum==-2) || (usernum==-3)) {
  7694.  
  7695. << Step three>>
  7696.  
  7697.         Recompile.
  7698.  
  7699. Insert disclaimer here ->
  7700.  
  7701. ===============================================================================
  7702.  Origin:  8315  The Trading Post BBS  803-787-9783  USR DS  WOMRable SNARFable
  7703.  
  7704.  
  7705.  
  7706.  
  7707.  
  7708.  
  7709. [62/99]: EDO006a.420 EDO006a.ZIP Better SysOp autovalidation mod.
  7710. [Name ]: Ed O'Brien #1 @7350
  7711. [Date ]: Sat Jan 04 13:05:41 1992
  7712. [From ]:^Data Xfer BBS [AVS] (Houston, Texas)
  7713.  
  7714.  
  7715. ┌────────────────────────────────────────────────────────────────────────────┐
  7716. │ Mod Name: EDO006a.420                   Mod Author: Ed O'Brien 1@7350      │
  7717. │ Difficulty: EASY                        Date: 01/04/92                     │
  7718. │ WWIV Version: 420e                                                         │
  7719. │ Description: Select Full Screen Editor, Default Protocol, Auto SysOp       │
  7720. │ Validation. Sends SysOp message via SMW.DAT of auto-validation and type.   │
  7721. └────────────────────────────────────────────────────────────────────────────┘
  7722.  
  7723. OK, first of all let me thank all the original authors of the FSEDDPAV mods
  7724. as this is basically their idea /╡mNÉpæ
  7725. ed upon with many extra features.
  7726.  
  7727. Also I wish to thank Aahz 1@8371 for bringing to my attention the built in
  7728. "set_autoval(x);" feature of WWIV.
  7729.  
  7730. This version uses a little less code and allows you to change your user
  7731. settings via Wayne's "set_autoval(x);" function in INIT.  Most of us are not
  7732. at the computer when some one calls so this feature is somewhat limited anyway.
  7733. Once the mod is installed you simply run INIT.EXE, select option '0' and set
  7734. the Fx keys to whatever settings you wish the new SysOp to have when they are
  7735. validated.  This allows you to change them at will without recompiling the BBS
  7736. each time.  It also saves you from figuring out what numbers to put in for the
  7737. various security levels.
  7738.  
  7739. For the most part this mod is simply a block read to the NEWUSER.C file but
  7740. you will need to create several printfile("xxxxxxxx")'s for each type of
  7741. SysOp you want to autovalidate.
  7742.  
  7743. As you may or may not know, Lance Halle, has established a list of boards
  7744. that use either a GUEST account or SysOp autovalidation to make it easier
  7745. for SysOps to have a place to get their mods.  I have always kept my source
  7746. mods separate from the addon files to prevent users that do NOT have their
  7747. WWIV registered from accessing the source mods and feel EVERYONE should do
  7748. the same to cut down on the illegal distribution of the source code.
  7749.  
  7750. Anyway what this mod will do is allow you several choices of type of SysOp's
  7751. you will autovalidate and the SL's you will grant each type.  It will also
  7752. send the SysOp of the board a message that so and so was autovalidated as a
  7753. xxxxxx type of SysOp along with "So and so read your mail" at logon.
  7754.  
  7755. On with the mod...
  7756.  
  7757. 1. Load up NEWUSER.C, ^QF void newuser and insert the following void right
  7758.    before it.
  7759.  
  7760. /* Begin block read */
  7761.  
  7762. void fullscred_protocol_autoval()            /* New Version 12/27/91 */
  7763. {
  7764.   int i,sysnumber;
  7765.   char sysnum[5],ph1[12],ph[12],sysname[35],s[40],s1[81],ch;
  7766.   net_system_list_rec *csne;
  7767.  
  7768.   thisuser.defprot=0;
  7769.   thisuser.defed=0;
  7770.   if (okansi()) {
  7771.   nl();
  7772.   prt(5,"Select a full-screen editor? ");
  7773.   if (ny())
  7774.    select_editor();
  7775.   }
  7776.    nl();
  7777.   prt(5,"Select a default transfer protocol? ");
  7778.   if (ny()) {
  7779.   nl();
  7780.   pl("Enter your default protocol, 0 for none.");
  7781.   nl();
  7782.   i=get_protocol(1);
  7783.   if (i>=0)
  7784.   thisuser.defprot=i;
  7785.  }
  7786.   thisuser.sl=syscfg.newusersl;         /* Validation starts here */
  7787.   thisuser.dsl=syscfg.newuserdsl;       /* Mostly new code        */
  7788.   thisuser.ar=0;
  7789.   thisuser.dar=0;
  7790.   thisuser.exempt=0;
  7791.   nl();
  7792.   prt(5,"Are you CURRENTLY the SysOp of a BBS? (no Co-SysOps) ");
  7793.    if (yn()) {
  7794.     printfile("VALID");                                  /* see note 2 */
  7795.     outstr("Which? 1-4,N : ");
  7796.     ch=onek("N1234");
  7797.       switch(ch) {
  7798. /*************************************************************************
  7799. This will autovalidate an unregistered WWIV SysOp NOT in WWIVnet and ONLY
  7800. allow access to the addon directory of the BBS and NO other areas anywhere.
  7801. *************************************************************************/
  7802.       case '1':
  7803.         pl("Please enter your BBS NAME and PHONE NUMBER.");
  7804.         outstr(":");
  7805.         inputl(thisuser.note,40);
  7806.         sprintf(s1,"%s validated as WWIV SysOp (no net)",thisuser.name);
  7807.         ssm(1,0,s1);
  7808.         sysoplog("#*#*#* Auto-validation of WWIV SysOp (no net)");
  7809.         thisuser.exempt=1;           /* Change this to suit your needs */
  7810.         set_autoval(0);              /* NOTE 1:F1 key, set in INIT.EXE */
  7811.         nl();
  7812.         printfile("WWIVSOP");                            /* see note 2 */
  7813.         nl();
  7814.         pausescr();
  7815.         break;
  7816. /*************************************************************************
  7817. Does the same as case '1' but for unregisterd WWIVnet SysOps and only
  7818. allows them access to non source areas of the BBS.
  7819. *************************************************************************/
  7820.       case '2':
  7821.         pl("Please enter your BBS NAME and PHONE NUMBER.");
  7822.         outstr(":");
  7823.         inputl(thisuser.note,40);
  7824.         sprintf(s1,"%s validated as UNregistered WWIVnet SysOp",thisuser.name);
  7825.         ssm(1,0,s1);
  7826.         sysoplog("#*#*#* Auto-validation of Unregistered WWIVnet SysOp");
  7827.         thisuser.exempt=1;           /* Change this to suit your needs */
  7828.         set_autoval(0);              /* NOTE 1:F1 key, set in INIT.EXE */
  7829.         nl();
  7830.         printfile("WWNETSOP");                           /* see note 2 */
  7831.         nl();
  7832.         pausescr();
  7833.         break;
  7834. /************************************************************************
  7835. This will autovalidated a SysOp who belongs to WWIVnet and has registered
  7836. WWIV.  It checks for a valid NODE number and an accompanying valid phone
  7837. number. It also gives the visiting SysOp full run of the BBS.
  7838. ************************************************************************/
  7839.       case '3':
  7840.         nl();
  7841.         pl ("Please enter your NODE number");
  7842.         outstr(":");
  7843.         input(sysnum,5);
  7844.         sysnumber=atoi(sysnum);
  7845.         csne=next_system(sysnumber);
  7846.         strcpy(ph,csne->phone);
  7847.         strcpy(sysname,csne->name);
  7848.         nl();
  7849.         pl ("Please enter your SYSTEM phone number\r\n ###-###-####");
  7850.         outstr(":");
  7851.         input(ph1,12);
  7852.       if (compare(ph,ph1)) {
  7853.         sprintf(s,"Sysop @%u %s",sysnumber,sysname);
  7854.         strcpy(thisuser.note,s);
  7855.         sprintf(s1,"%s validated as registered WWIVnet SysOp",thisuser.name);
  7856.         ssm(1,0,s1);
  7857.         sysoplog("#*#*#* Auto-validation of registered WWIVnet SysOp");
  7858.         sysoplog(s);
  7859.         thisuser.exempt=9;           /* Change this to suit your needs */
  7860.         set_autoval(1);              /* NOTE 1:F2 key, set in INIT.EXE */
  7861.         nl();
  7862.         printfile("WWIVSYSP");                           /* see note 2 */
  7863.         nl();nl();
  7864.         printfile("WWIVSOP1");                           /* see note 2 */
  7865.         nl();
  7866.         pausescr();
  7867.         enter_regnum();
  7868.       } else {
  7869.         nl();
  7870.         printfile("WWIVSOP2");                            /* see note 2 */
  7871.         nl();
  7872.         sprintf(s,"Attemped WWIV sysop autovalidation.");
  7873.         strcpy(thisuser.note,s);
  7874.       }
  7875.         break;
  7876. /************************************************************************
  7877. Here is where I autovalidate NON-WWIV SysOp running other BBS software.
  7878. Mine requests they are ONLY from my local area because I'm cheap and don't
  7879. want to call LD to verify their authenticity.  It also give the visiting
  7880. SysOp full run of my board, so be careful here. You may want to change it.
  7881. *************************************************************************/
  7882.       case '4':
  7883.         nl();
  7884.         pl("Please enter your BBS NAME and PHONE NUMBER.");
  7885.         outstr(":");
  7886.         inputl(thisuser.note,40);
  7887.         sprintf(s1,"%s validated as NON-WWIV SysOp",thisuser.name);
  7888.         ssm(1,0,s1);
  7889.         sysoplog("#*#*#* Auto-validation of a Non-WWIV Local SysOp");
  7890.         thisuser.exempt=0;           /* Change this to suit your needs */
  7891.         set_autoval(2);              /* NOTE 1:F3 key, set in INIT.EXE */
  7892.         nl();
  7893.         printfile("NONWWSOP");                           /* see note 2 */
  7894.         nl();
  7895.         pausescr();
  7896.         break;
  7897. /************************************************************************
  7898. Gives them the option of getting out of the autovalidation process if they
  7899. are honest. WARNING - some DO claim to be what they are not.
  7900. *************************************************************************/
  7901.       case 'N':
  7902.         nl();
  7903.         thisuser.note[0]=0;
  7904.         thisuser.exempt=0;
  7905.         thisuser.restrict=syscfg.newuser_restrict;
  7906.         break;
  7907.     }
  7908.    nl();
  7909.   }
  7910. }
  7911.  
  7912. /* end block read */
  7913.  
  7914.  
  7915. 3. Search for 'input_ansistat' and put
  7916. fullscred_protocol_autoval();
  7917. on the line AFTER it.
  7918.  
  7919. 4. Load up FNCS.H and search for 'void newuser()' and put the following
  7920. line before it:
  7921. void fullscred_protocol_autoval();
  7922.  
  7923. OK, that's it for the source modding.
  7924.  
  7925. NOTE 1: This part may be a little confusing so READ carefully:
  7926.         To set user levels for the F1 key use "set_autoval(0);"
  7927.         To set user levels for the F2 key use "set_autoval(1);"
  7928.         To set user levels for the F3 key use "set_autoval(2);" etc.
  7929.  
  7930.         The corresponding F keys are always one number larger than the
  7931.         number you use in the "set_autoval(x);" function.
  7932.  
  7933. NOTE 2: You will need to create several messages to be placed in your
  7934.         GFILES directory.  Mine are as follows but you may wish to reword
  7935.         them somewhat according to how your system is set up.
  7936.  
  7937. VALID.MSG  (This is the menu screen)
  7938.  
  7939.     Which type of BBS is this?  Must be CURRENTLY operational.
  7940.  
  7941.  1. Plain WWIV (no net/no registration #)  
  7942.  2. Unregistered WWIVnet (no registration #)
  7943.  3. Registered WWIVnet (MUST have valid Reg #)                    
  7944.  4. Running other BBS Software (Local to Houston ONLY)
  7945.  N. None of the above
  7946.  
  7947. WWIVSOP.MSG (This is the message WWIV (no net) SysOps will see.
  7948.  
  7949. You have been auto-validated as an unregistered WWIV
  7950. SysOp. If I find any of this information to be false,
  7951. your account will be deleted and other WWIV SysOps
  7952. informed about you.
  7953.  
  7954. WWNETSOP.MSG
  7955.  
  7956. You have been auto-validated as an unregistered
  7957. WWIVnet SysOp. If I find any of this information
  7958. to be false your account will be deleted and other
  7959. WWIVnet SysOps will be informed about you.
  7960.  
  7961. WWIVSYSP.MSG
  7962.  
  7963. You have been auto-validated as a WWIVnet SysOp.
  7964. If I find any of this information to be false, I will
  7965. delete your account and inform others about you!
  7966.  
  7967. WWIVSOP1.MSG (requests them to send E-Mail from their boards)
  7968.  
  7969. IMPORTANT!!!  You MUST send net E-Mail to 1@7350
  7970. from YOUR system to verify this account or it
  7971. will be deleted in 7 days.
  7972.  
  7973. WWIVSOP2.MSG (for those that fail the autovalidation tests)
  7974.  
  7975. The information you provided does NOT match WWIVnet files.
  7976. Application for SysOp status is denied!!!
  7977.  
  7978. Your attempt to gain access to this BBS as a WWIV SysOp will
  7979. be posted on the "WWIVnet AC's & GC's" sub board.
  7980.  
  7981. NONWWSOP.MSG (for those SysOps running other than WWIV software. Since
  7982. there is currently no good way to check their statements for validity I
  7983. simply autovalidate them as regular users until I have a chance to call
  7984. them voice, then upgrade them to visiting SysOps.)
  7985.  
  7986. The information you have provided will
  7987. be verified.  In the meantime you have 
  7988. been validated as a prefered user. Upon
  7989. verification that your BBS exists your
  7990. account will be upgraded to that of a
  7991. visiting SysOp.
  7992.  
  7993. If I find any of this info to be false,
  7994. or I can NOT find your BBS listed in the
  7995. current Houston BBS list, I will delete
  7996. your account and inform other local
  7997. SysOps about you.
  7998.  
  7999. You will have to figure out exactly what AR, DAR, SL, DSL and restrict you
  8000. want to give each type of Sysop.  Mine is set up to ONLY allow unregistered
  8001. WWIV and WWIVnet SysOps access to the WWIV addon programs in the transfer
  8002. section and nothing else on the BBS.  The registered WWIVnet SysOps have full
  8003. run of the board. (ALL areas).  The SysOps running other BBS software have
  8004. full access to all areas of my board with the exception of WWIV source mods.
  8005.  
  8006. For those of you that don't know, thisuser.exempt, is bit mapped.  It is a
  8007. rather long explanation on how to do this but I will give a minimal example:
  8008.  
  8009. An exemption of '1' is NO Upload/Download ratio and an exemption of '8' is
  8010. NO post per call ratio.  To give both exemptions to visiting SysOps just add
  8011. 1+8=9 and place '9' in the "thisuser.exempt=9" in the above code. Very simple!
  8012.  
  8013. If you have any problems with the mod I will not be held responsible, it
  8014. works for me and a few others.
  8015.  
  8016. Any questions or problems I can be reached as 1@7350.
  8017.  
  8018.  
  8019.  
  8020.  
  8021.  
  8022.  
  8023. [63/99]: Prelude to AKID3.MOD
  8024. [Name ]: Analog Kid #1 @5482
  8025. [Date ]: Sat Jan 04 15:44:59 1992
  8026. [From ]: Permanent Waves (Montreal, Canada)
  8027.  
  8028.     Greetings, all!
  8029.  
  8030.     I'm well aware that many out there have made and/or used such a mod as the
  8031. one I'm presenting you with now but I thought I would pass it on nonetheless.
  8032. I use it on my WWIV v4.20e BBS and it works just fine.  It's purpose is to
  8033. display your subs (by use of the '*' command) in two orderly columns, with
  8034. colours. Note that unlike certain other similar mods, this one maintains the
  8035. "<NET>", "[NET]" and the "-" notation so as to let the user discern whether
  8036. subs are netted or not and whether they have been toggled or not for QScan use.
  8037.  
  8038.     For the sake of showing what this mod will look like on your BBS, here
  8039. is how it is displayed for the regular user on Permanent Waves.  Should you
  8040. decide to use, remember to back up your source codes before doing so.  The
  8041. actual mod follows on the next post.
  8042.  
  8043.  
  8044.                           -=* Subboards Available *=-
  8045.  1 -       Main/General Board             2         Entertainment Board       
  8046.  3         Nonsense/Anonymous Board       4         Comics                    
  8047.  5 -       Trade Wars 2002 Conference     6 -       Mystic Realms             
  8048.  7 - [NET] Computer Classified            8 - [NET] Computer Problems         
  8049.  9 - [NET] Computer Programming          10   [NET] Doors & Games             
  8050. 11   [NET] Just For Laughs               12   [NET] Sporting News             
  8051. 13   [NET] Dead Poet Society             14   [NET] Canada Net                
  8052. 15   [NET] West Side                     16   [NET] Painter's Corner          
  8053. 17 - [NET] Trojans and Virii             18   [NET] The Shadow of Armageddon  
  8054. 19   [NET] Prophecy                      20 - [NET] Tolkien's Middle Earth    
  8055. 21   [NET] Keyboards For Christ          22 - [NET] Jewish Issues Sub         
  8056. 23 - [NET] Star Trek Sub                 24 - [NET] Trade Wars 2002 Discussion
  8057.  
  8058.  
  8059.  
  8060.  
  8061.  
  8062.  
  8063.  
  8064. [64/99]: AKID3.MOD
  8065. [Name ]: Analog Kid #1 @5482
  8066. [Date ]: Sat Jan 04 15:45:46 1992
  8067. [From ]: Permanent Waves (Montreal, Canada)
  8068.  
  8069. AKID3.MOD for WWIV 4.20
  8070.  
  8071. Programmed by the Analog Kid, 1@5482
  8072.                   of Permanent Waves BBS
  8073.                   (514) 844-0214
  8074.                   Montreal, Quebec,
  8075.                   Canada
  8076.  
  8077. Makes a two-column sublist display, with colours.  Simply remove the original
  8078. sublist() function in BBS.C and replace it with the following two functions.
  8079. Lastly, add the function prototype given below anywhere near the top of the
  8080. source (such as before the very first function).
  8081.  
  8082. void subline();                /* function prototype for AKID3.MOD */
  8083.  
  8084.  
  8085.  
  8086. Functions to be inserted (patch and paste will do it quickly):
  8087.  
  8088.  
  8089. void sublist()                   /* AKID3.MOD, by the Analog Kid, 1@5482 */
  8090. {                                /* Permanent Waves BBS, Montreal, PQ    */
  8091.   int i,abort,right;             /* Followed by function "subline".      */
  8092.   char s[160],s1[80];
  8093.  
  8094.   nl();
  8095.   i=abort=right=0;
  8096.   if (thisuser.screenchars<80)
  8097.   {
  8098.     prt(1,"-=* Subboards Available *=-");
  8099.     nl();
  8100.     while ((i<MAX_SUBS) && (usub[i].subnum!=-1))
  8101.     {
  8102.       subline(s1,i);
  8103.       pla(s1,&abort);
  8104.       i++;
  8105.     }
  8106.   }
  8107.   else
  8108.   {
  8109.     prt(1,"                          -=* Subboards Available *=-");
  8110.     nl();
  8111.     while ((i<MAX_SUBS) && (usub[i].subnum!=-1))
  8112.     {
  8113.       subline(s1,i);
  8114.       if (right)
  8115.       {
  8116.         strcat(s,"    ");
  8117.         strcat(s,s1);
  8118.         pla(s,&abort);
  8119.         right=0;
  8120.       }
  8121.       else
  8122.       {
  8123.         strcpy(s,s1);
  8124.         right=1;
  8125.       }
  8126.       i++;
  8127.     }
  8128.     if (right)
  8129.       pla(s,&abort);
  8130.   }
  8131.   if (i==0)
  8132.     pla("None.",&abort);
  8133. }
  8134.  
  8135.  
  8136.  
  8137. void subline(char s1[43], int i)
  8138. {
  8139.   sprintf(s1,"%2s - ",usub[i].keys);
  8140.   if (usub[i].subnum<32)
  8141.   {
  8142.     if (!((1L<<(usub[i].subnum)) & thisuser.qscn))
  8143.       s1[7]=32;
  8144.   }
  8145.   else
  8146.   {
  8147. #if MAX_SUBS>32
  8148.     if (!((1L<<(usub[i].subnum-32)) & thisuser.qscn2))
  8149.       s1[7]=32;
  8150. #else
  8151.     s1[7]=32;
  8152. #endif
  8153.   }
  8154.   if (syscfg.systemnumber)
  8155.   {
  8156.     if (subboards[usub[i].subnum].type)
  8157.       if (subboards[usub[i].subnum].anony & anony_val_net)
  8158.         strcat(s1,"[NET] ");
  8159.       else
  8160.         strcat(s1,"<NET> ");
  8161.     else
  8162.       strcat(s1,"      ");
  8163.   }
  8164.   strcat(s1,"");
  8165.   strcat(s1,subboards[usub[i].subnum].name);
  8166.   if (strlen(s1)>45)
  8167.     s1[45]=0;
  8168.   else
  8169.     while (strlen(s1)<=44)
  8170.       strcat(s1," ");
  8171. }
  8172.  
  8173.  
  8174.  
  8175. Disclaimer:  This mod works just fine on Permanent Waves, but in no way can I
  8176. be held responsible if its application results in burnt microchips (or human
  8177. nerve endings, for that matter), a homicide, drug abuse, the death of your
  8178. dog named Fido, or rap music to emanate from your stereo.
  8179.  
  8180. Criticism, suggestions, and/or praise are all kindly appreciated.  If this
  8181. mod does your board any service and you are pleased with it, please let me
  8182. know (and, of course, insert favorite Rush LP into stereo, and play loud).
  8183.  
  8184.     αñα£og kï√   (1@5482)
  8185.     SysOp of Permanent Waves
  8186.  
  8187.  
  8188.  
  8189.  
  8190.  
  8191.  
  8192.  
  8193. [65/99]: Notepad Mod + Auto-save feature for notepad, posts & e-mails
  8194. [Name ]: Jessica Lovecraft #130 @5460
  8195. [Date ]: Fri Jan 03 15:02:13 1992
  8196. [From ]: Le Curseur (Montreal, Canada)
  8197.  
  8198. Following is a modification to WWIV 4.20 sources in three parts.
  8199.  
  8200.         - Autosave messages. If the user gets hungup by loss of carrier or
  8201.           F5, SHIFT-F5 or CTRL-F5, his/her message is saved with a message
  8202.           indicating autosaved....
  8203.  
  8204.         - A notepad based on DR.ZEROs zpad with a few modifications correcting
  8205.           bugs, supporting WWIV 4.20 and other minor changes....
  8206.  
  8207.         - Autosave feature for the said notepad.
  8208.  
  8209. Disclaimer : The author of these modifications cannot be held responsible for 
  8210. any loss of data or problems otherwise encountered du to these modifications.
  8211. The use of these modifications is left to the discretion of the person
  8212. implementing them. 
  8213.  
  8214. ** original lines of code
  8215. -- lines to be removed
  8216. ++ lines to be added
  8217. .. original lines of code not shown here
  8218.  
  8219.  
  8220. Here begins the modifications required for the autosave feature for regular
  8221. posting or e-mailing.....
  8222.  
  8223. File MSGBASE.C
  8224. --------------
  8225.  
  8226. Function INMSG()
  8227.  
  8228. ..
  8229.  
  8230. **  nl();
  8231. **  helpl=6;
  8232. ++/* MCW this is where if posting and the user is hung up, we don't ask for */
  8233. ++/*   a title, instead we force one..... hehe */
  8234. ++  if (hangup) {
  8235. ++    strcpy(title,"*****  Auto saved message, loss of carrier  *****");
  8236. ++  } else {
  8237. **    if (okansi()) {
  8238. **      prt(2,"Title: ");
  8239. **      mpl(60);
  8240. **      inputl(title,60);
  8241. **    } else {
  8242. **   pl("       (---=----=----=----=----=----=----=----=----=----=----=----)");
  8243. **      outstr("Title: ");
  8244. **      inputl(title,60);
  8245. **    }
  8246. ++  }
  8247. ++/* MCW end */
  8248. **  if ((title[0]==0) && (needtitle)) {
  8249. **    pl("Aborted.");
  8250. **    m.stored_as=0xffffffff;
  8251. **    *m1=m;
  8252. **    if (!fsed)
  8253. **      farfree((void *)lin);
  8254. **    return;
  8255. **  }
  8256.  
  8257. ..
  8258.  
  8259. **    while (!done) {
  8260. **      helpl=27;
  8261. **      inli(s,ro,160,1);
  8262. **      if (hangup)
  8263. --        done=1; 
  8264. ++/* MCW if the user hungup, then we just save the message 
  8265. ++   with a note saying HUNGUP at the end */
  8266. ++        {
  8267. ++        setanon=0; /* must also clear anonymous prompt */
  8268. ++        save=1;
  8269. ++        done=1;
  8270. ++        savel=0;
  8271. ++        }
  8272. ++/* MCW end */
  8273. **      savel=1;
  8274. **      if (s[0]=='/') {
  8275.  
  8276. ..
  8277.  
  8278. **              for (i4=0; (i4<(thisuser.screenchars-i5)/2) && (!i2); i4++)
  8279. **                osan(" ",&i2,&i1);
  8280. **            }
  8281. **            pla(s1,&i2);
  8282. **          }
  8283. ++/* MCW Print the number of lines left to post.... */
  8284. ++         nl();
  8285. ++         sprintf(s,"%d lines done %d lines left",curli,(maxli-curli));
  8286. ++         prt(5,s);
  8287. ++/* MCW end */
  8288. **          nl();
  8289. **          pl("Continue...");
  8290. **        }
  8291. **        if ((stricmp(s,"/ES")==0) || (stricmp(s,"/S")==0)) {
  8292.  
  8293. ..
  8294.  
  8295. **      case anony_real_name:
  8296. **        real_name=1;
  8297. **        *anony=0;
  8298. **        break;
  8299. **    }
  8300. ++/* MCW cannont permit output if user hung up */
  8301. ++    if (!hangup)
  8302. ++/* MCW end */
  8303. **    outstr("Saving...");
  8304. **    if (fsed) {
  8305. **      i5=open(fnx,O_RDONLY | O_BINARY);
  8306. **      l1=filelength(i5);
  8307. **    } else {
  8308.  
  8309. ..
  8310.  
  8311. **    } else {
  8312. **      for (i5=0; i5<curli; i5++)
  8313. **      addline(b,&(lin[i5*LEN]),&l1);
  8314. **    }
  8315. ++/* MCW added for autosaved sakes hehe */
  8316. ++    if (hangup) {
  8317. ++      addline(b,"\n***** Auto saved message, loss of carrier *****",&l1);
  8318. ++    }
  8319. ++/* MCW end */    
  8320. **    if (b[l1-1]!=26)
  8321. **      b[l1++]=26;
  8322. **    savefile(b,l1,&m,aux);
  8323.  
  8324. Here ends the modifications required for the autosave feature for regular
  8325. posting or e-mailing.....
  8326.  
  8327. -------------------------------------------------------------------------------
  8328.  
  8329. Here begins the modifications required for the notepad.....
  8330.  
  8331. File MSGBASE1.C
  8332. ---------------
  8333.  
  8334. **#define ALLOW_FULLSCREEN 1
  8335. **#define EMAIL_STORAGE 2
  8336. **
  8337. **int deleted_flag;
  8338. **
  8339. ++/* MCW PAD MOD */
  8340. ++#define LEN 161
  8341. ++#define PADfilename     "INPUT.PAD"
  8342. ++#define PADnomemory     1
  8343. ++#define PADabort        2
  8344. ++#define PADfileerror    3
  8345. ++#define PADcontinue     4
  8346. ++#define PADsave         5
  8347. ++/* MCW PAD MOD END */
  8348. ++
  8349. ++
  8350. ++/* MCW PAD MOD */
  8351. ++int zpad(int force)
  8352. ++{
  8353. ++  char  filename[81], newfn[81];
  8354. ++  int   maxlin, status, exitf=0;
  8355. ++  FILE  *fhandle;
  8356. ++
  8357. ++/* Set maximum number of lines */
  8358. ++
  8359. ++  if (thisuser.sl<45)
  8360. ++    maxlin=30;
  8361. ++  else
  8362. ++    if (thisuser.sl<60)
  8363. ++      maxlin=50;
  8364. ++    else
  8365. ++      if (thisuser.sl<80)
  8366. ++        maxlin=60;
  8367. ++      else
  8368. ++        maxlin=100;
  8369. ++
  8370. ++  sprintf(filename, "%s%s", syscfg.tempdir, PADfilename);
  8371. ++  status=inpad(filename, maxlin, !exist(filename), force);
  8372. ++  switch(status)
  8373. ++  {
  8374. ++    case PADnomemory:  prt(6, "Not enough memory, unable to start pad.");
  8375. ++                       nl();
  8376. ++                       sysoplog("@ZPad Error: not enough memory");
  8377. ++                       break;
  8378. ++
  8379. ++    case PADabort:     prt(3, "Pad aborted.");
  8380. ++                       nl();
  8381. ++                       if (exist(filename))
  8382. ++                         remove(filename);
  8383. ++                       break;
  8384. ++
  8385. ++    case PADfileerror: prt(6, "Error opening pad file");
  8386. ++                       nl();
  8387. ++                       sysoplog("@ZPad Error: unable to open pad file");
  8388. ++                       break;
  8389. ++
  8390. ++    case PADcontinue:  prt(3, "Continue reading messages ...");
  8391. ++                       nl();
  8392. ++                       exitf=1;
  8393. ++                       break;
  8394. ++
  8395. ++    case PADsave:      sprintf(filename,"%s%s",syscfg.tempdir,PADfilename);
  8396. ++                       sprintf(newfn, "%s%s", syscfg.tempdir, "INPUT.MSG");
  8397. ++                       rename(filename,newfn);
  8398. ++                       use_workspace=1;
  8399. ++/* MCW this should get rid of the RE: stuff at beginning of message... */
  8400. ++                       irt[0]=0;
  8401. ++                       irt_name[0]=0;
  8402. ++/* MCW end */
  8403. ++                       post();
  8404. ++                       sysoplog("@Used ZPad v2.00");
  8405. ++                       break;
  8406. ++  }
  8407. ++  return(exitf);
  8408. ++}
  8409. ++
  8410. ++int inpad(char *filename, int maxlines, int firsttime, int force)
  8411. ++{
  8412. ++  char  ro[81], s[LEN], s1[LEN];
  8413. ++  char  *inbuff, *ss1, *ss2;
  8414. ++  FILE  *fhandle;
  8415. ++  int   done, savemsg, saveline, curline, abort,
  8416. ++        i1, i2, i3, i4, i5, i6;
  8417. ++
  8418. ++  done=0;
  8419. ++  savemsg=0;
  8420. ++  curline=0;
  8421. ++  abort=0;
  8422. ++
  8423. ++/* Allocate memory for line editor */
  8424. ++
  8425. ++  if ((inbuff=malloca((long)(maxlines)*LEN))==NULL)
  8426. ++    return(PADnomemory);
  8427. ++  for (i1=0; i1<maxlines; i1++)           /* Empty buffer */
  8428. ++    inbuff[i1*LEN]=0;
  8429. ++  ro[0]=0;
  8430. ++  nl();
  8431. ++
  8432. ++/* Line editor starts here */
  8433. ++
  8434. ++  prt(3, "NOTEPAD.");
  8435. ++  nl();
  8436. ++  sprintf(s,"Enter message now, max %d lines.",maxlines);
  8437. ++  pl(s);
  8438. ++  pl("Enter '/HELP' for help, /S to save, /ABT to abort, /* to continue 
  8439. reading.");
  8440. ++  
  8441. strcpy(s,"[---=----=----=----=----=----=----=----]----=----=----=----=----=----=----=----]");
  8442. ++  s[thisuser.screenchars]=0;
  8443. ++  pl(s);
  8444. ++
  8445. ++/* If re-entry, read lines from file */
  8446. ++
  8447. ++  if (!firsttime)
  8448. ++  {
  8449. ++    fhandle=fopen(filename,"rt");
  8450. ++    if (fhandle==NULL)
  8451. ++    {
  8452. ++      farfree((void *)inbuff);
  8453. ++      return(PADfileerror);
  8454. ++    }
  8455. ++    while (!feof(fhandle))
  8456. ++    {
  8457. ++      fgets(&inbuff[curline*LEN], LEN, fhandle);
  8458. ++      for(ss1=&inbuff[curline*LEN]; *ss1!='\n'; ss1++);
  8459. ++        *ss1='\0';
  8460. ++      curline++;
  8461. ++    }
  8462. ++    fclose(fhandle);
  8463. ++/* MCW kill the temporary file, there is no need to keep it around */
  8464. ++/*     since we will rewrite it before the end anyways.... */
  8465. ++    remove(filename);
  8466. ++/* MCW end */
  8467. ++    curline--;
  8468. ++    i2=0;
  8469. ++/* MCW modified for listing last couple lines instead of whole message */
  8470. ++/*  for (i6=0; (i6<curline) && (!i2); i6++) */
  8471. ++    for (i6=((curline<5)?0:(curline-5)); (i6<curline) && (!i2); i6++)
  8472. ++/* MCW end */
  8473. ++    {
  8474. ++      strcpy(s1,&(inbuff[i6*LEN]));
  8475. ++      i3=strlen(s1);
  8476. ++      if (s1[i3-1]==1)
  8477. ++        s1[i3-1]=0;
  8478. ++      if (s1[0]==2)
  8479. ++      {
  8480. ++        strcpy(s1,&(s1[1]));
  8481. ++        i5=0;
  8482. ++        for(i4=0; i4<strlen(s1); i4++)
  8483. ++          if ((s1[i4]==8) || (s1[i4]==3))
  8484. ++            --i5;
  8485. ++          else
  8486. ++            ++i5;
  8487. ++        for (i4=0; (i4<(thisuser.screenchars-i5)/2) && (!i2); i4++)
  8488. ++          osan(" ",&i2,&i1);
  8489. ++      }
  8490. ++      pla(s1,&i2);
  8491. ++    }
  8492. ++/* MCW Print the number of lines left to post.... */
  8493. ++    nl();
  8494. ++    sprintf(s,"%d lines done %d lines left",curline,(maxlines-curline));
  8495. ++    prt(3,s);
  8496. ++    nl();
  8497. ++/* MCW end */
  8498. ++    pl("Continue...");
  8499. ++  }
  8500. ++
  8501. ++  while (!done)
  8502. ++  {
  8503. ++    inli(s,ro,160,1);
  8504. ++    if (hangup)
  8505. ++        done=1;
  8506. ++    saveline=1;
  8507. ++    if (s[0]=='/')          /* Editor commands */
  8508. ++    {
  8509. ++      if (stricmp(s,"/HELP")==0)
  8510. ++      {
  8511. ++        saveline=0;
  8512. ++        printmenu(2);
  8513. ++      }
  8514. ++      if (stricmp(s,"/LI")==0)
  8515. ++      {
  8516. ++        saveline=0;
  8517. ++        i2=0;
  8518. ++        for (i6=0; (i6<curline) && (!i2); i6++)
  8519. ++        {
  8520. ++          strcpy(s1,&(inbuff[i6*LEN]));
  8521. ++          i3=strlen(s1);
  8522. ++          if (s1[i3-1]==1)
  8523. ++            s1[i3-1]=0;
  8524. ++          if (s1[0]==2)
  8525. ++          {
  8526. ++            strcpy(s1,&(s1[1]));
  8527. ++            i5=0;
  8528. ++            for(i4=0; i4<strlen(s1); i4++)
  8529. ++              if ((s1[i4]==8) || (s1[i4]==3))
  8530. ++                --i5;
  8531. ++              else
  8532. ++                ++i5;
  8533. ++            for (i4=0; (i4<(thisuser.screenchars-i5)/2) && (!i2); i4++)
  8534. ++              osan(" ",&i2,&i1);
  8535. ++          }
  8536. ++          pla(s1,&i2);
  8537. ++        }
  8538. ++        nl();
  8539. ++        pl("Continue...");
  8540. ++      }
  8541. ++      if ((stricmp(s,"/ES")==0) || (stricmp(s,"/S")==0))
  8542. ++      {
  8543. ++        savemsg=PADsave;
  8544. ++        done=1;
  8545. ++        saveline=0;
  8546. ++      }
  8547. ++      if (stricmp(s,"/ABT")==0)
  8548. ++      {
  8549. ++        done=1;
  8550. ++        saveline=0;
  8551. ++        abort=1;
  8552. ++      }
  8553. ++      if (stricmp(s,"/CLR")==0)
  8554. ++      {
  8555. ++        saveline=0;
  8556. ++        curline=0;
  8557. ++        pl("Message cleared... Start over...");
  8558. ++        nl();
  8559. ++      }
  8560. ++      if (stricmp(s,"/RL")==0)
  8561. ++      {
  8562. ++        saveline=0;
  8563. ++        if (curline)
  8564. ++        {
  8565. ++          --curline;
  8566. ++          pl("Replace:");
  8567. ++        }
  8568. ++        else
  8569. ++          pl("Nothing to replace.");
  8570. ++      }
  8571. ++
  8572. ++      strcpy(s1,s);
  8573. ++      s1[3]=0;
  8574. ++      if (stricmp(s1,"/C:")==0)
  8575. ++      {
  8576. ++        s1[0]=2;
  8577. ++        strcpy((&s1[1]),&(s[3]));
  8578. ++        strcpy(s,s1);
  8579. ++      }
  8580. ++      if ((stricmp(s1,"/SU")==0) && (s[3]=='/') && (curline))
  8581. ++      {
  8582. ++        strcpy(s1,&(s[4]));
  8583. ++        ss1=strstr(s1,"/");
  8584. ++        ss2=&(ss1[1]);
  8585. ++        ss1[0]=0;
  8586. ++        stuff(&(inbuff[(curline-1)*LEN]),s1,ss2);
  8587. ++        pl("Last line:");
  8588. ++        pl(&(inbuff[(curline-1)*LEN]));
  8589. ++        pl("Continue...");
  8590. ++        saveline=0;
  8591. ++      }
  8592. ++
  8593. ++      if (stricmp(s,"/*")==0)
  8594. ++      {
  8595. ++        if (force)
  8596. ++        {
  8597. ++          nl();
  8598. ++          pl("-= End of message sub reached.  You must finish pad.");
  8599. ++          pl("-= Use /ES to save or /ABT to abort pad.");
  8600. ++          saveline=0;
  8601. ++        }
  8602. ++        else
  8603. ++        {
  8604. ++          done=1;
  8605. ++          saveline=0;
  8606. ++          savemsg=PADcontinue;
  8607. ++        }
  8608. ++      }
  8609. ++    }
  8610. ++    if (saveline)
  8611. ++    {
  8612. ++      strcpy(&(inbuff[(curline++)*LEN]),s);
  8613. ++      if (curline==maxlines)
  8614. ++      {
  8615. ++        nl();
  8616. ++        pl("-= No more lines =-");
  8617. ++        pl("/ES to save");
  8618. ++        nl();
  8619. ++        --curline;
  8620. ++      }
  8621. ++    }
  8622. ++  } /* while(!done) */
  8623. ++
  8624. ++  if ((abort) || (curline==0))
  8625. ++  {
  8626. ++    farfree((void *)inbuff);
  8627. ++    return(PADabort);
  8628. ++  }
  8629. ++  if (savemsg)
  8630. ++  {
  8631. ++    fhandle=fopen(filename, "wt+");
  8632. ++    if (fhandle==NULL)
  8633. ++    {
  8634. ++      farfree((void *)inbuff);
  8635. ++      return(PADfileerror);
  8636. ++    }
  8637. ++    for(i1=0; i1<curline; i1++)
  8638. ++    {
  8639. ++      sprintf(s, "%s\n", &inbuff[i1*LEN]);
  8640. ++      fputs(s, fhandle);
  8641. ++    }
  8642. ++    fclose(fhandle);
  8643. ++    farfree((void *)inbuff);
  8644. ++    return(savemsg);
  8645. ++  }
  8646. ++  farfree((void *)inbuff);
  8647. ++  return(PADabort);
  8648. ++}
  8649. ++/* MCW PAD MOD END */
  8650. **
  8651. **/***************************************************************************/
  8652. **
  8653. **void send_net_post(postrec *p, unsigned int type, char *extra)
  8654.  
  8655. ..
  8656.  
  8657. **void scan(int msgnum, int optype, int *nextsub)
  8658. **{
  8659. **  char s[81],s1[81],s2[81],*b,*ss1;
  8660. **  int i,i1,i2,done,quit,abort,next,val,realexpress;
  8661. ++/* MCW PAD MOD */
  8662. ++  int padstatus=0;
  8663. ++/* MCW PAD MOD END */
  8664. **  slrec ss;
  8665. **  long l,len;
  8666. **  postrec p,p1;
  8667.  
  8668. ..
  8669.  
  8670. **                break;
  8671. ++/* MCW PAD MOD */
  8672. ++              case '*':                /* ZPad entrypoint */
  8673. ++                irt[0]=0;
  8674. ++                irt_name[0]=0;         
  8675. ++                padstatus=zpad(0);
  8676. ++                break;
  8677. ++/* MCW PAD MOD END */
  8678. **              case 'P':
  8679. **                irt[0]=0;
  8680. **                irt_name[0]=0;
  8681.  
  8682. ..
  8683.  
  8684. **      sprintf(s,"%d messages sent.",i1);
  8685. **      nl();
  8686. **      pl(s);
  8687. **      nl();
  8688. **      bchanged=1;
  8689. **    }
  8690. **  }
  8691. ++/* MCW PAD MOD */
  8692. ++/* MCW also check for hangup, we don't want to do this if the user hung up */
  8693. ++  if (padstatus && !hangup)
  8694. ++/* MCW end */
  8695. ++  {
  8696. ++    nl();
  8697. ++    prt(3,"Please finish pad.");
  8698. ++    nl();
  8699. ++    padstatus=zpad(1);
  8700. ++  }
  8701. ++/* MCW PAD MOD END */
  8702. **  if ((!quit) && (!express)) {
  8703. **    nl();
  8704. **    ss=syscfg.sl[actsl];
  8705. **    if (
  8706.  
  8707. Here ends the modifications required for the notepad.....
  8708.  
  8709. -------------------------------------------------------------------------------
  8710.  
  8711. Here begins the notepad autosave modifications. This modification requires
  8712. the autosave for regular posting and e-mail to be done first....
  8713.  
  8714. File MSGBASE1.C
  8715. ---------------
  8716.  
  8717. **#define PADcontinue     4
  8718. **#define PADsave         5
  8719. **/* MCW PAD MOD END */
  8720. **
  8721. ++/* MCW saving zpad if necessary when user has hungup unexpectedly */
  8722. ++void padautosave()
  8723. ++{
  8724. ++  char  filename[81], newfn[81];
  8725. ++
  8726. ++  sprintf(filename, "%s%s", syscfg.tempdir, PADfilename);
  8727. ++  if (exist(filename)) {
  8728. ++     sprintf(newfn, "%s%s", syscfg.tempdir, "INPUT.MSG");
  8729. ++     rename(filename,newfn);
  8730. ++     use_workspace=1;
  8731. ++     irt[0]=0;
  8732. ++     irt_name[0]=0;
  8733. ++     post();
  8734. ++     sysoplog("@Used ZPad v2.00 *** autosaved");
  8735. ++   }
  8736. ++}
  8737. ++/* MCW end */
  8738. ++
  8739. **
  8740. **/* MCW PAD MOD */
  8741. **int zpad(int force)
  8742. **{
  8743. **  char  filename[81], newfn[81];
  8744. **  int   maxlin, status, exitf=0;
  8745. **  FILE  *fhandle;
  8746.  
  8747. Function inpad()
  8748.  
  8749. ..
  8750.  
  8751. **  while (!done)
  8752. **  {
  8753. **    inli(s,ro,160,1);
  8754. **    if (hangup)
  8755. --        done=1;
  8756. ++/* MCW if the user hungup, then we just save the message with a note */
  8757. ++/*     saying HUNGUP at the end ( BTW, inmsg writes the note ) */
  8758. ++        {
  8759. ++        savemsg=PADsave;
  8760. ++        done=1;
  8761. ++        saveline=0;
  8762. ++        }
  8763. ++/* MCW end */
  8764. **    saveline=1;
  8765. **    if (s[0]=='/')          /* Editor commands */
  8766.  
  8767. Function readmail()
  8768.  
  8769. ..
  8770.  
  8771. **          f=open(fn,O_RDWR | O_BINARY);
  8772. **          num_mail1=((long) thisuser.feedbacksent) +
  8773. **                    ((long) thisuser.emailsent) +
  8774. **                    ((long) thisuser.emailnet);
  8775. ++/* MCW I think this will do the trick of hanging up when replying to */
  8776. ++/* someone elses mail. In this case, the mail will not be deleted.   */
  8777. ++/* this is for the autosave stuff... */
  8778. ++          if ( (ch=='A') && !hangup ) {
  8779. ++/* MCW end */
  8780. **            if (num_mail!=num_mail1) {
  8781. **              strcpy(s,nam(&thisuser,usernum));
  8782. **              if (m.anony & anony_receiver)
  8783. **                strcpy(s,">UNKNOWN<");
  8784.  
  8785. File COM.C
  8786.  
  8787. Function checkhangup()
  8788.  
  8789. ..
  8790.  
  8791. **      hangup = hungup = 1;
  8792. **      if (useron && !in_extern) {
  8793. **        sysoplog("Hung Up.");
  8794. ++/* MCW self explanatory */
  8795. ++      padautosave();
  8796. ++/* MCW end */
  8797. **      }
  8798. **    }
  8799. **  }
  8800. **}
  8801.  
  8802. Function getkey()
  8803.  
  8804. ..
  8805.  
  8806. **        nl();
  8807. **        outstr("Call back later when you are there.");
  8808. **        nl();
  8809. **        hangup = 1;
  8810. ++/* MCW self explanatory */
  8811. ++        padautosave();
  8812. ++/* MCW end */
  8813. **      }
  8814. **      checkhangup();
  8815. **    }
  8816. **    ch = inkey();
  8817.  
  8818. File CONIO.C
  8819.  
  8820. Function skey()
  8821.  
  8822. ..
  8823.  
  8824. **        case 63: /* F5 */
  8825. **          hangup=1;
  8826. **        dtr(0);
  8827. ++/* MCW self explanatory */
  8828. ++            padautosave();
  8829. ++/* MCW end */
  8830. **        break;
  8831. **      case 64: /* F6 */
  8832.  
  8833. ..
  8834.  
  8835. **      case 88: /* Shift-F5 */
  8836. **        i1=(rand() % 20) + 10;
  8837. **        for (i=0; i<i1; i++)
  8838. **          outchr(rand() % 256);
  8839. **          hangup=1;
  8840. **        dtr(0);
  8841. ++/* MCW self explanatory */
  8842. ++            padautosave();
  8843. ++/* MCW end */
  8844. **        break;
  8845. **      case 98: /* Ctrl-F5 */
  8846. **        nl();
  8847. **        pl("Call back later when you are there.");
  8848. **        nl();
  8849. **        hangup=1;
  8850. **        dtr(0);
  8851. ++/* MCW self explanatory */
  8852. ++            padautosave();
  8853. ++/* MCW end */
  8854. **        break;
  8855. **        case 103: /* Ctrl-F10 */
  8856. **          if (chatting==0)
  8857. **            chat1("",0);
  8858.  
  8859. Here ends the notepad autosave modifications.
  8860.  
  8861.  
  8862.  
  8863.  
  8864. If anyone has problems with these... just e-mail me or post to me here...
  8865.  
  8866. Have fun...
  8867.  
  8868.   ⌠       ⌠
  8869. ┐ │hite ┐ │izard  3@5462
  8870. └┘┘     └┘┘
  8871.  
  8872.  
  8873.  
  8874.  
  8875.  
  8876.  
  8877.  
  8878. [66/99]: The Cuss Modification
  8879. [Name ]: Hackmaster 1 #1 @3654
  8880. [Date ]: Sat Jan 04 23:44:18 1992
  8881. [From ]: Hacker's Haven (Kansas)
  8882.  
  8883. Lt. Hytiek #1 @3504
  8884.  
  8885.                                 CUSS.MOD
  8886.  
  8887. Affected: MSGBASE1.C
  8888.  
  8889. Replace your void inli( with this code...
  8890.  
  8891. /*****************Cuss Mod********************************/
  8892. void inli(char *s, char *rollover, int maxlen, int crend)
  8893. {
  8894.   int cp,i,i1,done,cm,begx,remove,count,posit;
  8895.   char s1[255],s2[255];
  8896.   unsigned char ch;
  8897.  
  8898.   cm=chatting;
  8899.  
  8900.   begx=wherex(); if (rollover[0]!=0) { if (charbufferpointer) {
  8901.       strcpy(s1,rollover); strcat(s1,&charbuffer[charbufferpointer]);
  8902.       strcpy(&charbuffer[1],s1); charbufferpointer=1; } else {
  8903.       strcpy(&charbuffer[1],rollover); charbufferpointer=1; } rollover[0]=0;
  8904.   }
  8905.   cp=0; done=0; do { ch=getkey(); if (two_color) if (lastcon) ansic(1);
  8906.       else ansic(0); if (cm) if (chatting==0) ch=13;
  8907.     if ((ch>=32)) {if ((wherex()<(thisuser.screenchars-1)) && (cp<maxlen)) {
  8908.         s[cp++]=ch; outchr(ch); if (wherex()==(thisuser.screenchars-1))
  8909.           done=1; } else { if (wherex()>=(thisuser.screenchars-1)) done=1; }
  8910.     } else
  8911.         switch(ch) {
  8912.           case 7: if ((chatting) && (outcom)) outcomch(7); break;
  8913.           case 13: /* C/R */s[cp]=0; done=1; break;
  8914.           case 8:  /* Backspace */if (cp) {if (s[cp-2]==3) {cp-=2;ansic(0);
  8915.               } else if (s[cp-1]==8) { cp--; outchr(32); } else { cp--;
  8916.                   backspace(); } } break;
  8917.           case 24: /* Ctrl-X */while (wherex()>begx) {backspace();cp=0;}
  8918.             ansic(0); break;
  8919.           case 23: /* Ctrl-W */if (cp) { do {if (s[cp-2]==3) {cp-=2;ansic(0);
  8920.                 } else if (s[cp-1]==8) { cp--; outchr(32); } else { cp--;
  8921.                     backspace(); }
  8922.               } while ((cp) && (s[cp-1]!=32) && (s[cp-1]!=8) && (s[cp-2]!=3));
  8923.             } break;
  8924.           case 14: /* Ctrl-N */if ((wherex()) && (cp<maxlen)) {outchr(8);
  8925.               s[cp++]=8; } break;
  8926.           case 16: /* Ctrl-P */
  8927.             if (cp<maxlen-1) {
  8928.               ch=getkey();
  8929.             if ((ch>='0') && (ch<='9')) {
  8930.               s[cp++]=3;
  8931.               s[cp++]=ch;
  8932.               ansic(ch-'0');
  8933.             }
  8934.             if (ch=='N') {
  8935.               ansic(6); outstr(thisuser.name);
  8936.             }
  8937.             } break;
  8938.           case 9:  /* Tab */i=5-(cp % 5);if (((cp+i)<maxlen) && 
  8939. ((wherex()+i)<thisuser.screenchars)) {
  8940.               i=5-((wherex()+1) % 5);for (i1=0; i1<i; i1++) {s[cp++]=32;
  8941.                 outchr(32); } } break;
  8942.         }
  8943.   /*Profanity restrictor*/
  8944.   if ((thisuser.ar & 4)==0)
  8945.    {
  8946.     remove=0;
  8947.     strcpy(s2,"    ");
  8948.     if (cp>=4) {
  8949.        posit=1;count=0;
  8950.        while ((posit<=cp) && (count<4))
  8951.         if (isdigit(s[cp-posit]) && (s[cp-(posit+1)]==3)) posit+=2;
  8952.           else if (s[cp-posit]==8) {posit++;remove++;}
  8953.             else if (remove>0) {remove--;posit++;}
  8954.                      else {s2[3-count]=s[cp-posit];count++;posit++;}
  8955.        strupr(s2);
  8956.        if ((strcmp(s2,"FUCK")==0) || (strcmp(s2,"SHIT")==0) ||
  8957.            (strcmp(s2,"FUC|")==0) || (strcmp(s2,"SHI+")==0) ||
  8958.            (strcmp(s2,"DIC|")==0) || (strcmp(s2,"PU$$")==0) ||
  8959.            (strcmp(s2,"PU$S")==0) || (strcmp(s2,"PUS$")==0) ||
  8960.            (strcmp(s2,"COC|")==0) || (strcmp(s2,"PVSS")==0) ||
  8961.            (strcmp(s2,"DYKE")==0) || (strcmp(s2,"PISS")==0) ||
  8962.            (strcmp(s2,"PUSS")==0) || (strcmp(s2,"CUNT")==0) ||
  8963.            (strcmp(s2,"DAMN")==0) || (strcmp(s2,"BITC")==0) ||
  8964.            (strcmp(s2,"DICK")==0) || (strcmp(s2,"ASSH")==0) ||
  8965.            (strcmp(s2,"A$$ ")==0) || (strcmp(s2,"CHYT")==0) ||
  8966.            (strcmp(s2,"AS$ ")==0) || (strcmp(s2," AS$")==0) ||
  8967.            (strcmp(s2," ASS")==0) || (strcmp(s2,"FUKI")==0) ||
  8968.            (strcmp(s2,"FUK ")==0) || (strcmp(s2,"SHLT")==0) ||
  8969.            (strcmp(s2,"SH1T")==0) || (strcmp(s2,"SHYT")==0) ||
  8970.            (strcmp(s2,"COCK")==0) || (strcmp(s2,"BAST")==0) ||
  8971.            (strcmp(s2,"SH!T")==0) || (strcmp(s2,"SHT ")==0) ||
  8972.            (strcmp(s2,"ASSS")==0) || (strcmp(s2,"PUSY")==0))
  8973.            {backspace();backspace();backspace();backspace();
  8974.            for (count=1;count<posit;count++) cp--;
  8975.            outstr("\a[CENSORED]\a\b \b\b \b\b \b\b \b\b \b\b \b\b \b\b \b\b 
  8976. \b\b \b");}
  8977.     }
  8978.    }
  8979.   } while ((done==0) && (hangup==0));
  8980.   if (ch!=13) {
  8981.     i=cp-1;
  8982.     while ((i>0) && (s[i]!=32) && (s[i]!=8) || (s[i-1]==3))
  8983.       i--;
  8984.     if ((i>(wherex()/2)) && (i!=(cp-1))) {
  8985.       i1=cp-i-1;
  8986.       for (i=0; i<i1; i++) outchr(8);
  8987.       for (i=0; i<i1; i++) outchr(32);
  8988.       for (i=0; i<i1; i++) rollover[i]=s[cp-i1+i];
  8989.       rollover[i1]=0; cp -= i1; } s[cp++]=1; s[cp]=0; }
  8990.   if (crend) nl();
  8991.  
  8992. }
  8993.  
  8994.  
  8995.  
  8996.  
  8997.  
  8998.  
  8999. [67/99]: 2 Way Chat Mod
  9000. [Name ]: Hackmaster 1 #1 @3654
  9001. [Date ]: Sat Jan 04 23:57:52 1992
  9002. [From ]: Hacker's Haven (Kansas)
  9003.  
  9004. ┌────────────────────────────────────────────────────────────────────────────┐
  9005. │ Mod Name: 2WAYNAME.MOD                  Mod Author: The Painter 1@2358     │
  9006. │ Difficulty: Easy                        Date: Feb 5, 1991                  │
  9007. │ WWIV Version: v4.xx                                                        │
  9008. │ Description: Change Two Way chat prompt to include sysops name             │
  9009. │                                                                            │
  9010. └────────────────────────────────────────────────────────────────────────────┘
  9011.  
  9012.  
  9013. The Painter #1 @2358
  9014. Tuesday, February 5,1991  4:10 PM <PST>
  9015.  
  9016.  
  9017. -*-Originating from The Spokane Hints.  Our Number is: 509-244-2872-*-
  9018.  
  9019. A few days ago, one of my friends (yes I have a couple of them)  asked 
  9020. me  to  figure out a way to that would allow the users  name  to  be 
  9021. displayed on the screen when they are chatting with the sysop.  I have 
  9022. done that.  This mod is very simple and is only a two line addition  to 
  9023. your conio.c file.  I dedicate this mod to Debbie Leighter, who inspired 
  9024. it.  Thanks Deb!
  9025.  
  9026. First  thing,  load up conio.c and hit control QF.   Search  for  strcpy 
  9027. (s,"Two  Way Chat ");.  When you find this (make sure it is the  correct 
  9028. one cuz there are two of them in this file, look directly below it  and
  9029. see if the next line is cnt=((thisuser.screenchars-strenlen(s))/2);.  If it 
  9030. is,  then you can continue. The mod looks like this when it is done.   I 
  9031. will use the following codes for changing the mod:
  9032.  
  9033. + new line
  9034. - delete line
  9035. = existing line
  9036.  
  9037. =    outstr("\x1b[12;1H");
  9038. =    ansic(3);
  9039. =    for(cnt=0;cnt<thisuser.screenchars;cnt++)
  9040. =      outchr(205);
  9041. -    strcpy(s," Two Way Chat ");  (remember DELETE THIS LINE!)
  9042. +    strcpy(s,syscfg.sysopname);
  9043. +    strcat(s," chatting with ");
  9044. +    strcat(s,thisuser.name);
  9045. =    cnt=((thisuser.screenchars-strlen(s))/2);
  9046. =    sprintf(s1,"\x1b[12;%dH",cnt);
  9047.  
  9048. Well, here goes with my first published mod. As with most first mods, mine 
  9049. is built on another's work; I thank Scott Lockwood (1@5906) for publishing 
  9050. his CHATNAME.MOD. I call mine the CHATKNOW.MOD.
  9051.  
  9052. Scott's mod put up the message "so & so chatting with so & so" on the line 
  9053. across the middle of the screen in a two-way chat. But it disappeared after 
  9054. the first screen scroll. This mod keeps the infomation up on the line 
  9055. during two-way chats and tells who's chatting with who and gives the 
  9056. amount of time the user has left on the board. The time is updated every 
  9057. time the screen scrolls. It is compatible with The PC Guru's Sysop Chat 
  9058. Selection mod.
  9059. ---------------------------------------------------------------------------
  9060. THE MOD: Load CONIO.C
  9061.  
  9062. Search for:     strcpy(temp1,"Two  Way Chat ");
  9063. Followed by:    cnt=((thisuser.screenchars-strenlen(temp1))/2);
  9064.  
  9065. If it is, then you can continue. The mod looks like this when it is done.   
  9066. Use the standard codes:  + new line     - delete line     = existing line
  9067.  
  9068. =    outstr("\x1b[12;1H");
  9069. =    ansic(3);
  9070. =    for(cnt=0;cnt<=thisuser.screenchars;cnt++)
  9071. =      s2[cnt]=205;
  9072. -    strcpy(temp1," Two Way Chat ");  (remember DELETE THIS LINE!)
  9073. +    strcpy(temp1," ");
  9074. +    strcat(temp1,syscfg.sysopname);
  9075. +    strcat(temp1," chatting with ");
  9076. +    strcat(temp1,thisuser.name);
  9077. +    strcat(temp1," ");
  9078. +    strcat(temp1,ctim(nsl()));
  9079. +    strcat(temp1," ");
  9080. =    cnt=((thisuser.screenchars-strlen(temp1))/2);
  9081.  
  9082.  
  9083. Now search for:     strcpy(s,"Two  Way Chat ");
  9084. Followed by:        cnt=((thisuser.screenchars-strenlen(s))/2);
  9085.  
  9086. =    outstr("\x1b[12;1H");
  9087. =    ansic(3);
  9088. =    for(cnt=0;cnt<=thisuser.screenchars;cnt++)
  9089. =      outchr=205;
  9090. -    strcpy(temp1," Two Way Chat ");  *** remember DELETE THIS LINE! ***
  9091. +    ansic(1)                         *** use to change color ***
  9092. +    strcpy(s," ");
  9093. +    strcat(s,syscfg.sysopname);
  9094. +    strcat(s," chatting with ");
  9095. +    strcat(s,thisuser.name);
  9096. +    strcat(s," ");
  9097. +    strcat(s,ctim(nsl()));
  9098. +    strcat(s," ");
  9099. +    ansic(3)                         *** use to change color ***
  9100. =    cnt=((thisuser.screenchars-strlen(s))/2);
  9101.  
  9102. That's it. And, if I can do it, anyone can!!  If you find this mod of any
  9103. value, let me and Scott know.
  9104.  
  9105. Thanks for the file to build on Scott!!
  9106.  
  9107.  
  9108.  
  9109.  
  9110.  
  9111.  
  9112.  
  9113. [68/99]: TJ-MOD03.MOD  For Users who hang up on you....
  9114. [Name ]: Trader Jack #1 @8315
  9115. [Date ]: Sunday, January 5, 1992 at  9:30 am <EST>
  9116. [From ]: The Trading Post (South Carolina)
  9117.  
  9118. ┌────────────────────────────────────────────────────────────────────────────┐
  9119. │ Mod Name: TJ-MOD03.MOD                  Mod Author: Trader Jack 1@8315     │
  9120. │ Difficulty: Easy                        Date: 01-05-91                     │
  9121. │ WWIV Version: 4.12                                                         │
  9122. │ Description: Increments thisuser.ass_pts and sends a note to users who     │
  9123. │              hang up.                                                      │
  9124. └────────────────────────────────────────────────────────────────────────────┘
  9125.  
  9126. I saw a similar mod on a board and the sysop couldn't remember where he got
  9127. it, so I decided to write it for myself.  I review accounts monthly, and this
  9128. seemed like a good way to keep up with those users who hang up on the system
  9129. alot since I don't use the ass_pts for anything else.  It has been tested on
  9130. 4.12 and works perfectly.
  9131.  
  9132. On with the mod!
  9133.  
  9134. << Step one: >>
  9135.  
  9136. You KNOW what step one is by now, Backup 'dem sourcies!!!
  9137.  
  9138. << Step two: >>
  9139.  
  9140. In COM.C, add this line at the end of the extern's
  9141.  
  9142. extern unsigned int finduser(char *s);                       /*add me*/
  9143.  
  9144. << Step three: >>
  9145.  
  9146. Search for void checkhangup() and add the lines indicated below.
  9147.  
  9148. void checkhangup()
  9149. .
  9150. .
  9151. .
  9152. .
  9153. {
  9154.   int i,i1,ok;                                      /*change me (add i1)*/
  9155.   char s[81],s1[81];                                /*add me*/
  9156.   if (!hangup && using_modem && !cdet()) {
  9157.     ok = 0;
  9158.     for (i = 0; (i < 500) && !ok; i++)
  9159.       if (cdet())
  9160.         ok = 1;
  9161.     if (!ok) {
  9162.       hangup = hungup = 1;
  9163.       if (useron && !in_extern)                                 /*exists*/
  9164.         sprintf(s,"^P^C2You Hung Up on your last call!");       /*add me*/     
  9165.     sprintf(s1,(thisuser.name));                            /*add me*/
  9166.         i1=(finduser(s1));                                      /*add me*/
  9167.         ssm(i1,0,(s));                                          /*add me*/
  9168.         thisuser.ass_pts++;                                     /*add me*/     
  9169.    sysoplog("Hung Up.");         sysoplog("Hung up.");                         
  9170.           /*exists*/
  9171.  
  9172. << Step four: >>
  9173.  
  9174. Hit F-9 or type MAKE and re-compile.
  9175.  
  9176. << Notes: >>
  9177.  
  9178. Insert you favorite disclaimer here -->
  9179.  
  9180. If you use this, please send me a note saying so.  I'd really like to know if
  9181. anyone uses these things.
  9182.  
  9183.                            -=<*Trader Jack 1@8315*>=-
  9184.  
  9185. ===============================================================================
  9186.  Origin:  8315  The Trading Post BBS  803-787-9783  USR DS  WOMRable SNARFable
  9187.  
  9188.  
  9189.  
  9190.  
  9191.  
  9192.  
  9193. [69/99]: Another Two Column Subs List mod.
  9194. [Name ]: Darrell Mobley #1 @9402
  9195. [Date ]: Mon Jan 06 20:33:09 1992
  9196. [From ]:^Data*West (Florida)
  9197.  
  9198. I noticed a few subslist mods come through but none took into consideration if 
  9199. you had added color into your subboard titles using the WWIV color codes. 
  9200. Because these can't be calculated using strlen to format correctly, I used 
  9201. another method to help a local sysop add dual columns.  It prints left to 
  9202. right, 1 then 2, 3 then 4, etc but calculates the cursor position to move to 
  9203. column 41 after printing the left column.  Check it out.
  9204.  
  9205.  
  9206. ┌──────────────────────────────────────────────────────────────────────┐
  9207. │ Mod Name:    :  2SUBLIST.420        Author :  Darrell Mobley 1 @9402 │
  9208. │ Difficulty   :  Easy                Date   :  10-10-91               │
  9209. │ WWIV Version :  4.20         File Modified :  BBS.C                  │
  9210. │                                                                      │
  9211. │ Description  :  This mod allows the sublist to print out in two      │
  9212. │                 columns.  It also allows for the sysops that have    │
  9213. │                 put color codes into their sublist, by determining   │
  9214. │                 the cursor location then spacing to column 40 to     │
  9215. │                 begin printing the second column.                    │
  9216. └──────────────────────────────────────────────────────────────────────┘
  9217.  
  9218.  
  9219. Disclaimer:  Why bother?  You KNOW to back up your source!  Grin.
  9220.  
  9221.  
  9222. First, load up BBS.C and look for "void sublist".  Then make these changes:
  9223.  
  9224.  
  9225. =void sublist()
  9226. ={
  9227. +  int i,abort,c;                                 /* Add the ",c" */
  9228. =  char s[80];
  9229. =
  9230. =  abort=0;
  9231. =  nl();
  9232. =  pla("Subs available: ",&abort);
  9233.  
  9234.  
  9235.  
  9236. Skip on down to and delete the lines marked "-"...
  9237.  
  9238.  
  9239. =    strcat(s,subboards[usub[i].subnum].name);
  9240. -    pla(s,&abort);                  /* Delete this and... */
  9241. -    i++;                            /* this.              */
  9242. =  }
  9243.  
  9244.  
  9245. And block in the area marked "+" in place of those two lines.
  9246.  
  9247.  
  9248. =    strcat(s,subboards[usub[i].subnum].name);
  9249. +      if (i % 2) {                  /* Block from here to... /*
  9250. +        c=wherex();
  9251. +        while (c<40) {
  9252. +          prt(0," ");
  9253. +          c++;
  9254. +        }
  9255. +        pla(s,&abort);
  9256. +      } else {
  9257. +        if (abort == 0)
  9258. +          outstr(s);
  9259. +        }
  9260. +    i++;
  9261. +    ansic(0);                       /* here. */
  9262. =  }
  9263. =  if (i==0)
  9264. =    pla("None.",&abort);
  9265. =  nl();
  9266. =}
  9267.  
  9268.  
  9269. This is my first mod, so I'm SURE it could be compacted up some.  In fact, I
  9270. see some areas that I could already compact.  But, it works, so enjoy it.
  9271. The same mod will also work in the transfer area's void dirlist(), so try it
  9272. there as well.
  9273.  
  9274.           Data*West BBS  (904)/278-8065  300-2400 Baud  WWIVNet @9402
  9275.                Jacksonville, Florida  ----  Gateway to the South
  9276.  
  9277.  
  9278.  
  9279.  
  9280.  
  9281.  
  9282.  
  9283. [70/99]: Here's a bug I found in WWIV 4.20e
  9284. [Name ]: Wile E. Coyote #10 @2510
  9285. [Date ]: Sun Jan 05 18:11:20 1992
  9286. [From ]: The Igmeister Zone (Alabama)
  9287.  
  9288. Here's a note I sent to Wayne, verbatim and in its entirety.  You can make
  9289. the mod and fix your board right away so that you're not caught by this
  9290. crash!
  9291.  
  9292. Hey, I thought you might be interested in a little bug I uncovered a little
  9293. while ago.  I just now found the fix for it.  If you try to //LOAD a message
  9294. greater than 32k into the board, it'll give the trunced message, then write
  9295. the message properly, but the board then runs out of memory and forgets half
  9296. of the standard system variables (like the system password).  The reason is
  9297. simple.  When you "truncated" the message, you changed nh.length to the
  9298. proper size, but the memcpy would blow right past the boundary of the buffer
  9299. b1 when it was writing the message because it copied len1 bytes.  Solution?
  9300. Cut len1 down to size as well and make it so that you don't overrun your new
  9301. boundary.  Here's the correction, following your modding conventions:
  9302.  
  9303. /*****************************************************************************/
  9304. msgbase1.c:
  9305.  
  9306. Starting on line 63 (?) add this line:
  9307. #  if (nh.length > 32760) {
  9308. #    npr("Message truncated by %lu bytes for the 
  9309. network.\r\n",nh.length-32760L);
  9310. #    nh.length = 32760;
  9311. +    len1=nh.length-1-strlen(p -> title);
  9312. #  }
  9313. /*****************************************************************************/
  9314.  
  9315. That'll fix the problem when a message larger than 32k is //LOADed or
  9316. //UPLOADed.  Without that fix, all such messages are subject to crashing
  9317. the board they're on.
  9318.  
  9319.  
  9320.  
  9321.  
  9322.  
  9323.  
  9324. [71/99]: Kinda revised message status mod. MS_REPLY.MOD
  9325. [Name ]: Wizard #1 @9431
  9326. [Date ]: Tuesday, January 7, 1992   9:36 am
  9327. [From ]: The Unnamed BBS (Florida)
  9328.  
  9329. ------------------------------------------------------
  9330.  
  9331. Ok, This was requested, so here it is. Basically, this asks the user if they
  9332. want a reply, and if so, it adds a line (after the RE and BY) with message 
  9333. status on it, if not, it adds only the RE and BY.
  9334.  
  9335. /***** File: MSGBASE.C *****/
  9336.  
  9337.       farfree(lin);            /* search for */
  9338.       pl("Out of memory.");
  9339.       m1->stored_as=0xffffffff;
  9340.       return;
  9341.     }
  9342.  
  9343.     l1=0;
  9344.     if (real_name)
  9345.       addline(b,thisuser.realname,&l1);
  9346.     else
  9347.       addline(b,nam1(&thisuser,usernum,syscfg.systemnumber),&l1);
  9348.     time(&ll);
  9349.     strcpy(s,ctime(&ll));
  9350.     s[strlen(s)-1]=0;
  9351.     addline(b,s,&l1);
  9352.     if (irt[0]) {
  9353.       strcpy(s,"RE ");
  9354.       strcat(s,irt);
  9355.       addline(b,s,&l1);
  9356.    /* if (byline[0])      /byline mod/
  9357.       addline(b,byline,&l1);   /byline mod/ */
  9358.       irt[0]=0;
  9359.   /*  byline[0]=0;  /byline mod/ */
  9360.     }
  9361.    prt(1,"Would You Like A Reply? (y/N) ");  /* add this line */
  9362.    if (yn()) {                               /* and this too */
  9363.        addline(b,"MS: Reply Wanted.",&l1);   /* this too, make sure it says
  9364.                                                 something to the effect that
  9365.                                                 the poster wants a reply. */
  9366.      }                                       /* add this line */
  9367. /* addline(b,"--------------------------------------------",&l1);  */
  9368.    /* ^^^^^ see note at bottom for this. */
  9369.     if (fsed) {    /* original code resumes here. */
  9370.       ll=filelength(i5);
  9371.       read(i5, (void *) (& (b[l1]) ),ll);
  9372.       l1 += ll;
  9373.       close(i5);
  9374.     } else {
  9375.  
  9376.  
  9377.  
  9378. Ok, There it is. This is taken straight from my code, and it SHOULD be right,
  9379.    but if not, mail me. I have been using this for about 6 months with no
  9380.    problems.
  9381.  
  9382.  
  9383. /* addline(b,"--------------------------------------------",&l1);
  9384.  ^^^- Uncomment the line up there that looks like this if you want to add a
  9385.  line after the RE's, BY's, and the message stat, but before the actual message
  9386. Kinda a separator between the RE, BY, and stuff, and the message.
  9387. */
  9388.  
  9389. Wizard
  9390.  
  9391.  
  9392.  
  9393.  
  9394.  
  9395.  
  9396.  
  9397.  
  9398. [72/99]: MBANK1-1.MOD
  9399. [Name ]: Raistlin Majere #2 @7750
  9400. [Date ]: Mon Jan 06 23:07:44 1992
  9401. [From ]: The Doctor's Office (Pennsylvania)
  9402.  
  9403. Title: MegaBank v1.1     //Fixes some bugs in v1.0
  9404. Filename:MBANK1-1.ZIP
  9405. Author: Dennis M. Myers
  9406. System: WWIV v4.12
  9407. Date: 1 June 1991
  9408. Usefulness: VERY!
  9409. Ease of installation: Routine.
  9410.  
  9411. What it does: MegaBank is an all prupose BANK for users to save time and
  9412.  money which is also a complete STRINGS EDITOR for two separate string
  9413.  files. One for immedeate printing and one for stuffing variables. Up to 600
  9414.  strings can be stored and with a very little modification the files could
  9415.  be swappable, but until I run out of room, I am going to leave well enough
  9416.  alone. The bank also has many SPARE PARTS. This is so that when you decide
  9417.  to add something to your board, you will not have to worry about messing up
  9418.  the bank data record. Just use some of the ample space. Users cannot see
  9419.  the Strings Manager. In a pinch, the sysop can use the bank without WWIV
  9420.  running as long as he has a copy of 2BANK.DAT with his account info in the
  9421.  same directory.  The only unpretty thing is that I use imbedded color
  9422.  codes, fine under the board, but ugly without, functional, but still ugly.
  9423.  
  9424. Other Authors whose code is either altered to suit or included unchanged
  9425.  include Wayne Bell for certain basic routines, Belgarath #1 @3304 Feb 1991
  9426.  whose Bank.exe is what I started with, Caramon Majere (03/24/90) whose
  9427.  String Editor v2.05 is incorporated as well as the suplimental RR5.MOD by
  9428.  Riffraff #1 @8354.
  9429.  
  9430.  
  9431. Enough. On with the mod!
  9432.  
  9433. ***************************** STEP ONE
  9434.  
  9435. This SHOULD go in Vardec.h, but it works just fine in BBS.C. Put it there
  9436. and test run the bank. If you like the bank AND feel like recompiling the
  9437. entire bbs, move it to Vardec.h.
  9438.  
  9439. typedef struct {                                /* MegaBank Mod v1.1 */
  9440.     int             user;                       /* user number */
  9441.     char            name[31];                   /* user name */
  9442.     int             gold2;                      /* gold */
  9443.     double          nsl;                        /* time left */
  9444.     float           extratime;                  /* returned to bbs */
  9445.     double          snapshot;                   /* time keeper */
  9446.     char            command[15];                /* returned to bbs */
  9447.     int             seclev;                     /* SL */
  9448.     int             dseclev;                    /* DSL */
  9449.     int             ass;                        /* Ass Points */
  9450.     char            status[10];                 /* [0] if OK Ansi */
  9451.     int             ulk;                        /* UL k */
  9452.     int             dlk;                        /* DL k */
  9453.     int             pc_ratio;                   /* Post/Call */
  9454.     int             ud_ratio;                   /* Up/Down */
  9455.     char            gfdir[81];                  /* GFiles Dir */
  9456.     char            datdir[81];                 /* Data Dir */
  9457.     char            sysop[31];                  /* YOU! */
  9458.     char            system[51];                 /* BBS Name */
  9459.     int             node;                       /* Net/Link node */
  9460.     float           pos;                        /* pos from bbs */
  9461.     float           neg;                        /* neg from bbs */
  9462.     char            msg[160];                   /* message 2 bbs */
  9463.     char            reserved[33];               /* hook for thisuser.res */
  9464. } bankrec;
  9465.  
  9466. typedef struct {                                /* MegaBank Mod v1.1 */
  9467.     unsigned char       string[81];
  9468.     unsigned int        color,
  9469.                         nl;
  9470. } stringrec;
  9471.  
  9472. typedef struct {                                /* MegaBank Mod v1.1 */
  9473.   unsigned char     string2[81];
  9474. } string2rec;
  9475.  
  9476.  
  9477. ***************************** STEP TWO
  9478.  
  9479. This Goes in Either UTILITY or BBSUTIL.C. Again, you CAN just put it in BBS.C
  9480. and test it. It works fine, just clutters up your code a bit...
  9481.  
  9482. #include <fcntl.h>                              /* MegaBank Mod v1.1 */
  9483. #include <sys/stat.h>                           /* MegaBank Mod v1.1 */
  9484.  
  9485. stringrec strings;                              /* MegaBank Mod v1.1 */
  9486. string2rec strings2;                            /* MegaBank Mod v1.1 */
  9487. int string_handle;                              /* MegaBank Mod v1.1 */
  9488. int prt_handle;                                 /* MegaBank Mod v1.1 */
  9489. int num_strings,num_strings2;                   /* MegaBank Mod v1.1 */
  9490.  
  9491. void open_string_file()                         /* MegaBank Mod v1.1 */
  9492. {
  9493.   char s[81],s1[81];
  9494.   stringrec a;
  9495.   string2rec b;
  9496.  
  9497.   sprintf(s,"%sSTRINGS.DAT","DATA\\");
  9498.   string_handle=open(s,O_RDWR | O_BINARY);
  9499.   if (string_handle<0) {
  9500.     printf("\n\7The file %s was not found.\7\n",s);
  9501.   }
  9502.   sprintf(s1,"%sSTRINGS2.DAT","DATA\\");
  9503.   prt_handle=open(s1,O_RDWR | O_BINARY);
  9504.   if (prt_handle<0) {
  9505.     printf("\n\7The file %s was not found.\7\n",s);
  9506.   }
  9507. }
  9508.  
  9509. void gstr(int string_num)                       /* MegaBank Mod v1.1 */
  9510. {
  9511.   char s[81];
  9512.   int seek_here;
  9513.  
  9514.   seek_here=string_num;
  9515.   lseek(string_handle,((long)(seek_here))*(sizeof(stringrec)),SEEK_SET);
  9516.   read(string_handle,(void *)&strings,sizeof(stringrec));
  9517.   sprintf(s,"%s%s",strings.string,strings.nl ? "\r\n" : "");
  9518.   prt(strings.color,s);
  9519. }
  9520.  
  9521. void pstr(char *st, int string_num)             /* MegaBank Mod v1.1 */
  9522. {
  9523.   char s[81];
  9524.   string2rec prt_strings;
  9525.  
  9526.   lseek(prt_handle,((long)(string_num))*(sizeof(string2rec)),SEEK_SET);
  9527.   read(prt_handle,(void *)&prt_strings,sizeof(string2rec));
  9528.   strcpy(st,prt_strings.string2);
  9529. }
  9530.  
  9531. void file_bank_rec()                            /* MegaBank Mod v1.1 */
  9532. {
  9533.   char s[81];
  9534.   int f,i;
  9535.   bankrec tu;
  9536.  
  9537.   strcpy(s,syscfg.datadir);
  9538.   strcat(s,"2BANK.DAT");
  9539.   tu.user=usernum;
  9540.   strcpy(tu.name,thisuser.name);
  9541.   tu.gold2=thisuser.gold;
  9542.   tu.nsl=nsl();
  9543.   tu.extratime=0.0;
  9544.   tu.snapshot=timer();
  9545.   for (i=0; i<15; i++)
  9546.     tu.command[i]=0;
  9547.   tu.seclev=thisuser.sl;
  9548.   tu.dseclev=thisuser.dsl;
  9549.   tu.ass=thisuser.ass_pts;
  9550.   if (okansi())
  9551.     tu.status[0]=1;
  9552.   else
  9553.     tu.status[0]=0;
  9554.   tu.ulk=thisuser.uk;
  9555.   tu.dlk=thisuser.dk;
  9556.   tu.pc_ratio=ratio();
  9557.   tu.ud_ratio=post_ratio();
  9558.   strcpy(tu.gfdir,syscfg.gfilesdir);
  9559.   strcpy(tu.datdir,syscfg.datadir);
  9560.   strcpy(tu.sysop,syscfg.sysopname);
  9561.   strcpy(tu.system,syscfg.systemname);
  9562.   tu.node=syscfg.systemnumber;
  9563.   tu.pos=thisuser.pos_account;
  9564.   tu.neg=thisuser.neg_account;
  9565.   strcpy(tu.msg,"");
  9566.   strcpy(tu.reserved,thisuser.res);
  9567.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  9568.   write(f,(void *)&tu,sizeof(bankrec));
  9569.   close(f);
  9570. }
  9571.  
  9572.  
  9573. void get_bank_rec()                             /* MegaBank Mod v1.1 */
  9574. {
  9575.   char s[81];
  9576.   int f,i;
  9577.   bankrec tu;
  9578.  
  9579.   strcpy(s,syscfg.datadir);
  9580.   strcat(s,"2BANK.DAT");
  9581.   f=open(s,O_RDONLY | O_BINARY);
  9582.   read(f,(void *)&tu,sizeof(bankrec));
  9583.   nl();
  9584.   if (tu.command[0]) {
  9585.     open_string_file();
  9586.     prt(1,"Command 0: String Files Reloaded");
  9587.   }
  9588.   if (tu.command[1]) {
  9589.     prt(1,"Command 1: Updating Time Status");
  9590.     thisuser.extratime += tu.extratime;
  9591.     nl();
  9592.   }
  9593.   if (tu.command[2]) {
  9594.     prt(1,"Command 2: Updating Credit Status");
  9595.     thisuser.gold=tu.gold2;
  9596.     nl();
  9597.   }
  9598.   if (tu.command[3]) {
  9599.     prt(1,"Command 2: Updating Demerits");
  9600.     thisuser.ass_pts = tu.ass;
  9601.     nl();
  9602.   }
  9603.   if (tu.command[4]) {
  9604.     prt(1,"Command 4: ");
  9605.   }
  9606.   if (tu.command[5]) {
  9607.     prt(1,"Command 5: ");
  9608.   }
  9609.   if (tu.command[6]) {
  9610.     prt(1,"Command 6: ");
  9611.   }
  9612.   if (tu.command[7]) {
  9613.     prt(1,"Command 7: ");
  9614.   }
  9615.   if (tu.command[8]) {
  9616.     prt(1,"Command 7: ");
  9617.   }
  9618.  
  9619.   if (tu.command[9]) {                               /* Look CLOSELY! */
  9620.     prt(1,"Command 9: Resetting Reserved Bytes");    /* Look CLOSELY! */
  9621.     for (i=0; i<33; i++)                             /* Look CLOSELY! */
  9622.       thisuser.res[i]=0;                             /* Look CLOSELY! */
  9623.     nl();
  9624.   }
  9625.  
  9626.   if (tu.command[10]) {
  9627.     prt(1,"Command 10: ");
  9628.   }
  9629.   if (tu.command[11]) {
  9630.     prt(1,"Command 11: ");
  9631.   }
  9632.   if (tu.command[12]) {
  9633.     prt(1,"Command 12: ");
  9634.   }
  9635.   if (tu.command[13]) {
  9636.     prt(1,"Command 13: ");
  9637.   }
  9638.   if (tu.command[14]) {
  9639.     prt(1,"Command 14: ");
  9640.   }
  9641.   close(f);
  9642. }
  9643.  
  9644. ***************************** DIGRESSION
  9645.  
  9646. Since I have the mod installed, mine looks like this:
  9647.  
  9648.   if (tu.command[9]) {
  9649.     gstr(4);  /* Command */
  9650.     prt(1," 9: ");
  9651.     gstr(8);  /* Resetting Reserved Bytes */
  9652.     for (i=0; i<33; i++)
  9653.       thisuser.res[i]=0;
  9654.     nl();
  9655.   }
  9656.  
  9657. Much less in the DGROUP.
  9658.  
  9659. By the way, in case you missed it above... this is the snippet of code that
  9660. resets thisuser.res after the customer has visited the bank and the correct
  9661. amount has been deposited in the bank.
  9662.  
  9663. ***************************** STEP THREE
  9664.  
  9665. In BBS.C in void mainmenu():
  9666.  
  9667. Oh, ya... thia is how you call it...
  9668.  
  9669.       case 'W':                                    /* MegaBank Mod v1.1 */
  9670. /*        printf("\b"); */
  9671. /*        gstr(23); */  /* MegaBank v1.1 */
  9672.         file_bank_rec();
  9673.         strcpy(s1,"BANK.EXE");
  9674.         if (exist(s1))
  9675.           full_external(s1,0,1);
  9676.         get_bank_rec();
  9677.         break;
  9678.  
  9679.  
  9680. I put it in the Transfer Menu as well...
  9681.  
  9682. ***************************** SECOND DIGRESSION
  9683.  
  9684. Here are some examples:
  9685.  
  9686.       case '#': {
  9687.         printf("\b");
  9688.         gstr(13); /* error */
  9689.         printfile("#");
  9690.         break;
  9691.       }
  9692.  
  9693.   if ((strcmp(s,"PSTR")==0) && (so())) {
  9694.   pstr(s,0);
  9695.   pl(s);
  9696.   }
  9697.  
  9698. ***************************** STEP FOUR
  9699.  
  9700. In Makefile.Mak (If you use it)
  9701.  
  9702. Alter to look like this:
  9703.  
  9704. #############################################################################
  9705. #
  9706. # Building everything requires bbs.exe, return.exe, bank.exe, and bbs.com.
  9707. #
  9708.  
  9709. all: $(EXE)bbs.exe $(EXE)return.exe $(EXE)bank.exe $(EXE)bbs.com
  9710.  
  9711. #############################################################################
  9712. #
  9713. # Building return.exe, bank.exe and bbs.com is easy and the same everywhere.
  9714. #
  9715.  
  9716. $(EXE)return.exe: $(OBJ)return.obj
  9717.   tlink /c /x $(TC)\lib\c0l+$(OBJ)return,$(EXE)return,,$(TC)\lib\$(LIB87)+\
  9718.     $(TC)\lib\mathl+$(TC)\lib\cl
  9719.  
  9720. $(EXE)bank.exe: $(OBJ)bank.obj
  9721.   tlink /c /x $(TC)\lib\c0l+$(OBJ)bank,$(EXE)bank,,$(TC)\lib\$(LIB87)+\
  9722.     $(TC)\lib\mathl+$(TC)\lib\cl
  9723.  
  9724.  
  9725.  
  9726.  
  9727. and further on down......................
  9728.  
  9729.  
  9730.  
  9731. $(OBJ)srrcv.obj   : srrcv.c    vardec.h net.h
  9732.   $(TCC_OVL)
  9733. $(OBJ)srsend.obj  : srsend.c   vardec.h net.h
  9734.   $(TCC_OVL)
  9735. $(OBJ)zscan.obj   :
  9736.  
  9737. $(OBJ)bank.obj  : bank.c
  9738.   $(TCC)
  9739.  
  9740. $(OBJ)return.obj  : return.c   vardec.h
  9741.   $(TCC)
  9742.  
  9743.  
  9744.  
  9745. ***************************** FINAL DIGRESSION
  9746.  
  9747. That is all there is!
  9748.  
  9749.  
  9750. Obviously the structures belong in VARDEC.H, but I am saving that for the
  9751. next time I feel like recompiling the entire board. It works fine in BBS.C.
  9752.  
  9753. Note: You will get file not found error until you put a tring into each
  9754.  file.  Each file may have up to 300 strings. This is less than the original
  9755.  500 each due to the global overloading...
  9756.  
  9757.  
  9758. ATTENTION ORIGINAL TIMEBANK USERS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  9759.  
  9760. Thisuser.res is reset due to the old timebank mod I had that I know others
  9761. have as well. If you have a mod which makes use of it other than the
  9762. timebank, take it out of both bbs.c and bank.c.
  9763.  
  9764. I did this due to a hunch many of us have that the new qscan pointer will
  9765. take thisuser.res. Besides, there are just SO many other things you can do
  9766. with that space, why not?
  9767.  
  9768.  
  9769. Have fun!
  9770.  
  9771. Remember, if it doesn't work for you, it is not my fault. It works gret for
  9772. me despite the seventeen crashes... er... um... naaaaaa. <GRIN> What? You
  9773. think I don't have a sense of humor?
  9774.  
  9775. There are more comments in the bank.c file....
  9776.  
  9777.  
  9778. WWIVnet: Deltigar 1#8412
  9779. GEnie: D.MYERS22
  9780.  
  9781. Just drop me a line if you like it and PLEASE! Report any bugs and if you
  9782. also send a fix, I will include mention of you in future releases. And YES.
  9783. I plan to make changes and improve the bank. That is why I left so much
  9784. extra room...
  9785.  
  9786.  
  9787.  
  9788.  
  9789.  
  9790.  
  9791.  
  9792. [73/99]: The truly amazing and really stupendous new mod by me!
  9793. [Name ]: Philip Trauring #1 @6750
  9794. [Date ]: Fri Jan 10 00:38:52 1992
  9795. [From ]: Interface (Massachusetts)
  9796.  
  9797. Name: USERLIST.MOD or DUMBMOD.MOD or whatever you feel like naming it...
  9798. Difficulty: Can you block-read?
  9799. Disclaimer: Be creative and think up your own...
  9800.  
  9801. Ok...well I was looking through the Mod Net sub a few minutes ago and I
  9802. saw a request for a mod to allow users to logon to the BBS using their real
  9803. name...the reason given was that users sometimes forget their usernames and
  9804. this would make it easier...Although I didn't write that mod, I did write up
  9805. a two-second hack that will help out users who have forgotten their username.
  9806. All this mod does is show the user list if the user types ? at the NN: prompt.
  9807. It's not elegant, I didn't go far into the code to make it not give the
  9808. 'Unknown User' message or anything like that...but it works okay and it takes
  9809. about a tenth of the time it took you to read this long intro...oh well...
  9810.  
  9811. 1) Goto UTILITY.C and search for 'findu'
  9812.  
  9813. 2) Add the 3 lines commented with the /* Add */ to your code
  9814.  
  9815. unsigned int finduser(char *s)
  9816. {
  9817.   int un;
  9818.   smalrec *sr;
  9819.   userrec u;
  9820.   char *ss;
  9821.  
  9822.   if (strcmp(s,"?")==0) {    /* Add */
  9823.     list_users();            /* Add */
  9824.     return(0); }             /* Add */
  9825.   if (strcmp(s,"NEW")==0)
  9826.     return(-1);
  9827.  
  9828. 3) Say 'that was the shortest mod I've ever added' 3 times...
  9829.  
  9830. 4) If you want you might want to change the following line from LILO.C:
  9831.  
  9832.       pl("This time is reserved for net-mail ONLY.");
  9833.       pl("Please try calling back again later.");
  9834.     } else
  9835.       pl("Enter number or name or 'NEW'"); /*This Line*/
  9836.     outstr("NN: "); /* DON'T change the NN: prompt. */
  9837.     input(s,30);
  9838.  
  9839.  
  9840. to something like:
  9841.  
  9842.       pl("Enter number, name, 'NEW', or ? to list usernames");
  9843. or
  9844.       pl("Enter your username, your number, 'NEW' to create a new");
  9845.       pl("account, or '?' to list all current usernames and numbers.");
  9846.  
  9847. 5) That's all folk's....what a grand production...now just run your makefile
  9848. and re-compile quickly since it's only one file, or for fun add a space or
  9849. something to one of the *.H files and then recompile the entire BBS! It even 
  9850. more fun than watching the washing machine! (Ok...well maybe not...but it's 
  9851. close)
  9852.  
  9853. Well, I think I'm done(I'm pretty sure anyways) so whether you like it...or if
  9854. you hate it(I'm not picky)...give my BBS a call...I have 1000's of mod online
  9855. just waiting to be leeched...bye!(finally...)
  9856.  
  9857.      Phil
  9858.      1@6750
  9859.  
  9860. Interface BBS - (617) 734-2053 - USR DS - IBM and Mac Support
  9861. SNARFable - Over 1000 WWIV mods online! - SysOp: Philip Trauring
  9862. "Diplomacy; the art of saying 'nice doggie' until you can find a rock."
  9863.  - Wynn Catlin
  9864.  
  9865.  
  9866.  
  9867.  
  9868.  
  9869.  
  9870. [74/99]: BBBOB01.MOD - Side-by-Side Subs/Dirs Listing
  9871. [Name ]: Bitbytebob #11 @6750
  9872. [Date ]: Fri Jan 10 11:27:07 1992
  9873. [From ]: Interface (Massachusetts)
  9874.  
  9875. ****************************************************************************
  9876.                                BBBOB01.MOD
  9877. Written by  : BitByteBob 1@6755
  9878. For         : WWIV v4.2e (Should work with v4.11 and v4.12 and others)
  9879. Date        : January 9th, 1992
  9880. Difficulty  : Simple, hack and paste
  9881. Description : Side-by-Side listing of subs and dirs.  Thanks to Analog Kid
  9882.                 for his mod, where I got most of the code.  His didnt work
  9883.                 correctly with long sub names, so I fixed it, and then added
  9884.                 the same capability to the download directories.
  9885.  
  9886. *****************************************************************************
  9887.  
  9888. 1) Backup that source code!
  9889.  
  9890. 2) Call up BBS.C, and find the line:
  9891.  
  9892.  
  9893. #define modem_time 3.5
  9894.  
  9895.  
  9896. add below:
  9897.  
  9898. void subline();               /* added for BBBOB01.MOD */
  9899. void dirline();               /* added for BBBOB01.MOD */
  9900.  
  9901.  
  9902.  
  9903. 3) find routine sublist(), delete it, and dirlist(), and replace with the
  9904.    following routines:
  9905.  
  9906. void sublist()                            /* new routine for BBBOB01.mod*/
  9907. {
  9908.   int i,abort,right;
  9909.   char s[160],s1[80];
  9910.  
  9911.   nl();
  9912.   i=abort=right=0;
  9913.   if (thisuser.screenchars<80)
  9914.   {
  9915.     prt(1,"-=* Subboards Available *=-");
  9916.     nl();
  9917.     while ((i<MAX_SUBS) && (usub[i].subnum!=-1))
  9918.     {
  9919.       subline(s1,i);
  9920.       pla(s1,&abort);
  9921.       i++;
  9922.     }
  9923.   }
  9924.   else
  9925.   {
  9926.     prt(1,"════════════════════════════╡ Subboards Available 
  9927. ╞════════════════════════════");
  9928.     nl();
  9929.     nl();
  9930.     while ((i<MAX_SUBS) && (usub[i].subnum!=-1))
  9931.     {
  9932.       subline(s1,i);
  9933.       if (right)
  9934.       {
  9935.         strcat(s,s1);
  9936.         pla(s,&abort);
  9937.         right=0;
  9938.       }
  9939.       else
  9940.       {
  9941.         strcpy(s,s1);
  9942.         right=1;
  9943.       }
  9944.       i++;
  9945.     }
  9946.     if (right)
  9947.       pla(s,&abort);
  9948.   }
  9949.   if (i==0)
  9950.     pla("None.",&abort);
  9951. }
  9952.  
  9953.  
  9954.  
  9955. void subline(char s1[50], int i)          /* new routine for BBBOB01.mod*/
  9956. {
  9957.   sprintf(s1,"(%2s) ",usub[i].keys);
  9958.   if (usub[i].subnum<32)
  9959.   {
  9960.     if (!((1L<<(usub[i].subnum)) & thisuser.qscn))
  9961.       s1[7]=32;
  9962.   }
  9963.   else
  9964.   {
  9965. #if MAX_SUBS>32
  9966.     if (!((1L<<(usub[i].subnum-32)) & thisuser.qscn2))
  9967.       s1[7]=32;
  9968. #else
  9969.     s1[7]=32;
  9970. #endif
  9971.   }
  9972.   if (syscfg.systemnumber)
  9973.   {
  9974.     if (subboards[usub[i].subnum].type)
  9975.       if (subboards[usub[i].subnum].anony & anony_val_net)
  9976.         strcat(s1,"[NET] ");
  9977.       else
  9978.         strcat(s1,"<NET> ");
  9979.     else
  9980.       strcat(s1,"      ");
  9981.   }
  9982.   strcat(s1,"");
  9983.   strcat(s1,subboards[usub[i].subnum].name);
  9984.   if (strlen(s1)>49)
  9985.     s1[49]=0;
  9986.   else
  9987.     while (strlen(s1)<49)
  9988.       strcat(s1," ");
  9989. }
  9990.  
  9991. void dirlist()                            /* new routine for BBBOB01.mod*/
  9992. {
  9993.   int i,abort,right;
  9994.   char s[160],s1[80];
  9995.  
  9996.   nl();
  9997.   i=abort=right=0;
  9998.   if (thisuser.screenchars<80)
  9999.   {
  10000.     prt(1,"-=* Directories Available *=-");
  10001.     nl();
  10002.     while ((i<MAX_DIRS) && (udir[i].subnum!=-1))
  10003.     {
  10004.       dirline(s1,i);
  10005.       pla(s1,&abort);
  10006.       i++;
  10007.     }
  10008.   }
  10009.   else
  10010.   {
  10011.     prt(1,"═══════════════════════════╡ Directories Available 
  10012. ╞═══════════════════════════");
  10013.     nl();
  10014.     nl();
  10015.     while ((i<MAX_DIRS) && (udir[i].subnum!=-1))
  10016.     {
  10017.       dirline(s1,i);
  10018.       if (right)
  10019.       {
  10020.         strcat(s,s1);
  10021.         pla(s,&abort);
  10022.         right=0;
  10023.       }
  10024.       else
  10025.       {
  10026.         strcpy(s,s1);
  10027.         right=1;
  10028.       }
  10029.       i++;
  10030.     }
  10031.     if (right)
  10032.       pla(s,&abort);
  10033.   }
  10034.   if (i==0)
  10035.     pla("None.",&abort);
  10036. }
  10037.  
  10038. void dirline(char s1[50], int i)          /* new routine for BBBOB01.mod*/
  10039. {
  10040.   sprintf(s1,"(%2s) %s",udir[i].keys, directories[udir[i].subnum].name);
  10041.   if (strlen(s1)>47)
  10042.     s1[47]=0;
  10043.   else
  10044.     while (strlen(s1)<47)
  10045.       strcat(s1," ");
  10046. }
  10047.  
  10048.  
  10049. 4) Run the make, and have fun!
  10050.  
  10051.  
  10052.  
  10053. Disclaimer:  The author of this mod is not responsible for anything this mod
  10054.              does to affect your bbs.  It has been tested and works fine with
  10055.              my WWIV4.20e.  If you have trouble, email me and ill see what I
  10056.              can do to fix the bugs.
  10057.  
  10058.  
  10059.  
  10060.  
  10061.  
  10062.  
  10063.  
  10064.  
  10065.  
  10066. [75/99]: BBBOB01.MOD Addendum
  10067. [Name ]: Bitbytebob #11 @6750
  10068. [Date ]: Fri Jan 10 11:29:55 1992
  10069. [From ]: Interface (Massachusetts)
  10070.  
  10071. Note the color codes that show up in the mod are needed for the strlen function to work correctly.  Mod the sprintf() and the strcat() calls for your own color preferences...
  10072.  
  10073. -Bob [1@6755]
  10074.  
  10075. Interface BBS - (617) 734-2053 - USR DS - IBM and Mac Support
  10076. SNARFable - Over 1000 WWIV mods online! - SysOp: Philip Trauring
  10077. "When you sit with a nice girl for two hours, you think it's only a minute.
  10078. But when you sit on a hot stove for a minute, you think it's two hours.
  10079. That's relativity." - Albert Einstein
  10080.  
  10081.  
  10082.  
  10083.  
  10084.  
  10085.  
  10086. [76/99]: My First Mod.  Created on 12/25/91
  10087. [Name ]: Renegade #20 @9973
  10088. [Date ]: Wed Dec 25 11:52:06 1991
  10089. [From ]: Total Confusion BBS (North Carolina)
  10090.  
  10091. /**************************************************************************/
  10092. /*                                                                        */
  10093. /*                MY FIRST MOD!    By Renegade        RANAVAIL.MOD             
  10094.        */
  10095. /*                                                                        */
  10096. /* A NoPHA Production (c)1991      Sysop of Split Reality (919)497-5297   */
  10097. /*                                      @9990                             */
  10098. /**************************************************************************/
  10099.  
  10100. Difficulty: Easy
  10101. Modification Time: 5 Minutes
  10102.  
  10103. WHAT THIS DOES:
  10104.         This allows randmonly chosen Sysop Available messages at logon.
  10105.  
  10106. I would like to say that I have no C experience.  My programming experience
  10107. is about 5 months of High School Pascal programming experience. The
  10108. similarity of the two is ASTOUNDING!! With the help of a small book called
  10109. The C Pocket Reference (126 pages), I managed to figure C programming out.
  10110. So hopefully my C knowledge will grow soon and you should see more of my
  10111. great mods!
  10112.  
  10113. And now on with the mod
  10114. ~~~~~~~~~~~~~~~~~~~~~~~
  10115.  
  10116. 1) Load up BBSUTL.C
  10117.  
  10118. 2) Search until you find:
  10119.  
  10120.   void logon()
  10121.   {
  10122.     char s[255],s1[81],s2[81],*ss;
  10123.     int i,i1,f;
  10124.     long len,pos;
  10125.     unsigned int randnum  <----.
  10126.                                |
  10127. 3) Add This Line --------------'
  10128.  
  10129. 4) Search down until you find:
  10130.  
  10131.   if (sysop2())
  10132.     pl("<UR NAME HERE> : Available");
  10133.   else
  10134.     pl("<UR NAME HERE> : NOT Available");
  10135.  
  10136. 5) Replace it with this:
  10137.  
  10138.   randnum=random(10);
  10139.   if (sysop2())
  10140.     {
  10141.      if (randnum<5)
  10142.        pl("<UR NAME HERE> : Here");
  10143.      else
  10144.        pl("<UR NAME HERE> : Sitting at the 'puter");
  10145.     }
  10146.   else
  10147.     {
  10148.      if (randnum<5)
  10149.        pl("<UR NAME HERE> : Is Out Shopping");
  10150.      else
  10151.        pl("<UR NAME HERE> : Is Totally Gone");
  10152.     }
  10153.  
  10154. 6) Or you can replace it with this:
  10155.  
  10156.   randnum=random(10);
  10157.   if (sysop2())
  10158.     {
  10159.      switch(randnum) {
  10160.      case 0: <--------------.
  10161.      case 1: <--------------|
  10162.      case 2: <--------------|-------.-- Replacing these in the form:
  10163.      case 3: <--------------|       |
  10164.      case 4: <--------------'       |     pl("<UR NAME HERE> : Your phrase");
  10165.      case 5:                        |     break;
  10166.        pl("<UR NAME HERE> : Here"); |
  10167.        break;                       |   Leaving cases blank with default to
  10168.      case 6: <----------------------|   the next set of case statements
  10169.      case 7: <----------------------|
  10170.      case 8: <----------------------'
  10171.      case 9:
  10172.        pl("<UR NAME HERE> : Sitting at the 'puter");
  10173.        break;
  10174.      }
  10175.     }
  10176.   else
  10177.     {
  10178.      switch (randnum) {
  10179.        case 0:
  10180.        case 1:
  10181.        case 2:
  10182.        case 3:
  10183.        case 4:
  10184.          pl("<UR NAME HERE> : Is Out Shopping");
  10185.          break;
  10186.        case 5:
  10187.        case 6:
  10188.        case 7:
  10189.        case 8:
  10190.        case 9:
  10191.          pl("<UR NAME HERE> : Is Totally Gone");
  10192.          break;
  10193.      }
  10194.     }
  10195.  
  10196. Simple as that.  Now I take no responsiblity for this code.  I don't see any-
  10197. thing that may cause any problems.  But I didn't do it!
  10198.  
  10199. Thanks to Mr. Fipps for his time and patience in teaching me Pascal.
  10200.  
  10201. Slayter
  10202. Renegade
  10203.   Peace '91
  10204.  
  10205.  
  10206.  
  10207.  
  10208.  
  10209.  
  10210.  
  10211.  
  10212. [77/99]: Brand New: 254 Message base modification for WWIV 4.20E
  10213. [Name ]: The Emporer #1 @6470
  10214. [Date ]: Thu Jan 09 20:52:15 1992
  10215. [From ]: The First Galactic Empire (Ohio)
  10216.  
  10217. Filename: EMP254-1.MOD
  10218. Name    : 254 Message base modification revision 1, 1/9/92
  10219.  
  10220. Author  : Adam Caldwell aka The Emporer aka The Author of WWIVEdit
  10221.  
  10222. Addresses: 1@16401 Link, 1@6470 Net, acaldwel@bigbird.cs.ohiou.edu,
  10223.            acaldwel@oucsace.cs.ohiou.edu
  10224.  
  10225. Written for: WWIV 4.20 Revision E
  10226.  
  10227. Files affected:
  10228.        BBS.C, BBSUTL.C, DEFAULTS.C, MSGBASE1.C, NEWUSER.C, SUBEDIT.C,
  10229.        UTILITY.C, VARDEC.H, USER.LST
  10230.  
  10231. Included: CONVERT.C, OLD.H
  10232.  
  10233. Level of difficulty: Moderate
  10234.  
  10235. Installation time: 30-60 minutes depending on modding ability
  10236.                    + time to recompile BBS
  10237.  
  10238. About this mod:
  10239.    I believe this is the first "released" modification that allows more than
  10240. 64 message bases, however, I may be mistaken.  Anyways, this mod allows
  10241. anywhere between 65 and 254 message bases...  You may ask why not 255 or more?
  10242. Well, that's because 255 is used to indicate that a user is a subop, and I
  10243. didn't want to have go through and fix all that... besides, isn't 255 enough?
  10244.  
  10245. Warning:
  10246.    Installing this modification will make your userrec stucture incompatible
  10247. with programs that expect the "default" userrec, or programs that need to know
  10248. which message bases are "configured" to be read.  The only program that I know
  10249. of that does this is WOMR, but there are bound to be others.
  10250.    The reason WOMR won't work is because for programming simplicity, instead
  10251. of using a unsigned long for qscn and qscn2, I just made an array of byte 
  10252. called qscn, and made it so there is one byte per message base.  This is a bit
  10253. wasteful when compared to the way WWIV does it, but it makes the code very easy
  10254. to install.
  10255.  
  10256. =============================================================================
  10257. Step 0 -    VERY IMPORTANT
  10258. =============================================================================
  10259. Back everything up... This is a very major modification, if anything goes
  10260. wrong, without a backup, you will be in some serious trouble.
  10261.  
  10262. In particular make sure you have a back up of your USER.LST file, as it
  10263. will require reformatting.
  10264.  
  10265. KEY:
  10266. ++ Add Line
  10267. -- Delete Line
  10268. %% Modify line
  10269.  
  10270. =============================================================================
  10271. Step 1 is done in BBS.C
  10272. =============================================================================
  10273. STEP 1.A
  10274. Search for the following in sublist():
  10275. ==   while ((i<MAX_SUBS) && (usub[i].subnum!=-1)) {
  10276.  
  10277. Delete the following Lines:
  10278. --     strcpy(s,usub[i].keys);
  10279. --     s[2]=0;
  10280. --     if (s[1]==0)
  10281. --       s[1]=32;
  10282. --     if (usub[i].subnum<32) {
  10283. --       if ((1L << (usub[i].subnum)) & thisuser.qscn)
  10284. --         strcat(s," - ");
  10285. --       else
  10286. --         strcat(s,"   ");
  10287. --     } else {
  10288. -- #if MAX_SUBS>32
  10289. --       if ((1L << (usub[i].subnum-32)) & thisuser.qscn2)
  10290. --         strcat(s," - ");
  10291. --       else
  10292. --         strcat(s,"   ");
  10293. -- #else
  10294. --       strcat(s,"   ");
  10295. -- #endif
  10296. --     }
  10297.  
  10298. Now Add these lines in their place:
  10299. ++     sprintf(s,"%-3s %c ",
  10300. ++               usub[i].keys,
  10301. ++               thisuser.qscn[usub[i].subnum]?'-':' ');
  10302.  
  10303. ============================================================================
  10304. STEP 1.B
  10305. Now, down in mainmenu(),
  10306. ==     prt(5,"Clear Q-Scan pointers? ");
  10307. ==     if (yn()) {
  10308. %%       for (i=0; i<MAX_SUBS; i++) /* Change 33 to MAX_SUBS */
  10309. ==         thisuser.qscnptr[i]=status.qscanptr-1L;
  10310. -- #if MAX_SUBS>32
  10311. --       for (i=0; i<MAX_SUBS-32; i++)
  10312. --         thisuser.qscnptr2[i]=status.qscanptr-1L;
  10313. -- #endif
  10314.  
  10315. ============================================================================
  10316. STEP 2 is done in BBSUTL.C
  10317. ============================================================================
  10318. STEP 2.A
  10319.  
  10320. In function mmkey(), make the following change:
  10321. %%    static unsigned char cmd1[10],cmd2[81],ch,cmd3[55]; /* add cmd3 */
  10322.  
  10323. Add the following code:
  10324. ==   int i,i1,i2,p;
  10325. ==
  10326. ++   i=0;
  10327. ++   cmd2[0]=0;
  10328. ++   if (dl==0) {
  10329. ++    do {
  10330. ++     ch=upcase(getkey());
  10331. ++     if (ch==13) {
  10332. ++       nl();
  10333. ++       if (cmd2[0]=='/' && cmd2[1]=='/') {
  10334. ++         strcpy(cmd3,(char *)(cmd2+2));
  10335. ++         return(cmd3);
  10336. ++       } else
  10337. ++         return(cmd2);
  10338. ++     } else if ((ch==8) && (i>0)) {
  10339. ++       backspace();
  10340. ++       i--;
  10341. ++     } else if (ch>=' ' && ch<=126 && i<50) {
  10342. ++       outchr(ch);
  10343. ++       cmd2[i++]=ch;
  10344. ++       cmd2[i]=0;
  10345. ++     };
  10346. ++     if (i==1 && strchr(dc,ch)==NULL) {
  10347. ++       nl();
  10348. ++       return(cmd2);
  10349. ++     }
  10350. ++     if (i==2 && cmd2[0]=='/' && cmd2[1]!='/') return(cmd2);
  10351. ++     if (i==2 && atoi(cmd2)>(int)((num_subs-num_subs%10)/10)) return(cmd2);
  10352. ++     if (i==2 && atoi(cmd2)>0) return(cmd2);
  10353. ++   } while (!hangup);
  10354. ++  } else
  10355. ==  do {
  10356.  
  10357. And delete the following code (about 10 lines down):
  10358. --     case 0:
  10359. --       if (strchr(dc,ch)!=NULL)
  10360. --         p=1;
  10361. --       break;
  10362.  
  10363. ============================================================================
  10364. Step 3 is done in DEFAULTS.C
  10365. ============================================================================
  10366. Step 3.A
  10367.  
  10368. Search for and delete the following code (in l_config_qscan()):
  10369. --      sprintf(s,"%c %s. %s",
  10370. --  #if MAX_SUBS>32
  10371. --         (usub[i].subnum>=32)?
  10372. --           (((1L << (usub[i].subnum-32)) & thisuser.qscn2)?'*':' '):
  10373. --           (((1L << (usub[i].subnum)) & thisuser.qscn)?'*':' '),
  10374. --  #else
  10375. --        ((1L << (usub[i].subnum)) & thisuser.qscn)?'*':' ',
  10376. --  #endif
  10377.  
  10378. And add the following line in its place:
  10379. ++      sprintf(s,"%c %s. %s", thisuser.qscn[usub[i].subnum]?'*':' ',
  10380.  
  10381. Step 3.B
  10382. Search for and delete the following code (in config_qscan()):
  10383. --          if (strcmp(usub[i].keys,s)==0) {
  10384. --  #if MAX_SUBS>32
  10385. --            if (usub[i].subnum>=32)
  10386. --              thisuser.qscn2 ^=((1L) << (usub[i].subnum-32));
  10387. --            else
  10388. --              thisuser.qscn ^=((1L) << (usub[i].subnum));
  10389. --  #else
  10390. --            thisuser.qscn ^=((1L) << (usub[i].subnum));
  10391. --  #endif
  10392. --          }
  10393.  
  10394. And add the following lines in its place:
  10395. ++          if (strcmp(usub[i].keys,s)==0)
  10396. ++            thisuser.qscn[usub[i].subnum] = !thisuser.qscn[usub[i].subnum];
  10397.  
  10398. ============================================================================
  10399. Step 4 is done in MSGBASE1.C
  10400. ============================================================================
  10401. Search for and delete the following code (in nscan()):
  10402. --  #if MAX_SUBS>32
  10403. --      if (((usub[i].subnum<32) && (thisuser.qscn & (1L<<(usub[i].subnum)))) 
  10404. ||
  10405. --          ((usub[i].subnum>=32) && (thisuser.qscn2 & 
  10406. (1L<<(usub[i].subnum-32)))))
  10407. --  #else
  10408. --      if (thisuser.qscn & (1L<<(usub[i].subnum)))
  10409. --  #endif
  10410.  
  10411. And replace it with this line:
  10412. ++      if (thisuser.qscn[i])
  10413.  
  10414. ============================================================================
  10415. Step 5 is done in NEWUSER.C
  10416. ============================================================================
  10417. Search for and delete these lines (in newuser()):
  10418. --    thisuser.qscn=0xFFFFFFFF;
  10419. --  #if MAX_SUBS>32
  10420. --    thisuser.qscn2=0xFFFFFFFF;
  10421. --  #endif
  10422.  
  10423. And add this line in its place:
  10424. ++    for(i=0; i<MAX_SUBS; i++) thisuser.qscn[i]=1;
  10425.  
  10426. ============================================================================
  10427. Step 6 is done in SUBEDIT.C
  10428. ============================================================================
  10429. Delete the insert_sub() and delete_sub() voids in SUBEDIT.C and replace them
  10430. with these:
  10431.  
  10432. void insert_sub(int n)
  10433. {
  10434.   subboardrec r;
  10435.   int i,i1,nu;
  10436.   userrec u;
  10437.   long l1,l2,l3;
  10438.  
  10439.   for (i=num_subs-1; i>=n; i--) {
  10440.     subboards[i+1]=subboards[i];
  10441.     sub_dates[i+1]=sub_dates[i];
  10442.   }
  10443.   strcpy(r.name,"** NEW SUB **");
  10444.   strcpy(r.filename,"NONAME");
  10445.   r.key=0;
  10446.   r.readsl=10;
  10447.   r.postsl=20;
  10448.   r.anony=0;
  10449.   r.age=0;
  10450.   r.maxmsgs=50;
  10451.   r.ar=0;
  10452.   r.type=0;
  10453.   r.storage_type=2;
  10454.   subboards[n]=r;
  10455.   ++num_subs;
  10456.   read_user(1,&u);
  10457.   nu=number_userrecs();
  10458.   for (i=1; i<=nu; i++) {
  10459.     read_user(i,&u);
  10460.     if (u.sysopsub!=255)
  10461.       if (u.sysopsub>=n)
  10462.         ++u.sysopsub;
  10463.     for (i1=num_subs-1; i1>n; i1--) {
  10464.       u.qscn[i1]=u.qscn[i1-1];
  10465.       u.qscnptr[i1]=u.qscnptr[i1-1];
  10466.     }
  10467.     u.qscnptr[n]=0L;
  10468.     write_user(i,&u);
  10469.   }
  10470.   modify_sub(n);
  10471. }
  10472.  
  10473.  
  10474. void delete_sub(int n)
  10475. {
  10476.   int i,i1,i2,nu;
  10477.   userrec u;
  10478.   long l1,l2;
  10479.  
  10480.   for (i=n; i<num_subs; i++) {
  10481.     subboards[i]=subboards[i+1];
  10482.     sub_dates[i]=sub_dates[i+1];
  10483.   }
  10484.   --num_subs;
  10485.   read_user(1,&u);
  10486.   nu=number_userrecs();
  10487.   for (i=1; i<=nu; i++) {
  10488.     read_user(i,&u);
  10489.     if (u.sysopsub==n)
  10490.       u.sysopsub=255;
  10491.     else
  10492.       if ((u.sysopsub>n) && (u.sysopsub!=255))
  10493.         --u.sysopsub;
  10494.     for (i1=n; i1<MAX_SUBS-1; i1++) {
  10495.         u.qscnptr[i1]=u.qscnptr[i1+1];
  10496.         u.qscn[i1]=u.qscn[i1+1];
  10497.     }
  10498.     u.qscnptr[MAX_SUBS-1]=0L;
  10499.     write_user(i,&u);
  10500.   }
  10501. }
  10502.  
  10503. =============================================================================
  10504. Step 7 is done in UTILITY.C
  10505. =============================================================================
  10506. Search for and make the following changes in changedsl()
  10507.  
  10508. ==   dcd[ddp++]='/';
  10509. %%   for (i=0; i<4; i++) {          /* Change the 3 to 4 */
  10510. ==     s1.keys[i]=0;
  10511. ==   }
  10512.  
  10513. Further down,
  10514.  
  10515. ==        usub[i3++]=s1;
  10516. ==      } else {
  10517. %%        if ((i1 % 10)==0 && i1<100)    /* add in the "&& i1<100" */
  10518. ==          dc[dp++]=('0'+(i1/10));
  10519. ==        itoa(i1++,s1.keys,10);
  10520.  
  10521. ============================================================================
  10522. Step 8 is done in VARDEC.H
  10523. ============================================================================
  10524.  
  10525. First, make a copy of VARDEC.H called OLD.H (ie "COPY VARDEC.H OLD.H")
  10526. for use in step 9.
  10527.  
  10528. Change this line:
  10529. ==  #define MAX_SUBS 64
  10530. to
  10531. %%  #define MAX_SUBS 254  /* You can make this smaller if you want */
  10532.  
  10533. Now, delete these lines:
  10534. --  #if MAX_SUBS>32
  10535. --  #define QSCN(i) 
  10536. (*((i>31)?(&thisuser.qscnptr2[i-32]):(&thisuser.qscnptr[i])))
  10537. --  #else
  10538. ==  #define QSCN(i) thisuser.qscnptr[i]  /* Keep this line */
  10539. --  #endif
  10540.  
  10541. Make the following insertion:
  10542. ==                      sysopsub,               /* sysop sub board number */
  10543. ++                      qscn[MAX_SUBS],         /* which subs to n-scan */
  10544. ==                      ontoday;                /* num times on today */
  10545.  
  10546. Then make these changes further down:
  10547. ==                      uk,                     /* number of k uploaded */
  10548. ==                      dk,                     /* number of k downloaded */
  10549. --                      qscn,                   /**********DELETE*********/
  10550. %%                      qscnptr[MAX_SUBS],      /* Change 33 to MAX_SUBS */
  10551. ==                      nscn1,nscn2,            /* which dirs to n-scan */
  10552.  
  10553. And a little further down, delete these lines:
  10554.  
  10555. --  #if MAX_SUBS>32
  10556. --          unsigned long   qscn2;                  /* additional ...
  10557. --          unsigned long   qscnptr2[MAX_SUBS-32];  /* additional ...
  10558. --  #endif
  10559.  
  10560. Next, further down, make this change (in usubrec)
  10561. == typedef struct {
  10562. %%      char            keys[4]; /* change 3 to 4 */
  10563. ==      int             subnum;
  10564. == } usersubrec;
  10565.  
  10566.  
  10567. ============================================================================
  10568. Step 9 is done in OLD.H (see step 8)
  10569. ============================================================================
  10570. delete everything from OLD.H except the userrec structure.  Rename the
  10571. Userec structure to olduserrec.  For reference, this is what it should look
  10572. like after the changes:
  10573. ==============================OLD.H=========================================
  10574. #define MAX_SUBS 64
  10575. #define MAX_DIRS 64
  10576.  
  10577. typedef struct {
  10578.         char            name[31],               /* user's name */
  10579.                         realname[21],           /* user's real name */
  10580.                         callsign[7],            /* user's amateur callsign */
  10581.                         phone[13],              /* user's phone number */
  10582.                         pw[9],                  /* user's password */
  10583.                         laston[9],              /* last date on */
  10584.                         firston[9],             /* first date on */
  10585.                         note[41],               /* sysop's note about user */
  10586.                         macros[3][81],          /* macro keys */
  10587.                         sex;                    /* user's sex */
  10588.         unsigned char   age,                    /* user's age */
  10589.                         inact,                  /* if deleted or inactive */
  10590.                         comp_type,              /* computer type */
  10591.                         defprot,                /* deflt transfer protocol */
  10592.                         defed,                  /* default editor */
  10593.                         screenchars,screenlines,/* screen size */
  10594.                         sl,                     /* security level */
  10595.                         dsl,                    /* transfer security level */
  10596.                         exempt,                 /* exempt from ratios, etc */
  10597.                         colors[8],              /* user's colors */
  10598.                         votes[20],              /* user's votes */
  10599.                         illegal,                /* illegal logons */
  10600.                         waiting,                /* number mail waiting */
  10601.                         sysopsub,               /* sysop sub board number */
  10602.                         ontoday;                /* num times on today */
  10603.         unsigned short  homeuser,homesys,       /* where user can be found */
  10604.                         forwardusr,forwardsys,  /* where to forward mail */
  10605.                         msgpost,                /* number messages posted */
  10606.                         emailsent,              /* number of email sent */
  10607.                         feedbacksent,           /* number of f-back sent */
  10608.                         posttoday,              /* number posts today */
  10609.                         etoday,                 /* number emails today */
  10610.                         ar,                     /* board access */
  10611.                         dar,                    /* directory access */
  10612.                         restrict,               /* restrictions on account */
  10613.                         ass_pts,                /* bad things the user did */
  10614.                         uploaded,               /* number files uploaded */
  10615.                         downloaded,             /* number files downloaded */
  10616.                         lastrate,               /* last baud rate on */
  10617.                         logons;                 /* total number of logons */
  10618.         unsigned long   msgread,                /* total num msgs read */
  10619.                         uk,                     /* number of k uploaded */
  10620.                         dk,                     /* number of k downloaded */
  10621. ±àL╨²                        qscn,                   /* which subs to n-scan */
  10622.                         qscnptr[33],            /* q-scan pointers */
  10623.                         nscn1,nscn2,            /* which dirs to n-scan */
  10624.                         daten,                  /* numerical time last on */
  10625.                         sysstatus;              /* status/defaults */
  10626.         float           timeontoday,            /* time on today */
  10627.                         extratime,              /* time left today */
  10628.                         timeon,                 /* total time on system */
  10629.                         pos_account,            /* $ credit */
  10630.                         neg_account,            /* $ debit */
  10631.                         gold;                   /* game money */
  10632.         unsigned char   bwcolors[8];            /* b&w colors */
  10633.         unsigned char   month,day,year;         /* user's birthday */
  10634.         unsigned int    emailnet,               /* email sent into net */
  10635.                         postnet;                /* posts sent into net */
  10636.         unsigned short  fsenttoday1;            /* feedbacks today */
  10637.         unsigned char   num_extended;           /* num lines of ext desc */
  10638.         unsigned char   optional_val;           /* optional lines in msgs */
  10639.         unsigned long   wwiv_regnum;            /* users WWIV reg number */
  10640.         char            res[29];                /* reserved bytes */
  10641. #if MAX_SUBS>32
  10642.         unsigned long   qscn2;                  /* additional qscan ptr */
  10643.         unsigned long   qscnptr2[MAX_SUBS-32];  /* additional quickscan ptrs */
  10644. #endif
  10645. } olduserrec;
  10646. ==================================END of OLD.H===============================
  10647.  
  10648. ============================================================================
  10649. Step 10:  Extract the following under the filename CONVERT.C
  10650. ============================================================================
  10651. /*  CONVERT USERLIST PROGRAM */
  10652.  
  10653. /*  Written by The Black Dragon, 1989 */
  10654. /*  (C) 1989 Black Dragon Enterprises */
  10655. /*  Compiled and tested using Borland Turbo C - Version 1.5 */
  10656. /*  License granted to freely distribute without compensation and to */
  10657. /*  modify as needed "to get the job done."  Use at your own risk.  */
  10658. /*  Distributed "as is".  No warranty or guarentee */
  10659.  
  10660. /*  Command Parameters:  */
  10661. /*  CONVERT  <old user filename>  <new user filename>  */
  10662.  
  10663. /* This file was modified by Lord Elric, 1@8251, 9/24/89, 5:17am
  10664. after yet another all-night BBS modding session. Many thanks to Black Dragon,
  10665. 1@280, for writing this conversion program. With little modifications here
  10666. and there, this can be used to add or delete almost anything from the user
  10667. record.
  10668.  
  10669. Lord Elric 1@8251 WWIVNet
  10670.  
  10671.   This file was modified by The Emporer, 1@6470 Net, 1@16401 Link 1/9/91
  10672.   to convert from the WWIV 4.20E with 64 Message bases activate to
  10673.   WWIV 4.20E with 254 Message bases
  10674. */
  10675.  
  10676.  
  10677. #include <stdio.h>
  10678. #include <string.h>
  10679. #include <mem.h>
  10680. #include <io.h>
  10681. #include <fcntl.h>
  10682. #include <sys\stat.h>
  10683. #include "old.h"                /* put your old userlist here and */
  10684. #include "vardec.h"             /* rename it from userrec to olduserrec */
  10685.  
  10686. void main(int argc, char *argv[])
  10687. {
  10688.   int f,g,i;
  10689.   unsigned int loop,num=0;
  10690.   unsigned long len;
  10691.   userrec new,new1;
  10692.   olduserrec old;
  10693.  
  10694.   if (argc<3) {
  10695.     printf("\nRequires 2 parameters.\n");
  10696.     printf("Usage: CONVERT oldfile newfile \n");
  10697.     abort();
  10698.   }
  10699.   if ((f=open(argv[1],O_RDWR|O_BINARY,S_IREAD|S_IWRITE))<=0) {
  10700.     printf("\nCould not open user list %s\n",argv[1]);
  10701.     abort();
  10702.   }
  10703.   if ((g=open(argv[2],O_RDWR|O_BINARY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE))<=0) {
  10704.     printf("\nCould not open output file %s\n",argv[2]);
  10705.     abort();
  10706.   }
  10707.   clrscr();
  10708.   printf("Size of old user record %d",sizeof(olduserrec));
  10709.   printf("\nSize of new user record %d\n\n",sizeof(userrec));
  10710.  
  10711.   len=filelength(f);
  10712.   num=(len/sizeof(olduserrec))+!(len%sizeof(olduserrec));
  10713.   for (loop=0;loop<num;loop++) {
  10714.     if (sizeof(olduserrec)==read(f,&old,sizeof(olduserrec))) {
  10715.     gotoxy(1,3);
  10716.     printf("\015Processing user #%u of %u - %-35s\n",loop,num-1,old.name);
  10717.  
  10718.     memset(&new,0,sizeof(userrec));     /* Nice to clear out garbage */
  10719.     strcpy(new.name,old.name);          /* Now copy all data over    */
  10720.     strcpy(new.realname,old.realname);
  10721.     strcpy(new.pw,old.pw);
  10722.     strcpy(new.laston,old.laston);
  10723.     strcpy(new.firston,old.firston);
  10724.     strcpy(new.note,old.note);
  10725.     for (i=0;i<3;i++)
  10726.       strcpy(new.macros[i],old.macros[i]);
  10727.     new.sex=old.sex;
  10728.     new.month=old.month;
  10729.     new.day=old.day;
  10730.     new.year=old.year;
  10731.     new.age=old.age;
  10732.     new.sl=old.sl;
  10733.     new.dsl=old.dsl;
  10734.     new.inact=old.inact;
  10735.     new.exempt=old.exempt;
  10736.     new.sysopsub=old.sysopsub;
  10737.     new.comp_type=old.comp_type;
  10738.     new.screenchars=old.screenchars;
  10739.     new.screenlines=old.screenlines;
  10740.     for (i=0;i<8;i++) {
  10741.       new.colors[i]=old.colors[i];
  10742.       new.bwcolors[i]=old.bwcolors[i];
  10743.     }
  10744.     for (i=0;i<20;i++)
  10745.       new.votes[i]=old.votes[i];
  10746.     new.illegal=old.illegal;
  10747.     new.ontoday=old.ontoday;
  10748.     new.defed=old.defed;
  10749.     new.defprot=old.defprot;
  10750.     new.num_extended=old.num_extended;
  10751.     new.waiting=old.waiting;
  10752.     new.fsenttoday1=old.fsenttoday1;
  10753.     new.homeuser=old.homeuser;
  10754.     new.homesys=old.homesys;
  10755.     new.forwardusr=old.forwardusr;
  10756.     new.forwardsys=old.forwardsys;
  10757.     new.msgpost=old.msgpost;
  10758.     new.emailsent=old.emailsent;
  10759.     new.feedbacksent=old.feedbacksent;
  10760.     new.posttoday=old.posttoday;
  10761.     new.etoday=old.etoday;
  10762.     new.emailnet=old.emailnet;
  10763.     new.postnet=old.postnet;
  10764.     new.ar=old.ar;
  10765.     new.dar=old.dar;
  10766.     new.restrict=old.restrict;
  10767.     new.ass_pts=old.ass_pts;
  10768.     new.uploaded=old.uploaded;
  10769.     new.downloaded=old.downloaded;
  10770.     new.lastrate=old.lastrate;
  10771.     new.logons=old.logons;
  10772.     strcpy(new.phone,old.phone);
  10773.     new.msgread=old.msgread;
  10774.     new.uk=old.uk;
  10775.     new.dk=old.dk;
  10776.     new.daten=old.daten;
  10777.     new.sysstatus=old.sysstatus;
  10778.     for (i=0; i<32; i++) {
  10779.       new.qscn[i]=(old.qscn & (1L<<i)?1:0);
  10780.       printf("%c",new.qscn[i]?'X':'O'); /* Just a little display of the ptrs */
  10781.       new.qscnptr[i]=old.qscnptr[i];
  10782.     }
  10783.     for (i=32; i<64; i++) {
  10784.       new.qscn[i]=(old.qscn2 & (1L<<(i-32))?1:0);
  10785.       new.qscnptr[i]=old.qscnptr2[i-32];
  10786.       printf("%c",new.qscn[i]?'X':'O');
  10787.     }
  10788.     for (i=64; i<MAX_SUBS; i++) new.qscn[i]=1;
  10789.     new.nscn1=old.nscn1;
  10790.     new.nscn2=old.nscn2;
  10791.     new.timeontoday=old.timeontoday;
  10792.     new.extratime=old.extratime;
  10793.     new.timeon=old.timeon;
  10794.     new.gold=old.gold;
  10795.     new.pos_account=old.pos_account;
  10796.     new.neg_account=old.neg_account;
  10797.     new.wwiv_regnum=old.wwiv_regnum;
  10798.     new.optional_val=old.optional_val;
  10799.     write(g,&new,sizeof(userrec));      /* User record converted here */
  10800.     }
  10801.   }
  10802.   close(f);
  10803.   close(g);
  10804. }
  10805. ==================================End of CONVERT.C==========================
  10806.  
  10807. ============================================================================
  10808. Step 11
  10809. ============================================================================
  10810. Compile CONVERT.C and run it to convert your user list to the new format.
  10811. The correct way to do this is to rename USER.LST to OLD.LST and then use
  10812. the command line:
  10813.    CONVERT OLD.LST USER.LST
  10814. Also, when you compile CONVERT.C, you will get a warning about MAX_SUBS
  10815. being redeclared... its not important, as the program will work anyways.
  10816. ============================================================================
  10817. END OF FILE
  10818.  
  10819.  
  10820.  
  10821.  
  10822.  
  10823.  
  10824. [78/99]: Please ...HELP!... I really could use this mod!!!
  10825. [Name ]: Rebel #1 @3104
  10826. [Date ]: Saturday, January 11, 1992 11:55 am  <Eastern>
  10827.  
  10828. This is the message reply mod for 4.12. I get errors trying to use
  10829. it it 4.20e. Does anyone know how to fix it so i do not get the
  10830. errors????
  10831.  
  10832. Or if you have this mod as a working version please e-mail it to
  10833. me.
  10834.  
  10835.                          
  10836.       save=0;
  10837.     } else {
  10838.     if (aux == "EMAIL")  {
  10839.     outstr("Would you like a response to this message? ");
  10840.       if (yn()) {
  10841.         curli++;
  10842.         strcpy(&(lin[(curli++) *LEN]),"MSG. STATUS: Please respond to this 
  10843. message. Thanks."); }
  10844.       else {
  10845.         curli++;
  10846.         strcpy(&(lin[(curli++) *LEN]),"MSG. STATUS: No response is 
  10847. neccessary."); }
  10848.       }
  10849.     }
  10850.   } else {
  10851.  
  10852.  
  10853.  
  10854.                        Thanks...
  10855.  
  10856.                            Rebel 1@3104
  10857.  
  10858.  
  10859.  
  10860.  
  10861.  
  10862.  
  10863. [79/99]: EDO007.420/EDO007.ZIP
  10864. [Name ]: Ed O'Brien #1 @7350
  10865. [Date ]: Fri Jan 10 13:24:01 1992
  10866. [From ]:^Data Xfer BBS [AVS] (Houston, Texas)
  10867.  
  10868.  
  10869. ┌────────────────────────────────────────────────────────────────────────────┐
  10870. │ Mod Name: EDO007.420                    Mod Author: Ed O'Brien             │
  10871. │ Difficulty: Easy block read             Date: 01/10/92                     │
  10872. │ WWIV Version: 4.20e May work on lower versions but not tested.             │
  10873. │ Description: Lets you run WWFNET21 from the transfer menu.                 │
  10874. │                                                                            │
  10875. └────────────────────────────────────────────────────────────────────────────┘
  10876.  
  10877.      First let me thank Andrew Gaunt 1@6300 for developing WWFNET21 used to
  10878. transfer files over WWIVnet between local nodes and agreeable LD nodes.
  10879.  
  10880. The installation of this mod is extremely simple as it is no more than a
  10881. block read.
  10882.  
  10883. Load up BBS.C void dlmainmenu() and block read the following case just before
  10884. case 'X':
  10885.  
  10886.  
  10887.       case 'W':                              /* add FMENU */
  10888.          set_protect(0);
  10889.          create_chain_file("CHAIN.TXT");
  10890.          strcpy(s1,"FMENU CHAIN.TXT");
  10891.          full_external(s1,0,1);
  10892.          break;
  10893.  
  10894.  
  10895. Drop to DOS and type "make".
  10896. Update your tranfer menu for the new selection.  I named mine:
  10897.  
  10898. W:WIVnet File Exchange
  10899.  
  10900. That's it!!!  
  10901. ═══════════════════════════════════════════════════════════════════════════════
  10902. Later...Ed
  10903.  
  10904.  
  10905.                        -= Data Xfer BBS * 713-937-0884 =-
  10906.                    -= Files * Messages * Games * WWIV Mods =-
  10907.                  -= PCPursuitable @ TXHOU * SNARFable v1.02 =- 
  10908.  
  10909.  
  10910.  
  10911.  
  10912.  
  10913.  
  10914.  
  10915. [80/99]: Scroll file
  10916. [Name ]: Space Kid #123 @8859
  10917. [Date ]: Tue Jan 07 21:33:02 1992
  10918. [From ]: The Inner Sanctum (Southern California)
  10919.  
  10920.     Well... I made a small Scroll file modification... This is 
  10921. early released and further development will be made to this to
  10922. make it look awsome......
  10923.  
  10924.     Please if there're problems installing it please post it 
  10925.  
  10926.  
  10927.  
  10928.  
  10929.  
  10930.  
  10931. [81/99]: SCRLST.MOD
  10932. [Name ]: Space Kid #123 @8859
  10933. [Date ]: Tue Jan 07 21:33:33 1992
  10934. [From ]: The Inner Sanctum (Southern California)
  10935.  
  10936.                         SCRLST.MOD v1.0
  10937. Compatibility:     WWIV 4.20+              WWIVe 2.0+
  10938.  
  10939. Description:
  10940.         This modification adds an additional choice for users to
  10941.    list the files in the transfer section.
  10942.  
  10943.  
  10944. Add in FCNS.H
  10945.  
  10946. void try_arc_l(char *s);
  10947. void tagline();
  10948. void try_temp_extract(char *s);
  10949. void scrlst();
  10950. void movto(int x, int y);
  10951.  
  10952. change in XFER.C
  10953.  
  10954. void try_arc_l(char *s)
  10955. {
  10956.   char s1[81],s2[81];
  10957.   int abort,next,i,i1;
  10958.   uploadsrec u;
  10959.  
  10960.   dliscan();
  10961.   abort=0;
  10962.   next=0;
  10963.   i=recno(s);
  10964.   do {
  10965.     if (i>0) {
  10966.       SETREC(i);
  10967.       read(dlf,(void *)&u,sizeof(uploadsrec));
  10968.       
  10969. i1=list_arc_out(stripfn(u.filename),directories[udir[curdir].subnum].path);
  10970.       if (i1)
  10971.         abort=1;
  10972.       checka(&abort,&next);
  10973.       i=nrecno(s,i);
  10974.     }
  10975.   } while ((i>0) && (!hangup) && (!abort));
  10976.   closedl();
  10977.  
  10978. }
  10979.  
  10980. void arc_l()
  10981. {
  10982.   char s[81];
  10983.  
  10984.   nl(); prt(2,"File for listing: ");
  10985.   input(s,12);
  10986.   if (strchr(s,'.')==NULL) strcat(s,".*");
  10987.   if (!okfn(s)) s[0]=0;
  10988.   align(s);
  10989.   try_arc_l(s);
  10990. }
  10991.  
  10992. **** DELETE old  /* void arc_l() */
  10993.  
  10994.  
  10995.  
  10996. change in XFERTMP.C
  10997.  
  10998. void try_temp_extract(char *s)
  10999. {
  11000.   int i,i1,i2,i3,ok,abort,ok1;
  11001.   char s1[255],s2[81],s3[255],s4[129];
  11002.   uploadsrec u,u1;
  11003.  
  11004.   i=recno(s);
  11005.   ok=1;
  11006.   while ((i>0) && (ok) && (!hangup)) {
  11007.     SETREC(i);
  11008.     read(dlf,(void *)&u,sizeof(uploadsrec));
  11009.     sprintf(s2,"%s%s",directories[udir[curdir].subnum].path,u.filename);
  11010.     get_arc_cmd(s1,s2,1,"");
  11011.     if ((s1[0]) && (exist(s2))) {
  11012.       nl(); nl();
  11013.       abort=0;
  11014.       printinfo(&u,&abort);
  11015.       nl();
  11016.       cd_to(directories[udir[curdir].subnum].path);
  11017.       get_dir(s4,1);
  11018.       strcat(s4,stripfn(u.filename));
  11019.       cd_to(cdir);
  11020.       if (!check_for_files(s4)) {
  11021.         do {
  11022.           prt(2,"Extract what (?=list,Q=abort) ? ");
  11023.           input(s1,12);
  11024.           if(strcmp(s,"..")==0) return;
  11025.           if (s1[0]==0)
  11026.             ok1=0;
  11027.           else
  11028.             ok1=1;
  11029.           if (!okfn(s1)) ok1=0;
  11030.           if (strcmp(s1,"?")==0) {
  11031.             
  11032. list_arc_out(stripfn(u.filename),directories[udir[curdir].subnum].path);
  11033.             s1[0]=0;
  11034.           }
  11035.           if (strcmp(s1,"Q")==0) {
  11036.             ok=0;
  11037.             s1[0]=0;
  11038.           }
  11039.           i2=0;
  11040.           for (i1=0; i1<strlen(s1); i1++)
  11041.             if ((s1[i1]=='|') || (s1[i1]=='>') || (s1[i1]=='<') || 
  11042. (s1[i1]==';') || (s1[i1]==' '))
  11043.               i2=1;
  11044.           if (i2) s1[0]=0;
  11045.           if (s1[0]) {
  11046.             if (strchr(s1,'.')==NULL) strcat(s1,".*");
  11047.             get_arc_cmd(s3,s4,1,stripfn(s1));
  11048.             cd_to(syscfg.tempdir);
  11049.             if (!okfn(s1)) s3[0]=0;
  11050.             if (s3[0]) {
  11051.               do_external(s3,0);
  11052.               sprintf(s2,"Extracted out %s from %s",s1,u.filename);
  11053.             } else
  11054.               s2[0]=0;
  11055.             cd_to(cdir);
  11056.             if (s2[0]) sysoplog(s2);
  11057.           }
  11058.         } while ((!hangup) && (ok) && (ok1));
  11059.       }
  11060.     } else
  11061.       if (s1[0]) {
  11062.         nl();
  11063.         pl("That file currently isn't there.");
  11064.         nl();
  11065.       }
  11066.     if (ok) i=nrecno(s,i);
  11067.   }
  11068.   closedl();
  11069. }
  11070.  
  11071. void temp_extract()
  11072. {
  11073.   char s[255];
  11074.  
  11075.   dliscan();
  11076.   nl(); pl("Extract to temporary directory:");
  11077.   nl(); prt(2,"Filename: ");
  11078.   input(s,12);
  11079.   if ((!okfn(s)) || (s[0]==0)) {
  11080.     closedl();
  11081.     return;
  11082.   }
  11083.   if (strchr(s,'.')==NULL) strcat(s,".*");
  11084.   align(s);
  11085.   try_temp_extract(s);
  11086. }
  11087.  
  11088. ****** DELETE old /*  void temp_extract()  */
  11089.  
  11090.  
  11091.  
  11092. add in XFER.C   /** Before listfile(); **/
  11093.  
  11094. void tagline()
  11095. {
  11096.   int i;
  11097.  
  11098.   moveto(0,21);
  11099.   curatr=0x1f;
  11100.   for(i=0; i<80; i++) outstr("  ");
  11101.   moveto(0,21);
  11102.   outstr("A] Up   N]ext page   Z] Down     D]ownload    P]revious Page\r\n");
  11103.   outstr("Q]uit   V]iew File   E]xtract    +]Batch       ");
  11104.   curatr=0x07;
  11105. }
  11106.  
  11107. void scrlst()
  11108. {
  11109.   char s[81],s1[50],s2[50],ch,s3[81];
  11110.   int file[21],c,i,abort,next=0,w,done=0,p,tag[11],tagc;
  11111.   double t;
  11112.   uploadsrec u;
  11113.  
  11114.   dliscan();
  11115.   file_mask(s);
  11116.   strcpy(s3,s);
  11117.   abort=0;
  11118.   c=w=p=tagc=1;
  11119.   if(numf==0) { pl("No file in this Directory.\n"); closedl(); return; }
  11120.   outchr(12);
  11121.   for (i=1; (i<=numf) && (w<=20) && (!abort) && (!hangup); i++) {
  11122.     SETREC(i);
  11123.     read(dlf,(void *)&u,sizeof(uploadsrec));
  11124.     if (compare(s,u.filename)) {
  11125.          printinfo(&u,&abort);
  11126.          file[w]=i;
  11127.          w++;
  11128.     } else
  11129.     if (!empty()) checka(&abort,&next);
  11130.   }
  11131.   if(w==1) { pl("No matched files!\n"); closedl(); return; }
  11132.   tagline();
  11133.   do {
  11134.    moveto(0,c);
  11135.    SETREC(file[c]);
  11136.    read(dlf,(void *)&u,sizeof(uploadsrec));
  11137.    strncpy(s,u.filename,8); s[8]=0;
  11138.    sprintf(s1,"%-8s",s);
  11139.    if(thisuser.sysstatus & sysstatus_funky_colors)
  11140.      sprintf(s2,"%-8s",s);
  11141.    else
  11142.      strcpy(s2,s1);
  11143.    strncpy(s,&((u.filename)[8]),4); s[4]=0;
  11144.    strcat(s1,s); strcat(s2,s);
  11145.    curatr=0x1f; outstr(s1); curatr=0x07;
  11146.    ch=upcase(getkey());
  11147.    switch (ch) {
  11148.      case 32:
  11149.        if(tagc<=10) {
  11150.        tag[tagc]=file[c];
  11151.        tagc++;
  11152.        } else
  11153.           pl("You can only tag 10 files...");
  11154.  
  11155.        break;
  11156.      case 'P':
  11157.        if(p>1) {
  11158.          w=1;
  11159.          outchr(12);
  11160.          for (i=file[1]-1; (i>=1) && (w<=20) && (!abort) && (!hangup); i--) {
  11161.          SETREC(i);
  11162.          read(dlf,(void *)&u,sizeof(uploadsrec));
  11163.          if (compare(s3,u.filename)) {
  11164.            moveto(0,21-w); printinfo(&u,&abort);
  11165.            file[21-w]=i;
  11166.            w++;
  11167.          } else
  11168.          if (!empty()) checka(&abort,&next);
  11169.        }
  11170.        p--;
  11171.        tagline();
  11172.        if(c>w) c=w-1;
  11173.      }
  11174.        break;
  11175.      case 'N':
  11176.         if(file[20]<numf) {
  11177.           outchr(12);
  11178.           w=1;
  11179.           p++;
  11180.         for (i=file[20]+1; (i<=numf) && (w<=20) && (!abort) && (!hangup); i++) 
  11181. {
  11182.         SETREC(i);
  11183.         read(dlf,(void *)&u,sizeof(uploadsrec));
  11184.         if (compare(s3,u.filename)) {
  11185.              printinfo(&u,&abort);
  11186.              file[w]=i;
  11187.              w++;
  11188.         } else
  11189.         if (!empty()) checka(&abort,&next);
  11190.       }
  11191.       tagline();
  11192.       if(c>w) c=w-1;
  11193.      }
  11194.         break;
  11195.      case 'A':
  11196.        c--;
  11197.        if(c<1) c=w-1;
  11198.        outstr("\r"); outstr(s2);
  11199.        break;
  11200.      case 'Z':
  11201.        c++;
  11202.        if(c>w-1) c=1;
  11203.        outstr("\r"); outstr(s2);
  11204.        break;
  11205.     case 'D':
  11206.        if(try_to_download(u.filename,udir[curdir].subnum,0)==0)
  11207.          pl("Error in your file directory");
  11208.        closedl();
  11209.        return;
  11210.     case 'V': moveto(0,24); try_arc_l(u.filename); pausescr(); closedl(); 
  11211. return;
  11212.     case 'E': moveto(0,24); try_temp_extract(u.filename); closedl(); return;
  11213. ifdef BATCH30
  11214.     case '+':
  11215.         if (numbatch>=MAX_BATCH) {
  11216.           moveto(0,25);
  11217.           outstr("No room left in batch queue.     ");
  11218.         } else {
  11219.           t=(12.656) / ((double) (modem_speed)) * ((double)(u.numbytes));
  11220.           if (nsl()<=(batchtime + t)) {
  11221.             moveto(0,25);
  11222.             outstr("Not enough time left in queue.     ");
  11223.           } else
  11224.             if (ratio1(batchsize)) {                      /* mod - add */
  11225.                 batchtime += t;
  11226.                 batchsize += ((u.numbytes+1023L) / 1024L); /* mod - add */
  11227.                 strcpy(batch.filename,u.filename);         /* mod - change */
  11228.                 batch.dir=curdir;                          /* mod - change */
  11229.                 batch.time=t;                              /* mod - change */
  11230.                 batch.sending=1;                           /* mod - change */
  11231.                 batch.len=u.numbytes;                      /* mod - change */
  11232.                 batch.size=((u.numbytes+1023L) / 1024L);   /* mod - add */
  11233.                 batrec(0,numbatch);                        /* mod - add */
  11234.                 numbatch++;
  11235.                 ++numbatchdl;
  11236.                 moveto(0,25); outstr("File added to batch queue.     ");
  11237.             }
  11238.         }
  11239.        break;
  11240. #endif
  11241.     case 'Q':
  11242.     case 27: done=1; break;
  11243.   } /* End of switch */
  11244.  } while ((!hangup) && (!done));
  11245.   closedl();
  11246. }
  11247.  
  11248. add in CONIO.C    /* Before void movecsr(int x, int y) */
  11249.  
  11250. void moveto(int x, int y)
  11251. {
  11252.     static char s[20];
  11253.  
  11254.     sprintf(s,"\x1b[%d;%dH",y,x);
  11255.     outstr(s);
  11256. }
  11257.  
  11258. add in BBS.C
  11259.  
  11260.       case 'G': temporary_stuff(); break;
  11261.       case 'I': scrlst(); break;                  /* add MOD */
  11262.       case 'L': listfiles(); break;
  11263.  
  11264.  
  11265. NOTE ******************************************************************
  11266. Batch <-  The batch function is from the BATCH30.MOD modification,
  11267.         if you don't have that mod, either use it or else change the
  11268.         '+' command to regular WWIV v4.20 mod...
  11269.  
  11270.    This version will only let the users view 20 files in one screen
  11271.  and use a small functions for it...
  11272.  
  11273.    Future version will allow users to tag files...
  11274.  
  11275.    Please don't change the movement of the files to the arrow
  11276. keys because users using QMODEM or anything else cannot access
  11277. it because of built in command in QMODEM.....
  11278.  
  11279. WARNING *************************************************************
  11280.   I don't hold responsible for any ways that user can hack or mess
  11281. up your board....
  11282.  
  11283.   This modification only works for users who has ANSI...
  11284.  
  11285. TOPSCREEN *************************************************************
  11286.   When you use this function LOCALLY it seems like it is totally messed
  11287. up... This is due to the Dash Rip Rock's Topscreen function where it
  11288. doesn't appear this way to the users...
  11289.  
  11290.  
  11291.   Any question or bugs pertaining to this modification please
  11292. just contact me or post around...
  11293.  
  11294. Revenge of Night Industry
  11295. (818) 577-9268  DUAL/24hrs
  11296.         John Tron @_@
  11297.                   / \
  11298.  
  11299.  
  11300.  
  11301.  
  11302.  
  11303.  
  11304. [82/99]: Minor fix for EMP254-1.MOD
  11305. [Name ]: The Emporer #1 @6470
  11306. [Date ]: Sat Jan 11 14:57:48 1992
  11307. [From ]: The First Galactic Empire (Ohio)
  11308.  
  11309. (FIX254.MOD)
  11310. I just found this little error in my 254 message base mod:
  11311.  
  11312. And replace it with this line:
  11313. ++      if (thisuser.qscn[i])
  11314.  
  11315. what it should say is:
  11316.  
  11317. And replace it with this line:
  11318. ++      if (thisuser.qscn[usub[i].subnum])
  11319.  
  11320.                                   The Emporer
  11321.  
  11322.  
  11323.  
  11324.  
  11325.  
  11326.  
  11327.  
  11328. [83/99]: finddup version 1.00
  11329. [Name ]: Jim Wire #1 @3950
  11330. [Date ]: Sat Jan 11 20:27:49 1992
  11331. [From ]:^HIT BBS (Iowa)
  11332.  
  11333. Mod         : finddup.mod
  11334. Version     : See #define FD_VER_NO below
  11335. Date        : See #define FD_DATE below
  11336. Written for : WWIV 4.20e
  11337. Author      : Jim Wire 1@3950 WWIVNet
  11338.                        1@13950 WWIVLink
  11339.                        1@3950 IceNET
  11340.  
  11341. Affects     : BBS.C          Step 1
  11342.               XFER.C:        Steps 2, 3A, 3B, 3C, 3D, 3E, 4A, 4B, 4C and 5
  11343.               XFEROVL.C:     Steps 6A and 6B
  11344.  
  11345. Indications : 1.   A fast search of ALL download directories to see if
  11346.                    the file being uploaded is already there.  This
  11347.                    search takes place at the DOS level and does not
  11348.                    involved the loading of all those data files.
  11349.  
  11350.               2.   A search of a trash file directory for the file being
  11351.                    uploaded.  This directory contains ZERO byte files
  11352.                    that you don't want uploaded like BBS.EXE and
  11353.                    COMMAND.COM.  These files can be created by a utility
  11354.                    called FAKEIT or when the file is taken off line (a
  11355.                    part of this mod).
  11356.  
  11357.                    NOTE:  This directory need not be part of the download
  11358.                           directory system.
  11359.  
  11360.               3.   A file can be taken off line and its description left
  11361.                    behind without dropping to DOS.  This file can be placed
  11362.                    in the trash file directory.
  11363.  
  11364.               4.   The //UPLOAD and //UPLOADALL commands are combined into
  11365.                    a single command.  This is purely optional; but it gives
  11366.                    the system operator one less thing to remember.
  11367.  
  11368.               5.   Lets the //UPLOAD function continue if you choose not
  11369.                    to add a file; but lets you space bar abort the sequence
  11370.                    if you want to.
  11371.  
  11372.               6.   Checks for the file name with all of the sysconfig archive
  11373.                    extensions attached to it.
  11374.  
  11375. Cautions    : 1.   If you need to be reminded to back up your source, then
  11376.                    consider yourself reminded.  As a matter of fact this
  11377.                    would be a good time to back up your whole BBS.
  11378.  
  11379.               2.   The installation of this mod is long and involved.  It
  11380.                    is not for the faint at heart.
  11381.  
  11382.               3.   This mod is really designed to be block copied.  If
  11383.                    you like to type the silly comments at the end of
  11384.                    the new and changed lines should allow you to do that.
  11385.  
  11386. Legend      : I really don't like mods that put their comments in the
  11387.               beginning of a line of code.  I have not asked any one
  11388.               else to conform to my conventions; but DO NOT ask me to
  11389.               conform to yours either.  I will agree to disagree on
  11390.               any conventions I've seen.  I don't even like mine all
  11391.               that well.
  11392.  
  11393.               A.   A line with no comment is original code in the same
  11394.                    location I found it.
  11395.  
  11396.               B.   A line with a + (plus) ie: /* finddup.mod +*/ is
  11397.                    an addition.
  11398.  
  11399.               C.   A line with a +- (plus and minus) ie: /* finddup.mod +-*/
  11400.                    is a changed line.  This convention is not used when only
  11401.                    the white space is changed.
  11402.  
  11403.               D.   A line with a += (plus and equals) ie:
  11404.                    /* finddup.mod +=*/ is a line which has had nothing more
  11405.                    than the white space changed to preserve the indention
  11406.                    levels.
  11407.  
  11408. Note        : 1.   The only changes from 0.9 version to 1.00b0 are in xfer.c.
  11409.                    Most of those are in the function finddup(fn), which is
  11410.                    included below.
  11411.  
  11412.               2.   Keep track of an suggestions for improvement you might
  11413.                    have.  I'm not really happy with the flow in the area
  11414.                    where files are taken off line, but I've yet to come
  11415.                    up with a better sequence.
  11416.  
  11417.               3.   If you have trouble getting this mod to work for you
  11418.                    don't wait to drop me E-Mail.  I call Dragon's Den
  11419.                    and Amber regularly.  I'm the only Jim Wire on either
  11420.                    of those two BBS's.  You can NET E-Mail me as 1@3950
  11421.                    on WWIVNet, 1@13950 on WWIVLink or 1@3950 on IceNET.
  11422.  
  11423.                    You might want to call my bbs at (319) 296-1529 and
  11424.                    make sure you have the latest version before you
  11425.                    install.
  11426.  
  11427. The Mod     : 1.   In the file bbs.c, function void dlmainmenu() search
  11428.                    for:
  11429.  
  11430.   if ((strcmp(s,"UPLOADALL")==0) && (dcs())) {
  11431.     i1=0;
  11432.     for (i=0; (i<64) && (udir[i].subnum>=0) && (!i1); i++) {
  11433.       nl();
  11434.       nl();
  11435.       outstr("Now uploading files for: ");
  11436.       pl(directories[udir[i].subnum].name);
  11437.       nl();
  11438.       i1=uploadall(udir[i].subnum);
  11439.     }
  11440.   }
  11441.   if ((strcmp(s,"UPLOAD")==0) && (dcs()))
  11442.     uploadall(udir[curdir].subnum);
  11443.  
  11444.  
  11445.                    and replace it with:
  11446.  
  11447.  
  11448.   if ((strcmp(s,"UPLOAD")==0) && (dcs())) {      /* finddup.mod */
  11449.     nl();                                        /* finddup.mod */
  11450.     prt(2,"Upload files in all dirs? ");         /* finddup.mod */
  11451.     if(yn()) {                                   /* finddup.mod */
  11452.       i1=0;                                      /* finddup.mod */
  11453.       for (i=0; (i<64) && (udir[i].subnum>=0) && (!i1); i++) {/* finddup.mod */
  11454.         nl();                                    /* finddup.mod */
  11455.         outstr("Uploading files in: ");    /* finddup.mod */
  11456.         pl(directories[udir[i].subnum].name);    /* finddup.mod */
  11457.         i1=uploadall(udir[i].subnum);            /* finddup.mod */
  11458.         checka(&abort,&next);                    /* finddup.mod */
  11459.         if (abort)                               /* finddup.mod */
  11460.           i1=1;                                  /* finddup.mod */
  11461.       }                                          /* finddup.mod */
  11462.     } else {                                     /* finddup.mod */
  11463.       uploadall(udir[curdir].subnum);            /* finddup.mod */
  11464.     }                                            /* finddup.mod */
  11465.   }                                              /* finddup.mod */
  11466.  
  11467.                    close bbs.c.
  11468.  
  11469. The Mod     : 2.   Open the file xfer.c.  Right below Wayne's header add:
  11470.  
  11471. #include <dir.h>                                 /* finddup.mod +*/
  11472. #define FD_VER_NO "1.00"                         /* finddup.mod +*/
  11473. #define FD_DATE "01/11/92"                       /* finddup.mod +*/
  11474.  
  11475. The Mod     : 3.   Still in the file xfer.c, function void upload(int dn),
  11476.  
  11477.                    A.  search for:
  11478.  
  11479.   int i,i1,i2,ok,xfer,f;
  11480.  
  11481.                        replace it with:
  11482.  
  11483.   int i,i1,i2,ok,xfer,f,here;                    /* finddup.mod +-*/
  11484.  
  11485.                    B.  search for:
  11486.  
  11487.   if ((ok) && (yn())) {
  11488.     sprintf(s1,"%s%s",d.path,s);
  11489.     if (exist(s1)) {
  11490.       if (dcs()) {
  11491.  
  11492.                        replace it with:
  11493.  
  11494.   if ((ok) && (yn())) {
  11495.     sprintf(s1,"%s%s",d.path,s);
  11496.     here=finddup(s);                             /* finddup.mod +*/
  11497.     dliscan1(dn);                                /* finddup.mod +*/
  11498.     d=directories[dn];                           /* finddup.mod +*/
  11499.     if ((exist(s1)) || (here)) {                 /* finddup.mod +-*/
  11500.       if ((dcs()) && (here)) {                   /* finddup.mod +-*/
  11501.  
  11502.                    C.  search for:
  11503.  
  11504.       if (ok) {
  11505.         if (ok==1) {
  11506.           f=open(s1,O_RDONLY | O_BINARY);
  11507.           if (f<0) {
  11508.  
  11509.                        replace it with:
  11510.  
  11511.       if (ok) {
  11512.         if ((ok==1) && (!here)) {                /* finddup.mod +-*/
  11513.           f=open(s1,O_RDONLY | O_BINARY);
  11514.           if (f<0) {
  11515.  
  11516.  
  11517.                    D.  search for:
  11518.  
  11519.           }
  11520.           if (ok && syscfg.upload_c[0]) {
  11521.             close(f);
  11522.             pl("Please wait...");
  11523.             if (check_ul_event(dn,&u)) {
  11524.  
  11525.                        replace it with:
  11526.  
  11527.           }
  11528.           if (ok && syscfg.upload_c[0] && !here) { /* finddup.mod +-*/
  11529.             close(f);
  11530.             pl("\r\nPlease wait...");            /* finddup.mod +-*/
  11531.             if (check_ul_event(dn,&u)) {
  11532.  
  11533.                    E.  search for:
  11534.  
  11535.         if (ok) {
  11536.           if (ok==1) {
  11537.             l=filelength(f);
  11538.             u.numbytes=l;
  11539.             close(f);
  11540.             ++thisuser.uploaded;
  11541.             thisuser.uk += ((l+1023)/1024);
  11542.           } else
  11543.             u.numbytes=0;
  11544.  
  11545.                        replace it with:
  11546.  
  11547.         if (ok) {
  11548.           if (ok==1) {
  11549.             if (!here) {                         /* finddup.mod +*/
  11550.               l=filelength(f);                   /* finddup.mod +=*/
  11551.               u.numbytes=l;                      /* finddup.mod +=*/
  11552.               close(f);                          /* finddup.mod +=*/
  11553.               ++thisuser.uploaded;               /* finddup.mod +=*/
  11554.               thisuser.uk += ((l+1023)/1024);    /* finddup.mod +=*/
  11555.             } else {                             /* finddup.mod +*/
  11556.               l=1000;                            /* finddup.mod +*/
  11557.               u.numbytes=l;                      /* finddup.mod +*/
  11558.             }                                    /* finddup.mod +*/
  11559.           } else
  11560.  
  11561.  
  11562.  
  11563.  
  11564. The Mod     : 4.   In the file xfer.c, function void removefile(),
  11565.  
  11566.                    A.  search for:
  11567.  
  11568.   int i,i1,ok,rm,abort,rdlp;
  11569.  
  11570.                        change it to:
  11571.  
  11572.   int i,i1,ok,rm,abort,rdlp,offline,f;           /* finddup.mod +-*/
  11573.  
  11574.                    B.  search for:
  11575.  
  11576.           if (dcs()) {
  11577.             prt(5,"Delete file too? ");
  11578.             rm=yn();
  11579.             if (rm) {
  11580.               prt(5,"Remove DL points? ");
  11581.               rdlp=yn();
  11582.             }
  11583.           } else
  11584.  
  11585.                        replace it with:
  11586.  
  11587.           if (dcs()) {
  11588.             prt(5,"Take file offline? ");        /* finddup.mod +*/
  11589.             offline=yn();                        /* finddup.mod +*/
  11590.             if(!offline) {                       /* finddup.mod +*/
  11591.               prt(5,"Delete file? ");            /* finddup.mod +-*/
  11592.               rm=yn();                           /* finddup.mod +-*/
  11593.               if (rm) {                          /* finddup.mod +-*/
  11594.                 prt(5,"Remove DL points? ");     /* finddup.mod +-*/
  11595.                 rdlp=yn();                       /* finddup.mod +-*/
  11596.               }                                  /* finddup.mod +-*/
  11597.             } else {                             /* finddup.mod +*/
  11598.               /* offline */                      /* finddup.mod +*/
  11599.               outstr("\r\nOffline\r\n");         /* finddup.mod +*/
  11600.               rm=1;                              /* finddup.mod +*/
  11601.               rdlp=0;                            /* finddup.mod +*/
  11602.             }
  11603.           } else
  11604.  
  11605.  
  11606.                    C.  search for:
  11607.  
  11608.               close_user();
  11609.             }
  11610.           }
  11611.           if (u.mask & mask_extended)
  11612.             delete_extended_description(u.filename);
  11613.           sprintf(s1,"-%s Removed off of %s",u.filename,
  11614.                             directories[udir[curdir].subnum].name);
  11615.           sysoplog(s1);
  11616.           for (i1=i; i1<numf; i1++) {
  11617.             SETREC(i1+1);
  11618.             read(dlf,(void *)&u,sizeof(uploadsrec));
  11619.             SETREC(i1);
  11620.             write(dlf,(void *)&u,sizeof(uploadsrec));
  11621.           }
  11622.           --i;
  11623.           --numf;
  11624.           SETREC(0);
  11625.           read(dlf, &u, sizeof(uploadsrec));
  11626.           u.numbytes=numf;
  11627.           SETREC(0);
  11628.           write(dlf,(void *)&u,sizeof(uploadsrec));
  11629.         }
  11630.       }
  11631.     }
  11632.     i=nrecno(s,i);
  11633.   }
  11634.   closedl();
  11635. }
  11636.  
  11637.                        replace it with:
  11638.  
  11639.  
  11640.               close_user();
  11641.             }
  11642.           }
  11643.           if (!offline) {                        /* finddup.mod +*/
  11644.             if (u.mask & mask_extended)          /* finddup.mod +=*/
  11645.               delete_extended_description(u.filename);/* finddup.mod +=*/
  11646.             sprintf(s1,"-%s Removed from %s",u.filename,/* finddup.mod +=*/
  11647.               directories[udir[curdir].subnum].name);/* finddup.mod +=*/
  11648.             sysoplog(s1);                        /* finddup.mod +=*/
  11649.             for (i1=i; i1<numf; i1++) {          /* finddup.mod +=*/
  11650.               SETREC(i1+1);                      /* finddup.mod +=*/
  11651.               read(dlf,(void *)&u,sizeof(uploadsrec));/* finddup.mod +=*/
  11652.               SETREC(i1);                        /* finddup.mod +=*/
  11653.               write(dlf,(void *)&u,sizeof(uploadsrec));/* finddup.mod +=*/
  11654.             }                                    /* finddup.mod +=*/
  11655.             --i;                                 /* finddup.mod +=*/
  11656.             --numf;                              /* finddup.mod +=*/
  11657.             SETREC(0);                           /* finddup.mod +=*/
  11658.             read(dlf, &u, sizeof(uploadsrec));   /* finddup.mod +=*/
  11659.             u.numbytes=numf;                     /* finddup.mod +=*/
  11660.             SETREC(0);                           /* finddup.mod +=*/
  11661.             write(dlf,(void *)&u,sizeof(uploadsrec));/* finddup.mod +=*/
  11662.           } else {                               /* finddup.mod +*/
  11663.             strcpy(s1,syscfg.dloadsdir);         /* finddup.mod +*/
  11664.             strcat(s1,"TRASHFIL\\");             /* finddup.mod +*/
  11665.             strcat(s1,u.filename);               /* finddup.mod +*/
  11666.             f=open(s1,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | 
  11667. S_IWRITE);/* finddup.mod +*/
  11668.             close(f);                            /* finddup.mod +*/
  11669.             sprintf(s1,"-%s on %s taken off line",u.filename,/* finddup.mod +*/
  11670.               directories[udir[curdir].subnum].name);/* finddup.mod +*/
  11671.             sysoplog(s1);                      /* finddup.mod +*/
  11672.           }                                    /* finddup.mod +*/
  11673.         }
  11674.       }
  11675.     }
  11676.     i=nrecno(s,i);
  11677.   }
  11678.   closedl();
  11679. }
  11680.  
  11681. The Mod     :5.    Still in the file xfer.c, at the end, add:
  11682.  
  11683. /* begin finddup.mod */
  11684.  
  11685. int finddup(char *fn)
  11686. {
  11687.   directoryrec d;
  11688.   int i,i2,here;
  11689.   char s1[MAXPATH],s2[MAXPATH];
  11690.   char fn_drive[MAXDRIVE];
  11691.   char fn_dir[MAXDIR];
  11692.   char fn_file[MAXFILE];
  11693.   char fn_ext[MAXEXT];
  11694.   char tf_drive[MAXDRIVE];
  11695.   char tf_dir[MAXDIR];
  11696.   char tf_file[MAXFILE];
  11697.   char tf_ext[MAXEXT];
  11698.   char in_fn[MAXFILE+MAXEXT];
  11699.   char arc_ext[MAXEXT];
  11700.  
  11701.   /* do not alter these next few lines.*/
  11702.   npr("\r\nFinddup, duplicate file prevention, version %s, dated %s,\r\n",
  11703.     FD_VER_NO,FD_DATE);
  11704.   npr("   by Jim Wire, HIT BBS.\r\n");
  11705.   /* Thank you.*/
  11706.   here=0;
  11707.   sprintf(in_fn,"%s",stripfn(fn));
  11708.   npr("\r\nStandby, checking for '%s' in other directories.\r\n",in_fn);
  11709.   closedl();
  11710.   for (i=0; (i<num_dirs) && (!hangup);i++){
  11711.     dliscan1(i);
  11712.     d=directories[i];
  11713.     if (thisuser.dsl>=d.dsl
  11714.       && (thisuser.age>=d.age)
  11715.       &! (d.dar && (d.dar & thisuser.dar)==0))
  11716.       pl(d.name);
  11717.     if (!here) {
  11718.       sprintf(s1,"%s%s",d.path,in_fn);
  11719.       sprintf(s2,"%s%s%s",syscfg.dloadsdir,"TRASHFIL\\",in_fn);
  11720.       if ((exist(s1)) || (exist(s2))) {
  11721.         here=1;
  11722.       } else {
  11723.         fnsplit(s1,fn_drive,fn_dir,fn_file,fn_ext);
  11724.         fnsplit(s2,tf_drive,tf_dir,tf_file,tf_ext);
  11725.         for (i2=0; (i2<4) && (!hangup) && (!here); i2++) {
  11726.           if (syscfg.arcs[i2].extension[0]
  11727.             && syscfg.arcs[i2].extension[0]!=' ') {
  11728.             sprintf(arc_ext,".%s",syscfg.arcs[i2].extension);
  11729.             fnmerge(s1,fn_drive,fn_dir,fn_file,arc_ext);
  11730.             if (exist(s1))
  11731.               here=1;
  11732.             if (i==0) {
  11733.               fnmerge(s2,tf_drive,tf_dir,tf_file,arc_ext);
  11734.               if (exist(s2))
  11735.                 here=1;
  11736.             }
  11737.           }
  11738.         }
  11739.       }
  11740.     }
  11741.     closedl();
  11742.   }
  11743.   return(here);
  11744. }
  11745.  
  11746. /* end finddup.mod */
  11747.  
  11748.  
  11749.                    Save the file xfer.c.
  11750.  
  11751. The Mod     :6.    In the file xferovl.c function int maybe_upload(char
  11752.                    *fn, int dn, char *desc),
  11753.  
  11754.                    A.  search for:
  11755.  
  11756.   int i,i1=0,ok=1;
  11757.  
  11758.                        replace it with:
  11759.  
  11760.   int i,ok=1,abort=0,next=0;                     /* finddup.mod +-*/
  11761.  
  11762.  
  11763.                    B.  search for:
  11764.  
  11765.   if (i==-1) {
  11766.     if (!upload_file(s,dn,desc))
  11767.       ok=0;
  11768.   } else {
  11769.     SETREC(i);
  11770.     read(dlf,(void *)&u, sizeof(uploadsrec));
  11771.     printinfo(&u,&i1);
  11772.     if (i1)
  11773.       ok=0;
  11774.   }
  11775.   return(ok);
  11776. }
  11777.  
  11778.                        replace it with:
  11779.  
  11780.   if (i==-1) {
  11781.     outstr("\r\n");                              /* finddup.mod +*/
  11782.     upload_file(s,dn,desc);                      /* finddup.mod +-*/
  11783.     checka(&abort,&next);                        /* finddup.mod +*/
  11784.     if (abort)                                   /* finddup.mod +*/
  11785.       ok=0;                                      /* finddup.mod +*/
  11786.   } else {
  11787.     SETREC(i);
  11788.     read(dlf,(void *)&u, sizeof(uploadsrec));
  11789.     outstr(".");                             /* finddup.mod +*/
  11790.     checka(&abort,&next);                        /* finddup.mod +*/
  11791.     if (abort)                                   /* finddup.mod +*/
  11792.       ok=0;                                      /* finddup.mod +*/
  11793.   }
  11794.   return(ok);
  11795. }
  11796.  
  11797. The Mod     :7.    Make fcns and make.
  11798.  
  11799. The Mod     :8.    Make a sub directory in your INIT, path, download
  11800.                    directory named TRASHFIL.  That ought to do it.
  11801.                    Example:  Download path=c:\bbs\dloads, add the
  11802.                    directory c:\bbs\dloads\trashfil.
  11803.  
  11804. REGISTRATION:
  11805.  
  11806.   FEE:       ShareWare authors, a registered copy of your product.
  11807.              Obtain approval prior to sending the product.
  11808.  
  11809.              Registered Clout users $5.00, be sure to include your
  11810.              node number(s) and WWIV registration number.
  11811.  
  11812.              All others $10.00, be sure to include your node number(s)
  11813.              and WWIV registration number.
  11814.  
  11815.   SEND TO:   Jim Wire
  11816.              1315 West 4th Street
  11817.              Waterloo, IA 50702
  11818.  
  11819. END OF FILE
  11820.  
  11821.  
  11822.  
  11823.  
  11824.  
  11825.  
  11826. [84/99]: Prelude to AKID4.MOD
  11827. [Name ]: Analog Kid #1 @5482
  11828. [Date ]: Sat Jan 11 16:49:43 1992
  11829. [From ]: Permanent Waves (Montreal, Canada)
  11830.  
  11831.     Dear fellow WWIVphiloi:
  11832.  
  11833.     I decided to venture on a three-column external door display mod and
  11834. believe to have created a fairly decent one.  True... there are many such mods
  11835. out there, but I just had to sit my ass down and write out my own.  Being a
  11836. relatively new C programmer and (perhaps? hopefully) a humble one, I welcome
  11837. all criticism of my programming style.  So please feel free to pass me your
  11838. suggestions.  What follows below, is the display the mod gives your board if
  11839. you use it as it is (this is how it would look like on Permanent Waves for
  11840. the regular user).  Should you decide to use it, remember to back up your
  11841. source codes prior to doing so.
  11842.  
  11843.                           ──══ External Programs ══──
  11844.  
  11845. [ 1] Time Bank             [ 2] The Pit v1.16         [ 3] Global Wars       
  11846. [ 4] Trade Wars 2002       [ 5] Pimp Wars v1.12       [ 6] Desert Race       
  11847. [ 7] Dragon's Hoard        [ 8] Marvel                [ 9] Nuclear Strike    
  11848. [10] Nex v1.0              [11] Food Fight!           [12] CL Football       
  11849. [13] BBS Chess v1.4        [14] Mat Mania         
  11850.  
  11851. Which (Q=Quit, ?=List) : 
  11852.  
  11853.     The actual mod follows on the next post.  Should you have any difficulties
  11854. whatsoever, please let me know immediately.  The mod works just fine on 
  11855. Permanent Waves (which is run on WWIV 4.20, but it probably will also do for
  11856. earlier versions as well).
  11857.  
  11858.     "I wish that at the river's end we could be taken up into the clouds
  11859.      And fall like rain, back to the beginning."
  11860.                                                  - Free Will
  11861.  
  11862.     αñα£og kï√   (1@5482)
  11863.     SysOp of Permanent Waves
  11864.  
  11865.  
  11866.  
  11867.  
  11868.  
  11869.  
  11870. [85/99]: AKID4.MOD
  11871. [Name ]: Analog Kid #1 @5482
  11872. [Date ]: Sat Jan 11 16:51:43 1992
  11873. [From ]: Permanent Waves (Montreal, Canada)
  11874.  
  11875. AKID4.MOD for WWIV 4.20
  11876.  
  11877. Programmed by the Analog Kid, 1@5482
  11878.                of Permanent Waves BBS
  11879.                (514) 844-0214
  11880.                Montreal, Quebec,
  11881.                Canada
  11882.  
  11883. Makes a three-column external door display, with colours.  Will do so
  11884. provided that the user has a display width length of at least 80 
  11885. characters (otherwise, a single column is printed while maintaining
  11886. the colours).
  11887.  
  11888. Instructions:  Open your BBSUTL1.C file, search for function "show_chains"
  11889. and replace it with the one following (patch and paste your way through).
  11890.  
  11891.  
  11892.  
  11893. void show_chains(int *mapp, int *map)     /* AKID4.MOD, by the Analog Kid */
  11894. {                                         /* Permanent Waves BBS, 1@5482  */
  11895.   int abort,i,posit;                      /* Montreal, Quebec, Canada     */
  11896.   char s[102],s1[90];                     /* (514) 844-0214               */
  11897.  
  11898.   abort=posit=i=0;
  11899.   nl();
  11900.   if (thisuser.screenchars<80)
  11901.   {
  11902.     pl("──══ External Programs ══──");
  11903.     nl();
  11904.     for (i=0; (i<*mapp) && (!abort) && (!hangup); i++)
  11905.     {
  11906.       sprintf(s1,"[%2d] %s",i+1,chains[map[i]].description);
  11907.       pla(s1,&abort);
  11908.     }
  11909.   }
  11910.   else
  11911.   {
  11912.     pl("                          ──══ External Programs ══──");
  11913.     nl();
  11914.     while ((i<*mapp) && (!abort) && (!hangup))
  11915.     {
  11916.       sprintf(s1,"[%2d] %s",i+1,chains[map[i]].description);
  11917.       if (strlen(s1)>31)
  11918.         s1[31]=0;
  11919.       else
  11920.         while (strlen(s1)<=30)
  11921.           strcat(s1," ");
  11922.       if (posit!=0)
  11923.       {
  11924.         strcat(s,"    ");
  11925.         strcat(s,s1);
  11926.         if (posit==2)
  11927.         {
  11928.           pla(s,&abort);
  11929.           posit=0;
  11930.         }
  11931.         else
  11932.           posit=2;
  11933.       }
  11934.       else
  11935.       {
  11936.         strcpy(s,s1);
  11937.         posit=1;
  11938.       }
  11939.       i++;
  11940.     }
  11941.     if (posit!=0)
  11942.       pla(s,&abort);
  11943.   }
  11944.   nl();
  11945. }
  11946.  
  11947.  
  11948.  
  11949. Disclaimer:  It works well on Permanent Waves... I believe it should do
  11950. likewise on your board.  I cannot, however, be held in any way responsible
  11951. if things go awry in one way or another.  Let me know if you are having 
  11952. difficulty and I'll do my very best to assist you - but don't come 
  11953. running to me because of mod frustrations that resulted in the death of
  11954. your dog named Rex.
  11955.  
  11956. Please do me a favour:  All criticism, suggestions and (especially!)
  11957. praising are very welcome and kindly asked for.  Please do yourself
  11958. a favour:  Insert Roll The Bones into stereo, play loud.  Many Thanks.
  11959.  
  11960.      αñα£og kï√ (1@5482)
  11961.      SysOp of Permanent Waves
  11962.  
  11963.  
  11964.  
  11965.  
  11966.  
  11967.  
  11968.  
  11969. [86/99]: DOSCAN.MOD - Official Release
  11970. [Name ]: Viper #64 @5060
  11971. [Date ]: Sat Jan 11 16:26:43 1992
  11972. [From ]: Fuzzball Land (Unknown Area)
  11973.  
  11974.  
  11975. Mod Name: DOSCAN.MOD
  11976. Mod Author: Viper
  11977. Mod Date: 1/11/92
  11978. Version: 4.2a-e
  11979. Author can be reached at: in the WWIVNet:  71 @ 5061 or
  11980.                                            28 @ 5067
  11981.                           in the WWIVLink: 65 @15054
  11982. Mod Description: This mod will allow your users to do a newscan
  11983.                  automatically after the the mail prompt. This
  11984.                  can be altered to be automatically done for all
  11985.                  users if a majority don't do newscans and just
  11986.                  run for the online games section.
  11987. Mod Idea: My own, i haven't seen any other one like this, came up with
  11988.           it because i notice a lot of people on a board i call just head
  11989.           straight for the online games section or the file section.
  11990.  
  11991. Files Effected: LILO.C, DEFAULTS.C, VARDEC.H (yeech!)
  11992.  
  11993. Disclaimer: You installed it, its your fault!
  11994.  
  11995. On with the mod!
  11996.  
  11997. -=-= Step 0 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  11998.  
  11999.  Backup your source, you never know when you might type
  12000.  in something wrong!
  12001.  
  12002. -=-= Step 1 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12003.  
  12004. Load up VARDEC.H and make the following addtions.
  12005.  
  12006. search for userrec.sysstatus and add the following.
  12007.  
  12008. #define sysstatus_funky_colors 0x0100
  12009. #define sysstatus_clr_scrn 0x0200
  12010. #define sysstatus_do_newscan 0x0400     /* DOSCAN.MOD *//* ADD */
  12011.  
  12012. /* slrec.ability */
  12013. #define ability_post_anony 0x0001
  12014.  
  12015. ok now save VARDEC.H
  12016.  
  12017. -=-= Step 2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12018.  
  12019. Load up DEFAULTS.C and make the following changes and additions.
  12020.  
  12021. in void print_cur_stat(); add the following
  12022.  
  12023. search down a little for this:
  12024.  
  12025.   }
  12026.   npr("B. Optional lines    : %d\r\n",thisuser.optional_val); /* Search for */
  12027.   npr("C. N-Scan After Mail : %s\r\n",                       /* DOSCAN.MOD */
  12028.       (thisuser.sysstatus & sysstatus_do_newscan)?"Yes":"No"); /* DOSCAN.MOD */
  12029.   if (thisuser.wwiv_regnum)
  12030.  
  12031.  
  12032.   ok, then in void defaults(); make these changes.
  12033.  
  12034.     helpl=4;
  12035.     if (okansi()) {
  12036.       prt(2,"Defaults: (1-9,A-C,?,Q) : ");  /* DOSCAN.MOD *//*Change*/
  12037.       ch=onek("Q?123456789ABCW");           /* DOSCAN.MOD *//*Change*/
  12038.     } else {
  12039.       prt(2,"Defaults: (1-7,B-C,?,Q) : ");  /* DOSCAN.MOD *//*Change */
  12040.       ch=onek("Q?1234567BCW");              /* DOSCAN.MOD *//*Change */
  12041.     }
  12042.     switch(ch) {
  12043.  
  12044. ok then a little farther down in the same void add this.
  12045.  
  12046.  
  12047.       case 'B':
  12048.         optional_lines();
  12049.         break;                 /* Search for this */
  12050.       case 'C':                                          /* DOSCAN.MOD */
  12051.         if (thisuser.sysstatus & sysstatus_do_newscan)   /* DOSCAN.MOD */
  12052.           thisuser.sysstatus ^= sysstatus_do_newscan;    /* DOSCAN.MOD */
  12053.        nl();                                             /* DOSCAN.MOD */
  12054.        prt(,2"Do you want to a N-Scan all areas after you read your 
  12055. mail\r\n"); /* DOSCAN.MOD */
  12056.        prt(2,"automatically? ");                         /* DOSCAN.MOD */
  12057.         if (yn())                                        /* DOSCAN.MOD */
  12058.         thisuser.sysstatus |= sysstatus_do_newscan;      /* DOSCAN.MOD */
  12059.         break;                                           /* DOSCAN.MOD */
  12060.       case 'W':
  12061.         enter_regnum();
  12062.  
  12063. ok, now save DEFAULTS.C.
  12064.  
  12065. -=-= Step 3 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12066.  
  12067. Load up LILO.C and make the following addtions and changes.
  12068.  
  12069. in the function void logon(); near the end of the void add this.
  12070.  
  12071.     nl();
  12072.     nl();
  12073.   }
  12074.   if (thisuser.sysstatus & sysstatus_do_newscan) {  /* DOSCAN.MOD */
  12075.     express=0;                                      /* DOSCAN.MOD */
  12076.     expressabort=0;                                 /* DOSCAN.MOD */
  12077.     nscan(0);                                       /* DOSCAN.MOD */
  12078.    }                                                /* DOSCAN.MOD */
  12079.   save_status();
  12080.   create_chain_file("CHAIN.TXT");
  12081. }
  12082.  
  12083.  
  12084. void logoff()
  12085. {
  12086.  
  12087. ok, now save LILO.C
  12088.  
  12089. -=-= Step 4 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12090.  
  12091. Now, compile the WHOLE bbs, cause you screwed with a header file.
  12092. There shouldn't be any errors, and i tested it fairly well. If you
  12093. any trouble installing this leave email to me at one of the bbs's
  12094. mentioned at the top. If you use this mod mail me telling me your
  12095. opinion of it. This is my first actual mod, and i hope to come out
  12096. with more.
  12097.  
  12098.  
  12099.  
  12100.  
  12101.  
  12102.  
  12103.  
  12104. [87/99]: This is Dawg03A.Mod  (Updated time compensation)
  12105. [Name ]: Dawg #1079 @5252
  12106. [Date ]: Sun Jan 12 23:33:53 1992
  12107. [From ]: The Dragon's Den [ASV] (South/Central Texas)
  12108.  
  12109.                 Time Compensation Mod  (DAWG03A.MOD)
  12110.                     by Dawg, 1@ 3472 (WWIVnet)
  12111.                              1@13472 (WWIVlink)
  12112.  
  12113.  
  12114.  
  12115. Okay here is DAWG03A.MOD.  It it a time compensation mod for posts.  The
  12116. main difference between this and the original revision is that this one
  12117. uses less dgroup.  The code is also more efficient, although I'm sure it
  12118. could still be done better, I'm not a very proficient programm!
  12119.  
  12120. Basically this mod came from Too $hort (1@3466 net), and the basic idea came
  12121. from Tolkien (1@3456 net).  Now that we have that out of the way, on to the
  12122. mod.  Basically Too $hort's mod is a good mod;  however, there were a couple
  12123. of things I didn't like about it.  One is that it gave the time back for posts
  12124. but also email.  I have taken care of that, although if you delete two small
  12125. lines you can put it back in.  Also, it only told how many minutes of time
  12126. it gave back.  Basically nothing wrong with that, but it looked weird if
  12127. a post took less than one minute.  The last thing was that while I am not
  12128. really a 'C' programmer, I do have a decent knowledge of Pascal.  Well I 
  12129. decided that the Div command would be much more workable and require less
  12130. code that Too $hort's method.  I then looked through the commands for 'C'.
  12131. Much to my suprise, the Div command in 'C' is much nicer than the one I used
  12132. in Pascal.  It returns the quotient and remainder.  Makes the mod much more
  12133. simple and takes less code.
  12134.  
  12135. Please back up your source first.  This is a simple mod, but in case
  12136. something goes wrong you will have a working copy that way.  I suppose this
  12137. could be abused.  
  12138.  
  12139. This mod does NOT remove time for posts removed.  The reason is that it only
  12140. gives the amount of time spent on making the post.  So they are only getting
  12141. reimbursed for the whole time spent on making a post.  Nothing extra (although
  12142. it would be simple to do that as well), so if they post just to get bonus
  12143. time, they aren't doing theyselves any good.
  12144.  
  12145.  
  12146. ============================================================================
  12147. Revision history:
  12148.  
  12149. rev 1.0 - Original mod, worked pretty well.  Released as Dawg03.Mod.
  12150.  
  12151. rev 1.1 - Rewritten to use less code.  More efficient as well.  Made sure
  12152.           it's compatible with 4.20e.  Released as Dawg03a.Mod.
  12153. ============================================================================
  12154.  
  12155. The entire mod is in void inmsg which is in MSGBASE.C.  You need to add the
  12156. following to the variable declarations at the top.
  12157.  
  12158. -------------------------------------------------------------
  12159.  
  12160.   double start,end,totalt;  /* ADD */
  12161.   div_t tcomp;              /* ADD */
  12162.  
  12163. -------------------------------------------------------------
  12164.  
  12165. Then add this line immediately after all the declarations
  12166. -------------------------------------------------------------
  12167.  
  12168.   start=nsl();     /*ADD*/
  12169.  
  12170. -------------------------------------------------------------
  12171.  
  12172. Now here is the bulk of the code.  I would suggest block reading it in.
  12173. Note:  Read the rest of the mod first as there is a second version later
  12174. on that is shorter.  However, in my opinion, it isn't as nice as this
  12175. one here.  Pick whichever you prefer though.
  12176. ---------------------------------------------------------------
  12177.  
  12178.  
  12179.   outstr("Saving...");  /*existing line*/
  12180.  
  12181. /***********************************************************************/
  12182. /***  Add this entire section of code.  Note:  A couple of lines are ***/
  12183. /***  split for space reasons, make sure to combine them back as one ***/
  12184. /***  line when you mod this into the source.                        ***/
  12185. /***********************************************************************/
  12186. nl();
  12187. end=nsl();
  12188. totalt=start-end;
  12189. tcomp=div(totalt,60);
  12190. if (strcmp(aux,"EMAIL")!=0) {    /* Note 1 */
  12191.   if (tcomp.quot!=0) {
  12192.     sprintf(s,"^C1Granted  ^C2%u ^C1Minute",tcomp.quot);
  12193.     if (tcomp.quot!=1)
  12194.       strcat(s,"^C1s");
  12195.       strcat(s,"^C1 and");
  12196.     }
  12197.     else
  12198.       strcpy(s,"^C1Granted");
  12199.     if (tcomp.rem!=0) {
  12200.       sprintf(s1," ^C2%u ^C1Second",tcomp.rem);
  12201.       if (tcomp.rem!=1)
  12202.         strcat(s1,"^C1s");
  12203.     }
  12204.     strcat(s1," for that post.");
  12205.     strcat(s,s1);
  12206.     pl(s);
  12207.     thisuser.extratime+=totalt;
  12208.   } /* NOTE 1 */
  12209. /*************************************************************************/
  12210. /***  Original code starts back up here                                ***/
  12211. /*************************************************************************/
  12212.         if (fsed) {
  12213.  
  12214. ---------------------------------------------------------------------------
  12215.  
  12216. Okay, I did not want to give time compensation for emails.  If you
  12217. wish to do that, just delete the two lines that say /* NOTE 1 */.  That
  12218. will then give compensation for emails and feedbacks. 
  12219.  
  12220.  
  12221. Well a couple of things here:
  12222.  
  12223. 1) BACK UP YOUR SOURCE!
  12224. 2) I am NOT RESPONSIBLE if (insert your favorite disaster here)!
  12225. 3) Make sure you change the ^C to the heart character.
  12226.     (In the Turbo C editor it is CTRL-P, the CTRL-C, but editors vary!)
  12227. 4) I will provide any help I can if you need it.  Feel free to email me
  12228.     at either of the above addresses.
  12229.  
  12230. Well that's all for now!
  12231.  
  12232. DAW
  12233.  
  12234.  
  12235.  
  12236.  
  12237.  
  12238.  
  12239. [88/99]: Addition to the Side-By-Side Sub List
  12240. [Name ]: Wafwot #2 @2632
  12241. [Date ]: Sat Jan 11 13:46:04 1992
  12242. [From ]: The Evening Post (Washington)
  12243.  
  12244. RE: BBBOB01.MOD - Side-by-Side Subs/Dirs Listing
  12245. BY: Bitbytebob #11 @6750
  12246.  
  12247. If you installed the side-by-side sub list mod, you might want to change
  12248. the size of title you can enter into BOARDEDIT so that you don't chop
  12249. the names off in the sublist.  It's quite simple...and after I changed
  12250. it, I went and changed the titles of the subs... and ALL of the subs fit.
  12251.  
  12252. Step 1. Always back up the source.  I am rewriting a few voids 'cause I
  12253.         didn't.
  12254.  
  12255. Step 2. In SUBEDIT.C look for this block of code... and change the one
  12256.         line indicated.
  12257.  
  12258.  
  12259.     prt(2,"Which (A-M,Q) ? ");
  12260.     ch=onek("QABCDEFGHIJKLMN");
  12261.     switch(ch) {
  12262.       case 'Q':done=1; break;
  12263.       case 'A':
  12264.         nl();
  12265.         prt(2,"New name? ");
  12266.         inputl(s,29);             /* CHANGE from 40 to 29 */
  12267.         if (s[0])
  12268.           strcpy(r.name,s);
  12269.         break;
  12270.       case 'B':
  12271.  
  12272. Step 3. Recompile. Simple. No more chopped of titles in a side-by-side
  12273.         listing.
  12274.  
  12275. Wafwot #2 @2632
  12276. The Evening Post BBS.
  12277.  
  12278.  
  12279.  
  12280.  
  12281.  
  12282.  
  12283. [89/99]: Fix for the userlist at logon mod...
  12284. [Name ]: Philip Trauring #1 @6750
  12285. [Date ]: Sun Jan 12 20:08:33 1992
  12286. [From ]: Interface (Massachusetts)
  12287.  
  12288. I noticed that if a user is in a sub that doesn't allow access to all the user 
  12289. on the BBS, and then logs off...then when it is run it will list the user that 
  12290. are allowed only in that sub which the person was in...so I have a quick fix...
  12291. (I think it's a fix...it makes sense to me) The fix is only the addition of one line...noted with the /* Add - Fix */...I hard coded in sub 1 because I assumed most people allow all their users into sub 1...but if you don't then change the 1 to something else...(Actually, since the boardedit starts at 0 might the 
  12292. cursub number start at 0? I don't know...I'm just a dumb hacker...cya)
  12293.  
  12294. ==============
  12295. Ok...well I was looking through the Mod Net sub a few minutes ago and I
  12296. saw a request for a mod to allow users to logon to the BBS using their real
  12297. name...the reason given was that users sometimes forget their usernames and
  12298. this would make it easier...Although I didn't write that mod, I did write up
  12299. a two-second hack that will help out users who have forgotten their passwords.
  12300. All this mod does is show the user list if the user types ? at the NN: prompt.
  12301. It's not elegant, I didn't go far into the code to make it not give the
  12302. 'Unknown User' message or anything like that...but it works okay and it takes
  12303. about a tenth of the time it took you to read this long intro...oh well...
  12304.  
  12305. 1) Goto UTILITY.C and search for 'findu'
  12306.  
  12307. 2) Add the 3 lines commented with the /* Add */ to your code
  12308.  
  12309. unsigned int finduser(char *s)
  12310. {
  12311.   int un;
  12312.   smalrec *sr;
  12313.   userrec u;
  12314.   char *ss;
  12315.  
  12316.   if (strcmp(s,"?")==0) {    /* Add */
  12317.     cursub=1;                /* Add - Fix */
  12318.     list_users();            /* Add */
  12319.     return(0); }             /* Add */
  12320.   if (strcmp(s,"NEW")==0)
  12321.     return(-1);
  12322.  
  12323. 3) Say 'that was the shortest mod I've ever added' 3 times...
  12324.  
  12325. 4) If you want you might want to change the following line from LILO.C:
  12326.  
  12327.       pl("This time is reserved for net-mail ONLY.");
  12328.       pl("Please try calling back again later.");
  12329.     } else
  12330.       pl("Enter number or name or 'NEW'"); /*This Line*/
  12331.     outstr("NN: "); /* DON'T change the NN: prompt. */
  12332.     input(s,30);
  12333.  
  12334.  
  12335. to something like:
  12336.  
  12337.       pl("Enter number, name, 'NEW', or ? to list usernames");
  12338. or
  12339.       pl("Enter your username, your number, 'NEW' to create a new");
  12340.       pl("account, or '?' to list all current usernames and numbers.");
  12341.  
  12342. 5) That's all folk's....what a grand production...now just run your makefile
  12343. and re-compile quickly since it's only one file, or for fun add a space or
  12344. something to one of the *.H files and then recompile so you have to wait for
  12345. two hours! It's so much more fun...
  12346.  
  12347. Well, I think I'm done(I'm pretty sure anyways) so whether you like it...or if
  12348. you hate it(I'm not picky)...give my BBS a call...I have 1000's of mod online
  12349. just waiting to be leeched...bye!(finally...)
  12350.  
  12351.      Phil
  12352.      1@6750
  12353.  
  12354. Interface BBS - (617) 734-2053 - USR DS - IBM and Mac Support
  12355. SNARFable - Over 1000 WWIV mods online! - SysOp: Philip Trauring
  12356. "Sometime they'll give a war and nobody will come." - Carl Sandburg
  12357.  
  12358.  
  12359.  
  12360.  
  12361.  
  12362.  
  12363. [90/99]: CHATCMDS.MOD - for use with CHATWISH.MOD 
  12364. [Name ]: Viper #88 @5071
  12365. [Date ]: Sun Jan 12 16:40:30 1992
  12366. [From ]: Special F/X (Unknown Area)
  12367.  
  12368.  
  12369. Mod Name: CHATCMDS.MOD
  12370. Mod Author: Viper
  12371. Mod Date: 1/12/92
  12372. Version: 4.2a-e
  12373. Author can be reached at: in the WWIVNet:  71 @ 5061 or
  12374.                                            28 @ 5067
  12375.                           in the WWIVLink: 65 @15054
  12376. Mod Description: This is my second actual mod being posted on the net.
  12377.                  This is a mod for you who have added Admiral Connor's
  12378.                  CHATWISH mod, what this will do, is if you request a chat
  12379.                  with a user and he ignores it for a while but you forgot
  12380.                  to turn off the scrol lock key, it will allow him to
  12381.                  hangup on himself. It also has another command added in
  12382.                  where it prints a help file for the user to see the
  12383.                  commands that he can use. This mod can have many other
  12384.                  commands added to it, you just got to figure it out.
  12385.  
  12386. Mod Idea: Mine, I thought of it. Well as in the description, if you happen
  12387.           to forget to turn off the scrol lock key, the user can hangup on
  12388.           himself and then he can log himself off.
  12389.  
  12390. Files Effected: CONIO.C
  12391.  
  12392. Disclaimer: You installed it, its your fault!
  12393.  
  12394. On with the mod!
  12395.  
  12396. -=-= Step 0 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12397.  
  12398.  Backup your source, you never know when you might type
  12399.  in something wrong!
  12400.  
  12401. -=-= Step 1 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12402.  
  12403. Load up CONIO.C and add the following to case's.
  12404.  
  12405. in void two_way_chat(blah, blah...)
  12406.  
  12407.                           }
  12408.                     }
  12409.               }
  12410.             break;
  12411.           case 15: /* Ctrl-O */     /* CHATCMDS.MOD *//* Add from here */
  12412.             outstr("\x1b[2J");
  12413.             printfile("CHATHELP");
  12414.             break;
  12415.           case 17: /* Ctrl-P */
  12416.            outstr("\x1b[2J");
  12417.            prt(4,"Sorry, I forgot to turn off the scroll lock.\r\n");
  12418.            prt(4,"Call back and you can resume whatever you were doing");
  12419.              nl();
  12420.              pausescr();
  12421.              hangup=1;
  12422.              break;                 /* CHATCMDS.MOD *//* To here */
  12423.         }
  12424.   } while ((done==0) && (hangup==0));
  12425.  
  12426.   if (ch!=13)
  12427.  
  12428. -=-= Step 2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  12429.  
  12430. Compile CONIO.C only, no need to do them all.
  12431.  
  12432.  
  12433.  Ohh, one more thing, this will not work in the regular chat screen, if
  12434.  you want to add this to the regular chat, you have to go into the void
  12435.  inli(blah, blah...); and insert the Ctrl-Q case in there somewhere. But
  12436.  other than that, it will work perfectely in 2 way chat
  12437.  
  12438.  
  12439.  
  12440.  
  12441.  
  12442.  
  12443. [91/99]: BBBOB02.MOD - Allows DGBG to work with WWIV
  12444. [Name ]: Bitbytebob #11 @6750
  12445. [Date ]: Tue Jan 14 14:35:46 1992
  12446. [From ]: Interface (Massachusetts)
  12447.  
  12448. ****************************************************************************
  12449.                                BBBOB02.MOD
  12450. Written by  : BitByteBob 1@6755
  12451. For         : WWIV v4.2e (Should work with v4.11 and v4.12 and others)
  12452. Date        : January 14th, 1992
  12453. Difficulty  : Simple, 2 lines
  12454. Description : DGBG (Damn Good Bulletin Generator) is a nifty utility that
  12455.                 creates .ANS files.  This little mod allows the file DGBG
  12456.                 creates to work correctly with WWIV.  It intercepts ASCII 01
  12457.                 with a subtype of 255 (file) and waits for a return.
  12458. *****************************************************************************
  12459.  
  12460. 1) Backup that source code!
  12461.  
  12462. 2) Call up MSGBASE.C, and find the line:
  12463.  
  12464.  
  12465. 3) Find routine read_message1(), find the following code:
  12466.    following routines:
  12467.  
  12468.  
  12469.           if ((ch==3) || (ch==8))                  /* find */        
  12470.             --p1;                                  /* find */
  12471.           else                                     /* find */
  12472.             ++p1;                                  /* find */
  12473.           if ((ch==32) && (!centre))               /* find */
  12474.             printit=1;                             /* find */
  12475.         }                                          /* find */
  12476.  
  12477.         if( ch==1 && m.storage_type == 255 )       /* added for BBBOB02.MOD */
  12478.           mmkey(0);                                /* added for BBBOB02.MOD */
  12479.  
  12480.         if ((printit) || (ansi) || (p>=80)) {      /* find */
  12481.           printit=0;                               /* find */
  12482.           if (centre && (ctrld!=-1)) {             /* find */
  12483.  
  12484. 4) Run the make, and have fun!
  12485.  
  12486.  
  12487.  
  12488. Disclaimer:  The author of this mod is not responsible for anything this mod
  12489.              does to affect your bbs.  It has been tested and works fine with
  12490.              my WWIV4.20e.  If you have trouble, email me and ill see what I
  12491.              can do to fix the bugs.
  12492.  
  12493.  
  12494.  
  12495.  
  12496.  
  12497.  
  12498. [92/99]: As requested: MAILALL.MOD; by Ethereal Cereal/|\/|erlin!
  12499. [Name ]: Scooby #1 @2557
  12500. [Date ]: Tuesday, January 14, 1992   7:39 pm
  12501. [From ]: \/ikings (Pennsylvania)
  12502.  
  12503.  
  12504. Ethereal Cereal #16 @16853
  12505. Wed Jan 08 11:18:41 1992
  12506.                                 MultiMail to All
  12507.                                  (MAILALL.MOD)
  12508.  
  12509.                                   Version 2.0
  12510.                                        by
  12511.                                 Ethereal Cereal
  12512.  
  12513.  
  12514. I've been asked by a few of the visiting sysops on my system to release my
  12515. multimail to all users mod.  This one is pretty easy to install, but I'm sure
  12516. there are better ways to go about it.  For example, it will continuously ask
  12517. you for a title.  Anyhow it does work.
  12518.  
  12519. As usual with most of these mods, the author (me) takes no resposibility
  12520. what-so-ever if this mod causes your cat to jump on your keyboard and
  12521. delete every user you have or if your modem decides it doesn't like you
  12522. and fries itself, committing datacide...
  12523.  
  12524. ───────────────────────────────────────────────────────────────────────────────
  12525.  
  12526.                               Crispy Software #5
  12527.                               Ethereal Cereal #16
  12528.  
  12529.         Multi-Networked     The Downtown Tower       Multi-Lined (soon)
  12530.        Home of CrispySoft  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀      WWIV On A LAN (Host)
  12531.          618-234-6892         WWIVlink: @16853       USR Dual Standard
  12532.          Sysop Autoval        FredNET : @6888        700+ WWIV Files Online
  12533.          WL2SP Support        WWIVnet : @6866        Snarfable!
  12534.                   More Fun Than A Normal Human Being Can Stand
  12535. ───────────────────────────────────────────────────────────────────────────────
  12536.  
  12537. /***********************/
  12538. /*     L E G E N D     */
  12539. /***********************/
  12540. /* - = Deleted Line    */
  12541. /* + = New Line        */
  12542. /* # = Existing Line   */
  12543. /* ! = Modified Line   */
  12544. /* * = Search For Line */
  12545. /***********************/
  12546.  
  12547.  
  12548.  
  12549. Step #1  -- MULTMAIL.C
  12550. Function -- N/A
  12551. Comments --  add this function
  12552.  
  12553. void mailall()
  12554. /* MOD -- MAILALL.MOD v2.  Allows you to Multimail ALL users on the system */
  12555. {
  12556.   int i,i1,f,len,an,cv,ok;
  12557.   mailrec m,m1;
  12558.   char s[81],s1[81],t[81];
  12559.   userrec ur;
  12560.   slrec ss;
  12561.  
  12562.   if (freek1(syscfg.msgsdir)<10.0) {
  12563.     nl();
  12564.     pl("Sorry, not enough disk space left.");
  12565.     nl();
  12566.     return;
  12567.   }
  12568.   nl();
  12569.   sprintf(s,"%sEMAIL.DAT",syscfg.datadir);
  12570.   ss=syscfg.sl[actsl];
  12571.  
  12572.   if (ss.ability & ability_email_anony)
  12573.     i=anony_enable_anony;
  12574.   else
  12575.     i=0;
  12576.   m.msg.storage_type=EMAIL_STORAGE;
  12577.   strcpy(irt,"Mail to ALL Users");
  12578.   irt_name[0]=0;
  12579.   inmsg(&m.msg,t,&i,1,"EMAIL",ALLOW_FULLSCREEN);
  12580.   if (m.msg.stored_as==0xffffffff)
  12581.     return;
  12582.   strcpy(m.title,t);
  12583.   m.anony=i;
  12584.   m.fromsys=0;
  12585.   m.fromuser=usernum;
  12586.   m.tosys=0;
  12587.   m.touser=0;
  12588.   m.status=status_multimail;
  12589.   time((long *)&(m.daten));
  12590.   f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  12591.   len=(int) filelength(f)/sizeof(mailrec);
  12592.   if (len==0)
  12593.     i=0;
  12594.   else {
  12595.     i=len-1;
  12596.     lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  12597.     read(f,(void *)&m1,sizeof(mailrec));
  12598.     while ((i>0) && (m1.tosys==0) && (m1.touser==0)) {
  12599.       --i;
  12600.       lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  12601.       i1=read(f,(void *)&m1,sizeof(mailrec));
  12602.       if (i1==-1)
  12603.         pl("DIDN'T READ RIGHT.");
  12604.     }
  12605.     if ((m1.tosys) || (m1.touser))
  12606.       ++i;
  12607.   }
  12608.   lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  12609.   pl("Mail sent to:");
  12610.   sysoplog("Multi-Mail sent to all users . . .");
  12611.  
  12612.   for (cv=0; cv<status.users; cv++) {
  12613.     read_user(smallist[cv].number,&ur);
  12614.     ok=1;
  12615.     if (((ur.sl==255) && (ur.waiting>(syscfg.maxwaiting * 5))) ||
  12616.         ((ur.sl!=255) && (ur.waiting>syscfg.maxwaiting)) ||
  12617.         (ur.waiting>200)) {
  12618.       sprintf(s,"%s  mailbox full, not sent.",nam(&ur,smallist[cv].number));
  12619.       sysoplog(s);
  12620.       npr(s);
  12621.       nl();
  12622.       ok=0;
  12623.     }
  12624.     if (ur.inact & inact_deleted) {
  12625.       sprintf(s,"User #%d deleted, not sent.",smallist[cv].number);
  12626.       sysoplog(s);
  12627.       npr(s);
  12628.       nl();
  12629.       ok=0;
  12630.     }
  12631.  
  12632.     if (ok) {
  12633.       m.touser=smallist[cv].number;
  12634.       write(f,(void *)&m,sizeof(mailrec));
  12635.       strcpy(s,"   ");
  12636.       ++ur.waiting;
  12637.       write_user(smallist[cv].number,&ur);
  12638.       if (smallist[cv].number==1)
  12639.         ++fwaiting;
  12640.       strcat(s,nam(&ur,smallist[cv].number));
  12641.       if (smallist[cv].number==1)  {
  12642.         ++status.fbacktoday;
  12643.         ++thisuser.feedbacksent;
  12644.         ++thisuser.fsenttoday1;
  12645.         ++fsenttoday;
  12646.       } else {
  12647.         ++status.emailtoday;
  12648.         ++thisuser.etoday;
  12649.         ++thisuser.emailsent;
  12650.       }
  12651.       pl(s);
  12652.     }
  12653.   }
  12654.   close_user();
  12655.   close(f);
  12656.   save_status();
  12657.   if (!wfc)
  12658.     topscreen();
  12659. }
  12660.  
  12661.  
  12662. Step #2  -- MULTMAIL.C
  12663. Function -- N/A
  12664. Comments --
  12665.  
  12666.         Modify this line...
  12667.  
  12668. #    nl();
  12669. +    if (so()) {
  12670. +      prt(2,"Multi-Mail: A,M,D,L,E,Q,S,? : ");
  12671. +      ch=onek("QAMDELS?");
  12672. +    } else {
  12673. #      prt(2,"Multi-Mail: A,M,D,L,E,Q,? : ");
  12674. #      ch=onek("QAMDEL?");
  12675. +    }
  12676. #    switch(ch) {
  12677. #      case '?':
  12678.  
  12679. Step #3  -- MULTMAIL.C
  12680. Function -- N/A
  12681. Comments --
  12682.  
  12683.         Add this case in with the others...
  12684.  
  12685.       case 'S':
  12686.        mailall();
  12687.        break;
  12688.  
  12689.  
  12690.  
  12691. ════WWIV═4.11═Etherealized══════════════════════════The Downtown Tower═════════
  12692. 600+ WWIV Files!!! -*- WWIVLink @16853 -*- USR Dual Standard -*- Sysop Autoval
  12693.  
  12694.  
  12695.  
  12696.  
  12697.  
  12698.  
  12699. [93/99]: Virus verification
  12700. [Name ]: Rejean F #1 @5499
  12701. [Date ]: Tue Jan 14 21:31:54 1992
  12702. [From ]: CIM-99 (Montreal, Canada)
  12703.  
  12704. /***************************************************************************
  12705.   MOD: Virus Checker
  12706.   Description: Check for virus on remote upload or ask to check on local upload
  12707.                uses the archive formats you have specified in INIT.EXE.
  12708.  
  12709.   Author: Captain Learjet
  12710.   Modified: Enigma #9 @9973
  12711.             Rejean F #1 @5499
  12712.  
  12713.   Comments: Enigma's release had two slight problems in the test_upload
  12714.             function:
  12715.                first:  it wasn't clearing the temp dir when checking
  12716.                        multiple files.
  12717.                second: de-archiving was not possible since the string
  12718.                        passed to to run_external wasn't set up properly.
  12719.  
  12720.             Both are now corrected.
  12721.   Requirements: You must have McAffe's SCAN.EXE and all de-archiver in your
  12722.                 path somewhere.
  12723.  
  12724.                                                        Rejean F
  12725.                                                        #1 @5499
  12726. ***************************************************************************/
  12727.  
  12728. ***********************
  12729.  
  12730.         STEP 1
  12731.  
  12732. Back-up your source!
  12733.  
  12734. ***********************
  12735.  
  12736.         STEP 2
  12737.  
  12738. In BBS.C add the following:
  12739.  
  12740.   if (strcmp(s,"/O")==0)                          = Existing
  12741.     if (countdwn()==1)                            = Existing
  12742.       hangup=1;                                   = Existing
  12743.   if ((strcmp(s,"/?")==0) && (dcs()))             = Existing
  12744.     printmenu(8);                                 = Existing
  12745.   if (strcmp(s,"/V")==0)                          + ADD
  12746.     virus_check();                                + ADD
  12747.   if ((strcmp(s,"UPLOADALL")==0) && (dcs())) {    = Existing
  12748.     i1=0;
  12749.  
  12750. ***********************
  12751.  
  12752.        STEP 3
  12753.  
  12754. **-- NOTE: In step 3 and 4, the sprintf function might not be exactly as
  12755.            represented. Also, in step 3, the pl function is probably
  12756.            different in your source.
  12757.  
  12758.  
  12759. In XFER.C add the following:
  12760.  
  12761.   ++status.uptoday;                             = Existing
  12762.   save_status();                                = Existing
  12763.   sprintf(s,"+%s uploaded in %s",               = Existing
  12764.           u.filename,directories[dn].name);     = Existing
  12765.   sysoplog(s);                                  = Existing
  12766.   nl();                                         = Existing
  12767.   if(!incom){                                   + ADD
  12768.     prt(5,"Test this file? ");                  + ADD
  12769.     if(yn())                                    + ADD
  12770.       test_upload(u.filename);                  + ADD
  12771.   }else                                         + ADD
  12772.     test_upload(u.filename);                    + ADD
  12773.   nl();                                         = Existing
  12774.   pl("File uploaded.");                         = Existing
  12775.  
  12776.  
  12777. At the end of the file (after the last line) add:
  12778.  
  12779. #include "VIRUSCHK.C"
  12780.  
  12781. ***********************
  12782.  
  12783.         STEP 4
  12784.  
  12785. In XFEROVL.C add the following:
  12786.  
  12787.     SETREC(0);                                  = Existing
  12788.     write(dlf,(void *)&u1,sizeof(uploadsrec));  = Existing
  12789.     ++status.uptoday;                           = Existing
  12790.     save_status();                              = Existing
  12791.     sprintf(s,"+%s uploaded in %s",             = Existing
  12792.             u.filename,d.name);                 = Existing
  12793.     sysoplog(s);                                = Existing
  12794.     if(!incom){                                 + ADD
  12795.       prt(5,"Test this file? ");                + ADD
  12796.       if(yn())                                  + ADD
  12797.         test_upload(u.filename)                 + ADD
  12798.     }else                                       + ADD
  12799.       test_upload(u.filename);                  + ADD
  12800.   }                                             = Existing
  12801.   return(1);                                    = Existing
  12802. }                                               = Existing
  12803.  
  12804. ***********************
  12805.        
  12806.        STEP 5
  12807.  
  12808. In FCNS.H add these two declaration in the XFER.C section:
  12809.  
  12810. void virus_check(void);
  12811. void test_upload(char *s);
  12812.  
  12813. ***********************
  12814.  
  12815.         STEP 6
  12816.          
  12817. Create those two files in your gfiles directory:
  12818.  
  12819. VIRUSOK.TXT  - Will be added to arc files that pass the test
  12820. VIRUSBAD.TXT - Will be added to arc files that fail the test
  12821.  
  12822. ***********************
  12823.  
  12824.         STEP 7
  12825.  
  12826. Save the two following functions as VIRUSCHK.C
  12827.  
  12828. --------------------------------CUT HERE-------------------------------------
  12829.  
  12830. void virus_check(void)
  12831. {
  12832.   char s[81];
  12833.  
  12834.   nl();
  12835.   prt(2,"Archive to Scan: ");
  12836.   mpl(12);
  12837.   input(s,12);
  12838.   if (!strchr(s,'.'))
  12839.     strcat(s,".*");
  12840.   test_upload(s);
  12841.   topscreen();
  12842. }
  12843.  
  12844.  
  12845. void test_upload(char *s)
  12846. {
  12847.   char s1[81],s2[81],s3[81],s4[81],s5[81];
  12848.   int i,i1,i2,type=0,abort=0,next=0,ext;
  12849.   uploadsrec u;
  12850.  
  12851.   remove_from_temp("*.*",syscfg.tempdir,0);
  12852.   align(s);
  12853.   dliscan();
  12854.  
  12855.   i=recno(s);
  12856.   do {
  12857.     if (i>0) {
  12858.       SETREC(i);
  12859.       read(dlf,(void *)&u,sizeof(uploadsrec));
  12860.       for(i2=0; i2<4; i2++)         /*** determine type and assign to ext ***/
  12861.       if (!strcmp(u.filename+9,syscfg.arcs[i2].extension)) {
  12862.         sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,
  12863.                 stripfn(u.filename));
  12864.         ext=i2;
  12865.         type=1;
  12866.       }
  12867.       if ((!strcmp(u.filename+9,"EXE")) || (!strcmp(u.filename+9,"COM")))
  12868.       type=4;
  12869.       if (type) {
  12870.         sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,
  12871.         stripfn(u.filename));
  12872.         if (exist(s1)) {
  12873.           nl();
  12874.           ansic(2);
  12875.           sprintf(s2,"Scanning %s for viruses... ",u.filename);
  12876.           nl();
  12877.           prt(3,"Please wait.....");nl();
  12878.           if (type<4) {     /*** if archived extract and check for virii ***/
  12879.             strcpy(s4,syscfg.arcs[ext].arce);    /* This part modified   */
  12880.             strcpy(s5,syscfg.tempdir);           /* for proper operation */
  12881.             stuff_in(s2,s4,s1,s5,"","","");      /* of PKUNZIP           */
  12882.             run_external(s2);
  12883.             sprintf(s3,"SCAN /nomem %s",syscfg.tempdir);
  12884.             i1=run_external1(s3);
  12885.             remove_from_temp("*.*",syscfg.tempdir,0);
  12886.           } else {          /*** else just check for virii ***/
  12887.             sprintf(s2,"SCAN /nomem %s",s1),
  12888.             i1=run_external1(s2);
  12889.           }
  12890.           prt(2,u.filename);
  12891.           if (i1==1) {
  12892.             pl(" \a\a\0036FAILED \0030the virus test!");
  12893.             nl();
  12894.    sprintf(s2,"%s \0036FAILED \0030the virus test. Please delete the file!",
  12895.            u.filename); 
  12896.             ssm(1,0,s2); 
  12897.             sysoplog(s2); 
  12898.           } else {
  12899.             pl(" \0035PASSED \0032the virus test.");
  12900.             sprintf(s2,"%s \0035PASSED \0030the virus test.",u.filename);
  12901.             ssm(1,0,s2);
  12902.             sysoplog(s2);
  12903.             nl();
  12904.           }
  12905. /*════════ delete area between lines to skip adding file comments ═════════*/
  12906. /*** will add file VIRUSOK.TXT to an archive that passed the virii scan ***
  12907.  *** will add file VIRUSBAD.TXT to an archive that failed the virii scan ***/
  12908.  
  12909.   /*** if ARJ archive add comment ***/
  12910.           if (!strcmp(u.filename+9,"ARJ")) {
  12911.             if (i1==1)
  12912.                sprintf(s1,"ARJ C %s%s -z%sVIRUSBAD.TXT",
  12913.                     directories[udir[curdir].subnum].path,
  12914.                     stripfn(u.filename),syscfg.gfilesdir);
  12915.             else
  12916.                sprintf(s1,"ARJ C %s%s -z%sVIRUSOK.TXT",
  12917.                directories[udir[curdir].subnum].path,
  12918.                stripfn(u.filename),syscfg.gfilesdir);
  12919.             sprintf(s3,"Adding comment to %s",u.filename);
  12920.             prt(2,s3);
  12921.             nl();
  12922.             run_external(s1);
  12923.           }
  12924.   /*** end add comment to ARJ ***/
  12925.  
  12926.   /*** if ZIP archive add comment ***/
  12927.  
  12928.           if (!strcmp(u.filename+9,"ZIP")) {
  12929.              if (i1==1)
  12930.                sprintf(s1,"PKZIP -Z %s%s < %sVIRUSBAD.TXT",
  12931.                     directories[udir[curdir].subnum].path,
  12932.                     stripfn(u.filename), syscfg.gfilesdir);
  12933.              else
  12934.                sprintf(s1,"PKZIP -Z %s%s < %sVIRUSOK.TXT",
  12935.                     directories[udir[curdir].subnum].path,
  12936.                     stripfn(u.filename), syscfg.gfilesdir);
  12937.              sprintf(s3,"Adding comment to %s",u.filename);
  12938.              prt(2,s3);
  12939.              nl();
  12940.              run_external(s1);
  12941.           }
  12942.  
  12943.   /*** end add comment to ZIP ***/
  12944. /*════════════════════════ end adding file comments ════════════════════════*/
  12945.         }
  12946.         checka(&abort,&next);
  12947.       }
  12948.     }
  12949.     i=nrecno(s,i);
  12950.   } while ((i>0) && (!hangup) && (!abort));
  12951.   closedl();
  12952.   remove_from_temp("*.*",syscfg.tempdir,0);
  12953. }
  12954.  
  12955. --------------------------------CUT HERE-------------------------------------
  12956.  
  12957. That's it, all that is left now is to recompile the whole thing.  Hope you
  12958. won't have problems with this mod.
  12959.  
  12960.  
  12961. RejeanF
  12962.  
  12963. #1 @5499
  12964.  
  12965.  
  12966.  
  12967.  
  12968.  
  12969.  
  12970.  
  12971. [94/99]: Strange grey colour code stuff and the AKID3.MOD
  12972. [Name ]: Analog Kid #1 @5482
  12973. [Date ]: Thu Jan 16 03:11:51 1992
  12974. [From ]: Permanent Waves (Montreal, Canada)
  12975.  
  12976.      For those who have used AKID3.MOD:
  12977.  
  12978.      If I may just have your attention for a brief moment... it seems that if 
  12979. we upload a mod to a message base and a single line has one "<heart>0" (^C0 or 
  12980. grey) colour imbedded within it (and no other colour code in the same line), 
  12981. the colour code gets ignored (perhaps because grey is a default colour?  I'm 
  12982. not sure.) I noticed this with the AKID3.MOD when Bill Swindell reported some 
  12983. strange error (that I wasn't getting) which displaced certain subs in the 
  12984. columns with <NET> or [NET] notation.  If someone knows why this strange grey 
  12985. colour code 'ignoring' occurs, I would greatly appreciate it being explained 
  12986. to me.
  12987.  
  12988.      The only thing that need be done to correct the mod is to simply insert 
  12989. two "<heart>0" codes in the locations listed below within the function subline:
  12990.  
  12991.   if (syscfg.systemnumber)
  12992.   {
  12993.     if (subboards[usub[i].subnum].type)
  12994.       if (subboards[usub[i].subnum].anony & anony_val_net)
  12995.         strcat(s1,"[NET] ");
  12996.       else
  12997.         strcat(s1,"<NET> ");
  12998.     else
  12999.       strcat(s1,"      ");  <---- should read   strcat(s1",<heart>0      ");
  13000.   }
  13001.   strcat(s1,"");            <---- should read   strcat(s1,"<heart>0");
  13002.   strcat(s1,subboards[usub[i].subnum].name);
  13003.  
  13004.  
  13005.      where, by <heart>, I mean the control-C symbol that actually appears as a 
  13006. heart in the IDE environment of C++.
  13007.   
  13008.      I'm sorry for this inconvenience, but  I wasn't aware that the "<heart>0" 
  13009. doesn't get saved when uploaded (and consequently, it screws up the columns a 
  13010. little).  However, once these two tiny additions are made, all should work 
  13011. fine.
  13012.  
  13013.      Bill Swindell:  Many thanks for pointing that out!
  13014.  
  13015.     αñα£og kï√   (1@5482)
  13016.     SysOp of Permanent Waves
  13017.  
  13018.  
  13019.  
  13020.  
  13021.  
  13022.  
  13023.  
  13024. [95/99]: A mod to see sub-type with name
  13025. [Name ]: Rasputin #1 @2629
  13026. [Date ]: Thu Jan 16 18:14:03 1992
  13027. [From ]: The Bloody Russian (Washington)
  13028.  
  13029. Name: SUBTYPE.MOD
  13030. Purpose: Replaces the filename with the subtype in the printout of subs under
  13031. //BOARDEDIT.
  13032.  
  13033. Conventions:  "=" don't change,  "*" change
  13034.  
  13035. Load subedit.c
  13036.  
  13037. In "void boarddata"
  13038.  
  13039. =     k=32;
  13040. =   else
  13041. =     k=r.key;
  13042. *   sprintf(s,"%2d %1c %1c  %-40s  %-8u %-3d %-3d %-3d %-3d %1c", /*(change 
  13043. %-8s to %-8u)*/
  13044. *             n,k,x,r.name,r.type,r.readsl,r.postsl,r.age,r.maxmsgs,y); 
  13045. /*(change r.filename to r.type)*/
  13046. = }
  13047.  
  13048. In "void showsubs"
  13049.  
  13050. =   outchr(12);
  13051. =   abort=0;
  13052. *   pla("NN K AR Name                                      SUBTYPE  RSL PSL 
  13053. AGE MSG ANON", /*(Change FILENAME to SUBTYPE)*/
  13054. =       &abort);
  13055. =   pla("== - == ----------------------------------------  ======== --- === 
  13056. --- === ----",
  13057. =       &abort);
  13058. =   for (i=0; (i<num_subs) && (!abort); i++) {
  13059.  
  13060.  
  13061. Save it and compile.  Wow, big mod.
  13062.  
  13063.  
  13064.  
  13065.  
  13066.  
  13067.  
  13068. [96/99]: Extended TOPSCREEN Data.
  13069. [Name ]: Scalawag #7 @5060
  13070. [Date ]: Fri Jan 17 11:05:46 1992
  13071. [From ]: Fuzzball Land (Unknown Area)
  13072.  
  13073. ╔══════════════════════════════════════════════════════════════════════════╗
  13074. ║ MOD     :UltF2scn.Mod - TOPSCREEN enhancement                            ║
  13075. ║ DATE    :1/16/92                                                         ║
  13076. ║ USAGE   :WWIV 4.11 - 4.12 - 4.20                                         ║
  13077. ║ VERSION :1.0                                                             ║
  13078. ║ Description: Extra Line of Data in Topscreen/color changes for everything║
  13079. ║ Files Affected: CONIO.C - BBSUTL.C  ( and *.C  see explanation)          ║
  13080. ║ Difficulty: EASY (Some searching)                                        ║
  13081. ║ Author: Scalawag  89@5050   7@5060   53@15053                            ║
  13082. ║         SysOp of: The Lunatic Fringe    (510)-676-1812                   ║
  13083. ║ Thanks to: Tanker  1@15053  171@5060 SysOp of The Tankyard 510-671-7006  ║
  13084. ║                    for the effort expended in exploring and explaining   ║
  13085. ║                    the "curatr" statements (color changes.)              ║
  13086. ╚══════════════════════════════════════════════════════════════════════════╝
  13087.  This mod will add another line of data in the topscreen box, and change the
  13088.  colors.
  13089.  New data added in the TOPSCREEN info....
  13090.  
  13091. (B)= Current baud rate
  13092. (G)= Gold in hand
  13093. (R)= TOTAL messages read
  13094. (P)= Messages posted TODAY (supplements the TOTAL messages posted)
  13095. (U/D)= Transfer ratio ( you don't need a calculator to figure it out...)
  13096. (P/C)= Post-Call ratio..^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  13097. (ASS)= ass_points ( I realize that not everyone uses them, but in case you do)
  13098. (E)= E-Mail sent today
  13099. (F)= Feedback sent today
  13100. and the 60 sec. format progressive timer for the CURRENT logon. (supplements
  13101. the "Time left" timer.)
  13102.  
  13103. The way this is written, it incorporates the same data for both F2 topscreens
  13104. except for ONE difference!
  13105.         The first F2 topscreen (the one with the system info) has LAST BAUD
  13106.         RATE instead of the current baud rate...I found it useful since
  13107.         sometimes a user would logon and for some reason be at a different
  13108.         Baud than before.
  13109.  
  13110. Keep in mind that you can change the ENTIRE first F2 screen to include totally
  13111. different data than the second screen. You just need the incentive and an idea
  13112. of what you want up there. I duplicated the screens because I couldn't think
  13113. of anything else that I needed to see. (I'm sure I'll come up with something
  13114. later.........)
  13115.  
  13116.   The majority of the modifications take place in CONIO.C & BBSUTL.C.
  13117.   BUT!!.....In order for this mod to work PERFECTLY, you must search through
  13118.   all other *.C files and ADD (on a seperate line)    topscreen();
  13119.   AFTER every (NEW TOPSCREEN) userrec stat that is incremented/decremented.
  13120.         If you successfully accomplish this, ALL user activity (for the new
  13121.         data) will be instantly reflected in the TOPSCREEN.
  13122.         Otherwise, you would have to cycle the F2 key to see the NEW data in
  13123.         the TOPSCREEN.
  13124.   Keep in mind that the MOD will still work perfectly even if you don't add
  13125.   any/all of the TOPSCREEN(); lines,...it just doesn't work as efficiently.
  13126.  
  13127.   Things to look for in your search:
  13128.               (in some cases [to put it simply] 'thisuser' has been converted
  13129.                to 'u')
  13130.         thisuser.posttoday
  13131.         thisuser.etoday
  13132.         thisuser.ass_pts
  13133.         thisuser.msgread
  13134.         thisuser.gold
  13135.         thisuser.fsenttoday1
  13136.         thisuser.etoday
  13137.         ratio()
  13138.         post_ratio()
  13139.         thisuser.dk
  13140.         thisuser.uk
  13141.  
  13142.         Look for any of these lines with a += or -= or ++ or -- (with
  13143.         exception to the "ratio()" and the "post_ratio()" lines) either before
  13144.         or after the line. Follow that line with a "topscreen();"
  13145.  
  13146.         If you notice a user on-line doing something that should be
  13147.         immediately reflected in the NEW info of the Topscreen, and it is NOT,
  13148.         then you know what you have to do.
  13149.  
  13150.         The spaces in the SPRINTF statements are critical. If they are not
  13151.         inserted exactly as written, there is a danger of possible overwriting
  13152.         of the timer or vice-versa.
  13153.  
  13154. PLEASE BACKUP YOUR SOURCE!!!!!!
  13155. I take NO responsibility for any problems this modification may cause.
  13156. I WILL, however, be glad to help with any part of it - if needed!
  13157.  
  13158.   NOW FOR THE MOD!!
  13159.   Lines with no instruction following are existing lines.
  13160.  
  13161.  
  13162.   In CONIO.C
  13163.  
  13164.   At the beginning of the file... in the EXTERN declarations
  13165.   FIND:
  13166.        extern int topdata,chatcall;
  13167.   CHANGE it to read:
  13168.        extern int topdata,chatcall,chatcall1;
  13169.  
  13170.   FIND:
  13171.        void skey(char ch)
  13172.   FIND:
  13173.        case 60: /* F2 */
  13174.           topdata+=1;
  13175.           if (topdata==3)
  13176.             topdata=0;
  13177.             chatcall1=0;                                       + ADD
  13178.           topscreen();
  13179.           break;
  13180.   FIND:
  13181.        case 62: /* F4 */
  13182.           chatcall=0;
  13183.           chatcall1=0;                                         + ADD
  13184.           topscreen();
  13185.           break;
  13186.   FIND:
  13187.        case 68: /* F10 */
  13188.           if (chatting==0) {
  13189.             if (syscfg.sysconfig & sysconfig_2_way)
  13190.               chat1("",1);
  13191.             else
  13192.               chat1("",0);
  13193.           } else
  13194.             chatting=0;
  13195.             chatcall1=0;                                       + ADD
  13196.       break;
  13197.  
  13198.   FIND:
  13199.        case 103: /* Ctrl-F10 */
  13200.           if (chatting==0)
  13201.             chat1("",0);
  13202.           else
  13203.             chatting=0;
  13204.             chatcall1=0;                                       + ADD
  13205.           break;
  13206.  
  13207. FIND:
  13208.  
  13209. void topscreen()        /* The FIRST void topscreen */
  13210. {
  13211.   userrec u;                                                   + ADD
  13212.   int cc,cx,cy,ctl,i,un;                                       # CHANGE
  13213.  
  13214.  
  13215.   switch(topdata) {
  13216.     case 0:
  13217.       set_protect(0);
  13218.       break;
  13219.     case 1:
  13220.       set_protect(3);
  13221.       break;
  13222.     case 2:
  13223.       if (chatcall || chatcall1)                               # CHANGE
  13224.         set_protect(7);                                        # CHANGE
  13225.       else {
  13226.         if (topline==7)                                        # CHANGE
  13227.           set_protect(0);
  13228.         set_protect(6);                                        # CHANGE
  13229.       }
  13230.       break;
  13231.   }
  13232.   cx=wherex();
  13233.   cy=wherey();
  13234.   ctl=topline;
  13235.   cc=curatr;
  13236.   if (crttype==7)
  13237.    curatr=0x07;
  13238.   else
  13239.    curatr=0x01f;                                               # CHANGE
  13240.   topline=0;
  13241.   for (i=0; i<80; i++)
  13242.     sl[i]=205;
  13243.   sl[80]=0;
  13244.   switch (topdata) {
  13245.  
  13246.  /* A couple of screens down - find "Case 2:" */
  13247.  
  13248.       movecsr(0,3);          /* find this WITHIN case 2: */
  13249.       sprintf(ol,"R=%-16s \"%-40s\"",
  13250.           restrict,thisuser.note);
  13251.       outs(ol);
  13252.  
  13253.     movecsr(0,4);                     /* ADD THIS BLOCK */
  13254.       un=usernum;
  13255.       read_user(un,&u);
  13256.       sprintf(ol,"B=%-5s G=%-4d R=%-5d",curspeed,(int) u.gold,u.msgread);
  13257.       outs(ol);
  13258.     movecsr(22,4);
  13259.        sprintf(ol," P=%-2d U/D=%-6.3f P/C=%-6.3f Ass=%-3d E=%-3d F=%-2d     
  13260. ",thisuser.posttoday,ratio(),post_ratio(),thisuser.ass_pts,thisuser.etoday,thisuser.fsenttoday1);
  13261.        outs(ol);
  13262.  
  13263.                                       /* STOP ADD */
  13264.  
  13265.  
  13266.       if (chatcall) {
  13267.         movecsr(0,5);                                          # CHANGE
  13268.         outs(chatreason);
  13269.       }
  13270.       break;
  13271.   }
  13272.   if (ctl!=0) {
  13273.     movecsr(0,ctl-1);
  13274.     outs(sl);
  13275.   }
  13276.   topline=ctl;
  13277.   movecsr(cx,cy);
  13278.   curatr=cc;
  13279.   tleft(0);
  13280. }
  13281.  
  13282. #else
  13283.  
  13284. void tleft(int x)
  13285. {
  13286.   int cx,cy,ctl,cc,ln,i;
  13287.   double nsln;
  13288.   double ti;
  13289.   long h,m,s;
  13290.   char tl[30],to[30];
  13291.  
  13292.   cx=wherex();
  13293.   cy=wherey();
  13294.   ctl=topline;
  13295.   cc=curatr;
  13296.   if (crttype==7)
  13297.    curatr=0x07;
  13298.   else
  13299.    curatr=0x01f;                                               # CHANGE
  13300.   topline=0;
  13301.   nsln=nsl();
  13302.   if (chatcall && (topdata==2))
  13303.     ln=6;
  13304.   else                                                         - DELETE
  13305.     ln=5;                                                      - DELETE
  13306.   if (chatcall1 && (topdata==2))                               + ADD
  13307.     ln=6;                                                      + ADD
  13308.   if ((chatcall1==0) && (topdata==2))                          + ADD
  13309.     ln=5;                                                      + ADD
  13310.   if (topdata==1)                                              + ADD
  13311.     ln=5;                                                      + ADD
  13312.  
  13313.  FIND and DELETE the following block of code:
  13314.  
  13315.   if (topdata) {                             /* START DELETE */
  13316.     if ((using_modem) && (!incom)) {
  13317.       movecsr(1,ln);
  13318.       outs("═════Comm Disabled═");
  13319.       for (i=19; i<strlen(curspeed); i++)
  13320.         out1ch('═');
  13321.     } else {
  13322.       movecsr(1,ln);
  13323.       outs(curspeed);
  13324.     }
  13325.  
  13326.     if ((thisuser.sl!=255) && (actsl==255)) {
  13327.       movecsr(23,ln);
  13328.       outs("═Temp Sysop═");
  13329.     }
  13330.  
  13331.     if (global_handle) {
  13332.       movecsr(40,ln);
  13333.       outs("═Capture═");
  13334.     }
  13335.  
  13336.     movecsr(54,ln);
  13337.     if (sysop_alert) {
  13338.       outs("═Alert═");
  13339.     } else {
  13340.       outs("═══════");
  13341.     }
  13342.  
  13343.     movecsr(64,ln);
  13344.     if (sysop1()) {
  13345.       outs("═Available═");
  13346.     } else {
  13347.       outs("═══════════");
  13348.     }
  13349.   }
  13350.  
  13351.                                              /* STOP DELETE */
  13352.  
  13353.   ADD in its place, the following block:
  13354.  
  13355.   if (topdata)                               /* START ADD */
  13356.   {
  13357.     curatr=0x0f;
  13358.     movecsr(6,ln);
  13359.     if ((using_modem) && (!incom)) {
  13360.       curatr=0x8c;
  13361.       outs("Comm Disabled");
  13362.       curatr=0x0f;
  13363.   } else
  13364.       outs("═════════════");
  13365.  
  13366.     movecsr(24,ln);
  13367.     if ((realsl !=255) && (thisuser.sl==255)) {    /* use for v4.11/4.12 */
  13368.     if ((thisuser.sl!=255) && (actsl==255)) {      /* use for v4.20 */
  13369.       curatr=0x8c;
  13370.       outs("Temp Sysop");
  13371.       curatr=0x0f;
  13372.   } else
  13373.       outs("══════════");
  13374.  
  13375.     movecsr(41,ln);
  13376.     if (global_handle) {
  13377.       curatr=0x8c;
  13378.       outs("Capture");
  13379.       curatr=0x0f;
  13380.   } else
  13381.       outs("═══════");
  13382.  
  13383.     movecsr(55,ln);
  13384.     if (sysop_alert) {
  13385.       curatr=0x8c;
  13386.       outs("Alert");
  13387.       curatr=0x0f;
  13388.   } else
  13389.       outs("═════");
  13390.  
  13391.     movecsr(65,ln);
  13392.     if (sysop1()) {
  13393.       curatr=0x8c;
  13394.       outs("Available");
  13395.       curatr=0x0f;
  13396.   } else
  13397.       outs("═════════");
  13398.   curatr=0x01f;
  13399.   }
  13400.                                              /* STOP ADD */
  13401.  
  13402.   switch (topdata)
  13403.     {
  13404.     case 1:
  13405.       if (useron) {
  13406.         movecsr(18,3);
  13407.         sprintf(tl,"T-%6.2f",nsln/60.0);
  13408.         outs(tl);
  13409.         }
  13410.         movecsr(72,4);                                         + ADD
  13411.         if (useron) {                                          + ADD
  13412.           ti=(timer()-timeon);                                 + ADD
  13413.           h=(long) (ti/3600.0);                                + ADD
  13414.           ti-=(double) (h*3600);                               + ADD
  13415.           m=(long) (ti/60.0);                                  + ADD
  13416.           ti-=(double) (m*60);                                 + ADD
  13417.           s=(long) (ti);                                       + ADD
  13418.           sprintf(to,"%02.2ld:%02.2ld:%02.2ld",h,m,s);         + ADD
  13419.           outs(to);                                            + ADD
  13420.           }                                                    + ADD
  13421.           break;
  13422.     case 2:
  13423.       movecsr(64,3);
  13424.       if (useron)
  13425.         sprintf(tl,"T-%6.2f",nsln/60.0);
  13426.       else
  13427.         strcpy(tl,thisuser.pw);
  13428.       outs(tl);
  13429.       movecsr(72,4);                                           + ADD
  13430.       if (useron) {                                            + ADD
  13431.       ti=(timer()-timeon);                                     + ADD
  13432.       h=(long) (ti/3600.0);                                    + ADD
  13433.       ti-=(double) (h*3600);                                   + ADD
  13434.       m=(long) (ti/60.0);                                      + ADD
  13435.       ti-=(double) (m*60);                                     + ADD
  13436.       s=(long) (ti);                                           + ADD
  13437.       sprintf(to,"%02.2ld:%02.2ld:%02.2ld",h,m,s);             + ADD
  13438.       outs(to);                                                + ADD
  13439.     }                                                          + ADD
  13440.      break;
  13441.   }
  13442.   topline=ctl;
  13443.   curatr=cc;
  13444.   movecsr(cx,cy);
  13445.   if ((x) && (useron))
  13446.     if (nsln==0.0) {
  13447.       outstr("\r\nTime expired.\r\n");
  13448.       hangup=1;
  13449.     }
  13450. }
  13451.  
  13452.  
  13453. void topscreen()               /* The SECOND void topscreen() */
  13454. {
  13455.   userrec u;                                                   + ADD
  13456.   int cc,cx,cy,ctl,i,un;                                       # CHANGE
  13457.  
  13458.  
  13459.   switch(topdata) {
  13460.     case 0:
  13461.       set_protect(0);
  13462.       break;
  13463.     case 1:
  13464.       set_protect(6);                                          # CHANGE
  13465.       break;
  13466.     case 2:
  13467.       if (chatcall || chatcall1)                               # CHANGE
  13468.         set_protect(7);                                        # CHANGE
  13469.       else {
  13470.         if (topline==7)                                        # CHANGE
  13471.           set_protect(0);
  13472.         set_protect(6);                                        # CHANGE
  13473.       }
  13474.       break;
  13475.   }
  13476.   cx=wherex();
  13477.   cy=wherey();
  13478.   ctl=topline;
  13479.   cc=curatr;
  13480.   if (crttype==7)
  13481.    curatr=0x07;
  13482.   else
  13483.    curatr=0x01f;                                               # CHANGE
  13484.   topline=0;
  13485.   for (i=0; i<80; i++)
  13486.     sl[i]=205;
  13487.   sl[80]=0;
  13488.  
  13489.   switch (topdata) {
  13490.     case 0:
  13491.       break;
  13492.  
  13493.   FIND:
  13494.        case 1:
  13495.  
  13496.       movecsr(0,0);
  13497.       sprintf(ol,"%-50s  Activity for %8s:      ",
  13498.           syscfg.systemname,status.date1);
  13499.       outs(ol);
  13500.  
  13501.   FIND: (WITHIN case 1:)
  13502.  
  13503.       movecsr(0,3);
  13504.       sprintf(ol,"SL=%3d   DL=%3d               FW=%3d      Uploaded:%2d files 
  13505.    Feedback    :%3d ",
  13506.           thisuser.sl,thisuser.dsl,fwaiting,status.uptoday,status.fbacktoday);
  13507.       outs(ol);
  13508.  
  13509.  
  13510.      movecsr(0,4);                          /* ADD this block */
  13511.      un=usernum;
  13512.      read_user(un,&u);
  13513.      sprintf(ol,"LB=%-5d G=%-4d R=%-5d",thisuser.lastrate,(int) 
  13514. u.gold,u.msgread);
  13515.      outs(ol);
  13516.      movecsr(23,4);
  13517.      sprintf(ol," P=%-2d U/D=%-6.3f P/C=%-6.3f Ass=%-3d E=%-3d F=%-2d     
  13518. ",thisuser.posttoday,ratio(),post_ratio(),thisuser.ass_pts,thisuser.etoday,thisuser.fsenttoday1);
  13519.      outs(ol);
  13520.      break;                                    /* STOP ADD */
  13521.  
  13522.     FIND:
  13523.          case 2:
  13524.  
  13525.       strcpy(rst,restrict_string);
  13526.       for (i=0; i<=15; i++) {
  13527.         if (thisuser.ar & (1 << i))
  13528.  
  13529.  FIND: (WITHIN case 2:)
  13530.  
  13531.       movecsr(0,3);
  13532.       sprintf(ol,"%-40s %c %2d %-17s          FW= %3d",
  13533.           thisuser.note,thisuser.sex,thisuser.age,
  13534.           ctypes[thisuser.comp_type],fwaiting);
  13535.       outs(ol);
  13536.  
  13537.       movecsr(0,4);                              /* ADD this block */
  13538.       un=usernum;
  13539.       read_user(un,&u);
  13540.       sprintf(ol,"B=%-5s G=%-4d R=%-5d",curspeed,(int) u.gold,u.msgread);
  13541.       outs(ol);
  13542.       movecsr(22,4);
  13543.       sprintf(ol," P=%-2d U/D=%-6.3f P/C=%-6.3f Ass=%-3d E=%-3d F=%-2d     
  13544. ",thisuser.posttoday,ratio(),post_ratio(),thisuser.ass_pts,thisuser.etoday,thisuser.fsenttoday1);
  13545.       outs(ol);
  13546.                                                  /* STOP ADD */
  13547.  
  13548.       if (chatcall) {
  13549.         movecsr(0,5);                                          # CHANGE
  13550.         outs(chatreason);
  13551.       }
  13552.       break;
  13553.   }
  13554.   if (ctl!=0) {
  13555.     movecsr(0,ctl-1);
  13556.     curatr=0x0f;                                               + ADD
  13557.     outs(sl);
  13558.     curatr=0x01f;                                              + ADD
  13559.   }
  13560.   topline=ctl;
  13561.   movecsr(cx,cy);
  13562.   curatr=cc;
  13563.   tleft(0);
  13564. }
  13565.  
  13566.  
  13567.  
  13568. SAVE CONIO.C
  13569.  
  13570. LOAD BBSUTL.C
  13571. In the EXTERN Declarations at the beginning of the file...
  13572. FIND:
  13573.      extern int fsenttoday,userfile,chatcall,mailcheck,smwcheck;
  13574. CHANGE that line to read:
  13575.      extern int fsenttoday,userfile,chatcall,chatcall1,mailcheck,smwcheck;
  13576.  /* It could go anywhere, but why not keep it neat... */
  13577.  
  13578. FIND:
  13579.      void reqchat()
  13580. FIND:
  13581.  
  13582. if (s[0]) {
  13583.         chatcall=1;
  13584.         strcpy(chatreason,"Chat: ");
  13585.         strcat(chatreason,s);
  13586.         nl();
  13587.         sysoplog(chatreason);
  13588.         for (ok=strlen(chatreason); ok<80; ok++)
  13589.           chatreason[ok]=32;
  13590.         chatreason[80]=0;
  13591.         chatcall1=1;                                           + ADD
  13592.         topscreen();
  13593.         pl("Chat call turned ON.");
  13594.         nl();
  13595.       }
  13596.     }
  13597.  
  13598. SAVE BBSUTL.C
  13599.  
  13600. Compile!!
  13601.  
  13602. This has been tested and proven on WWIV 4.11 / 4.12 / 4.20e.
  13603. Let me know if you need help with more/different data in TOPSCREEN or help
  13604. with color changes.
  13605. /****************************************************************************/
  13606.  The CHATCALL1 part was added mainly for those who use a modified REQCHAT
  13607.  function. It will not hurt those who use the original REQCHAT.
  13608.  
  13609. The main topscreen is WHITE on BLUE.
  13610. The bottom line of the box is WHITE on BLACK.
  13611. The text that appears when you hit (for instance) F6 (SysOp Alert)..is
  13612. Flashing RED on BLACK.
  13613. It looks GOOD!
  13614.  
  13615. You can change these colors to whatever you want....I will attempt to
  13616. explain..
  13617.  
  13618. BACKGROUND                 FOREGROUND
  13619. --------------------------------------------
  13620. 0  1  2  4  8              0  1  2  4  8
  13621. --------------------------------------------
  13622. B  B  G  R  B              B  B  G  R  I
  13623. L  L  R  E  L              L  L  R  E  N
  13624. A  U  E  D  I              A  U  E  D  T
  13625. C  E  E     N              C  E  E     E
  13626. K     N     K              K     N     N
  13627.             I                          S
  13628.             N                          E
  13629.             G
  13630.  
  13631. In the CURATR=0x statements, the number and/or letter following the 'x' is
  13632. what changes the colors.
  13633.  
  13634. Add the number/numbers for the colors you want and convert them to hexadecimal.
  13635. The main color of my topscreen is INTENSE White on Blue...
  13636. Background is first, so the first # after the 'x' is 01 (The first # in Hex is
  13637. 01, NOT just 1)
  13638. Foreground is INTENSE WHITE, so I add ALL the numbers together (1+2+4+8)
  13639. (somehow Red + Green + Blue = White).....The Total is 15. The 15th number in
  13640. HEX is F .. as in 01 02 03 04 05 06 07 08 09 A B C D E F 10 11 12 13 etc...
  13641. Therefore the statement would read    curatr=0x01f
  13642.  
  13643. Examples:
  13644. curatr=0x01  BLUE on BLACK
  13645. 0 is for BLACK background  1 is for BLUE foreground.
  13646. 0x02   GREEN on BLACK
  13647. 0x04   RED on BLACK
  13648. 0x04a  INTENSE GREEN on RED
  13649. 0x02c  INTENSE RED on GREEN
  13650. 0x8c   BLINKING INTENSE RED on BLACK (added 8 to background (BLACK) to get
  13651.                                      RED to blink)
  13652.  
  13653.  
  13654.  
  13655. Experiment! It's not as hard as it looks.
  13656.  
  13657. If you need help with color changes or any other part of this mod, contact
  13658. either me or TANKER at the addresses listed at the beginning of this mod.
  13659.  
  13660.  
  13661.  
  13662.                                    Scalawag
  13663.                           SysOp - The Lunatic Fringe
  13664.                                  510/676-1812
  13665.  
  13666.  
  13667.  
  13668.  
  13669.  
  13670.  
  13671.  
  13672.  
  13673.  
  13674. [97/99]: Very minor fix to GREENY01.mod (the random quote mod)
  13675. [Name ]: Greeny #8 @6910
  13676. [Date ]: Sat Jan 25 07:37:03 1992
  13677. [From ]: The Promised Land (New Jersey)
  13678.  
  13679. This mod works fine from the sysop's keyboard.  It doesn't from remote.  I 
  13680. used the function getch() rather than wayne bell's getkey().  I must have been 
  13681. asleep.  Didn't catch this one in debugging because I never tried it from 
  13682. remote, (and so far only one sysop's found it.  Apparently, none of you have 
  13683. very active cosysops, eh?)
  13684.  
  13685. Oh well...  Just thought I'd let you know.  Kind of turns one off to releasing 
  13686. mods period, eh?  there's ALWAYS one more bug...
  13687.  
  13688. Well, the next thing on here should be my online mostrosity.  It's big, it's 
  13689. tacky, and it has bar graphs.  AND somebody's been running it for six months 
  13690. without problems, so if there ARE any bugs they occurred when I wrote it up 
  13691. (and I don't think there are because I installed it in vanilla source 
  13692. according to my own instructions.).  Okay?  Now the mod...
  13693.  
  13694. (GREENY)
  13695.  
  13696. THE PROMISED LAND Delran NJ 609-764-7144  Reg. #91223
  13697. HOST OF SUB 42 - DEEP THOUGHT: THE INTERNATIONAL MENSA NET
  13698. USR 38400/HST/HST/V.32/V.32-BIS/LAPM/V.42/V.42-BIS/MNP/ARQ/ASL
  13699.  
  13700.  
  13701.  
  13702.  
  13703.  
  13704.  
  13705. [98/99]: GREENY02.MOD (the online mostrosity.  Tested on clean source
  13706. [Name ]: Greeny #8 @6910
  13707. [Date ]: Sat Jan 25 07:38:47 1992
  13708. [From ]: The Promised Land (New Jersey)
  13709.  
  13710.                                 GREENY02.MOD
  13711.  
  13712.                          Greeny's online monstrosity.
  13713.  
  13714.  
  13715. This mod evolved out of a mutant crossbreeding between somebody's onliner
  13716. timelock mod, and the mod that puts a purple box around transfers.  Now it's
  13717. a boxed, color-coded timelock mod with bar graphs of comparative usage for
  13718. each onliner.  Tacky, eh?  What else are onliners for?
  13719.  
  13720. You set a timelock for each onliner.  I.E. this onliner can only be played
  13721. from 11:00 pm to 3:00 am.  This is done in //chainedit, and yes I know
  13722. entering it in minutes from midnight is annoying.  Sheer lazines on my part.
  13723. I made this entire mod under protest and only decided to release it because
  13724. it had been so much work.  Anyway, all onliners that are currently
  13725. accessible will show up as green to everyone with ansi.  If it's timelocked,
  13726. it'll be dark red.  If someone tries to play a timelocked onliner, a message
  13727. will appear informing them from when to when the onliner is accessible.  If
  13728. they select a green one, it'll just load it up and go.  If you leave the on
  13729. and off times at midnight (the default), that onliner will always be green.
  13730. If start time is after end time, the available time will continue through
  13731. midnight and into the next day.
  13732.  
  13733. For those users who don't have ansi, the box will be made out of stuff like
  13734. plusses and minuses.  Plus, they can tell timelocked onliners by the
  13735. asterisk that appears in the appropriate row all the way to the right.
  13736.  
  13737. The bar graphs should be self explanatory.  To zero out the count, remove
  13738. and re-install the onliner.  Why you'd want to is beyond me, but it can be
  13739. done.
  13740.  
  13741. A program called subcnvt is included to convert your chains.dat file to the
  13742. new format.  Yes, it is yet another use for black dragon's convert
  13743. program.  Somebody give him a medal or something.  To use the
  13744. program, block read it out, compile it, go to your data directory,
  13745. rename chains.dat chains.old, and subcnvt chains.old chains.dat.  Then if
  13746. you're feeling industrious, delete chains.old.
  13747.  
  13748. Oh, by the way: exemption 16 exempts people from the timelock.  If you're
  13749. already using this for something else, change the #define...
  13750.  
  13751.  
  13752. The actual mod comes next.  If you don't back up your source code, you're
  13753. dumb.
  13754.  
  13755.  
  13756. In the function void modify_chain(int n), which is found in the file
  13757. CHNEDIT.C, add/edit the following lines:
  13758.  
  13759. /* Key: == already there, ++ add, += change */
  13760.  
  13761.  
  13762. ==  npr("I. Disable pause: %s\r\n",
  13763. ==     (c.ansir & ansir_no_pause)?"Yes":"No");
  13764. ++  npr("J. Switch on at : %d:%02d\r\n",c.lowtime/60,
  13765. ++              c.lowtime-((c.lowtime/60)*60));
  13766. ++  npr("K. Switch off at: %d:%02d\r\n",c.hightime/60,
  13767. ++              c.hightime-((c.hightime/60)*60));
  13768. ==  nl();
  13769. +=  prt(2,"Which (A-K,Q) ? ");
  13770. +=  ch=onek("QABCDEFGHIJK");
  13771.  
  13772.  
  13773. Farther down in the same function, add the following lines.  (I'd suggest
  13774. you block read them in and delete the plusses, but it's up to you.)
  13775.  
  13776. ==        c.ansir &= ~ansir_no_pause;
  13777. ==      break;
  13778. ++    case 'J':
  13779. ++      nl();
  13780. ++      prt(5,"Chain Low Time (Mins from midnight)? ");
  13781. ++      input(s,4);
  13782. ++      i=atoi(s);
  13783. ++      if(i>=0 && i<24*60) c.lowtime=i;
  13784. ++      break;
  13785. ++    case 'K':
  13786. ++      nl();
  13787. ++      prt(5,"Chain High Time (Mins from midnight)? ");
  13788. ++      input(s,4);
  13789. ++      i=atoi(s);
  13790. ++      if(i>=0 && i<24*60) c.hightime=i;
  13791. ++      break;
  13792. ==  }
  13793. ==} while ((!done) && (!hangup));
  13794.  
  13795. The next function to modify in is void insert_chain(int n).  Add the
  13796. following three lines...
  13797.  
  13798. ==  c.ansir=0;
  13799. ++  c.lowtime=0;
  13800. ++  c.hightime=0;
  13801. ++  c.usage=0;
  13802. ==  chains[n]=c;
  13803.  
  13804. Now save it off and load up the file BBSUTL1.C.  Delete the entire functions
  13805. show_chains and run_chains and replace them with the following:
  13806.  
  13807.  
  13808.  
  13809. /* Begin block read for GREENY02.MOD */
  13810.  
  13811. void show_chains(int *mapp, int *map)
  13812. {
  13813.   int abort,next,i,i1,j,k,macks=0,padington;
  13814.   char s[81],tempomatic[10];
  13815.  
  13816.   abort=0;
  13817.   for(i=0;i<*mapp;i++)
  13818.     if(chains[map[i]].usage>macks) macks=chains[map[i]].usage;
  13819.   nl();
  13820.   osan("\0031    Title",&abort,&next);
  13821.   for(i=0;i<37;i++) osan(" ",&abort,&next);
  13822.   pla(" Popularity    Times run",&abort);
  13823.   osan(okansi() ? "\0033┌──┬" : "+--+",&abort,&next);
  13824.   for(i=0;i<42;i++) osan(okansi() ? "─" : "-",&abort,&next);
  13825.   osan(okansi() ? "┬" : "+",&abort,&next);
  13826.   for(i=0;i<10;i++) osan(okansi() ? "─" : "-",&abort,&next);
  13827.   pla(okansi() ? "┬─┐" : "+-+" ,&abort);
  13828.   for (i=0; (i<*mapp) && (!abort) && (!hangup); i++) {
  13829.     strcpy(s,okansi() ? "\0033│\0032" : "|");
  13830.     if(i<9) strcat(s," ");
  13831.     itoa(i+1,tempomatic,10);
  13832.     strcat(s,tempomatic);
  13833.     osan(s,&abort,&next);
  13834.     osan(okansi() ? "\0033│ " : "| ",&abort,&next);
  13835.     k=1;
  13836.  
  13837.   if((chains[map[i]].lowtime!=chains[map[i]].hightime) &&
  13838.         !(thisuser.exempt & exempt_timelock))
  13839.     if(chains[map[i]].hightime>chains[map[i]].lowtime) {
  13840.       if((timer()<=(chains[map[i]].lowtime*60.0)) ||
  13841.         (timer()>=(chains[map[i]].hightime*60.0))) k=0;
  13842.     } else {
  13843.       k=0;
  13844.       if((timer()>(chains[map[i]].lowtime*60.0)) ||
  13845.         (timer()<(chains[map[i]].hightime*60))) k=1;
  13846.     }
  13847.     if(!abort && okansi()) {
  13848.       if(k) setc(10);
  13849.       else setc(4);
  13850.     }
  13851.     osan(chains[map[i]].description,&abort,&next);
  13852.     for(padington=0,j=0;j<strlen(chains[map[i]].description); j++)
  13853.       if(chains[map[i]].description[j]==3) padington+=2;
  13854.     for(j=strlen(chains[map[i]].description); j<=40+padington;j++)
  13855.       osan(" ",&abort,&next);
  13856.     osan(okansi() ? "\0033│\0037" : "|",&abort,&next);
  13857.     j=0;
  13858.     if(chains[map[i]].usage)
  13859.       if((macks/chains[map[i]].usage)*10)
  13860.         for(j=1;j<=((float) chains[map[i]].usage/macks)*10; j++)
  13861.           osan(okansi() ? "▀" : "#",&abort,&next);
  13862.     if(j==0) j++;
  13863.     while(++j<=11) osan(okansi() ? " " : ":",&abort,&next);
  13864.     osan(okansi() ? "\0033│" : "|",&abort,&next);
  13865.     if(okansi()) setc(4);
  13866.     osan(k ? " " : "*",&abort,&next);
  13867.     osan(okansi() ? "\0033│ \0031" : "| ",&abort,&next);
  13868.     sprintf(s,"%05d",chains[map[i]].usage);
  13869.     pla(s,&abort);
  13870.   }
  13871.   osan(okansi() ? "\0033└──┴" : "+--+",&abort,&next);
  13872.   for(i=0;i<42;i++) osan(okansi() ? "─" : "-",&abort,&next);
  13873.   osan(okansi() ? "┴" : "+",&abort,&next);
  13874.   for(i=0;i<10;i++) osan(okansi() ? "─" : "-",&abort,&next);
  13875.   pla(okansi() ? "┴─┘" : "+-+",&abort);
  13876.   nl();
  13877. }
  13878.  
  13879.  
  13880. void run_chain(int cn)
  13881. {
  13882.   char s[255],s1[81],s2[81],s3[81];
  13883.   int oc,f,blat;
  13884.   unsigned int toph,topm,topf,both,botm,botf;
  13885.   long l;
  13886.  
  13887.   blat=0;
  13888.   if((chains[cn].lowtime!=chains[cn].hightime) &&
  13889.     !(thisuser.exempt & exempt_timelock))
  13890.     if(chains[cn].hightime>chains[cn].lowtime) {
  13891.       if((timer()<=(chains[cn].lowtime*60.0)) ||
  13892.              (timer()>=(chains[cn].hightime*60.0))) blat=1;
  13893.     } else {
  13894.     blat=1;
  13895.     if((timer()>(chains[cn].lowtime*60.0)) ||
  13896.       (timer()<(chains[cn].hightime*60.00))) blat=0;
  13897.   }
  13898.   if(blat) {
  13899.     topf=botf=0;
  13900.     toph=chains[cn].hightime/60;
  13901.     topm=chains[cn].hightime-(60*toph);
  13902.     if(!toph) toph=12;
  13903.     if(chains[cn].hightime>=720) {
  13904.       toph-=12;
  13905.       topf=1;
  13906.     }
  13907.     both=chains[cn].lowtime/60;
  13908.     botm=chains[cn].lowtime-(60*both);
  13909.     if(!both) both=12;
  13910.     if(chains[cn].lowtime>=720) {
  13911.       both-=12;
  13912.       botf=1;
  13913.     }
  13914.     ansic(1);
  13915.     npr("\0031%s is only available from %d:%02d%cm to %d:%02d%cm\r\n",
  13916.     chains[cn].description,both,botm,botf?'p':'a',toph,topm,topf?'p':'a');
  13917.     sprintf(s2,"!Timelock on '%s'",chains[cn].description);
  13918.     sysoplog(s2);
  13919.     return;
  13920.   }
  13921.   chains[cn].usage++;
  13922.   sprintf(s,"%sCHAINS.DAT",syscfg.datadir);
  13923.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  13924.   write(f,(void *)chains, numchain * sizeof(chainfilerec));
  13925.   close(f);
  13926.   itoa(com_speed, s1, 10);
  13927.   itoa(syscfg.primaryport,s2,10);
  13928.   itoa(modem_speed, s3, 10);
  13929.   stuff_in(s,chains[cn].filename,create_chain_file("CHAIN.TXT"),s1,s2,s3,"");
  13930.   sprintf(s2,"!Ran '%s'",chains[cn].description);
  13931.   sysoplog(s2);
  13932.   oc=chatcall;
  13933.   chatcall=0;
  13934.   l=thisuser.sysstatus;
  13935.   if (chains[cn].ansir & ansir_no_pause)
  13936.     thisuser.sysstatus &= ~sysstatus_pause_on_page;
  13937.   if (chains[cn].ansir & ansir_no_DOS) {
  13938.     set_protect(0);
  13939.     if (chains[cn].ansir & ansir_shrink)
  13940.       shrink_out(s,1,0,1,1);
  13941.     else
  13942.       run_external(s);
  13943.     topscreen();
  13944.   } else
  13945.     if (chains[cn].ansir & ansir_shrink)
  13946.       shrink_out(s,1,1,1,1);
  13947.     else
  13948.       full_external(s,0,1);
  13949.   thisuser.sysstatus = l;
  13950.   chatcall=oc;
  13951. }
  13952.  
  13953. /* End block read for GREENY02.mod */
  13954.  
  13955.  
  13956.  
  13957. Save it off.  Load up VARS.H (I know, I know...) and change/add this...
  13958.  
  13959. == /* DATA FOR OTHER PROGRAMS AVAILABLE */
  13960. == typedef struct {
  13961. ==      char            filename[81],           /* filename for .chn file */
  13962. ==                      description[81];        /* description of it */
  13963. ==      unsigned char   sl,                     /* seclev restriction */
  13964. ==                      ansir;                  /* if ANSI required */
  13965. +=      unsigned short  ar,                     /* AR restriction */
  13966. ++                      lowtime,
  13967. ++                      hightime,
  13968. ++                      usage;
  13969. == } chainfilerec;
  13970.  
  13971. Farther down, find...
  13972.  
  13973. == #define exempt_post 0x08
  13974. ++ #define exempt_timelock 0x10
  13975.  
  13976. Save it.  Compile it.  Get some tea.  Then block read out and compile the
  13977. subcnvt program which follows.  You need to use it on your chains.dat file
  13978. in the data directory.  Usage subcnvt oldfile newfile.
  13979.  
  13980.  
  13981.  
  13982. /* Begin subcnvt.c for greeny's online monstrosity */
  13983.  
  13984. /*  CONVERT USERLIST PROGRAM */
  13985. /*  Written by The Black Dragon, 1989 */
  13986. /*  Mangled by Greeny to do something totally different. */
  13987.  
  13988. #include <stdio.h>
  13989. #include <string.h>
  13990. #include <mem.h>
  13991. #include <io.h>
  13992. #include <fcntl.h>
  13993. #include <sys\stat.h>
  13994. struct {char f[81],d[81],s,an;
  13995.         unsigned ar,l,h,u;} new;
  13996. struct {char f[81],d[81],s,an;
  13997.         unsigned ar;} old;
  13998. void main(int argc, char *argv[])
  13999. {
  14000.   int f,g,i;
  14001.   unsigned int loop,num=0;
  14002.   unsigned long len;
  14003.  
  14004.   if (argc<3) {
  14005.     printf("\nRequires 2 parameters.\n");
  14006.     printf("Usage: SUBCNVT oldfile newfile \n");
  14007.     exit(0);
  14008.   }
  14009.   if ((f=open(argv[1],O_RDWR|O_BINARY,S_IREAD|S_IWRITE))<=0) {
  14010.     printf("\nCould not open chain list %s\n",argv[1]);
  14011.     abort();
  14012.   }
  14013.   if ((g=open(argv[2],O_RDWR|O_BINARY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE))<=0) {
  14014.     printf("\nCould not open output file %s\n",argv[2]);
  14015.     abort();
  14016.   }
  14017.   printf("\n\nSize of old record %d",sizeof(old));
  14018.   printf("\nSize of new record %d\n\n",sizeof(new));
  14019.  
  14020.   len=filelength(f);
  14021.   num=(len/sizeof(old))+!(len%sizeof(old));
  14022.   for (loop=0;loop<num;loop++) {
  14023.     if (sizeof(old)==read(f,&old,sizeof(old))) {
  14024.     printf("\015Processing user #%u of %u",loop,num-1);
  14025.  
  14026.     memset(&new,0,sizeof(new));     /* Nice to clear out garbage */
  14027.     strcpy(new.f,old.f);          /* Now copy all data over    */
  14028.     strcpy(new.d,old.d);
  14029.     new.s=old.s;
  14030.     new.an=old.an;
  14031.     new.ar=old.ar;
  14032.     new.l=new.h=new.u=0;
  14033.     write(g,&new,sizeof(new));      /* record converted here */
  14034.     }
  14035.   }
  14036.   close(f);
  14037.   close(g);
  14038. }
  14039.  
  14040. /* End subcnvt.c for greeny's online monstrosity */
  14041.  
  14042.  
  14043.  
  14044. Try it.  The bar graphs should establish themselves in a few days, and will
  14045. be continuously updated each time someone runs an onliner.  The most popular
  14046. one will go all the way accross, the rest will be in proportion to it.
  14047. (Onliners a user does not have access to will not affect the bar graph
  14048. generated for that user.)
  14049.  
  14050. Mail about this can be sent to 8@6910.  I don't run a board myself, just
  14051. mangle code for people who do.
  14052.  
  14053. (GREENY)
  14054. THE PROMISED LAND Delran NJ 609-764-7144  Reg. #91223
  14055. HOST OF SUB 42 - DEEP THOUGHT: THE INTERNATIONAL MENSA NET
  14056. USR 38400/HST/HST/V.32/V.32-BIS/LAPM/V.42/V.42-BIS/MNP/ARQ/ASL
  14057.  
  14058.  
  14059.  
  14060.  
  14061.  
  14062.  
  14063. [99/99]: EDITINF1.420 - WWIVEdit's EDITINFO.MOD for WWIV 4.20
  14064. [Name ]: The Emporer #1 @6470
  14065. [Date ]: Sat Jan 18 23:36:53 1992
  14066. [From ]: The First Galactic Empire (Ohio)
  14067.  
  14068. EDITINFO.MOD
  14069. by Adam Caldwell (The Emporer)
  14070.  
  14071. ===========================================================================
  14072. This is a mod that I made so that WWIVEdit 2.2 could ALWAYS get the correct
  14073. title and destination when it loaded up.  It also has the side effect of
  14074. allowing Title changes and "Result" codes for Anonymous/Non-Anonymous saves.
  14075.  
  14076. 1/18/92 I finally update the mod for WWIV 4.20 (now it won't work with
  14077. WWIV 4.12)
  14078.  
  14079. ===========================================================================
  14080. Step 1:
  14081.  
  14082. Back everything up... This should go without saying by now...
  14083. ===========================================================================
  14084. Step 2:
  14085.  
  14086. Load up VARS.H and make the following addition:
  14087.  
  14088. char ansistr[81], cdir[81], charbuffer[161], chatreason[81], crttype,
  14089.      curspeed[81], dcd[81], dc[81], dszlog[81], endofline[81],
  14090.      gatfn[81], irt[81], net_email_name[81], newprompt[161], odc[81],
  14091.      search_pattern[81], ver_no1[51], xdate[9], irt_name[81];
  14092.  
  14093. char message_title[81], message_dest[81];         /* Add This Line */
  14094.  
  14095. int abortext, already_on, ansiptr, arcling, async_irq, base, bchanged,
  14096.     change_color, charbufferpointer, chatcall, chatting, chat_file,
  14097.  
  14098. =============================================================================
  14099. Step 3:
  14100.  
  14101. Still in VARS.H, but further down, make this addition:
  14102.  
  14103. extern char ansistr[81], cdir[81], charbuffer[161], chatreason[81], crttype,
  14104.      curspeed[81], dcd[81], dc[81], dszlog[81], endofline[81],
  14105.      gatfn[81], irt[81], net_email_name[81], newprompt[161], odc[81],
  14106.      search_pattern[81], ver_no1[51], xdate[9], irt_name[81];
  14107.  
  14108. extrn char message_title[81], message_dest[81];         /* Add This Line */
  14109.  
  14110. extern int abortext, already_on, ansiptr, arcling, async_irq, base, bchanged,
  14111.     change_color, charbufferpointer, chatcall, chatting, chat_file,
  14112.     checkit, configfile, curatr, curdir, curdloads, curldir, curlsub,
  14113.  
  14114.  
  14115. ===========================================================================
  14116. Step 4:
  14117.  
  14118. Save VARS.H and load up BBS.C.
  14119. ===========================================================================
  14120. Step 5:
  14121.  
  14122. In BBS.C, in void text_edit() add these two lines:
  14123.  
  14124.     sprintf(s1,"@ Edited: %s",s);
  14125.     sysoplog(s1);
  14126.     if (okfsed()) {                             /* Add { at end of line */
  14127.       strcpy(message_title,s);                                /* Add Me */
  14128.       strcpy(message_dest,syscfg.gfilesdir);                  /* Add Me */
  14129.       external_edit(s,syscfg.gfilesdir,thisuser.defed-1,500);
  14130.     } else                                     /* Add } at start of line*/
  14131.       tedit(s);
  14132. ===========================================================================
  14133. Step 6:
  14134.  
  14135. Still in BBS.C in void mainmenu() add these two lines:
  14136.   if ((strcmp(s,"EDIT")==0) && (so())) {
  14137.     nl();
  14138.     prt(2,"Filename? ");
  14139.     input(s1,50);
  14140.     if (s1[0]) {
  14141.       if ((okansi()) && (thisuser.defed)) {         /* Add { at end of line */
  14142.         strcpy(message_title,s1);                   /* Add Me */
  14143.         strcpy(message_dest,"BBS Main Directory");  /* Add Me */
  14144.         external_edit(s1,"",thisuser.defed-1,500);
  14145.       } else                                        /* Add } in front */
  14146.         tedit(s1);
  14147. ===========================================================================
  14148. Step 7:
  14149.  
  14150. Save BBS.C and load up MSGBASE.C
  14151. ===========================================================================
  14152. Step 8:
  14153.  
  14154. Still in MSGBASE.C in void inmsg()
  14155.  
  14156. Add this line up in the variables section
  14157.   char s[LEN],s1[LEN],s2[LEN],ro[81],fnx[81],chx,*ss,*ss1,pseudo[25];
  14158.   int maxli,curli,done,save,savel,i,i1,i2,i3,i4,i5,f,setanon,gati[50],gatp;
  14159.   messagerec m;
  14160.   long ll,l1;
  14161.   char *lin, *b;
  14162.   int real_name=0;
  14163.   FILE *result;    /* Add Me */
  14164.  
  14165. Now, much further down, do this:
  14166.     if (fsed==1) {                   /* Existing Line */
  14167.       strcpy(message_title,title);   /* Add Me */
  14168.       save=external_edit("INPUT.MSG",syscfg.tempdir,(int) (thisuser.defed)-1,ma
  14169. xli);  /* existing line */       if (save && 
  14170. (result=fopen("RESULT.ED","rt"))!=NULL) { /* Add Me */
  14171.         fgets(s,80,result);                                 /* Add Me */
  14172.         s[strlen(s)-1]=0;         /* take of CR */          /* Add Me */
  14173.         setanon=atoi(s);                                    /* Add Me */
  14174.         fgets(title,80,result);                             /* Add Me */
  14175.         title[strlen(title)-1]=0; /* take of CR */          /* Add Me */
  14176.         fclose(result);                                     /* Add Me */
  14177.         remove("RESULT.ED");                                /* Add Me */
  14178.       }                                                     /* Add Me */
  14179.     } else {                                                /* Existing */
  14180.       save=exist(fnx);                                      /* Existing */
  14181.       if (save) {                                           /* Existing */
  14182.         pl("Reading in file...");                           /* Existing */
  14183. ===========================================================================
  14184. Step 9:
  14185.  
  14186. In void email() about 100 lines further down... Add this line
  14187.  
  14188.     if (un==0)                                          /* Existing Line */
  14189.       sprintf(s2,"%s @%u",net_email_name,sy);           /* Existing Line */
  14190.     else                                                /* Existing Line */
  14191.       sprintf(s2,"User %u @%u",un,sy);                  /* Existing Line */
  14192.   }                                                     /* Existing Line */
  14193.   npr("E-mailing %s\r\n",s2);
  14194.   strcpy(message_dest,s2);                  /* Add Me */
  14195.   if (ss.ability & ability_email_anony)                 /* Existing Line */
  14196.     i=anony_enable_anony;                               /* Existing Line */
  14197.   else                                                  /* Existing Line */
  14198.     i=0;                                                /* Existing Line */
  14199.   if (anony & (anony_receiver_pp | anony_receiver_da))  /* Existing Line */
  14200. ===========================================================================
  14201. Step 10:
  14202.  
  14203. Save MSGBASE.C and load MSGBASE1.C
  14204. ===========================================================================
  14205. Step 11:
  14206.  
  14207. At the top just after the following lines:
  14208. #define EMAIL_STORAGE 2 /* Existing line */
  14209.  
  14210. int deleted_flag;       /* Existing line */
  14211.  
  14212. Add all of these lines:
  14213.  
  14214. void create_editor_info()
  14215. {
  14216.   FILE *f;
  14217.  
  14218.   remove("EDITOR.INF");
  14219.   remove("RESULT.ED");
  14220.   if ((f=fopen("EDITOR.INF","wt"))!=NULL) {
  14221.     fprintf(f,"%s\n%s\n%u\n%s\n%s\n%u\n",
  14222.       message_title,
  14223.       message_dest,
  14224.       usernum,
  14225.       thisuser.name,
  14226.       thisuser.realname,
  14227.       thisuser.sl);
  14228.     fclose(f);
  14229.   }
  14230. }
  14231. ===========================================================================
  14232. Step 12:
  14233.  
  14234. In int external_edit() add this line:
  14235.   itoa(numlines,sx3,10);                /* Existing Line */
  14236.   stuff_in(s,s1,fn,sx1,sx2,sx3,"");     /* Existing Line */
  14237.   create_editor_info();                                    /* Add Me */
  14238.   full_external(s,0,1);                 /* Existing Line */
  14239.   if (!wfc)                             /* Existing Line */
  14240.     topscreen();                        /* Existing Line */
  14241. ===========================================================================
  14242. Step 13:
  14243.  
  14244. In void post() add the following line:
  14245.     if (syscfg.systemnumber) {                    /* Existing Line */
  14246.       nl();                                       /* Existing Line */
  14247.       pl("This post will go out on WWIVnet.");    /* Existing Line */
  14248.       nl();                                       /* Existing Line */
  14249.     }                                             /* Existing Line */
  14250.   }                                               /* Existing Line */
  14251.   strcpy(message_dest,subboards[curlsub].name);                  /* Add me */
  14252.   inmsg(&m,p.title,&a,1,(subboards[curlsub].filename),ALLOW_FULLSCREEN); /* Exi
  14253. sting Line */   if (m.stored_as!=0xffffffff) {                  /* Existing 
  14254. Line */
  14255.     p.anony=a;                                    /* Existing Line */
  14256. ===========================================================================
  14257. Step 14:
  14258.  
  14259. Save MSGBASE1.C and Load MULTMAIL.C
  14260. ===========================================================================
  14261. Step 15:
  14262.  
  14263. In void multimail() add this line:
  14264.   m.msg.storage_type=EMAIL_STORAGE;             /* Existing Line */
  14265.   strcpy(irt,"Multi-Mail");                     /* Existing Line */
  14266.   irt_name[0]=0;                                /* Existing Line */
  14267.   strcpy(message_dest, irt);                                   /* Add Me */
  14268.   byline[0]=0;                                  /* Existing Line */
  14269.   inmsg(&m.msg,t,&i,1,"EMAIL",ALLOW_FULLSCREEN);/* Existing Line */
  14270.   if (m.msg.stored_as==0xffffffff)              /* Existing Line */
  14271.     return;                                     /* Existing Line */
  14272.   strcpy(m.title,t);                            /* Existing Line */
  14273. ===========================================================================
  14274. Step 16:
  14275.  
  14276. Save MULTMAIL.C and recompile.
  14277. ===========================================================================
  14278.  
  14279. Disclaimer:
  14280.   I assume no responsibilty if this blows up your system.
  14281.  
  14282. About this mod:
  14283.   There are ceartain mods that this mod will conflict with, including the
  14284. mod for FEDIT.  I will eventually work out a fix for it, but I don't have
  14285. the time to now....
  14286.   This mod has been successfully used on my BBS with my 254 Message base
  14287. installed, as well as some other mods.  If you have any problems with this
  14288. mod, there are a bunch of ways that you can contact me:
  14289.  
  14290. 1) E-Mail me via WWIVLink as 1   @16401
  14291. 2) E-Mail me via WWIVNet  as 1   @6470
  14292. 3) E-Mail me via WWIVNet  as 718 @5252
  14293. 4) E-Mail me via Internet as acaldwel@oucsace.ohiou.edu
  14294. 5) E-Mail me via Bitnet   as CS755@OUACCVMB
  14295. 6) Call my BBS at 614-593-7836 [The First Galactic Empire]
  14296. 7) Call me (only if you are *REALLY* desperate at 614-594-3051)
  14297.  
  14298.  
  14299.  
  14300.  
  14301.  
  14302.  
  14303. < The WWIV Modification Net Q-Scan Done >
  14304.  
  14305. < Nothing new on ReeferNet 13 >
  14306.  
  14307. < Nothing new on BeerNet 14 >
  14308.  
  14309. < Nothing new on Exotica Erotica 15 >
  14310.  
  14311. < Nothing new on VM386 Workshop 16 >
  14312.  
  14313. < Nothing new on 386ing 17 >
  14314.  
  14315. < Nothing new on WWIV Mods & Technical Help 18 >
  14316.  
  14317. << Global Q-Scan Done >>
  14318.  
  14319.  
  14320.  
  14321. [PD] Miscellaneous - Directory #1. Contains 18 ƒiles.
  14322. ═════════════════════════════════════════════════════
  14323.  
  14324. NASEMENU.ZIP:   52k :nasa menu
  14325. PACMAN  .ZIP:   27k :name says it all
  14326. MBASE21 .ZIP:   31k :music database..
  14327. ATOM    .ZIP:   19k :a great song. Sb not needed. Sounds awsome.
  14328. ANSIMUS2.ZIP:   60k :Ansi music editor (better than moonsong)
  14329. MOONSONG.ZIP:   29k :Ansi 
  14330. 68 minutes used, 22 left.
  14331. [12] [The WWIV Modification Net]         
  14332. << DOS Shell >>. Type 'EXIT┘' to return to Telix.
  14333. T
  14334.  
  14335. ┌────────────────────────────────────────────────────────────────────────────┐
  14336. │                        -=> TRANSFER AREA RULES <=-                         │
  14337. ├────────────────────────────────────────────────────────────────────────────┤
  14338. │ No DOWNLOADS durring the hours of 4pm and 10pm.  If you are found abusing  │
  14339. │ this rule, deletion of your account could occur.                           │
  14340. │                                                                            │
  14341. │ Files UPLOADED must be in ZIP, GIF, or EXE format.                         │
  14342. ├────────────────────────────────────────────────────────────────────────────┤
  14343. │ ** NOTE **          No PRIME TIME on Saturday & Sunday                     │
  14344. └────────────────────────────────────────────────────────────────────────────┘
  14345.  
  14346.  
  14347. 69 minutes used, 21 left.
  14348. (1)-([PD] Miscellaneous)         N
  14349.  
  14350. Search all directories? Yes
  14351.  
  14352.  
  14353. [PD] Miscellaneous - Directory #1. Contains 18 ƒiles.
  14354. ═════════════════════════════════════════════════════
  14355.  
  14356. NASEMENU.ZIP:   52k :nasa menu
  14357. PACMAN  .ZIP:   27k :name says it all
  14358. MBASE21 .ZIP:   31k :music database..
  14359. ATOM    .ZIP:   19k :a great song. Sb not needed. Sounds awsome.
  14360. ANSIMUS2.ZIP:   60k :Ansi music editor (better than moonsong)
  14361. MOONSONG.ZIP:   29k :Ansi Music Editor
  14362. POETRY  .ZIP:  284k :Poetry Generator
  14363. RDWAY301.ZIP:  187k :Vacation/trip mapping program. (Routes)
  14364. RUSTU15 .ZIP:  226k :Russian Tutor, not bad for those learning.
  14365. STUP    .ZIP:  692k :stupid computer tricks try them all
  14366. THIEF22 .ZIP:   49k :code thief
  14367.  
  14368.  
  14369. [PD] Documents & Text - Directory #3. Contains 6 ƒiles.
  14370. ═══════════════════════════════════════════════════════
  14371.  
  14372. MAKE9600.TXT:    5k :Make your old 2400 into a 9600 or more!!!!!!!
  14373. PC-DRAFT.ZIP:   60k :word process..
  14374. GIRLS   .TXT:    5k :How to meet Girls
  14375.  
  14376.  
  14377. [PD] Virus Protection Programs - Directory #4. Contains 7 ƒiles.
  14378. ════════════════════════════════════════════════════════════════
  14379.  
  14380. FPROT201.ZIP:  231k :Freeware Virus protection program, Version Nov 91.
  14381. VSUMX110.ZIP:  390k :Database of known viruses, dated November 91.
  14382.  
  14383.  
  14384. [PD] Communications - Directory #5. Contains 21 ƒiles.
  14385. ══════════════════════════════════════════════════════
  14386.  
  14387. BIMODEM .ZIP:  133k :bimodem protocal
  14388. DSZ1015 .ZIP:   88k :Z modem 
  14389. MDMCFG20.ZIP:   27k :Telix 3.15 modem config v2.0
  14390. MTEZ    .ZIP:   85k :comm program with MNP1-5 built in for modems w/out
  14391. ODYSY150.ZIP:  307k :Full featured comm program with MNP1-5 built in.
  14392. SUPERZ  .ZIP:   82k :Super Z modem
  14393. TLXPROT .ZIP:  153k :external Protocols for Telix
  14394. TM301-1 .ZIP:  189k :Telemate v3.01 Com Program 1/3
  14395. TM301-2 .ZIP:  263k :Telemate v3.01 Com program 2/3
  14396. TM301-3 .ZIP:  103k :Telemate v3.01 Documentation Files
  14397. TUM100  .ZIP:   14k :Telix Upload Manager
  14398.  
  14399.  
  14400. [PD] Utilities & Applications - Directory #7. Contains 20 ƒiles.
  14401. ════════════════════════════════════════════════════════════════
  14402.  
  14403. BX      .ZIP:    7k :baltimore exchanges
  14404. ASQV315 .ZIP:  179k :System Diagnostics from Qualitas (freeware)
  14405. DOSKEY  .ZIP:    2k :Lets you choose from your last 10 commands using up arrow
  14406. FIXDOS50.ZIP:  226k :Files to fix bugs in Dos 5.0
  14407. HIMEM300.ZIP:    9k :HIMEM v3.00 newest release--takes up less memory
  14408. MSDRIVRS.ZIP:   59k :8/27/91 New Drivers from Microsoft (DOS 5.)
  14409. ORG30SWE.ZIP:   71k :Defrag/Organize your HD (Graphic)
  14410. PAK251  .EXE:  101k :PAK v2.51 compression/extraction -- better than PKZIP
  14411. PCZIP   .ZIP:   55k :Speeds up computer about %5. Doesn't work on all systems.
  14412. PRODHP13.ZIP:   95k :Online help for Prodigy
  14413. TSRBASIC.ZIP:   95k :basic compiler tsr style.. can even compile.. 
  14414.  
  14415.  
  14416. [PD] Graphic Utilities - Directory #8. Contains 8 ƒiles.
  14417. ════════════════════════════════════════════════════════
  14418.  
  14419. ANSICV22.ZIP:   64k :Convert gif's to ansi. 12/91 release.
  14420. NPSADULT.ZIP:   15k :New Print Shop Graphics - Adult X-rated
  14421. PIXFOL12.ZIP:  298k :Image viewer for Win 3.0
  14422.  
  14423.  
  14424. [PD] DEMO's Oƒ Various Sorts - Directory #9. Contains 11 ƒiles.
  14425. ═══════════════════════════════════════════════════════════════
  14426.  
  14427. CATNAP  .ZIP:  445k :Catnap - .FLI Christmas Demo from Atari...
  14428. DGENDEMO.ZIP:  265k :D-Generation Playable Demo
  14429. F117A1  .ZIP:  445k :F117 Playable Demo from Microprose [1/2]
  14430. F117A2  .ZIP:  604k :F117 Playable Demo from Microprose [2/2]
  14431. FAR     .ZIP:  553k :Demo of the Farside Calendar
  14432. SIERRA  .ZIP:  135k :Christmas demo from Sierra.
  14433.  
  14434.  
  14435. [PD] Games - Directory #10. Contains 47 ƒiles.
  14436. ══════════════════════════════════════════════
  14437.  
  14438. DARKAGES.ZIP:  174k :ANOTHER D&D GRAPHIC GAME GOOD REALLY IT IS!!!
  14439. MORAFF  .ZIP:  151k :Moraff D&D graphx game!!!!!!!!!!!!!!!!!!!!!!!
  14440. UPWALL  .ZIP:   64k :Will drive you up the wall@!!@!@!@!
  14441. BUSHIDO .ZIP:   61k :ninja game, read docs
  14442. SIMCTYSW.ZIP:  580k :Sim City shareware version great!!!
  14443. WIZ-LAIR.ZIP:  217k :Wizard's Lair Role Playing Game
  14444. DUBLLINK.ZIP:  104k :Like Dr. Mario, VGA
  14445. ATLANTIS.ZIP:  127k :Risk type game
  14446. !ESCAPED.ZIP:  138k :Maze type game from Moraffware. Challenging!
  14447. ARKANOID.ZIP:  115k :VGA version of the popular arcade game
  14448. BRIX    .ZIP:  113k :Latest Tetris like game released 12/15/91
  14449. CD-MAN  .ZIP:  227k :VGA Pacman 
  14450. CHINESE .ZIP:  144k :Chinese Checkers Game
  14451. COMIC400.ZIP:  102k :captain comic adventures
  14452. K6DEMO  .ZIP:  694k :Commander Keen 6 Demo
  14453. MCPOP   .ZIP:   53k :Screw women to stay alive
  14454. ORION   .ZIP:  246k :Excellent VGA arcade game, fly with a jet pack
  14455. SEXJVGA .ZIP:  301k :Sexjack vga(+ega) much improved!! prged by Lurch for 2+plr
  14456. SHADOW  .ZIP:  151k :Shadow Knight - vga ninja action arcade game
  14457. SHOOT20 .ZIP:  130k :Shoot um up game
  14458. STARGOSE.ZIP:   85k :Space game w/ good graphics and action.
  14459. ZZT30   .ZIP:  114k :ZZT Adventure - Very Good - [ All Monitors Supported ]
  14460.  
  14461.  
  14462. [PD] Non-PornoGrapic Gif's - Directory #11. Contains 47 ƒiles.
  14463. ══════════════════════════════════════════════════════════════
  14464.  
  14465. STEPH1  .GIF:  344k :(550x800x256) nice babe in white swimsuit
  14466. 2010    .GIF:   35k :From the movie 2010
  14467. BUSH    .GIF:   52k :president bush
  14468. CLOWN   .ZIP:   50k :A gif of a clown..... GREAT Pic!
  14469. COKE    .GIF:   58k :coke can 
  14470. DRAGON  .GIF:  176k :dragon
  14471. EARTH   .GIF:   51k :picture of earth from space
  14472. HARLQUIN.GIF:   92k :Etching of a Harlequin by Picasso (B/W)
  14473. INANAME .GIF:   81k :(639x460x256) What's in a name? Orig scan of a rose.
  14474. MBBUDGIR.GIF:  185k :Budwiser girls
  14475. PICASSO .GIF:  100k :A photo of the cubist master painter
  14476. PIPER   .GIF:  201k :(517x445x256) Cover art from Rare Air's SPACE PIPER
  14477. ROSE    .GIF:   47k :vga rose
  14478. SI01-I  .GIF:  196k :Brunette in swimsuit
  14479. SI02-I  .GIF:  194k :Elle Macpherson in swimsuit
  14480. SI04-I  .GIF:  140k :VGA Swimsuit girl
  14481. SI05-I  .GIF:  144k :Elle Macpherson in swimsuit
  14482. SI07-I  .GIF:  121k :another Elle Macpherson
  14483. SI08-I  .GIF:  177k :Girl lying on rocks
  14484. SI09-I  .GIF:  321k :Christy Brinkley (What a babe!)
  14485. SI11-I  .GIF:  275k :VGA Scan of awesome babe in swimsuit
  14486. SI12-I  .GIF:  236k :VGA Swimsuit girl
  14487. SI13-I  .GIF:  118k :VGA Swimsuit girl
  14488. SI14-I  .GIF:  142k :Girl on beach with horses
  14489. SI16-I  .GIF:  188k :Beautiful girl in a pool
  14490. SI30-I  .GIF:  127k :Girl returning from snorkling
  14491. SIGIRL3 .GIF:  167k :Very Beautiful Blonde in swimsuit VGA
  14492. VG0002  .GIF:  272k :Another masterpiece from Vinnie VanGogh
  14493. VG0003  .GIF:  147k :Another from the master PostImpressionist Van Gogh
  14494. VG0004  .GIF:  188k :(640x480x256) great work #4 from Vinnie VanGogh
  14495. VG0005  .GIF:  201k :(640x480x256) 5th in the series of VanGogh works
  14496. WEEPNWMN.GIF:  145k :Etching of a crying woman by Picasso
  14497. WINTER  .GIF:  256k :Awesome VGA scan of a house covered in snow
  14498. YELLO   .GIF:  172k :(639x460x256) Yellow Lamborghini Diablo w/fire backdrop
  14499.  
  14500.  
  14501. [PD] XXX Giƒs (100k+ 256color) - Directory #12. Contains 29 ƒiles.
  14502. ══════════════════════════════════════════════════════════════════
  14503.  
  14504. CINDYC  .GIF:  126k :(512x400x256) Cindy !!!
  14505. FK1     .GIF:  165k :(480x640x256) Nice Nude !!!
  14506. CC4     .GIF:  125k :(640x400x256) Michelle Pfiefer in the buff !!!
  14507. ALLEY01 .GIF:  114k :(640x412x256) Kirstie Alley in the buff !!!
  14508. BB1     .GIF:  120k :(640x480x256) two gals in a tub sudzin & suckin'
  14509. N2      .GIF:  139k :(640x480x256) blonde twins in white teddy's
  14510. CASS3   .GIF:  245k :(640x480x256) blonde bent over in front of a red tub
  14511. BATH1   .GIF:  170k :(640x495x256) standing tall & lookin' good
  14512. VLG9-075.GIF:  725k :(1024x768x256) xxx
  14513. 3ORGANS .GIF:  183k :(640x400x256) Girl working 2 guys nest to a pool table
  14514. BANANA2H.GIF:  259k :(588x480x256) Find the BANANA
  14515. BANANA3H.GIF:  138k :(325x480x256) Find the BANANA
  14516. BANANA4H.GIF:  214k :(478x480x256) Find the BANANA
  14517. DRAGONLY.GIF:  363k :Very High res NUDE wraped by a dragon
  14518. EM-NUDE .GIF:  227k :nude
  14519. EVANS   .GIF:  140k :(640x480x256) linda semi-nude in a pond
  14520. F3052-1 .GIF:  135k :(623x462x256) Gif of gal from Lutherville (Gabby's BBS)
  14521. HEAVEN  .GIF:  129k :(640x480x256) 9 nudes in a row
  14522. KASCHAX4.GIF:  165k :(640x400x256) Kascha fillin her holes
  14523. LEZ-1   .GIF:  202k :same muffin munchers
  14524. LORNA   .GIF:  197k :Great Hooters on the beach
  14525. PHGIRLS .GIF:  222k :(640x480x256) Two babes on the beach
  14526. PREG1   .GIF:  164k :(472x459x256) Pregnant women having fun (orig. scan)
  14527. PREG2   .GIF:  167k :(471x459x256) Followup to PREG1.GIF
  14528. TENBOOBS.GIF:  137k :(640x480x256) Five ladies with big hooters
  14529.  
  14530.  
  14531. [PD] Porno .TXT ƒiles - Directory #13. Contains 40 ƒiles.
  14532. ═════════════════════════════════════════════════════════
  14533.  
  14534. LESSON  .ZIP:   38k :They learn a lesson 
  14535. ANGIE   .ZIP:   30k :A young girl gets educated
  14536. BEACH   .ZIP:    7k :A txt about doing it at the beach.
  14537. CSAR    .ZIP:   24k :A Master and his pets
  14538. DANE    .ZIP:    8k :A kinky weekend at Dane Manor
  14539. GENNY   .ZIP:    6k :About a girl name Genny.
  14540. LAYCAMP .ZIP:    7k :About a camp you will not forget.
  14541. LISA    .ZIP:   74k :Lisa's stories
  14542. NITERAIN.ZIP:    3k :A rainy evening on the road
  14543. NURSING .ZIP:    6k :A kinky adventure with three nurses
  14544. SCHLBOY .ZIP:    7k :Some scholl discipline
  14545. SEXTET  .ZIP:   16k :A woman who loves it all.
  14546. TEXPOKER.ZIP:   22k :Strip poker Texas style.
  14547.  
  14548.  
  14549. [PD] BBS Advertisements - Directory #14. Contains 14 ƒiles.
  14550. ═══════════════════════════════════════════════════════════
  14551.  
  14552. QUANTUM .V8 :  189k :Digitized Sound BBS ad! 8-Bit
  14553.  
  14554.  
  14555. [Elite] Amiga Games - Directory #15. Contains 2 ƒiles.
  14556. ══════════════════════════════════════════════════════
  14557.  
  14558. JETSONS .ZIP:   48k :Coll jetsons game
  14559.  
  14560.  
  14561. [Elite] Documents & Text - Directory #18. Contains 10 ƒiles.
  14562. ════════════════════════════════════════════════════════════
  14563.  
  14564. F29DOC  .ZIP:    2k :Docs for f-29 retaliator.
  14565.  
  14566.  
  14567. [Elite] Communications - Directory #19. Contains 4 ƒiles.
  14568. ═════════════════════════════════════════════════════════
  14569.  
  14570. BIREGIS .ZIP:  133k :Registered Bimodem
  14571. PUMA100 .ZIP:   65k :puma protocol
  14572.  
  14573.  
  14574. [Elite] Windows Programs - Directory #20. Contains 28 ƒiles.
  14575. ════════════════════════════════════════════════════════════
  14576.  
  14577. INTERMIS.ZIP:  240k :Win 3: Intermission Screen Saver
  14578. EXCEL301.ZIP: 1015k :MICROSOFT EXCEL 3.0 1/3
  14579. EXCEL302.ZIP: 1053k :Microsoft EXCEL 3.0 2/3
  14580. EXCEL303.ZIP:  665k :MICROSOFT EXCEL 3.0 3/3
  14581. GB210   .ZIP:  323k :A number of games for windows 3.0
  14582. ICO-1980.ZIP:  410k :Nearly 2000 Icons for windows
  14583. UC30-1  .ZIP:  185k :Unicomm Comm prog for win 3.0 - VG
  14584. UC30-2  .ZIP:  116k :Disk 2 of 2 for Unicomm for windows 3.0
  14585. VANGOGH .ZIP:   42k :Wallpaper for Windows 3.0--VanGogh Self Portrait (Great!)
  14586. WARHEAD .ZIP:  111k :Warhead - for Windows, like Missle Command.
  14587. WINENTPK.ZIP:  266k :Windows Entertainment Pack!
  14588.  
  14589.  
  14590. [Elite] Utilities & Applications - Directory #21. Contains 48 ƒiles.
  14591. ════════════════════════════════════════════════════════════════════
  14592.  
  14593. XTRATANK.ZIP:   48k :double hard disk space
  14594. 123_23_1.ZIP:  604k :Lotus 1-2-3 2.3 [1/4]
  14595. 123_23_2.ZIP:  714k :Lotus 1-2-3 2.3 [2/4]
  14596. 123_23_3.ZIP:  711k :Lotus 1-2-3 2.3 [3/4]
  14597. 123_23_4.ZIP:  712k :Lotus 1-2-3 2.3 [4/4]
  14598. ASQ0315 .ZIP:  179k :memory analysis & tutorial from Qualitas
  14599. BETRLIV1.ZIP: 1280k :Better Living  1/2
  14600. BETRLIV2.ZIP: 1230k :Better Living  2/2
  14601. BWORKS1 .ZIP:  923k :Body Works  1/2
  14602. BWORKS2 .ZIP: 1176k :Body Works  2/2
  14603. CNTRLROM.ZIP:  567k :Control Room 
  14604. CPAV1   .ZIP:  193k :Central Point Anti-Virus  1/2
  14605. CPAV2   .ZIP:  288k :Central Poing Anti-Virus  2/2
  14606. DA50    .ZIP:  335k :Direct Access 5.0
  14607. LAFFER1 .ZIP: 1099k :Laffer Utilities [1/4] Leisure Suit Larry 4
  14608. MAC1990A.ZIP:  232k :Mace Utilities  1/3
  14609. MAC1990B.ZIP:  334k :Mace Utilities  2/3
  14610. MAC1990C.ZIP:  337k :Mace Utilities  3/3
  14611. NE2     .ZIP:   94k :Norton Editor Version 2.0
  14612. SPOTTER .ZIP:  162k :Program that tells everything about comp.
  14613. TAME261 .ZIP:   75k :tame 261
  14614. TP60-1  .ZIP:  312k :TurboPascal v6.0 [1/4]
  14615.  
  14616.  
  14617. [Elite] Sound & Music Demo's - Directory #22. Contains 9 ƒiles.
  14618. ═══════════════════════════════════════════════════════════════
  14619.  
  14620. SPEAKER .ZIP:    6k :make pc speak
  14621. NEWTOONS.ZIP:  299k :Sound Blaster VOC files from ROGER RABBIT
  14622. EMOTIONS.ZIP:  222k :VOC file of a portion of the pop song
  14623. GSHOT   .ZIP:    8k :Sound Blaster VOC file of a gun shot
  14624. HVYMETAL.ZIP:  337k :VOC files from the Sci-Fi movie HEAVY METAL
  14625. JIMI    .ZIP:  255k :jimi playing star spangled banner, No soundcard needed
  14626. LAUGH   .ZIP:   19k :Sound Blaster VOC file of sinister laugh (Vincent Price?)
  14627. MUSIC   .ZIP:  279k :sample music clips, no soundcard needed
  14628. TREKSND .ZIP:  654k :star trek voc files
  14629.  
  14630.  
  14631. [Elite] Graphic Utilities - Directory #23. Contains 4 ƒiles.
  14632. ════════════════════════════════════════════════════════════
  14633.  
  14634. HG      .ZIP: 1687k :Harvard Graphics v2.3
  14635. QUICKFLI.ZIP:
  14636. 71 minutes used, 19 left.
  14637. (1)-([PD] Miscellaneous)         *
  14638.                               -= Dirs Available =-
  14639.  
  14640.  
  14641. 1  - [PD] Miscellaneous              16 - [Elite] Amiga Utilities       
  14642. 2  - [PD] Requests                   17 - [Elite] Requests              
  14643. 3  - [PD] Documents & Text           18 - [Elite] Documents & Text      
  14644. 4  - [PD] Virus Protection Programs  19 - [Elite] Communications        
  14645. 5  - [PD] Communications             20 - [Elite] Windows Programs      
  14646. 6  - [PD] Educational                21 - [Elite] Utilities & Applications
  14647. 7  - [PD] Utilities & Applications   22 - [Elite] Sound & Music Demo's  
  14648. 8  - [PD] Graphic Utilities          23 - [Elite] Graphic Utilities     
  14649. 9  
  14650. 71 minutes used, 19 left.
  14651. (1)-([PD] Miscellaneous)         7
  14652.  
  14653. 71 minutes used, 19 left.
  14654. (7)-([PD] Utilities & Applications)         Y
  14655.  
  14656.  
  14657. Uploads        : 592k in 4 ƒiles
  14658. Downloads      : 1208k in 16 ƒiles
  14659. Your Ratio     : 0.490 
  14660. Required Ratio : 0.500 
  14661. Ratio          : 0.490 
  14662. Your DSL       : 95
  14663.  
  14664.  
  14665. 71 minutes used, 19 left.
  14666. (7)-([PD] Utilities & Applications)         
  14667. << DOS Shell >>. Type 'EXIT┘' to return to Telix.
  14668. S
  14669.  
  14670.  
  14671. Search all directories.
  14672.  
  14673. ƒile mask: TBANK.ZIP
  14674.  
  14675.  
  14676. 72 minutes used, 18 left.
  14677. (7)-([PD] Utilities & Applications)         *
  14678.                               -= Dirs Available =-
  14679.  
  14680.  
  14681. 1  - [PD] Miscellaneous              16 - [Elite] Amiga Utilities       
  14682. 2  - [PD] Requests                   17 - [Elite] Requests              
  14683. 3  - [PD] Documents & Text           18 - [Elite] Documents & Text      
  14684. 4  - [PD] Virus Protection Programs  19 - [Elite] Communications        
  14685. 5  - [PD] Communications             20 - [Elite] Windows Programs      
  14686. 6  - [PD] Educational                21 - [Elite] Utilities & Applications
  14687. 7  - [PD] Utilities & Applications   22 - [Elite] Sound & Music Demo's  
  14688. 8  - [PD] Graphic Utilities          23 - [Elite] Graphic Utilities     
  14689. 9  - [PD] DEMO's Oƒ Various Sorts    24 - [Elite] Games >REMOVING 2/1/92<
  14690. 10 - [PD] Games                      25 - [Elite] Games #2              
  14691. 11 - [PD] Non-PornoGrapic Gif's      26 - [Elite] DataShack             
  14692. 12 - [PD] XXX Giƒs (100k+ 256color)  27 - [Elite] Animation (GL) ONLY!  
  14693. 13 - [PD] Porno .TXT ƒiles           28 - [Elite] Animation (DL) ONLY!  
  14694. 14 - [PD] BBS Advertisements         29 - [Elite] WWIV 4.20 & Related   
  14695. 15 - [Elite] Amiga Games           
  14696.  
  14697. 72 minutes used, 18 left.
  14698. (7)-([PD] Utilities & Applications)         1
  14699.  
  14700. 72 minutes used, 18 left.
  14701. (1)-([PD] Miscellaneous)         U
  14702.  
  14703. Upload - 61568k ƒree.
  14704.  
  14705. ƒilename: TBANK.ZIP
  14706.  
  14707. Upload 'TBANK   .ZIP' to [PD] Miscellaneous? Yes
  14708.  
  14709. Please enter a one line description.
  14710. :                                              WWIV on-line Time Bank
  14711.  
  14712.  
  14713. Enter an extended description? No
  14714.  
  14715.  
  14716. Protocol (?=list) : ?
  14717.  
  14718. Q: Abort Transƒer(s)
  14719. 0: Don't Transƒer
  14720. 2. Xmodem
  14721. 3. Xmodem-CRC
  14722. 4. Ymodem
  14723. 5. Batch
  14724. 6. Zmodem
  14725.  
  14726.  
  14727. Protocol (?=list) : 6
  14728.  
  14729. > Smorgasßoard is ready to receive, [CNTRL-X] to abort.
  14730. **00000012f4cedè
  14731.  
  14732. ƒile uploaded.
  14733.  
  14734. Your ratio is now: 0.541 
  14735.  
  14736.  
  14737.  
  14738. 78 minutes used, 17 left.
  14739. (1)-([PD] Miscellaneous)         *
  14740.                               -= Dirs Available =-
  14741.  
  14742.  
  14743. 1  - [PD] Miscellaneous              16 - [Elite] Amiga Utilities       
  14744. 2  - [PD] Requests                   17 - [Elite] Requests              
  14745. 3  - [PD] Documents & Text           18 - [Elite] Documents & Text      
  14746. 4  - [PD] Virus Protection Programs  19 - [Elite] Communications        
  14747. 5  - [PD] Communications             20 - [Elite] Windows Programs      
  14748. 6  - [PD] Educational                21 - [Elite] Utilities & Applications
  14749. 7  - [PD] Utilities & Applications   22 - [Elite] Sound & Music Demo's  
  14750. 8  - [PD] Graphic Utilities          23 - [Elite] Graphic Utilities     
  14751.  
  14752. 78 minutes used, 17 left.
  14753. (1)-([PD] Miscellaneous)         7
  14754.  
  14755. 78 minutes used, 17 left.
  14756. (7)-([PD] Utilities & Applications)         D
  14757.  
  14758. Download -
  14759.  
  14760. ƒilename: NPSADULT
  14761.  
  14762. Searching all directories.
  14763.  
  14764.  
  14765. Directory  : [PD] Graphic Utilities
  14766. ƒilename   : npsadult.zip
  14767. Description: New Print Shop Graphics - Adult X-rated
  14768. ƒile size  : 15k
  14769. Apprx. time: 00:01:16
  14770. Uploaded on: 12/30/91
  14771. Uploaded by: Tomhawk #50 @3104
  14772. Times D/L'd: 3
  14773.  
  14774.  
  14775. Protocol (?=list) : ?
  14776.  
  14777. Q: Abort Transƒer(s)
  14778. 0: Don't Transƒer
  14779. 1. ASCII
  14780. 2. Xmodem
  14781. 3. Xmodem-CRC
  14782. 4. Ymodem
  14783. 5. Batch
  14784. 6. Zmodem
  14785.  
  14786.  
  14787. Protocol (?=list) : 6
  14788.  
  14789. > Beginning ƒile transmission, [CNTRL-X] to abort.
  14790. rz**
  14791.  
  14792. Your ratio is now: 0.534 
  14793.  
  14794. 79 minutes used, 15 left.
  14795. (7)-([PD] Utilities & Applications)         Q
  14796.  
  14797. 79 minutes used, 15 left.
  14798. [12] [The WWIV Modification Net]         .
  14799.                           ──══ External Programs ══──
  14800.  
  14801. [ 1] Food Fight          [ 2] Global War v1.6     [ 3] The Pit v1.10   
  14802. [ 4] The Pit Fiends      [ 5] Space Dynasty       [ 6] Tetris          
  14803. [ 7] W.O.M.R.        
  14804.  
  14805. Which (Q=Quit, ?=List)    Q
  14806.  
  14807. 80 minutes used, 15 left.
  14808. [12] [The WWIV Modification Net]         ?
  14809.  
  14810. ╓──╢ Miscellaneous ╟──╥──╢ Electronic Mail ╟──╥─────╢ Message Subs ╟────╖
  14811.    ║║║║
  14812.    ║ [A] uto Message║  [E] -Mail A User║  [N] ew Message Scan    ║
  14813.    ║ [B] BS List║  [F] eedback To Rebel ║  [P] ost A Message║
  14814.    ║ [C] all For Rebel   ║  [K] ill E-Mail Sent  ║  [Q] uick Scan All Subs ║
  14815.    ║ [I] System Info║  [M] ailbox Scan║  [R] emove A Message    ║
  14816.    ║ [L] ast Callers║║  [S] can Message Titles ║
  14817.    ║ [O] Log Off╟───╢System Features╟───╢  [Z] Express Scan║
  14818.    ║ [U] ser Listing║║  [*] List All Subs║
  14819.    ║ [V] oting Booth║  [D] efaults Section  ║  [+] Advance 1 Sub║
  14820.    ║ [X] Toggle Menus    ║  [G] -files Section   ║  [-] Retreat 1 Sub║
  14821.    ║ [Y] our Information ║  [T] ransfer Section  ║  [#] Goto Sub-# Pressed ║
  14822.    ╟─────────────────────╨───────────────────────╨─────────────────────────╢
  14823.    ║ [/O] Fast Log-Off//Net Work BBS Listing   [.] Online Programs    ║
  14824.    ║ [/E] Send Multi-Mail  //Qscan Clears Pointers  //CLS Clears Screen    ║
  14825.    ║ [/C] Toggle Colors    //Upload Upload Text//VER BBS Information  ║
  14826.    ║╓───────────────────────╖  ╓───────────────────────╖║
  14827.    ╙────────╢ CNTRL-O = Online Help ╟──╢ CNTRL-T = Time Of Day ╟───────────╜
  14828. ╙───────────────────────╜  ╙───────────────────────╜
  14829.  
  14830.  
  14831. 80 minutes used, 15 left.
  14832. [12] [The WWIV Modification Net]         /O
  14833. #■   !S=U»╚╥
  14834. NO CARRIER
  14835.