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

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.               Copyright (C) 1988 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vardec.h"
  18. #include "fcns.h"
  19. #include <fcntl.h>
  20. #include <io.h>
  21. #include <sys\stat.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <time.h>
  25. #include <dos.h>
  26. #include <alloc.h>
  27. #include <stdio.h>
  28. #include <dir.h>
  29. #include "net.h"
  30.  
  31. extern subboardrec subboards[32];
  32. extern usersubrec usub[32];
  33. extern int cursub,express,expressabort,num_sys_list,screenlinest;
  34. extern int curlsub,nummsgs,helpl;
  35. extern postrec *msgs;
  36. extern configrec syscfg;
  37. extern int bchanged;
  38. extern userrec thisuser;
  39. extern int hangup,incom;
  40. extern int usernum,using_modem,topline,defscreenbottom;
  41. extern statusrec status;
  42. extern char irt[81],cdir[81],net_email_name[81];
  43. extern messagerec menus[30],menus1[30],menus2[30];
  44. extern int fwaiting,fsenttoday,msgreadlogon,useron,wfc,mailcheck,numed;
  45. extern editorrec *editors,*backuped;
  46. extern short gat[2048];
  47. extern char gatfn[81];
  48. extern int use_workspace;
  49. extern int checked[50];
  50.  
  51. #define ALLOW_FULLSCREEN 1
  52. #define EMAIL_STORAGE 2
  53.  
  54. int deleted_flag;
  55.  
  56. /****************************************************************************/
  57.  
  58. void send_net_post(postrec *p, unsigned int type, char *extra)
  59. {
  60.   net_header_rec nh;
  61.   char *b, *b1;
  62.   long len1, len2;
  63.   char s[81];
  64.   int f,i;
  65.   unsigned int *list;
  66.  
  67.   b=readfile(&(p -> msg),extra,&len1);
  68.   if (b==NULL)
  69.     return;
  70.   nh.tosys=0;
  71.   nh.touser=0;
  72.   if (p -> ownersys)
  73.     nh.fromsys=p -> ownersys;
  74.   else
  75.     nh.fromsys =syscfg.systemnumber;
  76.   nh.fromuser=p -> owneruser;
  77.   nh.main_type=main_type_post;
  78.   nh.minor_type=type;
  79.   nh.list_len=0;
  80.   nh.daten=p -> daten;
  81.   nh.length=len1+1+strlen(p -> title);
  82.   nh.method=0;
  83.   if ((b1=malloca(nh.length+100))==NULL) {
  84.     farfree(b);
  85.     return;
  86.   }
  87.   strcpy(b1,p -> title);
  88.   memmove(&(b1[strlen(p -> title)+1]),b,(unsigned int) len1);
  89.   farfree(b);
  90.   if ((list=malloca(2*(num_sys_list+2)))==NULL) {
  91.     farfree(b1);
  92.     return;
  93.   }
  94.   sprintf(s,"%sN%u.NET",syscfg.datadir,type);
  95.   f=open(s,O_RDONLY | O_BINARY);
  96.   if (f>0) {
  97.     len1=filelength(f);
  98.     if ((b=malloca(len1+100L))==NULL) {
  99.       farfree(list);
  100.       farfree(b1);
  101.       return;
  102.     }
  103.     lseek(f,0L,SEEK_SET);
  104.     read(f,(void *)b,len1);
  105.     b[len1]=0;
  106.     close(f);
  107.     len2=0;
  108.     while (len2<len1) {
  109.       while ((len2<len1) && ((b[len2]<'0') || (b[len2]>'9')))
  110.         ++len2;
  111.       if ((b[len2]>='0') && (b[len2]<='9') && (len2<len1)) {
  112.         i=atoi(&(b[len2]));
  113.         if ((i!=syscfg.systemnumber) && (i != p -> ownersys))
  114.           list[nh.list_len++]=i;
  115.         while ((len2<len1) && (b[len2]>='0') && (b[len2]<='9'))
  116.           ++len2;
  117.       }
  118.     }
  119.     farfree(b);
  120.   }
  121.   if (nh.list_len) {
  122.     strcpy(s,syscfg.datadir);
  123.     if (nh.fromsys!=syscfg.systemnumber)
  124.       strcat(s,"P1.NET");
  125.     else
  126.       strcat(s,"P0.NET");
  127.     f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  128.     lseek(f,0L,SEEK_END);
  129.     write(f,(void *)&nh,sizeof(net_header_rec));
  130.     write(f,(void *)list,2*nh.list_len);
  131.     write(f,(void *)b1,nh.length);
  132.     close(f);
  133.   }
  134.  
  135.   sprintf(s,"%sNN%u.NET",syscfg.datadir,subboards[curlsub].type);
  136.   f=open(s,O_RDONLY | O_BINARY);
  137.   nh.list_len=0;
  138.   nh.main_type=main_type_pre_post;
  139.   if (f>0) {
  140.     len1=filelength(f);
  141.     if ((b=malloca(len1+100L))==NULL) {
  142.       farfree(b1);
  143.       farfree(list);
  144.       return;
  145.     }
  146.     lseek(f,0L,SEEK_SET);
  147.     read(f,(void *)b,len1);
  148.     b[len1]=0;
  149.     close(f);
  150.     len2=0;
  151.     while (len2<len1) {
  152.       while ((len2<len1) && ((b[len2]<'0') || (b[len2]>'9')))
  153.         ++len2;
  154.       if ((b[len2]>='0') && (b[len2]<='9') && (len2<len1)) {
  155.         i=atoi(&(b[len2]));
  156.         if ((i!=syscfg.systemnumber) && (i != p -> ownersys))
  157.           list[nh.list_len++]=i;
  158.         while ((len2<len1) && (b[len2]>='0') && (b[len2]<='9'))
  159.           ++len2;
  160.       }
  161.     }
  162.     farfree(b);
  163.   }
  164.   if (nh.list_len) {
  165.     strcpy(s,syscfg.datadir);
  166.     if (nh.fromsys!=syscfg.systemnumber)
  167.       strcat(s,"P1.NET");
  168.     else
  169.       strcat(s,"P0.NET");
  170.     f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  171.     lseek(f,0L,SEEK_END);
  172.     write(f,(void *)&nh,sizeof(net_header_rec));
  173.     write(f,(void *)list,2*nh.list_len);
  174.     write(f,(void *)b1,nh.length);
  175.     close(f);
  176.   }
  177.   farfree(list);
  178.   farfree(b1);
  179. }
  180.  
  181. /****************************************************************************/
  182.  
  183. void post()
  184. {
  185.   messagerec m;
  186.   postrec p;
  187.   char s[121],*b,*b1;
  188.   int i,dm,a,f;
  189.   slrec ss;
  190.   net_header_rec nh;
  191.   long len1,len2;
  192.   unsigned int *list;
  193.  
  194.   iscan(cursub);
  195.   if (curlsub<0) {
  196.     nl();
  197.     pl("No subs available.");
  198.     nl();
  199.     return;
  200.   }
  201.  
  202.   ss=syscfg.sl[thisuser.sl];
  203.  
  204.   if (freek1(syscfg.msgsdir)<10.0) {
  205.     nl();
  206.     pl("Sorry, not enough disk space left.");
  207.     nl();
  208.     return;
  209.   }
  210.  
  211.   if ((restrict_post & thisuser.restrict) || (thisuser.posttoday>=ss.posts)) {
  212.     nl();
  213.     pl("Too many messages posted today.");
  214.     nl();
  215.     return;
  216.   }
  217.  
  218.   if (thisuser.sl<subboards[curlsub].postsl) {
  219.     nl();
  220.     pl("You can't post here.");
  221.     nl();
  222.     return;
  223.   }
  224.  
  225.   m.storage_type=subboards[curlsub].storage_type;
  226.   a=subboards[curlsub].anony & 0x0f;
  227.   if ((a==0) && (ss.ability & ability_post_anony))
  228.     a=anony_enable_anony;
  229.   if ((a==anony_enable_anony) && (thisuser.restrict & restrict_anony))
  230.     a=0;
  231.   if (subboards[curlsub].type) {
  232.     a &= (anony_real_name);
  233.     if (thisuser.restrict & restrict_net) {
  234.       nl();
  235.       pl("You can't post on networked sub-boards.");
  236.       nl();
  237.       return;
  238.     }
  239.     if (thisuser.restrict & (restrict_validate | restrict_auto_msg_delete)) {
  240.       nl();
  241.       pl("You can't post on networked sub-boards.");
  242.       nl();
  243.       return;
  244.     }
  245.     if (syscfg.systemnumber) {
  246.       nl();
  247.       pl("This post will go out on WWIVnet.");
  248.       nl();
  249.     }
  250.   }
  251.   inmsg(&m,p.title,&a,1,(subboards[curlsub].filename),ALLOW_FULLSCREEN);
  252.   if (m.stored_as!=0xffffffff) {
  253.     p.anony=a;
  254.     p.msg=m;
  255.     p.ownersys=0;
  256.     p.owneruser=usernum;
  257.     p.qscan=status.qscanptr++;
  258.     time((long *)(&p.daten));
  259.     if (thisuser.restrict & restrict_auto_msg_delete)
  260.       p.status=status_delete;
  261.     else
  262.       if (thisuser.restrict & restrict_validate)
  263.         p.status=status_unvalidated;
  264.       else
  265.         p.status=0;
  266.     if ((subboards[curlsub].type) && (syscfg.systemnumber) &&
  267.       (subboards[curlsub].anony & anony_val_net) && (!lcs())) {
  268.       p.status |= status_pending_net;
  269.       dm=1;
  270.       for (i=1; i<=nummsgs; i++)
  271.         if (msgs[i].status & status_pending_net)
  272.           dm=0;
  273.       if (dm) {
  274.         sprintf(s,"Unvalidated net posts on %s.",subboards[curlsub].name);
  275.         ssm(1,0,s);
  276.       }
  277.     }
  278.     if (nummsgs>=subboards[curlsub].maxmsgs) {
  279.       i=1;
  280.       dm=0;
  281.       while ((dm==0) && (i<=nummsgs)) {
  282.         if ((msgs[i].status & status_no_delete)==0)
  283.           dm=i;
  284.         ++i;
  285.       }
  286.       if (dm==0)
  287.         dm=1;
  288.       delete(dm);
  289.       deleted_flag=dm;
  290.     }
  291.     msgs[++nummsgs]=p;
  292.     bchanged=1;
  293.     savebase();
  294.     ++thisuser.msgpost;
  295.     ++thisuser.posttoday;
  296.     ++status.msgposttoday;
  297.     save_status();
  298.     topscreen();
  299.     sprintf(s,"+%s posted on %s",p.title,subboards[curlsub].name);
  300.     sysoplog(s);
  301.     sprintf(s,"Posted on %s",subboards[curlsub].name);
  302.     save_status();
  303.     pl(s);
  304.     if ((subboards[curlsub].type) && (syscfg.systemnumber)) {
  305.       ++thisuser.postnet;
  306.       if (((subboards[curlsub].anony & anony_val_net)==0) || (lcs()))
  307.         send_net_post(&p, subboards[curlsub].type, subboards[curlsub].filename);
  308.     }
  309.   }
  310. }
  311.  
  312.  
  313. void extract_out(char *b, long len)
  314. {
  315.   char s1[81],s2[81],ch=26,ch1;
  316.   int i;
  317.  
  318.   do {
  319.     prt(2,"Save under what filename? ");
  320.     input(s1,12);
  321.     if (s1[0]) {
  322.       sprintf(s2,"%s%s",syscfg.gfilesdir,s1);
  323.       if (exist(s2)) {
  324.         nl();
  325.         pl("Filename already in use.");
  326.         nl();
  327.         prt(2,"O)verwrite, A)ppend, N)ew name, Q)uit? ");
  328.         ch1=onek("QOAN");
  329.         switch(ch1) {
  330.           case 'Q':
  331.             s2[0]=0;
  332.             s1[0]=0;
  333.             break;
  334.           case 'N':
  335.             s1[0]=0;
  336.             break;
  337.           case 'A':
  338.             break;
  339.           case 'O':
  340.             unlink(s2);
  341.             break;
  342.         }
  343.         nl();
  344.       }
  345.     } else
  346.       s2[0]=0;
  347.   } while ((!hangup) && (s2[0]!=0) && (s1[0]==0));
  348.   if ((s1[0]) && (!hangup)) {
  349.     i=open(s2,O_RDWR | O_BINARY | O_CREAT , S_IREAD | S_IWRITE);
  350.     lseek(i,0L,SEEK_END);
  351.     write(i,(void *)b,len);
  352.     write(i,&ch,1);
  353.     close(i);
  354.     print("Message written to: ",s2,".","");
  355.   }
  356.   farfree(b);
  357. }
  358.  
  359. void grab_user_name(messagerec *m, char *fn)
  360. {
  361.   char *ss,*ss1;
  362.   long len;
  363.  
  364.   ss=readfile(m,fn,&len);
  365.   if (ss) {
  366.     ss1=strchr(ss,'\r');
  367.     if (ss1) {
  368.       *ss1=0;
  369.       strcpy(net_email_name,ss);
  370.     } else
  371.       net_email_name[0]=0;
  372.     farfree(ss);
  373.   } else
  374.     net_email_name[0]=0;
  375. }
  376.  
  377.  
  378.  
  379. void scan(int msgnum, int optype, int *nextsub)
  380. {
  381.   char s[81],s1[81],s2[81],*b,*ss1;
  382.   int i,i1,i2,done,quit,abort,next,val,realexpress;
  383.   slrec ss;
  384.   long l,len;
  385.   postrec p,p1;
  386.  
  387.   irt[0]=0;
  388.   done=0;
  389.   quit=0;
  390.   val=0;
  391.   realexpress=express;
  392.   iscan(cursub);
  393.   if (curlsub<0) {
  394.     nl();
  395.     pl("No subs available.");
  396.     nl();
  397.     return;
  398.   }
  399.   do {
  400.     tleft(1);
  401.     switch(optype) {
  402.       case 0: /* Read Prompt */
  403.         sprintf(s,"Read:(1-%u,^%u),? :",nummsgs,msgnum);
  404.         nl();
  405.         if (express) {
  406.           s[0]=0;
  407.           nl();
  408.           nl();
  409.         } else {
  410.           prt(2,s);
  411.           helpl=16;
  412.           input(s,3);
  413.       while (s[0]==32) {
  414.         strcpy(s1,&(s[1]));
  415.         strcpy(s,s1);
  416.       }
  417.         }
  418.         optype=0;
  419.         i=atoi(s);
  420.         if (s[0]==0) {
  421.           i=msgnum+1;
  422.           if (i>=nummsgs+1)
  423.             done=1;
  424.         }
  425.         if ((i!=0) && (i<=nummsgs) && (i>=1)) {
  426.           optype=2;
  427.           msgnum=i;
  428.         } else
  429.           if (s[1]==0) {
  430.             switch(s[0]) {
  431.               case 'Q':
  432.                 quit=1;
  433.                 done=1;
  434.                 *nextsub=0;
  435.                 break;
  436.               case 'B':
  437.                 if (*nextsub!=0) {
  438.                   *nextsub=1;
  439.                   done=1;
  440.                   quit=1;
  441.                 }
  442.                 break;
  443.               case 'T':
  444.                 optype=1;
  445.                 break;
  446.               case 'R':
  447.                 optype=2;
  448.                 break;
  449.               case 'A':
  450.                 if ((msgs[msgnum].ownersys) && (!msgs[msgnum].owneruser))
  451.                   grab_user_name(&(msgs[msgnum].msg),subboards[curlsub].filename);
  452.                 ss=syscfg.sl[thisuser.sl];
  453.                 if ((lcs()) || (ss.ability & ability_read_post_anony) || (msgs[msgnum].anony==0))
  454.                   email(msgs[msgnum].owneruser,msgs[msgnum].ownersys,0,0);
  455.                 else
  456.                   email(msgs[msgnum].owneruser,msgs[msgnum].ownersys,0,msgs[msgnum].anony);
  457.                 break;
  458.               case 'P':
  459.                 irt[0]=0;
  460.               case 'W':
  461.                 deleted_flag=0;
  462.                 post();
  463.                 if (deleted_flag && (deleted_flag<=msgnum))
  464.                   --msgnum;
  465.                 break;
  466.               case '?':
  467.         if (lcs())
  468.           printmenu(13);
  469.         else
  470.                   printmenu(1);
  471.                 break;
  472.           case '-':
  473.         if ((msgnum>1) && (msgnum-1<nummsgs)) {
  474.           --msgnum;
  475.           optype=2;
  476.         }
  477.         break;
  478.           case 'C':
  479.         express=1;
  480.         break;
  481. /*************/
  482.               case 'V':
  483.                 if ((cs()) && (msgs[msgnum].ownersys==0) && (msgnum>0) && (msgnum<=nummsgs))
  484.                   valuser(msgs[msgnum].owneruser);
  485.         else
  486.                   if ((cs()) && (msgnum>0) && (msgnum<=nummsgs)) {
  487.             nl();
  488.             pl("Post from another system.");
  489.             nl();
  490.           }
  491.                 break;
  492.           case 'N':
  493.         if ((lcs()) && (msgnum>0) && (msgnum<=nummsgs)) {
  494.           msgs[msgnum].status ^= status_no_delete;
  495.                   bchanged=1;
  496.           nl();
  497.           if (msgs[msgnum].status & status_no_delete)
  498.                     pl("Message will NOT be auto-purged.");
  499.           else
  500.             pl("Message CAN now be auto-purged.");
  501.           nl();
  502.         }
  503.         break;
  504.               case 'X':
  505.         if ((lcs()) && (msgnum>0) && (msgnum<=nummsgs)) {
  506.                   msgs[msgnum].status ^= status_pending_net;
  507.                   bchanged=1;
  508.           nl();
  509.                   if (msgs[msgnum].status & status_pending_net) {
  510.                     val |= 2;
  511.                     pl("Will be sent out on net now.");
  512.                   } else
  513.                     pl("Not set for net pending now.");
  514.           nl();
  515.         }
  516.         break;
  517.           case 'U':
  518.         if ((lcs()) && (msgnum>0) && (msgnum<=nummsgs)) {
  519.           msgs[msgnum].anony=0;
  520.                   bchanged=1;
  521.           nl();
  522.                   pl("Message is not anonymous now.");
  523.         }
  524.         break;
  525.               case 'D':
  526.                 if (lcs()) {
  527.                   if (msgnum) {
  528.                     delete(msgnum);
  529.                     if (msgnum>1)
  530.                       msgnum--;
  531.                   }
  532.                 }
  533.                 break;
  534.           case 'E':
  535.         if (so()) {
  536.                   if ((msgnum>0) && (msgnum<=nummsgs)) {
  537.                     b=readfile(&(msgs[msgnum].msg),(subboards[curlsub].filename),&len);
  538.                     extract_out(b,len);
  539.                   }
  540.         }
  541.         break;
  542.           case 'M':
  543.         if ((cs()) && (msgnum>0) && (msgnum<=nummsgs)) {
  544.                   nl();
  545.           do {
  546.                     prt(2,"Move to which sub? ");
  547.                     ss1=mmkey(0);
  548.             if (ss1[0]=='?')
  549.               sublist();
  550.           } while ((!hangup) && (ss1[0]=='?'));
  551.           i=-1;
  552.           if (ss1[0]==0)
  553.             break;
  554.                   for (i1=0; i1<32; i1++)
  555.                     if (strcmp(usub[i1].keys,ss1)==0)
  556.                       i=i1;
  557.                   if (i!=-1) {
  558.             p=msgs[msgnum];
  559.                     b=readfile(&(p.msg),(subboards[curlsub].filename),&len);
  560.                     delete(msgnum);
  561.             savebase();
  562.                     iscan(i);
  563.             p.msg.storage_type=subboards[curlsub].storage_type;
  564.             savefile(b,len,&(p.msg),(subboards[curlsub].filename));
  565.                     p.qscan=status.qscanptr++;
  566.             if (nummsgs>=subboards[curlsub].maxmsgs) {
  567.                       i1=1;
  568.                       i2=0;
  569.                       while ((i2==0) && (i1<=nummsgs)) {
  570.                         if ((msgs[i1].status & status_no_delete)==0)
  571.                           i2=i1;
  572.                         ++i1;
  573.                        }
  574.                        if (i2==0)
  575.                          i2=1;
  576.                        p1=msgs[i2];
  577.                        remove_link(&p1.msg,(subboards[curlsub].filename));
  578.                        for (i1=i2; i1<nummsgs; i1++)
  579.                          msgs[i1]=msgs[i1+1];
  580.                --nummsgs;
  581.                      }
  582.                      msgs[++nummsgs]=p;
  583.                      bchanged=1;
  584.                      savebase();
  585.                      save_status();
  586.                      iscan(cursub);
  587.              nl();
  588.              pl("Message moved.");
  589.              nl();
  590.           }
  591.         }
  592.         break;
  593. /*************/
  594.             }
  595.       } else {
  596.         if (strcmp(s,"CLS")==0)
  597.           outchr('\x0c');
  598.       }
  599.         break;
  600.       case 1: /* List Titles */
  601.         i=0;
  602.         abort=0;
  603.         if (msgnum>=nummsgs)
  604.           abort=1;
  605.         while ((!abort) && (!hangup) && (++i<=10)) {
  606.           ++msgnum;
  607.           itoa(msgnum,s,10);
  608.           if ((msgs[msgnum].ownersys==0) && (msgs[msgnum].owneruser==usernum))
  609.             sprintf(s1,"[%s]",s);
  610.           else
  611.             sprintf(s1,"(%s)",s);
  612.           for (i1=0; i1<5; i1++)
  613.             s[i1]=32;
  614.           if (msgs[msgnum].qscan>thisuser.qscnptr[curlsub])
  615.             s[0]='*';
  616.           strcpy(&s[7-strlen(s1)],s1);
  617.           strcat(s," ");
  618.           strcat(s,msgs[msgnum].title);
  619.           pla(s,&abort);
  620.           if (msgnum>=nummsgs)
  621.             abort=1;
  622.         }
  623.         optype=0;
  624.         break;
  625.       case 2: /* Read Message */
  626.     if ((msgnum>0) && (msgnum<=nummsgs))
  627.           read_message(msgnum,&next,&val);
  628.     ansic(0);
  629.         nl();
  630.         if (next) {
  631.           ++msgnum;
  632.           if (msgnum>nummsgs)
  633.             done=1;
  634.           optype=2;
  635.         } else
  636.           optype=0;
  637.         if (expressabort)
  638.       if (realexpress) {
  639.             done=1;
  640.             quit=1;
  641.             *nextsub=0;
  642.           } else {
  643.         expressabort=0;
  644.         express=0;
  645.         optype=0;
  646.       }
  647.         break;
  648.     }
  649.   } while ((!done) && (!hangup));
  650.   if (!realexpress) {
  651.     express=0;
  652.     expressabort=0;
  653.   }
  654.   if ((val & 1) && (lcs()) && (!express)) {
  655.     nl();
  656.     prt(5,"Validate messages here? ");
  657.     if (yn()) {
  658.       for (i=1; i<=nummsgs; i++)
  659.         if (msgs[i].status & (status_unvalidated | status_delete))
  660.           msgs[i].status &= (~(status_unvalidated | status_delete));
  661.       bchanged=1;
  662.     }
  663.   }
  664.   if ((val & 2) && (lcs()) && (!express)) {
  665.     nl();
  666.     prt(5,"Network validate here? ");
  667.     if (yn()) {
  668.       i1=0;
  669.       for (i=1; i<=nummsgs; i++)
  670.         if (msgs[i].status & status_pending_net) {
  671.           send_net_post(msgs+i, subboards[curlsub].type,
  672.             subboards[curlsub].filename);
  673.           ++i1;
  674.           msgs[i].status &= (~status_pending_net);
  675.         }
  676.       sprintf(s,"%d messages sent.",i1);
  677.       nl();
  678.       pl(s);
  679.       nl();
  680.       bchanged=1;
  681.     }
  682.   }
  683.   if ((!quit) && (!express)) {
  684.     nl();
  685.     ss=syscfg.sl[thisuser.sl];
  686.     if (
  687.         ((restrict_post & thisuser.restrict)==0) &&
  688.         (thisuser.posttoday<ss.posts) &&
  689.         (thisuser.sl>=subboards[curlsub].postsl)) {
  690.       sprintf(s,"Post on %s? ",subboards[curlsub].name);
  691.       prt(5,s);
  692.       irt[0]=0;
  693.       if (yn())
  694.         post();
  695.     }
  696.   }
  697.   savebase();
  698.   nl();
  699. }
  700.  
  701.  
  702. void qscan(int bn, int *ns)
  703. {
  704.   int i,nextsub,os;
  705.   char s[81],s1[81];
  706.  
  707.   if (hangup)
  708.     return;
  709.   nextsub=*ns;
  710.   os=cursub;
  711.   cursub=bn;
  712.   iscan(cursub);
  713.   if (curlsub<0) {
  714.     nl();
  715.     pl("No subs available.");
  716.     nl();
  717.     return;
  718.   }
  719.   i=1;
  720.   while ((i<=nummsgs) && (msgs[i].qscan<=thisuser.qscnptr[curlsub]))
  721.     ++i;
  722.   nl();
  723.   sprintf(s,"< Q-scan %s %s - %u msgs >",subboards[curlsub].name,
  724.             usub[bn].keys,nummsgs);
  725.   prt(1,s);
  726.   nl();
  727.   if ((nummsgs>0) && (msgs[nummsgs].qscan<=thisuser.qscnptr[curlsub]))
  728.     thisuser.qscnptr[curlsub]=status.qscanptr-1;
  729.   if ((nummsgs>0) && (i<=nummsgs))
  730.     if (msgs[i].qscan>thisuser.qscnptr[curlsub])
  731.       scan(i,2,&nextsub);
  732.   sprintf(s,"< %s Q-Scan Done >",subboards[curlsub].name);
  733.   prt(1,s);
  734.   nl();
  735.   cursub=os;
  736.   *ns=nextsub;
  737. }
  738.  
  739.  
  740. void nscan(int ss)
  741. {
  742.   int i,nextsub,abort,next;
  743.  
  744.   nl();
  745.   nextsub=1;
  746.   prt(3,"<< Q-Scan All >>");
  747.   nl();
  748.   for (i=ss; (usub[i].subnum!=-1) && (i<32) && (nextsub) && (!hangup); i++) {
  749.     if (thisuser.qscn & (1L<<(usub[i].subnum)))
  750.       qscan(i,&nextsub);
  751.     abort=next=0;
  752.     checka(&abort,&next);
  753.     if (abort)
  754.       nextsub=0;
  755.   }
  756.   nl();
  757.   prt(3,"<< Global Q-Scan Done >>");
  758.   nl();
  759.   nl();
  760.   if ((nextsub) && (thisuser.sysstatus & sysstatus_nscan_file_system) &&
  761.     ((syscfg.sysconfig & sysconfig_no_xfer)==0))
  762.     nscanall();
  763. }
  764.  
  765. void scan2()
  766. {
  767.   char s[81];
  768.   int i,i1;
  769.  
  770.   iscan(cursub);
  771.   nl();
  772.   if (curlsub<0) {
  773.     pl("No subs available.");
  774.     nl();
  775.     return;
  776.   }
  777.   print(itoa(nummsgs,s,10)," msgs on ",subboards[curlsub].name,"");
  778.   if (nummsgs==0)
  779.     return;
  780.   helpl=11;
  781.   prt(2,"Start listing at? ");
  782.   input(s,4);
  783.   i=atoi(s);
  784.   if (i<1)
  785.     i=0;
  786.   else
  787.     if (i>nummsgs)
  788.       i=nummsgs;
  789.     else
  790.       i--;
  791.   i1=0;
  792.   if (strcmp(s,"S")==0)
  793.     scan(0,0,&i1);
  794.   else
  795.     if (strcmp(s,"Q")) {
  796.       if (strcmp(s,"N")==0) {
  797.       } else
  798.         scan(i,1,&i1);
  799.     }
  800. }
  801.  
  802.  
  803. void printmenu(int i)
  804. {
  805.   char s[81],s1[81];
  806.   int next;
  807.  
  808.   next=0;
  809.  
  810.   if ((thisuser.sysstatus & (sysstatus_color | sysstatus_ansi))
  811.       == (sysstatus_color | sysstatus_ansi)) {
  812.     sprintf(s1,"MENU%u.ANS", i);
  813.     sprintf(s,"%s%s",syscfg.gfilesdir,s1);
  814.     if (exist(s)) {
  815.       printfile(s1);
  816.       return;
  817.     }
  818.   }
  819.   sprintf(s1,"MENU%u.MSG", i);
  820.   sprintf(s,"%s%s",syscfg.gfilesdir,s1);
  821.   if (exist(s)) {
  822.     printfile(s1);
  823.     return;
  824.   }
  825.  
  826.   if ((thisuser.screenchars==40) && (menus2[i].stored_as)) {
  827.     sprintf(s,"%sMENUS40.MSG",syscfg.gfilesdir);
  828.     read_message1(&menus2[i],0,0,&next,s);
  829.   } else
  830.     if ((okansi()) && (menus1[i].stored_as)) {
  831.       sprintf(s,"%sMENUSANS.MSG",syscfg.gfilesdir);
  832.       read_message1(&menus1[i],0,0,&next,s);
  833.     } else {
  834.       sprintf(s,"%sMENUS.MSG",syscfg.gfilesdir);
  835.       if (menus[i].stored_as)
  836.         read_message1(&menus[i],0,0,&next,s);
  837.     }
  838. }
  839.  
  840.  
  841. void delmail(int f, int loc)
  842. {
  843.   mailrec m,m1;
  844.   userrec u;
  845.   int rm,i,t,otf;
  846.  
  847.   lseek(f,((long) loc) * ((long) sizeof(mailrec)), SEEK_SET);
  848.   read(f,(void *)&m,sizeof(mailrec));
  849.  
  850.   rm=1;
  851.   if (m.status & status_multimail) {
  852.     t=filelength(f)/sizeof(mailrec);
  853.     otf=0;
  854.     for (i=0; i<t; i++)
  855.       if (i!=loc) {
  856.         lseek(f,((long)i)*((long)sizeof(mailrec)),SEEK_SET);
  857.         read(f,(void *)&m1,sizeof(mailrec));
  858.         if ((m.msg.stored_as==m1.msg.stored_as) && (m.msg.storage_type==m1.msg.storage_type) && (m1.daten!=0xffffffff))
  859.           otf=1;
  860.       }
  861.     if (otf)
  862.       rm=0;
  863.   }
  864.  
  865.   if (rm)
  866.     remove_link(&m.msg,"EMAIL");
  867.  
  868.   if (m.tosys==0) {
  869.     read_user(m.touser,&u);
  870.     if (u.waiting) {
  871.       --u.waiting;
  872.       write_user(m.touser,&u);
  873.       close_user();
  874.     }
  875.     if (m.touser==1)
  876.       --fwaiting;
  877.   }
  878.  
  879.   lseek(f,((long) loc) * ((long) sizeof(mailrec)), SEEK_SET);
  880.   m.touser=0;
  881.   m.tosys=0;
  882.   m.daten=0xffffffff;
  883.   m.msg.storage_type=0;
  884.   m.msg.stored_as=0xffffffff;
  885.   write(f,(void *)&m,sizeof(mailrec));
  886.   mailcheck=1;
  887. }
  888.  
  889. void readmail()
  890. {
  891.   int i,i1,i2,i3,f,mw,mloc[200],mfl,curmail,done,abort,next,okmail;
  892.   unsigned short x,xx;
  893.   char s[81],s1[81],s2[81],fn[81],*b;
  894.   mailrec m;
  895.   slrec ss;
  896.   userrec u;
  897.   char ch;
  898.   long len,num_mail,num_mail1;
  899.  
  900.   ss=syscfg.sl[thisuser.sl];
  901.   sprintf(fn,"%sEMAIL.DAT",syscfg.datadir);
  902.   f=open(fn,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  903.   if (f<0) {
  904.     nl();
  905.     nl();
  906.     pl("No mail file exists!");
  907.     nl();
  908.     return;
  909.   }
  910.   mfl=filelength(f)/sizeof(mailrec);
  911.   mw=0;
  912.   for (i=0; (i<mfl) && (mw<200); i++) {
  913.     lseek(f,((long) (i)) * (sizeof(mailrec)), SEEK_SET);
  914.     read(f,(void *)(&m),sizeof(mailrec));
  915.     if ((m.tosys==0) && (m.touser==usernum))
  916.       mloc[mw++]=i;
  917.   }
  918.   thisuser.waiting=mw;
  919.   if (usernum==1)
  920.     fwaiting=mw;
  921.   if (mw==0) {
  922.     nl();
  923.     nl();
  924.     pl("You have no mail.");
  925.     nl();
  926.     return;
  927.   }
  928.   if (mw==1)
  929.     curmail=0;
  930.   else {
  931.     nl();
  932.     nl();
  933.     pl("You have mail from:");
  934.     nl();
  935.     for (i=0; i<mw; i++) {
  936.       lseek(f,((long) mloc[i]) * sizeof(mailrec),SEEK_SET);
  937.       read(f,(void *) (&m),sizeof(mailrec));
  938.       itoa(i+1,s,10);
  939.       strcat(s,". ");
  940.       if ((m.anony & anony_sender) && ((ss.ability & ability_read_email_anony)==0)) {
  941.         strcat(s,">UNKNOWN<");
  942.       } else {
  943.         if (m.fromsys==0) {
  944.       if (m.fromuser==65535)
  945.         strcat(s,"WWIVnet");
  946.       else {
  947.             read_user(m.fromuser,&u);
  948.             strcat(s,nam(&u,m.fromuser));
  949.       }
  950.         } else {
  951.           sprintf(s1,"User %u @%u",m.fromuser,m.fromsys);
  952.           strcat(s,s1);
  953.         }
  954.       }
  955.       pl(s);
  956.     }
  957.     nl();
  958.     helpl=10;
  959.     pl("Hit return, or enter number");
  960.     outstr(":");
  961.     input(s,3);
  962.     if (strcmp(s,"Q")==0) {
  963.       close(f);
  964.       return;
  965.     }
  966.     i=atoi(s);
  967.     if (i)
  968.       if (i<=mw)
  969.         curmail=i-1;
  970.       else
  971.         curmail=0;
  972.     else
  973.       curmail=0;
  974.   }
  975.   done=0;
  976.   do {
  977.     sprintf(s,"(%u/%u): ",curmail+1,mw);
  978.     abort=0;
  979.     nl();
  980.     nl();
  981.     osan(s,&abort,&next);
  982.     next=0;
  983.     ansic(MSG_COLOR);
  984.     s[0]=0;
  985.     if (mloc[curmail]<0) {
  986.       strcat(s,">>> MAIL DELETED <<<");
  987.       okmail=0;
  988.       pl(s);
  989.       nl();
  990.       nl();
  991.     } else {
  992.       lseek(f,((long) (mloc[curmail])) * (sizeof(mailrec)), SEEK_SET);
  993.       read(f,(void *)&m,sizeof(mailrec));
  994.       if ((m.tosys!=0) || (m.touser!=usernum)) {
  995.     mloc[curmail]=-1;
  996.         strcat(s,">>> MAIL DELETED <<<");
  997.         okmail=0;
  998.         pl(s);
  999.         nl();
  1000.         nl();
  1001.       } else {
  1002.         strcat(s,m.title);
  1003.         strcpy(irt,m.title);
  1004.         abort=0;
  1005.         i=((ability_read_email_anony & ss.ability)!=0);
  1006.         okmail=1;
  1007.         pla(s,&abort);
  1008.         if ((m.fromsys) && (!m.fromuser))
  1009.           grab_user_name(&(m.msg),"EMAIL");
  1010.         else
  1011.           net_email_name[0]=0;
  1012.         setorigin(m.fromsys);
  1013.         if (!abort)
  1014.           read_message1(&m.msg, (m.anony & 0x0f), i, &next, "EMAIL");
  1015.       }
  1016.     }
  1017.     do {
  1018.       i2=1;
  1019.       prt(2,"Mail {?} : ");
  1020.       helpl=34;
  1021.       if (!okmail)
  1022.     ch=onek("QI?-+G");
  1023.       else
  1024.         if (so())
  1025.           ch=onek("QSRIDAF?-+GZVUEO");
  1026.         else
  1027.           if (cs())
  1028.             ch=onek("QSRIDAF?-+GZVUO");
  1029.           else
  1030.             ch=onek("QSRIDAF?+-G");
  1031.       switch (ch) {
  1032.     case 'E':
  1033.           if ((so()) && (okmail)) {
  1034.             b=readfile(&(m.msg),"EMAIL",&len);
  1035.             extract_out(b,len);
  1036.           }
  1037.           i2=0;
  1038.       break;
  1039.         case 'Q':
  1040.           done=1;
  1041.           break;
  1042.     case 'O':
  1043.       if ((cs()) && (okmail) && (m.fromuser!=65535)) {
  1044.         nl();
  1045.         prt(2,"Which form letter? ");
  1046.             input(s,4);
  1047.             sprintf(s1,"%sFORM%s.MSG",syscfg.gfilesdir,s);
  1048.         if (exist(s1)) {
  1049.               strcpy(s,nam(&thisuser,usernum));
  1050.           if (m.anony & anony_receiver)
  1051.             strcpy(s,">UNKNOWN<");
  1052.               strcat(s," read your mail on ");
  1053.               strcat(s,date());
  1054.           if (m.fromsys==0)
  1055.                 ssm(m.fromuser,m.fromsys,s);
  1056.               delmail(f,mloc[curmail]);
  1057.               mloc[curmail]=-1;
  1058.               ++curmail;
  1059.               if (curmail>=mw)
  1060.                 done=1;
  1061.               if (!wfc)
  1062.                 topscreen();
  1063.               close(f);
  1064.               load_workspace(s1,1);
  1065.               email(m.fromuser,m.fromsys,0,m.anony);
  1066.               f=open(fn,O_RDWR | O_BINARY);
  1067.         } else {
  1068.           nl();
  1069.           pl("File not found.");
  1070.           nl();
  1071.               i2=0;
  1072.         }
  1073.       }
  1074.       break;
  1075.     case 'G':
  1076.           sprintf(s,"Go to which (1-%u) ? ",mw);
  1077.       prt(2,s);
  1078.       input(s,3);
  1079.       i2=atoi(s);
  1080.       if ((i2>0) && (i2<=mw)) {
  1081.         curmail=i2-1;
  1082.         i2=1;
  1083.       } else
  1084.         i2=0;
  1085.       break;
  1086.         case 'I':
  1087.     case '+':
  1088.           ++curmail;
  1089.           if (curmail>=mw)
  1090.             done=1;
  1091.           break;
  1092.     case '-':
  1093.       if (curmail)
  1094.             --curmail;
  1095.       break;
  1096.         case 'R':
  1097.           break;
  1098.         case '?':
  1099.           printmenu(4);
  1100.           i2=0;
  1101.           break;
  1102.         case 'D':
  1103.       if (!okmail)
  1104.         break;
  1105.           strcpy(s,nam(&thisuser,usernum));
  1106.       if (m.anony & anony_receiver)
  1107.         strcpy(s,">UNKNOWN<");
  1108.           strcat(s," read your mail on ");
  1109.           strcat(s,date());
  1110.       if ((m.fromsys==0) && (m.fromuser!=65535))
  1111.             ssm(m.fromuser,m.fromsys,s);
  1112.         case 'Z':
  1113.       if (!okmail)
  1114.         break;
  1115.           delmail(f,mloc[curmail]);
  1116.           mloc[curmail]=-1;
  1117.           ++curmail;
  1118.           if (curmail>=mw)
  1119.             done=1;
  1120.           if (!wfc)
  1121.             topscreen();
  1122.           break;
  1123.         case 'F':
  1124.       if (m.status & status_multimail) {
  1125.         nl();
  1126.         pl("Can't forward multimail.");
  1127.         nl();
  1128.         break;
  1129.       }
  1130.       if (!okmail)
  1131.         break;
  1132.           nl();
  1133.           nl();
  1134.           prt(2,"Forward to: ");
  1135.           input(s,30);
  1136.           x=finduser(s);
  1137.           if ((x==usernum) && (!cs())) {
  1138.             x=0;
  1139.             nl();
  1140.             pl("Can't forward to yourself.");
  1141.             nl();
  1142.           }
  1143.           xx=0;
  1144.           if ((x) && (forwardm(&x,&xx))) {
  1145.             nl();
  1146.             if (x)
  1147.               pl("Forwarded from there.");
  1148.             else
  1149.               pl("Can't forward to him.");
  1150.           }
  1151.       if (x>0) {
  1152.         read_user(x,&u);
  1153.             sprintf(s,"Forward to %s? ",nam(&u,x));
  1154.         prt(5,s);
  1155.         if (!yn())
  1156.           x=0;
  1157.       }
  1158.           if (x>0) {
  1159.             --thisuser.waiting;
  1160.             if (usernum==1)
  1161.               --fwaiting;
  1162.             m.touser=x;
  1163.             lseek(f,((long) (mloc[curmail])) * (sizeof(mailrec)), SEEK_SET);
  1164.             write(f,(void *)&m,sizeof(mailrec));
  1165.             read_user(x,&u);
  1166.             ++u.waiting;
  1167.             write_user(x,&u);
  1168.             if (x==1)
  1169.               ++fwaiting;
  1170.             strcpy(s,"\r\nForwarded from: ");
  1171.             strcat(s,nam(&thisuser,usernum));
  1172.             lineadd(&m.msg,s,"EMAIL");
  1173.             strcpy(s,nam(&thisuser,usernum));
  1174.             strcat(s," forwarded your mail to ");
  1175.             strcat(s,nam(&u,x));
  1176.         if (m.fromsys==0)
  1177.               ssm(m.fromuser,m.fromsys,s);
  1178.             mloc[curmail]=-1;
  1179.             ++curmail;
  1180.             if (curmail>=mw)
  1181.               done=1;
  1182.             if (!wfc)
  1183.               topscreen();
  1184.             print("Forwarded to ",nam(&u,x),"");
  1185.           } else {
  1186.             nl();
  1187.             pl("Unknown user.");
  1188.             nl();
  1189.           }
  1190.           break;
  1191.         case 'A':
  1192.         case 'S':
  1193.       if (!okmail)
  1194.         break;
  1195.           close(f);
  1196.           num_mail=((long) thisuser.feedbacksent) +
  1197.                    ((long) thisuser.emailsent) +
  1198.                    ((long) thisuser.emailnet);
  1199.       if (m.fromuser!=65535)
  1200.             email(m.fromuser,m.fromsys,0,m.anony);
  1201.           f=open(fn,O_RDWR | O_BINARY);
  1202.           num_mail1=((long) thisuser.feedbacksent) +
  1203.                     ((long) thisuser.emailsent) +
  1204.                     ((long) thisuser.emailnet);
  1205.           if (ch=='A') {
  1206.             if (num_mail!=num_mail1) {
  1207.               strcpy(s,nam(&thisuser,usernum));
  1208.               if (m.anony & anony_receiver)
  1209.                 strcpy(s,">UNKNOWN<");
  1210.               strcat(s," read your mail on ");
  1211.               strcat(s,date());
  1212.               if ((m.fromsys==0) && (m.fromuser!=65535))
  1213.                 ssm(m.fromuser,m.fromsys,s);
  1214.               delmail(f,mloc[curmail]);
  1215.               mloc[curmail]=-1;
  1216.               ++curmail;
  1217.               if (curmail>=mw)
  1218.                 done=1;
  1219.               if (!wfc)
  1220.                 topscreen();
  1221.             } else {
  1222.               nl();
  1223.               pl("No mail sent.");
  1224.               nl();
  1225.               i2=0;
  1226.             }
  1227.           } else {
  1228.             ++curmail;
  1229.             if (curmail>=mw)
  1230.               done=1;
  1231.             if (!wfc)
  1232.               topscreen();
  1233.           }
  1234.           break;
  1235.         case 'U':
  1236.         case 'V':
  1237.       if (!okmail)
  1238.         break;
  1239.           if ((m.fromsys==0) && (cs()) && (m.fromuser!=65535))
  1240.             if (ch=='V')
  1241.               valuser(m.fromuser);
  1242.             else
  1243.               uedit(m.fromuser,0);
  1244.       else
  1245.         if (cs()) {
  1246.           nl();
  1247.           pl("Mail from another system.");
  1248.           nl();
  1249.         }
  1250.           i2=0;
  1251.           break;
  1252.       }
  1253.     } while ((!i2) && (!hangup));
  1254.   } while ((!hangup) && (!done));
  1255.   close(f);
  1256. }
  1257.  
  1258.  
  1259. void remove_post()
  1260. {
  1261.   int i,i1,any,abort;
  1262.   char s[161];
  1263.  
  1264.   iscan(cursub);
  1265.   if (curlsub<0) {
  1266.     nl();
  1267.     pl("No subs available.");
  1268.     nl();
  1269.     return;
  1270.   }
  1271.   any=0;
  1272.   abort=0;
  1273.   nl();
  1274.   nl();
  1275.   strcpy(s,"Posts by you on ");
  1276.   strcat(s,subboards[curlsub].name);
  1277.   pl(s);
  1278.   nl();
  1279.   for (i=1; (i<=nummsgs) && (!abort); i++) {
  1280.     if ((msgs[i].ownersys==0) && (msgs[i].owneruser==usernum)) {
  1281.       any=1;
  1282.       sprintf(s,"%u: %s",i,msgs[i].title);
  1283.       pla(s,&abort);
  1284.     }
  1285.   }
  1286.   if (!any) {
  1287.     pl("None.");
  1288.     if (!cs())
  1289.       return;
  1290.   }
  1291.   nl();
  1292.   prt(2,"Remove which? ");
  1293.   input(s,3);
  1294.   i=atoi(s);
  1295.   if ((i>0) && (i<=nummsgs)) {
  1296.     if (((msgs[i].ownersys==0) && (msgs[i].owneruser==usernum)) || (lcs())) {
  1297.       sprintf(s,"-%s removed from %s",msgs[i].title,subboards[curlsub].name);
  1298.       sysoplog(s);
  1299.       delete(i);
  1300.       savebase();
  1301.       nl();
  1302.       pl("Message removed.");
  1303.       nl();
  1304.     }
  1305.   }
  1306. }
  1307.  
  1308.  
  1309.  
  1310. int external_edit(char *fn1, char *direc, int ednum, int numlines)
  1311. {
  1312.   char s[255],s1[128],fn[128],s2[128],s3[81],sx1[21],sx2[21],sx3[21],ch;
  1313.   int i,i1,i2,r,w,filethere,mod,newtl;
  1314.   struct ftime ftimep,ftimep1;
  1315.  
  1316.   if ((ednum>=numed) || (!okansi())) {
  1317.     nl();
  1318.     pl("You can't use that full screen editor.");
  1319.     nl();
  1320.     return(0);
  1321.   }
  1322.   i1=0;
  1323.   for (i2=0; i2<81; i2++) {
  1324.     i1+=editors[ednum].filename[i2];
  1325.     i1+=editors[ednum].filenamecon[i2];
  1326.   }
  1327.   if (i1!=checked[ednum]) {
  1328.     nl();
  1329.     pl("Editor record(s) corrupted... Aborting...");
  1330.     nl();
  1331.     closeport();
  1332.     sl1(1,"");
  1333.     abort();
  1334.   }
  1335.   if (incom)
  1336.     strcpy(s1,(editors[ednum].filename));
  1337.   else
  1338.     strcpy(s1,(editors[ednum].filenamecon));
  1339.   if (s1[0]==0) {
  1340.     nl();
  1341.     pl("You can't use that full screen editor.");
  1342.     nl();
  1343.     return(0);
  1344.   }
  1345.   strcpy(s3,fn1);
  1346.   stripfn1(s3);
  1347.   if (direc[0]) {
  1348.     cd_to(direc);
  1349.     get_dir(fn,1);
  1350.     cd_to(cdir);
  1351.   } else
  1352.     fn[0]=0;
  1353.   strcat(fn,s3);
  1354.   filethere=exist(fn);
  1355.   if (filethere) {
  1356.     i=open(fn,O_RDONLY | O_BINARY);
  1357.     getftime(i,&ftimep);
  1358.     close(i);
  1359.   }
  1360.   itoa(thisuser.screenchars,sx1,10);
  1361.   if (screenlinest>defscreenbottom-topline)
  1362.     newtl=0;
  1363.   else
  1364.     newtl=topline;
  1365.   if (using_modem)
  1366.     itoa(thisuser.screenlines,sx2,10);
  1367.   else
  1368.     itoa(defscreenbottom+1-newtl,sx2,10);
  1369.   itoa(numlines,sx3,10);
  1370.   stuff_in(s,s1,fn,sx1,sx2,sx3,"");
  1371.   full_external(s,0,1);
  1372.   if (!wfc)
  1373.     topscreen();
  1374.   mod=0;
  1375.   if (!filethere) {
  1376.     mod=exist(fn);
  1377.   } else {
  1378.     i=open(fn,O_RDONLY | O_BINARY);
  1379.     getftime(i,&ftimep1);
  1380.     close(i);
  1381.     if ((ftimep.ft_year!=ftimep1.ft_year) ||
  1382.         (ftimep.ft_month!=ftimep1.ft_month) ||
  1383.         (ftimep.ft_day!=ftimep1.ft_day) ||
  1384.         (ftimep.ft_hour!=ftimep1.ft_hour) ||
  1385.         (ftimep.ft_min!=ftimep1.ft_min) ||
  1386.         (ftimep.ft_tsec!=ftimep1.ft_tsec))
  1387.       mod=1;
  1388.   }
  1389.   return(mod);
  1390. }
  1391.