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