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