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