home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / WWIV2.ZIP / SUBEDIT.C < prev    next >
C/C++ Source or Header  |  1992-12-14  |  16KB  |  625 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1993 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 "subxtr.h"
  22.  
  23.  
  24. void save_subs(void)
  25. {
  26.   char s[100],s1[100],s2[100];
  27.   int f,i,i1,i2,onn;
  28.   FILE *fp, *al, *su, *nn;
  29.   xtrasubsnetrec *xnp;
  30.  
  31.   onn=net_num;
  32.  
  33.   for (i=0; i<num_subs; i++) {
  34.     subboards[i].type=0;
  35.     subboards[i].age &= 0x7f;
  36.     if (status.net_version<32) {
  37.       if (xsubs[i].num_nets) {
  38.         subboards[i].type=xsubs[i].nets[0].type;
  39.         subboards[i].age |= 0x80;
  40.         subboards[i].name[40]=xsubs[i].nets[0].net_num;
  41.         subboards[i].name[39]=0;
  42.       }
  43.     }
  44.   }
  45.  
  46.   sprintf(s,"%sSUBS.DAT",syscfg.datadir);
  47.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  48.   if (f<0) {
  49.     pl(get_string(164));
  50.     pausescr();
  51.   } else {
  52.     i=write(f,(void *)&subboards[0], num_subs * sizeof(subboardrec));
  53.     if (i!=(num_subs*sizeof(subboardrec))) {
  54.       pl(get_string(165));
  55.       pausescr();
  56.     }
  57.     close(f);
  58.   }
  59.  
  60.   sprintf(s,"%sSUBS.XTR",syscfg.datadir);
  61.   unlink(s);
  62.   fp=fopen(s,"w");
  63.   if (fp) {
  64.     for (i=0; i<num_subs; i++) {
  65.       if (xsubs[i].num_nets) {
  66.         fprintf(fp,"!%u\n@%s\n#%lu\n",i,
  67.           xsubs[i].desc,(xsubs[i].flags&XTRA_MASK));
  68.         for (i1=0; i1<xsubs[i].num_nets; i1++) {
  69.           fprintf(fp,"$%s %s %lu %u %u\n",
  70.             net_networks[xsubs[i].nets[i1].net_num].name,
  71.             xsubs[i].nets[i1].stype,
  72.             xsubs[i].nets[i1].flags,
  73.             xsubs[i].nets[i1].host,
  74.             xsubs[i].nets[i1].category);
  75.         }
  76.       }
  77.     }
  78.     fclose(fp);
  79.   }
  80.  
  81.   for (i=0; i<net_num_max; i++) {
  82.     set_net_num(i);
  83.  
  84.     sprintf(s,"%sALLOW.NET", net_data); unlink(s);
  85.     sprintf(s1,"%sSUBS.PUB", net_data); unlink(s1);
  86.     sprintf(s2,"%sNNALL.NET", net_data); unlink(s2);
  87.  
  88.     if (status.net_version<32) {
  89.       al=su=nn=NULL;
  90.       for (i1=0; i1<num_subs; i1++) {
  91.         for (i2=0,xnp=xsubs[i1].nets; i2<xsubs[i1].num_nets; i2++,xnp++) {
  92.           if (xnp->net_num==net_num) {
  93.             if (xnp->flags & XTRA_NET_AUTO_ADDDROP) {
  94.               if (!al)
  95.                 al=fopen(s,"w");
  96.               if (al)
  97.                 fprintf(al,"%s\n",xnp->stype);
  98.             }
  99.             if (xnp->flags & XTRA_NET_AUTO_INFO) {
  100.               if (!su)
  101.                 su=fopen(s1,"w");
  102.               if (s)
  103.                 fprintf(su,"%s\n",xnp->stype);
  104.             }
  105.             if (xnp->host) {
  106.               if (!nn)
  107.                 nn=fopen(s2,"w");
  108.               if (nn)
  109.                 fprintf(nn,"%-7s %-6u          %s\n",xnp->stype, xnp->host,
  110.                         xsubs[i1].desc?xsubs[i1].desc:subboards[i1].name);
  111.             }
  112.           }
  113.         }
  114.       }
  115.       if (al) fclose(al);
  116.       if (su) fclose(su);
  117.       if (nn) fclose(nn);
  118.     }
  119.   }
  120.  
  121.   set_net_num(onn);
  122. }
  123.  
  124. /****************************************************************************/
  125.  
  126. void boarddata(int n, char *s)
  127. {
  128.   char x,y,k,i;
  129.   subboardrec r;
  130.  
  131.   r=subboards[n];
  132.   if (r.ar==0)
  133.     x=32;
  134.   else {
  135.     for (i=0; i<16; i++)
  136.       if ((1 << i) & r.ar)
  137.         x='A'+i;
  138.   }
  139.   switch(r.anony & 0x0f) {
  140.     case 0: y='N'; break;
  141.     case anony_enable_anony: y='Y'; break;
  142.     case anony_enable_dear_abby: y='D'; break;
  143.     case anony_force_anony: y='F'; break;
  144.     case anony_real_name: y='R'; break;
  145.   }
  146.   if (r.key==0)
  147.     k=32;
  148.   else
  149.     k=r.key;
  150.   sprintf(s,"%2d %1c  %-40s  %-8s %-3d %-3d %-3d %-3d %5s",
  151.             n,x,r.name,r.filename,r.readsl,r.postsl,r.age&0x7f,r.maxmsgs,
  152.             xsubs[n].num_nets?xsubs[n].nets[0].stype:"");
  153.   x=k; x=y; /* leave in old code but ignore warning */
  154. }
  155.  
  156. void showsubs(void)
  157. {
  158.   int abort,i;
  159.   char s[180];
  160.  
  161.   outchr(12);
  162.   abort=0;
  163.   pla(get_string(166),
  164.       &abort);
  165.   pla(get_string(167),
  166.       &abort);
  167.   for (i=0; (i<num_subs) && (!abort); i++) {
  168.     subboards[i].anony &= ~anony_require_sv;
  169.     boarddata(i,s);
  170.     pla(s,&abort);
  171.   }
  172. }
  173.  
  174.  
  175.  
  176. void modify_sub(int n)
  177. {
  178.   subboardrec r;
  179.   char s[81],s1[81],ch,ch2,ch3;
  180.   int i,i1,i2,done;
  181.   char *name;
  182.   xtrasubsnetrec *xnp;
  183.  
  184.   r=subboards[n];
  185.   done=0;
  186.   do {
  187.     outchr(12);
  188.     outstr(get_string(62)); pl(r.name);
  189.     outstr(get_string(63)); pl(r.filename);
  190.     if (r.key==0)
  191.       strcpy(s,get_string(168));
  192.     else {
  193.       s[0]=r.key;
  194.       s[1]=0;
  195.     }
  196.     outstr(get_string(169)); pl(s);
  197.     outstr(get_string(170)); pln(r.readsl);
  198.     outstr(get_string(171)); pln(r.postsl);
  199.     switch(r.anony & 0x0f) {
  200.       case 0: strcpy(s,str_no); break;
  201.       case anony_enable_anony: strcpy(s,str_yes); break;
  202.       case anony_enable_dear_abby: strcpy(s,get_string(172)); break;
  203.       case anony_force_anony: strcpy(s,get_string(173)); break;
  204.       case anony_real_name: strcpy(s,get_string(174)); break;
  205.       default: strcpy(s,get_string(175)); break;
  206.     }
  207.     outstr(get_string(176)); pl(s);
  208.     outstr(get_string(177)); pln(r.age&0x7f);
  209.     outstr(get_string(178)); pln(r.maxmsgs);
  210.     strcpy(s,get_string(5));
  211.     if (r.ar!=0) {
  212.       for (i=0; i<16; i++)
  213.         if ((1 << i) & r.ar)
  214.           s[0]='A'+i;
  215.       s[1]=0;
  216.     }
  217.     outstr(get_string(179)); pl(s);
  218.     outstr(get_string(180));
  219.     if (xsubs[n].num_nets) {
  220.       npr("\r\n      %-12.12s %-7.7s %-6.6s  %s\r\n",
  221.           get_string(181), get_string(182), get_string(183), get_string(184));
  222.       for (i=0,xnp=xsubs[n].nets; i<xsubs[n].num_nets; i++,xnp++) {
  223.         if (xnp->host==0)
  224.           strcpy(s,get_string(185));
  225.         else
  226.           sprintf(s,"%u ",xnp->host);
  227.         if (xnp->category)
  228.           sprintf(s1,"%s(%d)",get_string(187),xnp->category);
  229.         else
  230.           strcpy(s1,get_string(187));
  231.         npr("   %c) %-12.12s %-7.7s %-6.6s  %s%s\r\n",
  232.             i+'a',
  233.             net_networks[xnp->net_num].name,
  234.             xnp->stype,
  235.             s,
  236.             (xnp->flags&XTRA_NET_AUTO_ADDDROP)?get_string(186):"",
  237.             (xnp->flags&XTRA_NET_AUTO_INFO)?s1:"");
  238.       }
  239.     } else {
  240.       pl(get_string(188));
  241.     }
  242.  
  243.     outstr(get_string(189)); pln(r.storage_type);
  244.     outstr(get_string(190)); pl((r.anony & anony_val_net)?str_yes:str_no);
  245.     outstr(get_string(191)); pl((r.anony & anony_ansi_only)?str_yes:str_no);
  246.     outstr(get_string(192)); pl((r.anony & anony_no_tag)?str_yes:str_no);
  247.     outstr(get_string(193)); pl(xsubs[n].desc);
  248.     nl();
  249.     prt(2,get_string(194));
  250.     ch=onek("QABCDEFGHIJKLMNO");
  251.     switch(ch) {
  252.       case 'Q':done=1; break;
  253.       case 'A':
  254.         nl();
  255.         prt(2,get_string(69));
  256.         if (status.net_version<32)
  257.           inputl(s,39);
  258.         else
  259.           inputl(s,40);
  260.         if (s[0])
  261.           strcpy(r.name,s);
  262.         break;
  263.       case 'B':
  264.         nl();
  265.         prt(2,get_string(72));
  266.         input(s,8);
  267.         if ((s[0]!=0) && (strchr(s,'.')==0))
  268.           strcpy(r.filename,s);
  269.         break;
  270.       case 'C':
  271.         nl();
  272.         prt(2,get_string(195));
  273.         ch2=onek("@#$%^&()-_=+\\|][{};:'\",<>`~ ");
  274.         if (ch2==32)
  275.           r.key=0;
  276.         else
  277.           r.key=ch2;
  278.         break;
  279.       case 'D':
  280.         nl();
  281.         prt(2,get_string(196));
  282.         input(s,3);
  283.         i=atoi(s);
  284.         if ((i>=0) && (i<256) && (s[0]))
  285.           r.readsl=i;
  286.         break;
  287.       case 'E':
  288.         nl();
  289.         prt(2,get_string(197));
  290.         input(s,3);
  291.         i=atoi(s);
  292.         if ((i>=0) && (i<256) && (s[0]))
  293.           r.postsl=i;
  294.         break;
  295.       case 'F':
  296.         nl();
  297.         prt(2,get_string(198));
  298.         strcpy(s,"NYDFR");
  299.         s[0]=str_no[0];
  300.         s[1]=str_yes[0];
  301.         ch2=onek(s);
  302.         if (ch2==str_no[0])
  303.           ch2=0;
  304.         else if (ch2==str_yes[0])
  305.           ch2=1;
  306.         r.anony &= 0xf0;
  307.         switch(ch2) {
  308.           case 0: break;
  309.           case 1: r.anony |= anony_enable_anony; break;
  310.           case 'D': r.anony |= anony_enable_dear_abby; break;
  311.           case 'F': r.anony |= anony_force_anony; break;
  312.           case 'R': r.anony |= anony_real_name; break;
  313.         }
  314.         break;
  315.       case 'G':
  316.         nl();
  317.         prt(2,get_string(77));
  318.         input(s,3);
  319.         i=atoi(s);
  320.         if ((i>=0) && (i<128) && (s[0]))
  321.           r.age=(r.age&0x80)|(i&0x7f);
  322.         break;
  323.       case 'H':
  324.         nl();
  325.         prt(2,get_string(199));
  326.         input(s,3);
  327.         i=atoi(s);
  328.         if ((i>0) && (i<255) && (s[0]))
  329.           r.maxmsgs=i;
  330.         break;
  331.       case 'I':
  332.         nl();
  333.         prt(2,get_string(80));
  334.         ch2=onek("ABCDEFGHIJKLMNOP ");
  335.         if (ch2==32)
  336.           r.ar=0;
  337.         else
  338.           r.ar=1 << (ch2-'A');
  339.         break;
  340.       case 'J':
  341.         if (xsubs[n].num_nets) {
  342.           nl();
  343.           prt(2,get_string(200));
  344.           ch2=onek("QAMD");
  345.         } else
  346.           ch2='A';
  347.  
  348.         if (ch2=='A') {
  349.           if (status.net_version<32) {
  350.             nl();
  351.             pl(get_string(201));
  352.             nl();
  353.             pausescr();
  354.           } else
  355.             sub_xtr_add(n, -1);
  356.         } else if ((ch2=='D') || (ch2=='M')) {
  357.           nl();
  358.           ansic(2);
  359.           if (ch2=='D')
  360.             outstr(get_string(202));
  361.           else
  362.             outstr(get_string(203));
  363.           npr("%c",'a'+xsubs[n].num_nets-1);
  364.           outstr(get_string(204));
  365.           s[0]='Q';
  366.           for (i=0; i<xsubs[n].num_nets; i++)
  367.             s[i+1]='A'+i;
  368.           s[i+1]=0;
  369.           ansic(0);
  370.           ch3=onek(s);
  371.           if (ch3!='Q') {
  372.             i=ch3-'A';
  373.             if ((i>=0) && (i<xsubs[n].num_nets)) {
  374.               if (ch2=='D') {
  375.                 sub_xtr_del(n, i, 1);
  376.               } else {
  377.                 sub_xtr_del(n, i, 0);
  378.                 sub_xtr_add(n, i);
  379.               }
  380.             }
  381.           }
  382.         }
  383.         break;
  384.       case 'K':
  385.         nl();
  386.         prt(2,get_string(205));
  387.         input(s,4);
  388.         i=atoi(s);
  389.         if ((s[0]) && (i>=0) && (i<=2))
  390.           r.storage_type=i;
  391.         break;
  392.       case 'L':
  393.         nl();
  394.         prt(5,get_string(206));
  395.         r.anony &= ~anony_val_net;
  396.         if (yn())
  397.           r.anony |= anony_val_net;
  398.         break;
  399.       case 'M':
  400.         nl();
  401.         prt(5,get_string(207));
  402.         r.anony &= ~anony_ansi_only;
  403.         if (yn())
  404.           r.anony |= anony_ansi_only;
  405.         break;
  406.       case 'N':
  407.         nl();
  408.         prt(5,get_string(208));
  409.         r.anony &= ~anony_no_tag;
  410.         if (yn())
  411.           r.anony |= anony_no_tag;
  412.         break;
  413.       case 'O':
  414.         nl();
  415.         prt(2,get_string(209));
  416.         inputl(s,60);
  417.         if (s[0])
  418.           strcpy(xsubs[n].desc,s);
  419.         break;
  420.     }
  421.   } while ((!done) && (!hangup));
  422.   subboards[n]=r;
  423. }
  424.  
  425.  
  426. void insert_sub(int n)
  427. {
  428.   subboardrec r;
  429.   int i,i1,i2,nu;
  430.   unsigned long *qsc, *qsc_n, *qsc_q, *qsc_p, m1, m2, m3;
  431.  
  432.   for (i=num_subs-1; i>=n; i--) {
  433.     subboards[i+1]=subboards[i];
  434.     sub_dates[i+1]=sub_dates[i];
  435.     xsubs[i+1]=xsubs[i];
  436.   }
  437.   strcpy(r.name,get_string(210));
  438.   strcpy(r.filename,get_string(82));
  439.   r.key=0;
  440.   r.readsl=10;
  441.   r.postsl=20;
  442.   r.anony=0;
  443.   r.age=0;
  444.   r.maxmsgs=50;
  445.   r.ar=0;
  446.   r.type=0;
  447.   r.storage_type=2;
  448.   subboards[n]=r;
  449.   memset(&(xsubs[n]),0, sizeof(xtrasubsrec));
  450.   ++num_subs;
  451.   nu=number_userrecs();
  452.   close_user();
  453.  
  454.   qsc=(unsigned long *)farmalloc(syscfg.qscn_len);
  455.   if (qsc) {
  456.     qsc_n=qsc+1;
  457.     qsc_q=qsc_n+(max_dirs+31)/32;
  458.     qsc_p=qsc_q+(max_subs+31)/32;
  459.  
  460.     m1=1L<<(n%32);
  461.     m2=0xffffffff<<((n%32)+1);
  462.     m3=0xffffffff>>(32-(n%32));
  463.  
  464.     for (i=1; i<=nu; i++) {
  465.       read_qscn(i,qsc, 1);
  466.  
  467.       if ((*qsc!=999) && (*qsc>=n))
  468.         (*qsc)++;
  469.  
  470.       for (i1=num_subs-1; i1>n; i1--)
  471.         qsc_p[i1]=qsc_p[i1-1];
  472.       qsc_p[n]=0;
  473.  
  474.       for (i2=num_subs/32; i2>n/32; i2--) {
  475.         qsc_q[i2]=(qsc_q[i2]<<1) | (qsc_q[i2-1]>>31);
  476.       }
  477.       qsc_q[i2]=m1 | (m2 & (qsc_q[i2]<<1)) | (m3 & qsc_q[i2]);
  478.  
  479.       write_qscn(i,qsc,1);
  480.     }
  481.     close_qscn();
  482.     farfree(qsc);
  483.   }
  484.  
  485.   save_subs();
  486.  
  487.   if (curlsub>=n)
  488.     curlsub++;
  489.  
  490.   modify_sub(n);
  491. }
  492.  
  493.  
  494. void delete_sub(int n)
  495. {
  496.   int i,i1,i2,nu;
  497.   unsigned long *qsc, *qsc_n, *qsc_q, *qsc_p, m2, m3;
  498.  
  499.   while (xsubs[n].num_nets)
  500.     sub_xtr_del(n, 0, 1);
  501.   if ((xsubs[n].nets) && (xsubs[n].flags & XTRA_MALLOCED))
  502.     farfree(xsubs[n].nets);
  503.  
  504.   for (i=n; i<num_subs; i++) {
  505.     subboards[i]=subboards[i+1];
  506.     sub_dates[i]=sub_dates[i+1];
  507.     xsubs[i]=xsubs[i+1];
  508.   }
  509.   --num_subs;
  510.   nu=number_userrecs();
  511.   close_user();
  512.  
  513.   qsc=(unsigned long *)farmalloc(syscfg.qscn_len+4);
  514.   if (qsc) {
  515.     qsc_n=qsc+1;
  516.     qsc_q=qsc_n+(max_dirs+31)/32;
  517.     qsc_p=qsc_q+(max_subs+31)/32;
  518.  
  519.     m2=0xffffffff<<(n%32);
  520.     m3=0xffffffff>>(32-(n%32));
  521.  
  522.     for (i=1; i<=nu; i++) {
  523.       read_qscn(i,qsc, 1);
  524.  
  525.       if (*qsc!=999) {
  526.         if (*qsc==n)
  527.           *qsc=999;
  528.         else if (*qsc>n)
  529.           (*qsc)--;
  530.       }
  531.  
  532.       for (i1=n; i1<num_subs; i1++)
  533.         qsc_p[i1]=qsc_p[i1+1];
  534.  
  535.       qsc_q[n/32]=(qsc_q[n/32]&m3) | ((qsc_q[n/32]>>1)&m2) |
  536.                   (qsc_q[(n/32)+1]<<31);
  537.  
  538.       for (i2=(n/32)+1; i2<=(num_subs/32); i2++) {
  539.         qsc_q[i2]=(qsc_q[i2]>>1) | (qsc_q[i2+1]<<31);
  540.       }
  541.  
  542.       write_qscn(i,qsc,1);
  543.     }
  544.     close_qscn();
  545.     farfree(qsc);
  546.   }
  547.  
  548.   save_subs();
  549.  
  550.   if (curlsub==n)
  551.     curlsub=-1;
  552.   else if (curlsub>n)
  553.     curlsub--;
  554. }
  555.  
  556.  
  557. void boardedit(void)
  558. {
  559.   int i,i1,i2,done,f;
  560.   char s[81],s1[81],s2[81],ch;
  561.  
  562.   if (!checkpw())
  563.     return;
  564.   showsubs();
  565.   done=0;
  566.   do {
  567.     nl();
  568.     prt(2,get_string(211));
  569.     ch=onek("QDIM?");
  570.     switch(ch) {
  571.       case '?':
  572.         showsubs();
  573.         break;
  574.       case 'Q':
  575.         done=1;
  576.         break;
  577.       case 'M':
  578.         nl();
  579.         prt(2,get_string(212));
  580.         input(s,3);
  581.         i=atoi(s);
  582.         if ((s[0]!=0) && (i>=0) && (i<num_subs))
  583.           modify_sub(i);
  584.         break;
  585.       case 'I':
  586.         if (num_subs<max_subs) {
  587.           nl();
  588.           prt(2,get_string(213));
  589.           input(s,3);
  590.           i=atoi(s);
  591.           if ((s[0]!=0) && (i>=0) && (i<=num_subs))
  592.             insert_sub(i);
  593.         }
  594.         break;
  595.       case 'D':
  596.         nl();
  597.         prt(2,get_string(214));
  598.         input(s,3);
  599.         i=atoi(s);
  600.         if ((s[0]!=0) && (i>=0) && (i<num_subs)) {
  601.           nl();
  602.           sprintf(s1,"%s %s? ",get_string(215), subboards[i].name);
  603.           prt(5,s1);
  604.           if (yn()) {
  605.             strcpy(s,subboards[i].filename);
  606.             delete_sub(i);
  607.             nl();
  608.             prt(5,get_string(216));
  609.             if (yn()) {
  610.               sprintf(s1,"%s%s.SUB",syscfg.datadir, s);
  611.               unlink(s1);
  612.               sprintf(s1,"%s%s.DAT",syscfg.msgsdir,s);
  613.               unlink(s1);
  614.             }
  615.           }
  616.         }
  617.         break;
  618.     }
  619.   } while ((!done) && (!hangup));
  620.   save_subs();
  621.   if (!wfc)
  622.     changedsl();
  623. }
  624.  
  625.