home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / SCFG / SCFGSUB.C < prev    next >
Encoding:
Text File  |  1997-04-13  |  37.1 KB  |  1,201 lines

  1. #line 2 "SCFGSUB.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "scfg.h"
  6.  
  7. void sub_cfg(uint grpnum)
  8. {
  9.     static int dflt,tog_dflt,opt_dflt,net_dflt,adv_dflt,bar;
  10.     char str[81],str2[81],str3[11],done=0,code[9],*p;
  11.     int j,m,n,ptridx,q,s;
  12.     uint i,subnum[MAX_OPTS+1];
  13.     static sub_t savsub;
  14.  
  15. while(1) {
  16.     for(i=0,j=0;i<total_subs && j<MAX_OPTS;i++)
  17.         if(sub[i]->grp==grpnum) {
  18.             subnum[j]=i;
  19.             if(sub[subnum[0]]->qwkconf)
  20.                 sprintf(opt[j],"%-5u %s"
  21.                     ,sub[i]->qwkconf,sub[i]->lname);
  22.             else
  23.                 sprintf(opt[j],"%s"
  24.                     ,sub[i]->lname);
  25.             j++; }
  26.     subnum[j]=total_subs;
  27.     opt[j][0]=0;
  28.     sprintf(str,"%s Sub-boards",grp[grpnum]->sname);
  29.     savnum=0;
  30.     i=WIN_SAV|WIN_ACT;
  31.     if(j)
  32.         i|=WIN_DEL|WIN_GET|WIN_DELACT;
  33.     if(j<MAX_OPTS)
  34.         i|=WIN_INS|WIN_XTR|WIN_INSACT;
  35.     if(savsub.sname[0])
  36.         i|=WIN_PUT;
  37.     SETHELP(WHERE);
  38. /*
  39. Message Sub-boards:
  40.  
  41. This is a list of message sub-boards that have been configured for the
  42. selected message group.
  43.  
  44. To add a sub-board, select the desired position with the arrow keys and
  45. hit  INS .
  46.  
  47. To delete a sub-board, select it with the arrow keys and hit  DEL .
  48.  
  49. To configure a sub-board, select it with the arrow keys and hit  ENTER .
  50. */
  51.     i=ulist(i,24,1,LEN_SLNAME+5,&dflt,&bar,str,opt);
  52.     savnum=1;
  53.     if((signed)i==-1)
  54.         return;
  55.     if((i&MSK_ON)==MSK_INS) {
  56.         i&=MSK_OFF;
  57.         strcpy(str,"General");
  58.         SETHELP(WHERE);
  59. /*
  60. Sub-board Long Name:
  61.  
  62. This is a description of the message sub-board which is displayed in all
  63. sub-board listings.
  64. */
  65.         if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME
  66.             ,K_EDIT)<1)
  67.             continue;
  68.         sprintf(str2,"%.*s",LEN_SSNAME,str);
  69.         SETHELP(WHERE);
  70. /*
  71. Sub-board Short Name:
  72.  
  73. This is a short description of the message sub-board which is displayed
  74. at the main and reading messages prompts.
  75. */
  76.         if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME
  77.             ,K_EDIT)<1)
  78.             continue;
  79.         sprintf(str3,"%.10s",str2);
  80.         SETHELP(WHERE);
  81. /*
  82. Sub-board QWK Name:
  83.  
  84. This is the name of the sub-board used for QWK off-line readers.
  85. */
  86.         if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10
  87.             ,K_EDIT)<1)
  88.             continue;
  89.         sprintf(code,"%.8s",str3);
  90.         p=strchr(code,SP);
  91.         if(p) *p=0;
  92.         strupr(code);
  93.         SETHELP(WHERE);
  94. /*
  95. Sub-board Internal Code:
  96.  
  97. Every sub-board must have its own unique code for Synchronet to refer to
  98. it internally. This code should be descriptive of the sub-board's topic,
  99. usually an abreviation of the sub-board's name.
  100. */
  101.         if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code",code,8
  102.             ,K_EDIT|K_UPPER)<1)
  103.             continue;
  104.         if(!code_ok(code)) {
  105.             helpbuf=invalid_code;
  106.             savnum=0;
  107.             umsg("Invalid Code");
  108.             helpbuf=0;
  109.             continue; }
  110.  
  111.         if((sub=(sub_t **)REALLOC(sub,sizeof(sub_t *)*(total_subs+1)))==NULL) {
  112.             errormsg(WHERE,ERR_ALLOC,nulstr,total_subs+1);
  113.             total_subs=0;
  114.             bail(1);
  115.             continue; }
  116.  
  117.         for(ptridx=0;ptridx>-1;ptridx++) { /* Search for unused pointer indx */
  118.             for(n=0;n<total_subs;n++)
  119.                 if(sub[n]->ptridx==ptridx)
  120.                     break;
  121.             if(n==total_subs)
  122.                 break; }
  123.  
  124.         if(j) {
  125.             for(n=total_subs;n>subnum[i];n--)
  126.                 sub[n]=sub[n-1];
  127.             for(q=0;q<total_qhubs;q++)
  128.                 for(s=0;s<qhub[q]->subs;s++)
  129.                     if(qhub[q]->sub[s]>=subnum[i])
  130.                         qhub[q]->sub[s]++; }
  131.  
  132.         if((sub[subnum[i]]=(sub_t *)MALLOC(sizeof(sub_t)))==NULL) {
  133.             errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t));
  134.             continue; }
  135.         memset((sub_t *)sub[subnum[i]],0,sizeof(sub_t));
  136.         sub[subnum[i]]->grp=grpnum;
  137.         if(total_faddrs)
  138.             sub[subnum[i]]->faddr=faddr[0];
  139.         else
  140.             memset(&sub[subnum[i]]->faddr,0,sizeof(faddr_t));
  141.         sub[subnum[i]]->maxmsgs=500;
  142.         strcpy(sub[subnum[i]]->code,code);
  143.         strcpy(sub[subnum[i]]->lname,str);
  144.         strcpy(sub[subnum[i]]->sname,str2);
  145.         strcpy(sub[subnum[i]]->qwkname,str3);
  146.         sub[subnum[i]]->misc=(SUB_NSDEF|SUB_SSDEF|SUB_QUOTE|SUB_TOUSER
  147.             |SUB_HDRMOD|SUB_FAST);
  148.         sub[subnum[i]]->ptridx=ptridx;
  149.         total_subs++;
  150.         changes=1;
  151.         continue; }
  152.     if((i&MSK_ON)==MSK_DEL) {
  153.         i&=MSK_OFF;
  154.         SETHELP(WHERE);
  155. /*
  156. Delete Data in Sub-board:
  157.  
  158. If you want to delete all the messages for this sub-board, select Yes.
  159. */
  160.         j=1;
  161.         strcpy(opt[0],"Yes");
  162.         strcpy(opt[1],"No");
  163.         opt[2][0]=0;
  164.         j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
  165.             ,"Delete Data in Sub-board",opt);
  166.         if(j==-1)
  167.             continue;
  168.         if(j==0) {
  169.                 sprintf(str,"%s.s*",sub[subnum[i]]->code);
  170.                 if(!sub[subnum[i]]->data_dir[0])
  171.                     sprintf(tmp,"%sSUBS\\",data_dir);
  172.                 else
  173.                     strcpy(tmp,sub[subnum[i]]->data_dir);
  174.                 delfiles(tmp,str);
  175.                 clearptrs(subnum[i]); }
  176.         FREE(sub[subnum[i]]);
  177.         total_subs--;
  178.         for(j=subnum[i];j<total_subs;j++)
  179.             sub[j]=sub[j+1];
  180.         for(q=0;q<total_qhubs;q++)
  181.             for(s=0;s<qhub[q]->subs;s++) {
  182.                 if(qhub[q]->sub[s]==subnum[i])
  183.                     qhub[q]->sub[s]=INVALID_SUB;
  184.                 else if(qhub[q]->sub[s]>subnum[i])
  185.                     qhub[q]->sub[s]--; }
  186.         changes=1;
  187.         continue; }
  188.     if((i&MSK_ON)==MSK_GET) {
  189.         i&=MSK_OFF;
  190.         savsub=*sub[subnum[i]];
  191.         continue; }
  192.     if((i&MSK_ON)==MSK_PUT) {
  193.         i&=MSK_OFF;
  194.         ptridx=sub[subnum[i]]->ptridx;
  195.         *sub[subnum[i]]=savsub;
  196.         sub[subnum[i]]->ptridx=ptridx;
  197.         sub[subnum[i]]->grp=grpnum;
  198.         changes=1;
  199.         continue; }
  200.     i=subnum[i];
  201.     j=0;
  202.     done=0;
  203.     while(!done) {
  204.         n=0;
  205.         sprintf(opt[n++],"%-27.27s%s","Long Name",sub[i]->lname);
  206.         sprintf(opt[n++],"%-27.27s%s","Short Name",sub[i]->sname);
  207.         sprintf(opt[n++],"%-27.27s%s","QWK Name",sub[i]->qwkname);
  208.         sprintf(opt[n++],"%-27.27s%s","Internal Code",sub[i]->code);
  209.         sprintf(opt[n++],"%-27.27s%.40s","Access Requirements"
  210.             ,sub[i]->ar);
  211.         sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements"
  212.             ,sub[i]->read_ar);
  213.         sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements"
  214.             ,sub[i]->post_ar);
  215.         sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements"
  216.             ,sub[i]->op_ar);
  217.         sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User"
  218.             ,sub[i]->mod_ar);
  219.         sprintf(opt[n++],"%-27.27s%u","Maximum Messages"
  220.             ,sub[i]->maxmsgs);
  221.         if(sub[i]->maxage)
  222.             sprintf(str,"Enabled (%u days old)",sub[i]->maxage);
  223.         else
  224.             strcpy(str,"Disabled");
  225.         sprintf(opt[n++],"%-27.27s%s","Purge by Age",str);
  226.         if(sub[i]->maxcrcs)
  227.             sprintf(str,"Enabled (%lu message CRCs)",sub[i]->maxcrcs);
  228.         else
  229.             strcpy(str,"Disabled");
  230.         sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str);
  231.  
  232.         strcpy(opt[n++],"Toggle Options...");
  233.         strcpy(opt[n++],"Network Options...");
  234.         strcpy(opt[n++],"Advanced Options...");
  235.         opt[n][0]=0;
  236.         sprintf(str,"%s Sub-board",sub[i]->sname);
  237.         savnum=1;
  238.         SETHELP(WHERE);
  239. /*
  240. Sub-board Configuration:
  241.  
  242. This menu allows you to configure the individual selected sub-board.
  243. Options with a trailing ... provide a sub-menu of more options.
  244. */
  245.         switch(ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT
  246.             ,0,0,60,&opt_dflt,0,str,opt)) {
  247.             case -1:
  248.                 done=1;
  249.                 break;
  250.             case 0:
  251.                 SETHELP(WHERE);
  252. /*
  253. Sub-board Long Name:
  254.  
  255. This is a description of the message sub-board which is displayed in all
  256. sub-board listings.
  257. */
  258.                 strcpy(str,sub[i]->lname);    /* save */
  259.                 if(!uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Listings"
  260.                     ,sub[i]->lname,LEN_SLNAME,K_EDIT))
  261.                     strcpy(sub[i]->lname,str);    /* restore */
  262.                 break;
  263.             case 1:
  264.                 SETHELP(WHERE);
  265. /*
  266. Sub-board Short Name:
  267.  
  268. This is a short description of the message sub-board which is displayed
  269. at the main and reading messages prompts.
  270. */
  271.                 uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts"
  272.                     ,sub[i]->sname,LEN_SSNAME,K_EDIT);
  273.                 break;
  274.             case 2:
  275.                 SETHELP(WHERE);
  276. /*
  277. Sub-board QWK Name:
  278.  
  279. This is the name of the sub-board used for QWK off-line readers.
  280. */
  281.                 uinput(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets"
  282.                     ,sub[i]->qwkname,10,K_EDIT);
  283.                 break;
  284.             case 3:
  285.                 SETHELP(WHERE);
  286. /*
  287. Sub-board Internal Code:
  288.  
  289. Every sub-board must have its own unique code for Synchronet to refer
  290. to it internally. This code should be descriptive of the sub-board's
  291. topic, usually an abreviation of the sub-board's name.
  292. */
  293.                 strcpy(str,sub[i]->code);
  294.                 uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
  295.                     ,str,8,K_EDIT|K_UPPER);
  296.                 if(code_ok(str))
  297.                     strcpy(sub[i]->code,str);
  298.                 else {
  299.                     helpbuf=invalid_code;
  300.                     umsg("Invalid Code");
  301.                     helpbuf=0; }
  302.                 break;
  303.             case 4:
  304.                 savnum=2;
  305.                 sprintf(str,"%s Access",sub[i]->sname);
  306.                 getar(str,sub[i]->ar);
  307.                 break;
  308.             case 5:
  309.                 savnum=2;
  310.                 sprintf(str,"%s Reading",sub[i]->sname);
  311.                 getar(str,sub[i]->read_ar);
  312.                 break;
  313.             case 6:
  314.                 savnum=2;
  315.                 sprintf(str,"%s Posting",sub[i]->sname);
  316.                 getar(str,sub[i]->post_ar);
  317.                 break;
  318.             case 7:
  319.                 savnum=2;
  320.                 sprintf(str,"%s Operator",sub[i]->sname);
  321.                 getar(str,sub[i]->op_ar);
  322.                 break;
  323.             case 8:
  324.                 savnum=2;
  325.                 sprintf(str,"%s Moderated Posting User",sub[i]->sname);
  326.                 getar(str,sub[i]->mod_ar);
  327.                 break;
  328.             case 9:
  329.                 sprintf(str,"%u",sub[i]->maxmsgs);
  330.                 SETHELP(WHERE);
  331. /*
  332. Maximum Number of Messages:
  333.  
  334. This value is the maximum number of messages that will be kept in the
  335. sub-board. Once this maximum number of messages is reached, the oldest
  336. messages will be automatically purged. Usually, 100 messages is a
  337. sufficient maximum.
  338. */
  339.                 uinput(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages"
  340.                     ,str,5,K_EDIT|K_NUMBER);
  341.                 sub[i]->maxmsgs=atoi(str);
  342.                 sub[i]->misc|=SUB_HDRMOD;
  343.                 break;
  344.             case 10:
  345.                 sprintf(str,"%u",sub[i]->maxage);
  346.                 SETHELP(WHERE);
  347. /*
  348. Maximum Age of Messages:
  349.  
  350. This value is the maximum number of days that messages will be kept in
  351. the sub-board.
  352. */
  353.                 uinput(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)"
  354.                     ,str,5,K_EDIT|K_NUMBER);
  355.                 sub[i]->maxage=atoi(str);
  356.                 sub[i]->misc|=SUB_HDRMOD;
  357.                 break;
  358.             case 11:
  359.                 sprintf(str,"%u",sub[i]->maxcrcs);
  360.                 SETHELP(WHERE);
  361. /*
  362. Maximum Number of CRCs:
  363.  
  364. This value is the maximum number of CRCs that will be kept in the
  365. sub-board for duplicate message checking. Once this maximum number of
  366. CRCs is reached, the oldest CRCs will be automatically purged.
  367. */
  368.                 uinput(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs"
  369.                     ,str,5,K_EDIT|K_NUMBER);
  370.                 sub[i]->maxcrcs=atol(str);
  371.                 sub[i]->misc|=SUB_HDRMOD;
  372.                 break;
  373.             case 12:
  374.                 while(1) {
  375.                     n=0;
  376.                     sprintf(opt[n++],"%-27.27s%s","Allow Private Posts"
  377.                         ,sub[i]->misc&SUB_PRIV ? sub[i]->misc&SUB_PONLY
  378.                         ? "Only":"Yes":"No");
  379.                     sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts"
  380.                         ,sub[i]->misc&SUB_ANON ? sub[i]->misc&SUB_AONLY
  381.                         ? "Only":"Yes":"No");
  382.                     sprintf(opt[n++],"%-27.27s%s","Post Using Real Names"
  383.                         ,sub[i]->misc&SUB_NAME ? "Yes":"No");
  384.                     sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts"
  385.                         ,sub[i]->misc&SUB_DEL ? sub[i]->misc&SUB_DELLAST
  386.                         ? "Last":"Yes":"No");
  387.                     sprintf(opt[n++],"%-27.27s%s","Default On for New Scan"
  388.                         ,sub[i]->misc&SUB_NSDEF ? "Yes":"No");
  389.                     sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan"
  390.                         ,sub[i]->misc&SUB_FORCED ? "Yes":"No");
  391.                     sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan"
  392.                         ,sub[i]->misc&SUB_SSDEF ? "Yes":"No");
  393.                     sprintf(opt[n++],"%-27.27s%s","Public 'To' User"
  394.                         ,sub[i]->misc&SUB_TOUSER ? "Yes":"No");
  395.                     sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting"
  396.                         ,sub[i]->misc&SUB_QUOTE ? "Yes":"No");
  397.                     sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs"
  398.                         ,sub[i]->misc&SUB_SYSPERM ? "Yes":"No");
  399.                     sprintf(opt[n++],"%-27.27s%s","Kill Read Messages"
  400.                         ,sub[i]->misc&SUB_KILL ? "Yes"
  401.                         : (sub[i]->misc&SUB_KILLP ? "Pvt" : "No"));
  402. #if 1
  403.                     sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)"
  404.                         ,sub[i]->misc&SUB_LZH ? "Yes" : "No");
  405. #endif
  406.                     opt[n][0]=0;
  407.                     savnum=2;
  408.                     SETHELP(WHERE);
  409. /*
  410. Sub-board Toggle Options:
  411.  
  412. This menu allows you to toggle certain options for the selected
  413. sub-board between two or more settings, such as Yes and No.
  414. */
  415.                     n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0
  416.                         ,"Toggle Options",opt);
  417.                     if(n==-1)
  418.                         break;
  419.                     savnum=3;
  420.                     switch(n) {
  421.                         case 0:
  422.                             n=1;
  423.                             strcpy(opt[0],"Yes");
  424.                             strcpy(opt[1],"No");
  425.                             strcpy(opt[2],"Only");
  426.                             opt[3][0]=0;
  427.                             SETHELP(WHERE);
  428. /*
  429. Allow Private Posts on Sub-board:
  430.  
  431. If you want users to be able to post private messages to other users
  432. on this sub-board, set this value to Yes. Usually, E-mail is the
  433. preferred method of private communication. If you want users to be able
  434. to post private messages only on this sub-board, select Only.
  435. */
  436.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  437.                                 ,"Allow Private Posts",opt);
  438.                             if(n==-1)
  439.                                 break;
  440.                             if(!n && (sub[i]->misc&(SUB_PRIV|SUB_PONLY))
  441.                                 !=SUB_PRIV) {
  442.                                 changes=1;
  443.                                 sub[i]->misc&=~SUB_PONLY;
  444.                                 sub[i]->misc|=SUB_PRIV;
  445.                                 break; }
  446.                             if(n==1 && sub[i]->misc&SUB_PRIV) {
  447.                                 changes=1;
  448.                                 sub[i]->misc&=~SUB_PRIV;
  449.                                 break; }
  450.                             if(n==2 && (sub[i]->misc&(SUB_PRIV|SUB_PONLY))
  451.                                 !=(SUB_PRIV|SUB_PONLY)) {
  452.                                 changes=1;
  453.                                 sub[i]->misc|=(SUB_PRIV|SUB_PONLY); }
  454.                             break;
  455.                         case 1:
  456.                             n=1;
  457.                             strcpy(opt[0],"Yes");
  458.                             strcpy(opt[1],"No");
  459.                             strcpy(opt[2],"Only");
  460.                             opt[3][0]=0;
  461.                             SETHELP(WHERE);
  462. /*
  463. Allow Anonymous Posts on Sub-board:
  464.  
  465. If you want users with the A exemption to be able to post anonymously on
  466. this sub-board, select Yes. If you want all posts on this sub-board to be
  467. forced anonymous, select Only. If you do not want anonymous posts allowed
  468. on this sub-board at all, select No.
  469. */
  470.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  471.                                 ,"Allow Anonymous Posts",opt);
  472.                             if(n==-1)
  473.                                 break;
  474.                             if(!n && (sub[i]->misc&(SUB_ANON|SUB_AONLY))
  475.                                 !=SUB_ANON) {
  476.                                 changes=1;
  477.                                 sub[i]->misc&=~SUB_AONLY;
  478.                                 sub[i]->misc|=SUB_ANON;
  479.                                 break; }
  480.                             if(n==1 && sub[i]->misc&(SUB_ANON|SUB_AONLY)) {
  481.                                 changes=1;
  482.                                 sub[i]->misc&=~(SUB_ANON|SUB_AONLY);
  483.                                 break; }
  484.                             if(n==2 && (sub[i]->misc&(SUB_ANON|SUB_AONLY))
  485.                                 !=(SUB_ANON|SUB_AONLY)) {
  486.                                 changes=1;
  487.                                 sub[i]->misc|=(SUB_ANON|SUB_AONLY); }
  488.                             break;
  489.                         case 2:
  490.                             n=1;
  491.                             strcpy(opt[0],"Yes");
  492.                             strcpy(opt[1],"No");
  493.                             opt[2][0]=0;
  494.                             SETHELP(WHERE);
  495. /*
  496. User Real Names in Posts on Sub-board:
  497.  
  498. If you allow aliases on your system, you can have messages on this
  499. sub-board automatically use the real name of the posting user by setting
  500. this option to Yes.
  501. */
  502.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  503.                                 ,"Use Real Names in Posts",opt);
  504.                             if(n==-1)
  505.                                 break;
  506.                             if(!n && !(sub[i]->misc&SUB_NAME)) {
  507.                                 changes=1;
  508.                                 sub[i]->misc|=SUB_NAME;
  509.                                 break; }
  510.                             if(n==1 && sub[i]->misc&SUB_NAME) {
  511.                                 changes=1;
  512.                                 sub[i]->misc&=~SUB_NAME; }
  513.                             break;
  514.                         case 3:
  515.                             n=2;
  516.                             strcpy(opt[0],"Yes");
  517.                             strcpy(opt[1],"No");
  518.                             strcpy(opt[2],"Last Post Only");
  519.                             opt[3][0]=0;
  520.                             SETHELP(WHERE);
  521. /*
  522. Users Can Delete Posts on Sub-board:
  523.  
  524. If you want users to be able to delete any of their own posts on this
  525. sub-board, set this option to Yes. If you want to allow users the
  526. ability to delete their message only if it is the last message on the
  527. sub-board, select Last Post Only. If you want to disallow users from
  528. deleting any of their posts, set this option to No.
  529. */
  530.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  531.                                 ,"Users Can Delete Posts",opt);
  532.                             if(n==-1)
  533.                                 break;
  534.                             if(!n && (sub[i]->misc&(SUB_DEL|SUB_DELLAST))
  535.                                 !=SUB_DEL) {
  536.                                 changes=1;
  537.                                 sub[i]->misc&=~SUB_DELLAST;
  538.                                 sub[i]->misc|=SUB_DEL;
  539.                                 break; }
  540.                             if(n==1 && sub[i]->misc&SUB_DEL) {
  541.                                 changes=1;
  542.                                 sub[i]->misc&=~SUB_DEL;
  543.                                 break; }
  544.                             if(n==2 && (sub[i]->misc&(SUB_DEL|SUB_DELLAST))
  545.                                 !=(SUB_DEL|SUB_DELLAST)) {
  546.                                 changes=1;
  547.                                 sub[i]->misc|=(SUB_DEL|SUB_DELLAST); }
  548.                             break;
  549.                         case 4:
  550.                             n=0;
  551.                             strcpy(opt[0],"Yes");
  552.                             strcpy(opt[1],"No");
  553.                             opt[2][0]=0;
  554.                             SETHELP(WHERE);
  555. /*
  556. Default On for New Scan:
  557.  
  558. If you want this sub-board to be included in all user new message scans
  559. by default, set this option to Yes.
  560. */
  561.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  562.                                 ,"Default On for New Scan",opt);
  563.                             if(n==-1)
  564.                                 break;
  565.                             if(!n && !(sub[i]->misc&SUB_NSDEF)) {
  566.                                 changes=1;
  567.                                 sub[i]->misc|=SUB_NSDEF;
  568.                                 break; }
  569.                             if(n==1 && sub[i]->misc&SUB_NSDEF) {
  570.                                 changes=1;
  571.                                 sub[i]->misc&=~SUB_NSDEF; }
  572.                             break;
  573.                         case 5:
  574.                             n=1;
  575.                             strcpy(opt[0],"Yes");
  576.                             strcpy(opt[1],"No");
  577.                             opt[2][0]=0;
  578.                             SETHELP(WHERE);
  579. /*
  580. Forced On for New Scan:
  581.  
  582. If you want this sub-board to be included in all user new message scans
  583. even if the user has removed it from their new scan configuration, set
  584. this option to Yes.
  585. */
  586.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  587.                                 ,"Forced New Scan",opt);
  588.                             if(n==-1)
  589.                                 break;
  590.                             if(!n && !(sub[i]->misc&SUB_FORCED)) {
  591.                                 changes=1;
  592.                                 sub[i]->misc|=SUB_FORCED;
  593.                                 break; }
  594.                             if(n==1 && sub[i]->misc&SUB_FORCED) {
  595.                                 changes=1;
  596.                                 sub[i]->misc&=~SUB_FORCED; }
  597.                             break;
  598.                         case 6:
  599.                             n=0;
  600.                             strcpy(opt[0],"Yes");
  601.                             strcpy(opt[1],"No");
  602.                             opt[2][0]=0;
  603.                             SETHELP(WHERE);
  604. /*
  605. Default On for Your Scan:
  606.  
  607. If you want this sub-board to be included in all user personal message
  608. scans by default, set this option to Yes.
  609. */
  610.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  611.                                 ,"Default On for Your Scan",opt);
  612.                             if(n==-1)
  613.                                 break;
  614.                             if(!n && !(sub[i]->misc&SUB_SSDEF)) {
  615.                                 changes=1;
  616.                                 sub[i]->misc|=SUB_SSDEF;
  617.                                 break; }
  618.                             if(n==1 && sub[i]->misc&SUB_SSDEF) {
  619.                                 changes=1;
  620.                                 sub[i]->misc&=~SUB_SSDEF; }
  621.                             break;
  622.                         case 7:
  623.                             n=1;
  624.                             strcpy(opt[0],"Yes");
  625.                             strcpy(opt[1],"No");
  626.                             opt[2][0]=0;
  627.                             SETHELP(WHERE);
  628. /*
  629. Prompt for 'To' User on Public Posts:
  630.  
  631. If you want all posts on this sub-board to be prompted for a 'To' user,
  632. set this option to Yes. This is a useful option for sub-boards that
  633. are on a network that does not allow private posts.
  634. */
  635.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  636.                                 ,"Prompt for 'To' User on Public Posts",opt);
  637.                             if(n==-1)
  638.                                 break;
  639.                             if(!n && !(sub[i]->misc&SUB_TOUSER)) {
  640.                                 changes=1;
  641.                                 sub[i]->misc|=SUB_TOUSER;
  642.                                 break; }
  643.                             if(n==1 && sub[i]->misc&SUB_TOUSER) {
  644.                                 changes=1;
  645.                                 sub[i]->misc&=~SUB_TOUSER; }
  646.                             break;
  647.                         case 8:
  648.                             n=1;
  649.                             strcpy(opt[0],"Yes");
  650.                             strcpy(opt[1],"No");
  651.                             opt[2][0]=0;
  652.                             SETHELP(WHERE);
  653. /*
  654. Allow Message Quoting:
  655.  
  656. If you want users to be allowed to quote messages on this sub-board, set
  657. this option to Yes.
  658. */
  659.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  660.                                 ,"Allow Message Quoting",opt);
  661.                             if(n==-1)
  662.                                 break;
  663.                             if(!n && !(sub[i]->misc&SUB_QUOTE)) {
  664.                                 changes=1;
  665.                                 sub[i]->misc|=SUB_QUOTE;
  666.                                 break; }
  667.                             if(n==1 && sub[i]->misc&SUB_QUOTE) {
  668.                                 changes=1;
  669.                                 sub[i]->misc&=~SUB_QUOTE; }
  670.                             break;
  671.                         case 9:
  672.                             n=1;
  673.                             strcpy(opt[0],"Yes");
  674.                             strcpy(opt[1],"No");
  675.                             opt[2][0]=0;
  676.                             SETHELP(WHERE);
  677. /*
  678. Operator Messages Automatically Permanent:
  679.  
  680. If you want messages posted by System and Sub-board Operators to be
  681. automatically permanent (non-purgable) for this sub-board, set this
  682. option to Yes.
  683. */
  684.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  685.                                 ,"Permanent Operator Messages",opt);
  686.                             if(n==-1)
  687.                                 break;
  688.                             if(!n && !(sub[i]->misc&SUB_SYSPERM)) {
  689.                                 changes=1;
  690.                                 sub[i]->misc|=SUB_SYSPERM;
  691.                                 break; }
  692.                             if(n==1 && sub[i]->misc&SUB_SYSPERM) {
  693.                                 changes=1;
  694.                                 sub[i]->misc&=~SUB_SYSPERM; }
  695.                             break;
  696.                         case 10:
  697.                             n=1;
  698.                             strcpy(opt[0],"Yes");
  699.                             strcpy(opt[1],"No");
  700.                             strcpy(opt[2],"Private");
  701.                             opt[3][0]=0;
  702.                             SETHELP(WHERE);
  703. /*
  704. Kill Read Messages Automatically:
  705.  
  706. If you want messages that have been read by the intended recipient to
  707. be automatically deleted by SMBUTIL, set this option to Yes or
  708. Private if you want only private messages to be automatically deleted.
  709. */
  710.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  711.                                 ,"Kill Read Messages",opt);
  712.                             if(n==-1)
  713.                                 break;
  714.                             if(!n && !(sub[i]->misc&SUB_KILL)) {
  715.                                 changes=1;
  716.                                 sub[i]->misc|=SUB_KILL;
  717.                                 sub[i]->misc&=~SUB_KILLP;
  718.                                 break; }
  719.                             if(n==1 && sub[i]->misc&(SUB_KILL|SUB_KILLP)) {
  720.                                 changes=1;
  721.                                 sub[i]->misc&=~(SUB_KILL|SUB_KILLP); }
  722.                             if(n==2 && !(sub[i]->misc&SUB_KILLP)) {
  723.                                 changes=1;
  724.                                 sub[i]->misc|=SUB_KILLP;
  725.                                 sub[i]->misc&=~SUB_KILL;
  726.                                 break; }
  727.                             break;
  728. #if 1
  729.                         case 11:
  730.                             n=1;
  731.                             strcpy(opt[0],"Yes");
  732.                             strcpy(opt[1],"No");
  733.                             opt[2][0]=0;
  734.                             SETHELP(WHERE);
  735. /*
  736. Compress Messages with LZH Encoding:
  737.  
  738. If you want all messages in this sub-board to be automatically
  739. compressed via LZH (Lempel/Ziv/Huffman algorithm used in LHarc, LHA,
  740. and other popular compression and archive programs), this option to Yes.
  741.  
  742. Compression will slow down the reading and writing of messages slightly,
  743. but the storage space saved can be as much as 50 percent.
  744.  
  745. Before setting this option to Yes, make sure that all of the SMB
  746. compatible mail programs you use support the LZH translation.
  747. */
  748.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  749.                                 ,"Compress Messages (LZH)",opt);
  750.                             if(n==-1)
  751.                                 break;
  752.                             if(!n && !(sub[i]->misc&SUB_LZH)) {
  753.                                 changes=1;
  754.                                 sub[i]->misc|=SUB_LZH;
  755.                                 break; }
  756.                             if(n==1 && sub[i]->misc&SUB_LZH) {
  757.                                 changes=1;
  758.                                 sub[i]->misc&=~SUB_LZH; }
  759.                             break;
  760. #endif
  761.                             } }
  762.                 break;
  763.             case 13:
  764.                 while(1) {
  765.                     n=0;
  766.                     sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line"
  767.                         ,sub[i]->misc&SUB_NOTAG ? "No":"Yes");
  768.                     sprintf(opt[n++],"%-27.27s%s","Export ASCII Only"
  769.                         ,sub[i]->misc&SUB_ASCII ? "Yes":"No");
  770.                     sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types"
  771.                         ,sub[i]->misc&SUB_GATE ? "Yes":"No");
  772.                     sprintf(opt[n++],"%-27.27s%s","QWK Networked"
  773.                         ,sub[i]->misc&SUB_QNET ? "Yes":"No");
  774.                     sprintf(opt[n++],"QWK Tagline");
  775.                     sprintf(opt[n++],"%-27.27s%s","Internet"
  776.                         ,sub[i]->misc&SUB_INET ? "Yes":"No");
  777.                     sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay"
  778.                         ,sub[i]->misc&SUB_PNET ? "Yes":"No");
  779.                     sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail"
  780.                         ,sub[i]->misc&SUB_FIDO ? "Yes":"No");
  781.                     sprintf(opt[n++],"%-27.27s%s","FidoNet Address"
  782.                         ,faddrtoa(sub[i]->faddr));
  783.                     sprintf(opt[n++],"EchoMail Origin Line");
  784.                     if(!sub[i]->echopath[0])
  785.                         sprintf(str,"%s%s\\",echomail_dir,sub[i]->code);
  786.                     else
  787.                         strcpy(str,sub[i]->echopath);
  788.                     sprintf(opt[n++],"%-27.27s%.40s","EchoMail Directory"
  789.                         ,str);
  790.                     if(!sub[i]->echomail_sem[0])
  791.                         strcpy(str,echomail_sem);
  792.                     else
  793.                         strcpy(str,sub[i]->echomail_sem);
  794.                     sprintf(opt[n++],"%-27.27s%.40s","EchoMail Semaphore File"
  795.                         ,str);
  796.                     opt[n][0]=0;
  797.                     savnum=2;
  798.                     SETHELP(WHERE);
  799. /*
  800. Sub-board Network Options:
  801.  
  802. This menu contains options for the selected sub-board that pertain
  803. specifically to message networking.
  804. */
  805.                     n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0
  806.                         ,"Network Options",opt);
  807.                     if(n==-1)
  808.                         break;
  809.                     savnum=3;
  810.                     switch(n) {
  811.                         case 0:
  812.                             n=0;
  813.                             strcpy(opt[0],"Yes");
  814.                             strcpy(opt[1],"No");
  815.                             opt[2][0]=0;
  816.                             SETHELP(WHERE);
  817. /*
  818. Append Tag/Origin Line to Posts:
  819.  
  820. If you want to disable the automatic addition of a network tagline or
  821. origin line to the bottom of outgoing networked posts from this
  822. sub-board, set this option to No.
  823. */
  824.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  825.                                 ,"Append Tag/Origin Line to Posts",opt);
  826.                             if(n==-1)
  827.                                 break;
  828.                             if(!n && sub[i]->misc&SUB_NOTAG) {
  829.                                 changes=1;
  830.                                 sub[i]->misc&=~SUB_NOTAG;
  831.                                 break; }
  832.                             if(n==1 && !(sub[i]->misc&SUB_NOTAG)) {
  833.                                 changes=1;
  834.                                 sub[i]->misc|=SUB_NOTAG; }
  835.                             break;
  836.                         case 1:
  837.                             n=0;
  838.                             strcpy(opt[0],"Yes");
  839.                             strcpy(opt[1],"No");
  840.                             opt[2][0]=0;
  841.                             SETHELP(WHERE);
  842. /*
  843. Export ASCII Characters Only:
  844.  
  845. If the network that this sub-board is echoed on does not allow extended
  846. ASCII (>127) or control codes (<20, not including CR), set this option
  847. to Yes.
  848. */
  849.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  850.                                 ,"Export ASCII Characters Only",opt);
  851.                             if(n==-1)
  852.                                 break;
  853.                             if(n && sub[i]->misc&SUB_ASCII) {
  854.                                 changes=1;
  855.                                 sub[i]->misc&=~SUB_ASCII;
  856.                                 break; }
  857.                             if(!n && !(sub[i]->misc&SUB_ASCII)) {
  858.                                 changes=1;
  859.                                 sub[i]->misc|=SUB_ASCII; }
  860.                             break;
  861.                         case 2:
  862.                             n=1;
  863.                             strcpy(opt[0],"Yes");
  864.                             strcpy(opt[1],"No");
  865.                             opt[2][0]=0;
  866.                             SETHELP(WHERE);
  867. /*
  868. Gate Between Net Types:
  869.  
  870. If this sub-board is networked using more than one network technology,
  871. and you want messages to be gated between the networks, set this
  872. option to Yes.
  873.  
  874. If this option is set to No, messages imported from one network type
  875. will not be exported to another network type. This is the default and
  876. should be used unless you have specific permission from both networks
  877. to gate this sub-board. Incorrectly gated sub-boards can cause duplicate
  878. messages loops and cross-posted messages.
  879.  
  880. This option does not affect the exporting of messages created on your
  881. BBS.
  882. */
  883.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  884.                                 ,"Gate Between Net Types",opt);
  885.                             if(n==-1)
  886.                                 break;
  887.                             if(!n && !(sub[i]->misc&SUB_GATE)) {
  888.                                 changes=1;
  889.                                 sub[i]->misc|=SUB_GATE;
  890.                                 break; }
  891.                             if(n==1 && sub[i]->misc&SUB_GATE) {
  892.                                 changes=1;
  893.                                 sub[i]->misc&=~SUB_GATE; }
  894.                             break;
  895.                         case 3:
  896.                             n=1;
  897.                             strcpy(opt[0],"Yes");
  898.                             strcpy(opt[1],"No");
  899.                             opt[2][0]=0;
  900.                             SETHELP(WHERE);
  901. /*
  902. Sub-board Networked via QWK Packets:
  903.  
  904. If this sub-board is networked with other BBSs via QWK packets, this
  905. option should be set to Yes. With this option set to Yes, titles of
  906. posts on this sub-board will be limited to the QWK packet limitation of
  907. 25 characters. It also allows the Network restriction to function
  908. properly.
  909. */
  910.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  911.                                 ,"Networked via QWK Packets",opt);
  912.                             if(n==-1)
  913.                                 break;
  914.                             if(!n && !(sub[i]->misc&SUB_QNET)) {
  915.                                 changes=1;
  916.                                 sub[i]->misc|=SUB_QNET;
  917.                                 break; }
  918.                             if(n==1 && sub[i]->misc&SUB_QNET) {
  919.                                 changes=1;
  920.                                 sub[i]->misc&=~SUB_QNET; }
  921.                             break;
  922.                         case 4:
  923.                             SETHELP(WHERE);
  924. /*
  925. Sub-board QWK Network Tagline:
  926.  
  927. If you want to use a different QWK tagline than the configured default
  928. tagline in the Networks configuration, you should enter that tagline
  929. here. If this option is left blank, the default tagline is used.
  930. */
  931.                             uinput(WIN_MID|WIN_SAV,0,0,nulstr,sub[i]->tagline
  932.                                 ,63,K_MSG|K_EDIT);
  933.                             break;
  934.                         case 5:
  935.                             n=1;
  936.                             strcpy(opt[0],"Yes");
  937.                             strcpy(opt[1],"No");
  938.                             opt[2][0]=0;
  939.                             SETHELP(WHERE);
  940. /*
  941. Sub-board Networked via Internet:
  942.  
  943. If this sub-board is networked to the Internet via UUCP, this option
  944. should be set to Yes.
  945.  
  946. It will allow the Network restriction to function properly.
  947. */
  948.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  949.                                 ,"Networked via Internet",opt);
  950.                             if(n==-1)
  951.                                 break;
  952.                             if(!n && !(sub[i]->misc&SUB_INET)) {
  953.                                 changes=1;
  954.                                 sub[i]->misc|=SUB_INET;
  955.                                 break; }
  956.                             if(n==1 && sub[i]->misc&SUB_INET) {
  957.                                 changes=1;
  958.                                 sub[i]->misc&=~SUB_INET; }
  959.                             break;
  960.                         case 6:
  961.                             n=1;
  962.                             strcpy(opt[0],"Yes");
  963.                             strcpy(opt[1],"No");
  964.                             opt[2][0]=0;
  965.                             SETHELP(WHERE);
  966. /*
  967. Sub-board Networked via PostLink or PCRelay:
  968.  
  969. If this sub-board is networked with other BBSs via PostLink or PCRelay,
  970. this option should be set to Yes. With this option set to Yes,
  971. titles of posts on this sub-board will be limited to the UTI
  972. specification limitation of 25 characters. It also allows the Network
  973. restriction to function properly.
  974. */
  975.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  976.                                 ,"Networked via PostLink or PCRelay",opt);
  977.                             if(n==-1)
  978.                                 break;
  979.                             if(!n && !(sub[i]->misc&SUB_PNET)) {
  980.                                 changes=1;
  981.                                 sub[i]->misc|=SUB_PNET;
  982.                                 break; }
  983.                             if(n==1 && sub[i]->misc&SUB_PNET) {
  984.                                 changes=1;
  985.                                 sub[i]->misc&=~SUB_PNET; }
  986.                             break;
  987.                         case 7:
  988.                             n=1;
  989.                             strcpy(opt[0],"Yes");
  990.                             strcpy(opt[1],"No");
  991.                             opt[2][0]=0;
  992.                             SETHELP(WHERE);
  993. /*
  994. Sub-board Networked via FidoNet EchoMail:
  995.  
  996. If this sub-board is part of a FidoNet EchoMail conference, set this
  997. option to Yes.
  998. */
  999.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  1000.                                 ,"Networked via FidoNet EchoMail",opt);
  1001.                             if(n==-1)
  1002.                                 break;
  1003.                             if(!n && !(sub[i]->misc&SUB_FIDO)) {
  1004.                                 changes=1;
  1005.                                 sub[i]->misc|=SUB_FIDO;
  1006.                                 break; }
  1007.                             if(n==1 && sub[i]->misc&SUB_FIDO) {
  1008.                                 changes=1;
  1009.                                 sub[i]->misc&=~SUB_FIDO; }
  1010.                             break;
  1011.                         case 8:
  1012.                             strcpy(str,faddrtoa(sub[i]->faddr));
  1013.                             SETHELP(WHERE);
  1014. /*
  1015. Sub-board FidoNet Address:
  1016.  
  1017. If this sub-board is part of a FidoNet EchoMail conference, this is
  1018. the address used for this sub-board. Format: Zone:Net/Node[.Point]
  1019. */
  1020.                             uinput(WIN_MID|WIN_SAV,0,0,"FidoNet Address"
  1021.                                 ,str,20,K_EDIT);
  1022.                             sub[i]->faddr=atofaddr(str);
  1023.                             break;
  1024.                         case 9:
  1025.                             SETHELP(WHERE);
  1026. /*
  1027. Sub-board FidoNet Origin Line:
  1028.  
  1029. If this sub-board is part of a FidoNet EchoMail conference and you
  1030. want to use an origin line other than the default origin line in the
  1031. Networks configuration, set this value to the desired origin line.
  1032.  
  1033. If this option is blank, the default origin line is used.
  1034. */
  1035.                             uinput(WIN_MID|WIN_SAV,0,0,nulstr,sub[i]->origline
  1036.                                 ,50,K_EDIT);
  1037.                             break;
  1038.                         case 10:
  1039.                             SETHELP(WHERE);
  1040. /*
  1041. Sub-board EchoMail Storage Directory:
  1042.  
  1043. This is the storage directory where FidoNet style (FTS-0001 stored
  1044. message format) messages are imported from and exported to for this
  1045. sub-board. If this option is blank, then the EchoMail Base Directory is
  1046. used with the internal code of this sub-board as the sub-directory where
  1047. the FidoNet messages are stored.
  1048. */
  1049.  
  1050.                             uinput(WIN_MID|WIN_SAV,0,0
  1051.                                 ,"EchoMail Directory"
  1052.                                 ,sub[i]->echopath,50,K_UPPER|K_EDIT);
  1053.                             break;
  1054.                         case 11:
  1055. SETHELP(WHERE);
  1056. /*
  1057. EchoMail Semaphore File:
  1058.  
  1059. This is a filename that will be used as a semaphore (signal) to your
  1060. FidoNet front-end that new EchoMail has been created and the messages
  1061. should be re-scanned.
  1062. */
  1063.                             uinput(WIN_MID|WIN_SAV,0,17,"EchoMail Semaphore"
  1064.                                 ,sub[i]->echomail_sem,50,K_EDIT|K_UPPER);
  1065.                             break; } }
  1066.                 break;
  1067.             case 14:
  1068.                 while(1) {
  1069.                     n=0;
  1070.                     if(sub[i]->qwkconf)
  1071.                         sprintf(str,"Static (%u)",sub[i]->qwkconf);
  1072.                     else
  1073.                         strcpy(str,"Dynamic");
  1074.                     sprintf(opt[n++],"%-27.27s%s","QWK Conference Number"
  1075.                         ,str);
  1076.                     sprintf(opt[n++],"%-27.27s%s","Storage Method"
  1077.                         ,sub[i]->misc&SUB_HYPER ? "Hyper Allocation"
  1078.                         : sub[i]->misc&SUB_FAST ? "Fast Allocation"
  1079.                         : "Self-packing");
  1080.                     if(!sub[i]->data_dir[0])
  1081.                         sprintf(str,"%sSUBS\\",data_dir);
  1082.                     else
  1083.                         strcpy(str,sub[i]->data_dir);
  1084.                     sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str);
  1085.                     opt[n][0]=0;
  1086.                     savnum=2;
  1087.                     SETHELP(WHERE);
  1088. /*
  1089. Sub-board Advanced Options:
  1090.  
  1091. This menu contains options for the selected sub-board that are advanced
  1092. in nature.
  1093. */
  1094.                     n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0
  1095.                         ,"Advanced Options",opt);
  1096.                     if(n==-1)
  1097.                         break;
  1098.                     savnum=3;
  1099.                     switch(n) {
  1100.                         case 0:
  1101.                             SETHELP(WHERE);
  1102. /*
  1103. Sub-board QWK Conference Number:
  1104.  
  1105. If you wish to have the QWK conference number for this sub-board
  1106. automatically generated by Synchronet (based on the group number
  1107. and sub-board number for the user), set this option to Dynamic.
  1108.  
  1109. If you wish to have the same QWK conference number for this sub-board
  1110. regardless of which user access it, set this option to Static
  1111. by entering the conference number you want to use.
  1112. */
  1113.                             if(sub[i]->qwkconf)
  1114.                                 sprintf(str,"%u",sub[i]->qwkconf);
  1115.                             else
  1116.                                 str[0]=0;
  1117.                             if(uinput(WIN_MID|WIN_SAV,0,17
  1118.                                 ,"QWK Conference Number (0=Dynamic)"
  1119.                                 ,str,5,K_EDIT|K_NUMBER)>=0)
  1120.                                 sub[i]->qwkconf=atoi(str);
  1121.                             break;
  1122.                         case 1:
  1123.                             n=0;
  1124.                             strcpy(opt[0],"Hyper Allocation");
  1125.                             strcpy(opt[1],"Fast Allocation");
  1126.                             strcpy(opt[2],"Self-packing");
  1127.                             opt[3][0]=0;
  1128.                             SETHELP(WHERE);
  1129. /*
  1130. Self-Packing is the slowest storage method because it conserves disk
  1131.   space as it imports messages by using deleted message header and data
  1132.   blocks for new messages automatically. If you use this storage method,
  1133.   you will not need to run SMBUTIL P on this message base unless you
  1134.   accumilate a large number of deleted message blocks and wish to free
  1135.   that disk space. You can switch from self-packing to fast allocation
  1136.   storage method and back again as you wish.
  1137. Fast Allocation is faster than self-packing because it does not search
  1138.   for deleted message blocks for new messages. It automatically places
  1139.   all new message blocks at the end of the header and data files. If you
  1140.   use this storage method, you will need to run SMBUTIL P on this
  1141.   message base periodically or it will continually use up disk space.
  1142. Hyper Allocation is the fastest storage method because it does not
  1143.   maintain allocation files at all. Once a message base is setup to use
  1144.   this storage method, it should not be changed without first deleting
  1145.   the message base data files in your DATA\DIRS\SUBS directory for this
  1146.   sub-board. You must use SMBUTIL P as with the fast allocation method.
  1147. */
  1148.                             n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0
  1149.                                 ,"Storage Method",opt);
  1150.                             if(n==-1)
  1151.                                 break;
  1152.                             if(!n && !(sub[i]->misc&SUB_HYPER)) {
  1153.                                 changes=1;
  1154.                                 sub[i]->misc|=SUB_HYPER;
  1155.                                 sub[i]->misc&=~SUB_FAST;
  1156.                                 sub[i]->misc|=SUB_HDRMOD;
  1157.                                 break; }
  1158.                             if(!n)
  1159.                                 break;
  1160.                             if(sub[i]->misc&SUB_HYPER) {    /* Switching from hyper */
  1161.                                 strcpy(opt[0],"Yes");
  1162.                                 strcpy(opt[1],"No, I want to use Hyper Allocation");
  1163.                                 opt[2][0]=0;
  1164.                                 m=0;
  1165.                                 if(ulist(WIN_SAV|WIN_MID,0,0,0,&m,0
  1166.                                     ,"Delete all messages in this sub-board?",opt)!=0)
  1167.                                     break;
  1168.                                 if(sub[i]->data_dir[0])
  1169.                                     sprintf(str,"%s",sub[i]->data_dir);
  1170.                                 else
  1171.                                     sprintf(str,"%sSUBS\\",data_dir);
  1172.                                 sprintf(str2,"%s.*",sub[i]->code);
  1173.                                 delfiles(str,str2); }
  1174.  
  1175.                             if(sub[i]->misc&SUB_HYPER)
  1176.                                 sub[i]->misc|=SUB_HDRMOD;
  1177.                             if(n==1 && !(sub[i]->misc&SUB_FAST)) {
  1178.                                 changes=1;
  1179.                                 sub[i]->misc|=SUB_FAST;
  1180.                                 sub[i]->misc&=~SUB_HYPER;
  1181.                                 break; }
  1182.                             if(n==2 && sub[i]->misc&(SUB_FAST|SUB_HYPER)) {
  1183.                                 changes=1;
  1184.                                 sub[i]->misc&=~(SUB_FAST|SUB_HYPER);
  1185.                                 break; }
  1186.                             break;
  1187.                         case 2:
  1188.                             SETHELP(WHERE);
  1189. /*
  1190. Sub-board Storage Directory:
  1191.  
  1192. Use this if you wish to place the data directory for this sub-board on
  1193. another drive or in another directory besides the default setting.
  1194. */
  1195.                             uinput(WIN_MID|WIN_SAV,0,17,"Directory"
  1196.                                 ,sub[i]->data_dir,50,K_EDIT|K_UPPER);
  1197.                             break; } }
  1198.                 break;
  1199.                 } } }
  1200. }
  1201.