home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MSGBASE1.C < prev    next >
Text File  |  1992-06-15  |  37KB  |  1,467 lines

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