|
|
1.1 root 1: /* scfgmsg.c */
2:
3: /* $Id: scfgmsg.c,v 1.29 2004/09/09 21:26:49 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 2003 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: char *utos(char *str)
39: {
40: static char out[128];
41: int i;
42:
43: for(i=0;str[i] && i<sizeof(out)-1;i++)
44: if(str[i]=='_')
45: out[i]=' ';
46: else
47: out[i]=str[i];
48: out[i]=0;
49: return(out);
50: }
51:
52: char *stou(char *str)
53: {
54: static char out[128];
55: int i;
56:
57: for(i=0;str[i];i++)
58: if(str[i]==' ')
59: out[i]='_';
60: else
61: out[i]=str[i];
62: out[i]=0;
63: return(out);
64: }
65:
66: void clearptrs(int subnum)
67: {
68: char str[256];
69: ushort idx,scancfg;
70: int file,i,gi;
71: long l=0L;
72: glob_t g;
73:
74: uifc.pop("Clearing Pointers...");
75: sprintf(str,"%suser/ptrs/*.ixb",cfg.data_dir);
76:
77: glob(str,0,NULL,&g);
78: for(gi=0;gi<g.gl_pathc;gi++) {
79:
80: if(flength(g.gl_pathv[gi])>=((long)cfg.sub[subnum]->ptridx+1L)*10L) {
81: if((file=nopen(g.gl_pathv[gi],O_WRONLY))==-1) {
82: errormsg(WHERE,ERR_OPEN,g.gl_pathv[gi],O_WRONLY);
83: bail(1);
84: }
85: while(filelength(file)<(long)(cfg.sub[subnum]->ptridx)*10) {
86: lseek(file,0L,SEEK_END);
87: idx=tell(file)/10;
88: for(i=0;i<cfg.total_subs;i++)
89: if(cfg.sub[i]->ptridx==idx)
90: break;
91: write(file,&l,sizeof(l));
92: write(file,&l,sizeof(l));
93: scancfg=0xff;
94: if(i<cfg.total_subs) {
95: if(!(cfg.sub[i]->misc&SUB_NSDEF))
96: scancfg&=~SUB_CFG_NSCAN;
97: if(!(cfg.sub[i]->misc&SUB_SSDEF))
98: scancfg&=~SUB_CFG_SSCAN;
99: } else /* Default to scan OFF for unknown sub */
100: scancfg&=~(SUB_CFG_NSCAN|SUB_CFG_SSCAN);
101: write(file,&scancfg,sizeof(scancfg));
102: }
103: lseek(file,((long)cfg.sub[subnum]->ptridx)*10L,SEEK_SET);
104: write(file,&l,sizeof(l)); /* date set to null */
105: write(file,&l,sizeof(l)); /* date set to null */
106: scancfg=0xff;
107: if(!(cfg.sub[subnum]->misc&SUB_NSDEF))
108: scancfg&=~SUB_CFG_NSCAN;
109: if(!(cfg.sub[subnum]->misc&SUB_SSDEF))
110: scancfg&=~SUB_CFG_SSCAN;
111: write(file,&scancfg,sizeof(scancfg));
112: close(file);
113: }
114: }
115: globfree(&g);
116: uifc.pop(0);
117: }
118:
119: void msgs_cfg()
120: {
121: static int dflt,msgs_dflt,bar;
122: char str[256],str2[256],done=0;
123: char* p;
124: char* tp;
125: char tmp[128];
126: char tmp_code[16];
127: int j,k,l,q,s;
128: int i,file,ptridx,n;
129: long ported;
130: sub_t tmpsub;
131: static grp_t savgrp;
132: FILE* stream;
133:
134: while(1) {
135: for(i=0;i<cfg.total_grps && i<MAX_OPTS;i++)
136: sprintf(opt[i],"%-25s",cfg.grp[i]->lname);
137: opt[i][0]=0;
138: j=WIN_ORG|WIN_ACT|WIN_CHE;
139: if(cfg.total_grps)
140: j|=WIN_DEL|WIN_DELACT|WIN_GET;
141: if(cfg.total_grps<MAX_OPTS)
142: j|=WIN_INS|WIN_INSACT|WIN_XTR;
143: if(savgrp.sname[0])
144: j|=WIN_PUT;
145: SETHELP(WHERE);
146: /*
147: &Message Groups:&
148:
149: This is a listing of message groups for your BBS. Message groups are
150: used to logically separate your message &sub-boards& into groups. Every
151: sub-board belongs to a message group. You must have at least one message
152: group and one sub-board configured.
153:
154: One popular use for message groups is to separate local sub-boards and
155: networked sub-boards. One might have a &Local& message group that contains
156: non-networked sub-boards of various topics and also have a &FidoNet&
157: message group that contains sub-boards that are echoed across FidoNet.
158: Some sysops separate sub-boards into more specific areas such as &Main&,
159: &Technical&, or &Adult&. If you have many sub-boards that have a common
160: subject denominator, you may want to have a separate message group for
161: those sub-boards for a more organized message structure.
162: */
163: i=uifc.list(j,0,0,45,&msgs_dflt,&bar,"Message Groups",opt);
164: uifc.savnum=0;
165: if(i==-1) {
166: j=save_changes(WIN_MID);
167: if(j==-1)
168: continue;
169: if(!j) {
170: write_msgs_cfg(&cfg,backup_level);
171: refresh_cfg(&cfg);
172: }
173: return;
174: }
175: if((i&MSK_ON)==MSK_INS) {
176: i&=MSK_OFF;
177: SETHELP(WHERE);
178: /*
179: &Group Long Name:&
180:
181: This is a description of the message group which is displayed when a
182: user of the system uses the &/*& command from the main menu.
183: */
184: strcpy(str,"Main");
185: if(uifc.input(WIN_MID|WIN_SAV,0,0,"Group Long Name",str,LEN_GLNAME
186: ,K_EDIT)<1)
187: continue;
188: SETHELP(WHERE);
189: /*
190: &Group Short Name:&
191:
192: This is a short description of the message group which is used for the
193: main menu and reading message prompts.
194: */
195: sprintf(str2,"%.*s",LEN_GSNAME,str);
196: if(uifc.input(WIN_MID,0,0,"Group Short Name",str2,LEN_GSNAME,K_EDIT)<1)
197: continue;
198: if((cfg.grp=(grp_t **)REALLOC(cfg.grp,sizeof(grp_t *)*(cfg.total_grps+1)))==NULL) {
199: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_grps+1);
200: cfg.total_grps=0;
201: bail(1);
202: continue; }
203:
204: if(cfg.total_grps) { /* was cfg.total_subs (?) */
205: for(j=cfg.total_grps;j>i;j--) /* insert above */
206: cfg.grp[j]=cfg.grp[j-1];
207: for(j=0;j<cfg.total_subs;j++) /* move sub group numbers */
208: if(cfg.sub[j]->grp>=i)
209: cfg.sub[j]->grp++; }
210:
211: if((cfg.grp[i]=(grp_t *)MALLOC(sizeof(grp_t)))==NULL) {
212: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(grp_t));
213: continue; }
214: memset((grp_t *)cfg.grp[i],0,sizeof(grp_t));
215: strcpy(cfg.grp[i]->lname,str);
216: strcpy(cfg.grp[i]->sname,str2);
217: cfg.total_grps++;
218: uifc.changes=1;
219: continue; }
220: if((i&MSK_ON)==MSK_DEL) {
221: i&=MSK_OFF;
222: SETHELP(WHERE);
223: /*
224: &Delete All Data in Group:&
225:
226: If you wish to delete the messages in all the sub-boards in this group,
227: select &Yes&.
228: */
229: j=1;
230: strcpy(opt[0],"Yes");
231: strcpy(opt[1],"No");
232: opt[2][0]=0;
233: j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Delete All Data in Group",opt);
234: if(j==-1)
235: continue;
236: if(j==0)
237: for(j=0;j<cfg.total_subs;j++)
238: if(cfg.sub[j]->grp==i) {
239: sprintf(str,"%s%s.s*"
240: ,cfg.grp[cfg.sub[j]->grp]->code_prefix
241: ,cfg.sub[j]->code_suffix);
242: strlwr(str);
243: if(!cfg.sub[j]->data_dir[0])
244: sprintf(tmp,"%ssubs/",cfg.data_dir);
245: else
246: strcpy(tmp,cfg.sub[j]->data_dir);
247: delfiles(tmp,str);
248: clearptrs(j); }
249: FREE(cfg.grp[i]);
250: for(j=0;j<cfg.total_subs;) {
251: if(cfg.sub[j]->grp==i) { /* delete subs of this group */
252: FREE(cfg.sub[j]);
253: cfg.total_subs--;
254: k=j;
255: while(k<cfg.total_subs) { /* move all subs down */
256: cfg.sub[k]=cfg.sub[k+1];
257: for(q=0;q<cfg.total_qhubs;q++)
258: for(s=0;s<cfg.qhub[q]->subs;s++)
259: if(cfg.qhub[q]->sub[s]==k)
260: cfg.qhub[q]->sub[s]--;
261: k++; } }
262: else j++; }
263: for(j=0;j<cfg.total_subs;j++) /* move sub group numbers down */
264: if(cfg.sub[j]->grp>i)
265: cfg.sub[j]->grp--;
266: cfg.total_grps--;
267: while(i<cfg.total_grps) {
268: cfg.grp[i]=cfg.grp[i+1];
269: i++; }
270: uifc.changes=1;
271: continue; }
272: if((i&MSK_ON)==MSK_GET) {
273: i&=MSK_OFF;
274: savgrp=*cfg.grp[i];
275: continue; }
276: if((i&MSK_ON)==MSK_PUT) {
277: i&=MSK_OFF;
278: *cfg.grp[i]=savgrp;
279: uifc.changes=1;
280: continue; }
281: done=0;
282: while(!done) {
283: j=0;
284: sprintf(opt[j++],"%-27.27s%s","Long Name",cfg.grp[i]->lname);
285: sprintf(opt[j++],"%-27.27s%s","Short Name",cfg.grp[i]->sname);
286: sprintf(opt[j++],"%-27.27s%s","Internal Code Prefix",cfg.grp[i]->code_prefix);
287: sprintf(opt[j++],"%-27.27s%.40s","Access Requirements"
288: ,cfg.grp[i]->arstr);
289: strcpy(opt[j++],"Clone Options");
290: strcpy(opt[j++],"Export Areas...");
291: strcpy(opt[j++],"Import Areas...");
292: strcpy(opt[j++],"Message Sub-boards...");
293: opt[j][0]=0;
294: sprintf(str,"%s Group",cfg.grp[i]->sname);
295: uifc.savnum=0;
296: SETHELP(WHERE);
297: /*
298: &Message Group Configuration:&
299:
300: This menu allows you to configure the security requirements for access
301: to this message group. You can also add, delete, and configure the
302: sub-boards of this group by selecting the &Messages Sub-boards...& option.
303: */
304: switch(uifc.list(WIN_ACT,6,4,60,&dflt,0,str,opt)) {
305: case -1:
306: done=1;
307: break;
308: case 0:
309: SETHELP(WHERE);
310: /*
311: &Group Long Name:&
312:
313: This is a description of the message group which is displayed when a
314: user of the system uses the &/*& command from the main menu.
315: */
316: strcpy(str,cfg.grp[i]->lname); /* save incase setting to null */
317: if(!uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings"
318: ,cfg.grp[i]->lname,LEN_GLNAME,K_EDIT))
319: strcpy(cfg.grp[i]->lname,str);
320: break;
321: case 1:
322: SETHELP(WHERE);
323: /*
324: &Group Short Name:&
325:
326: This is a short description of the message group which is used for
327: main menu and reading messages prompts.
328: */
329: uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts"
330: ,cfg.grp[i]->sname,LEN_GSNAME,K_EDIT);
331: break;
332: case 2:
333: SETHELP(WHERE);
334: /*
335: `Internal Code Prefix:`
336:
337: This is an `optional` code prefix used to help generate unique internal
338: codes for the sub-boards in this message group. If this option
339: is used, sub-board internal codes will be made up of this prefix and the
340: specified code suffix for each sub-board.
341: */
342: uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Prefix"
343: ,cfg.grp[i]->code_prefix,LEN_CODE,K_EDIT|K_UPPER);
344: break;
345: case 3:
346: sprintf(str,"%s Group",cfg.grp[i]->sname);
347: getar(str,cfg.grp[i]->arstr);
348: break;
349: case 4: /* Clone Options */
350: j=0;
351: strcpy(opt[0],"Yes");
352: strcpy(opt[1],"No");
353: opt[2][0]=0;
354: SETHELP(WHERE);
355: /*
356: &Clone Sub-board Options:&
357:
358: If you want to clone the options of the first sub-board of this group
359: into all sub-boards of this group, select &Yes&.
360:
361: The options cloned are posting requirements, reading requirements,
362: operator requirments, moderated user requirments, toggle options,
363: network options (including EchoMail origin line, EchoMail address,
364: and QWK Network tagline), maximum number of messages, maximum number
365: of CRCs, maximum age of messages, storage method, and data directory.
366: */
367: j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
368: ,"Clone Options of First Sub-board into All of Group",opt);
369: if(j==0) {
370: k=-1;
371: for(j=0;j<cfg.total_subs;j++)
372: if(cfg.sub[j]->grp==i) {
373: if(k==-1)
374: k=j;
375: else {
376: uifc.changes=1;
377: cfg.sub[j]->misc=(cfg.sub[k]->misc|SUB_HDRMOD);
378: strcpy(cfg.sub[j]->post_arstr,cfg.sub[k]->post_arstr);
379: strcpy(cfg.sub[j]->read_arstr,cfg.sub[k]->read_arstr);
380: strcpy(cfg.sub[j]->op_arstr,cfg.sub[k]->op_arstr);
381: strcpy(cfg.sub[j]->mod_arstr,cfg.sub[k]->mod_arstr);
382: strcpy(cfg.sub[j]->origline,cfg.sub[k]->origline);
383: strcpy(cfg.sub[j]->tagline,cfg.sub[k]->tagline);
384: strcpy(cfg.sub[j]->data_dir,cfg.sub[k]->data_dir);
385: strcpy(cfg.sub[j]->post_sem,cfg.sub[k]->post_sem);
386: cfg.sub[j]->maxmsgs=cfg.sub[k]->maxmsgs;
387: cfg.sub[j]->maxcrcs=cfg.sub[k]->maxcrcs;
388: cfg.sub[j]->maxage=cfg.sub[k]->maxage;
389:
390: cfg.sub[j]->faddr=cfg.sub[k]->faddr; } } }
391: break;
392: case 5:
393: k=0;
394: ported=0;
395: q=uifc.changes;
396: strcpy(opt[k++],"SUBS.TXT (Synchronet)");
397: strcpy(opt[k++],"AREAS.BBS (MSG)");
398: strcpy(opt[k++],"AREAS.BBS (SBBSecho)");
399: strcpy(opt[k++],"FIDONET.NA (Fido)");
400: opt[k][0]=0;
401: SETHELP(WHERE);
402: /*
403: &Export Area File Format:&
404:
405: This menu allows you to choose the format of the area file you wish to
406: export the current message group into.
407: */
408: k=0;
409: k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
410: ,"Export Area File Format",opt);
411: if(k==-1)
412: break;
413: if(k==0)
414: sprintf(str,"%sSUBS.TXT",cfg.ctrl_dir);
415: else if(k==1)
416: sprintf(str,"AREAS.BBS");
417: else if(k==2)
418: sprintf(str,"%sAREAS.BBS",cfg.data_dir);
419: else if(k==3)
420: sprintf(str,"FIDONET.NA");
421: if(k && k<3)
422: if(uifc.input(WIN_MID|WIN_SAV,0,0,"Uplinks"
423: ,str2,sizeof(str2)-1,0)<=0) {
424: uifc.changes=q;
425: break; }
426: if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
427: ,str,sizeof(str)-1,K_EDIT)<=0) {
428: uifc.changes=q;
429: break; }
430: if(fexist(str)) {
431: strcpy(opt[0],"Overwrite");
432: strcpy(opt[1],"Append");
433: opt[2][0]=0;
434: j=0;
435: j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
436: ,"File Exists",opt);
437: if(j==-1)
438: break;
439: if(j==0) j=O_WRONLY|O_TRUNC;
440: else j=O_WRONLY|O_APPEND; }
441: else
442: j=O_WRONLY|O_CREAT;
443: if((stream=fnopen(&file,str,j))==NULL) {
444: sprintf(str,"Open Failure: %d (%s)"
445: ,errno,strerror(errno));
446: uifc.msg(str);
447: uifc.changes=q;
448: break;
449: }
450: uifc.pop("Exporting Areas...");
451: for(j=0;j<cfg.total_subs;j++) {
452: if(cfg.sub[j]->grp!=i)
453: continue;
454: ported++;
455: if(k==1) { /* AREAS.BBS *.MSG */
456: sprintf(str,"%s%s%s/"
457: ,cfg.echomail_dir
458: ,cfg.grp[cfg.sub[j]->grp]->code_prefix
459: ,cfg.sub[j]->code_suffix);
460: fprintf(stream,"%-30s %-20s %s\r\n"
461: ,str,stou(cfg.sub[j]->sname),str2);
462: continue; }
463: if(k==2) { /* AREAS.BBS SBBSecho */
464: fprintf(stream,"%s%-30s %-20s %s\r\n"
465: ,cfg.grp[cfg.sub[j]->grp]->code_prefix
466: ,cfg.sub[j]->code_suffix
467: ,stou(cfg.sub[j]->sname)
468: ,str2);
469: continue; }
470: if(k==3) { /* FIDONET.NA */
471: fprintf(stream,"%-20s %s\r\n"
472: ,stou(cfg.sub[j]->sname),cfg.sub[j]->lname);
473: continue; }
474: fprintf(stream,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n"
475: "%s\r\n%s\r\n%s\r\n"
476: ,cfg.sub[j]->lname
477: ,cfg.sub[j]->sname
478: ,cfg.sub[j]->qwkname
479: ,cfg.sub[j]->code_suffix
480: ,cfg.sub[j]->data_dir
481: ,cfg.sub[j]->arstr
482: ,cfg.sub[j]->read_arstr
483: ,cfg.sub[j]->post_arstr
484: ,cfg.sub[j]->op_arstr
485: );
486: fprintf(stream,"%lX\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n"
487: ,cfg.sub[j]->misc
488: ,cfg.sub[j]->tagline
489: ,cfg.sub[j]->origline
490: ,cfg.sub[j]->post_sem
491: ,cfg.sub[j]->newsgroup
492: ,smb_faddrtoa(&cfg.sub[j]->faddr,tmp)
493: );
494: fprintf(stream,"%lu\r\n%lu\r\n%u\r\n%u\r\n%s\r\n"
495: ,cfg.sub[j]->maxmsgs
496: ,cfg.sub[j]->maxcrcs
497: ,cfg.sub[j]->maxage
498: ,cfg.sub[j]->ptridx
499: ,cfg.sub[j]->mod_arstr
500: );
501: fprintf(stream,"***END-OF-SUB***\r\n\r\n"); }
502: fclose(stream);
503: uifc.pop(0);
504: sprintf(str,"%lu Message Areas Exported Successfully",ported);
505: uifc.msg(str);
506: uifc.changes=q;
507: break;
508: case 6:
509: ported=0;
510: k=0;
511: strcpy(opt[k++],"SUBS.TXT (Synchronet)");
512: strcpy(opt[k++],"AREAS.BBS (Generic)");
513: strcpy(opt[k++],"AREAS.BBS (SBBSecho)");
514: strcpy(opt[k++],"FIDONET.NA (Fido)");
515: opt[k][0]=0;
516: SETHELP(WHERE);
517: /*
518: &Import Area File Format:&
519:
520: This menu allows you to choose the format of the area file you wish to
521: import into the current message group.
522: */
523: k=0;
524: k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
525: ,"Import Area File Format",opt);
526: if(k==-1)
527: break;
528: if(k==0)
529: sprintf(str,"%sSUBS.TXT",cfg.ctrl_dir);
530: else if(k==1)
531: sprintf(str,"AREAS.BBS");
532: else if(k==2)
533: sprintf(str,"%sAREAS.BBS",cfg.data_dir);
534: else if(k==3)
535: sprintf(str,"FIDONET.NA");
536: if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
537: ,str,sizeof(str)-1,K_EDIT)<=0)
538: break;
539: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
540: uifc.msg("Open Failure");
541: break; }
542: uifc.pop("Importing Areas...");
543: while(!feof(stream)) {
544: if(!fgets(str,sizeof(str),stream)) break;
545: truncsp(str);
546: if(!str[0])
547: continue;
548: if(k) {
549: p=str;
550: while(*p && *p<=' ') p++;
551: if(!*p || *p==';')
552: continue;
553: memset(&tmpsub,0,sizeof(sub_t));
554: tmpsub.misc|=
555: (SUB_FIDO|SUB_NAME|SUB_TOUSER|SUB_QUOTE|SUB_HYPER);
556: if(k==1) { /* AREAS.BBS Generic/*.MSG */
557: p=str;
558: SKIP_WHITESPACE(p); /* Find path */
559: FIND_WHITESPACE(p); /* Skip path */
560: SKIP_WHITESPACE(p); /* Find tag */
561: truncstr(p," \t"); /* Truncate tag */
562: SAFECOPY(tmp_code,p); /* Copy tag to internal code */
563: SAFECOPY(tmpsub.lname,utos(p));
564: SAFECOPY(tmpsub.sname,tmpsub.lname);
565: SAFECOPY(tmpsub.qwkname,tmpsub.qwkname);
566: }
567: else if(k==2) { /* AREAS.BBS SBBSecho */
568: p=str;
569: SKIP_WHITESPACE(p); /* Find internal code */
570: tp=p;
571: FIND_WHITESPACE(tp);
572: *tp=0; /* Truncate internal code */
573: SAFECOPY(tmp_code,p); /* Copy internal code suffix */
574: p=tp+1;
575: SKIP_WHITESPACE(p); /* Find echo tag */
576: truncstr(p," \t"); /* Truncate tag */
577: SAFECOPY(tmpsub.lname,utos(p));
578: SAFECOPY(tmpsub.sname,tmpsub.lname);
579: SAFECOPY(tmpsub.qwkname,tmpsub.sname);
580: }
581: else if(k==3) { /* FIDONET.NA */
582: p=str;
583: SKIP_WHITESPACE(p); /* Find echo tag */
584: tp=p;
585: FIND_WHITESPACE(tp); /* Find end of tag */
586: *tp=0; /* Truncate echo tag */
587: SAFECOPY(tmp_code,p); /* Copy tag to internal code suffix */
588: SAFECOPY(tmpsub.sname,utos(p)); /* ... to short name, converting underscores to spaces */
589: SAFECOPY(tmpsub.qwkname,tmpsub.sname); /* ... to QWK name .... */
590: p=tp+1;
591: SKIP_WHITESPACE(p); /* Find description */
592: SAFECOPY(tmpsub.lname,p); /* Copy description to long name */
593: }
594: }
595: else {
596: memset(&tmpsub,0,sizeof(sub_t));
597: tmpsub.grp=i;
598: sprintf(tmpsub.lname,"%.*s",LEN_SLNAME,str);
599: if(!fgets(str,128,stream)) break;
600: truncsp(str);
601: sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,str);
602: if(!fgets(str,128,stream)) break;
603: truncsp(str);
604: sprintf(tmpsub.qwkname,"%.*s",10,str);
605: if(!fgets(str,128,stream)) break;
606: truncsp(str);
607: SAFECOPY(tmp_code,str);
608: if(!fgets(str,128,stream)) break;
609: truncsp(str);
610: sprintf(tmpsub.data_dir,"%.*s",LEN_DIR,str);
611: if(!fgets(str,128,stream)) break;
612: truncsp(str);
613: sprintf(tmpsub.arstr,"%.*s",LEN_ARSTR,str);
614: if(!fgets(str,128,stream)) break;
615: truncsp(str);
616: sprintf(tmpsub.read_arstr,"%.*s",LEN_ARSTR,str);
617: if(!fgets(str,128,stream)) break;
618: truncsp(str);
619: sprintf(tmpsub.post_arstr,"%.*s",LEN_ARSTR,str);
620: if(!fgets(str,128,stream)) break;
621: truncsp(str);
622: sprintf(tmpsub.op_arstr,"%.*s",LEN_ARSTR,str);
623: if(!fgets(str,128,stream)) break;
624: truncsp(str);
625: tmpsub.misc=ahtoul(str);
626: if(!fgets(str,128,stream)) break;
627: truncsp(str);
628: sprintf(tmpsub.tagline,"%.*s",80,str);
629: if(!fgets(str,128,stream)) break;
630: truncsp(str);
631: sprintf(tmpsub.origline,"%.*s",50,str);
632: if(!fgets(str,128,stream)) break;
633: truncsp(str);
634: sprintf(tmpsub.post_sem,"%.*s",LEN_DIR,str);
635: if(!fgets(str,128,stream)) break;
636: truncsp(str);
637: SAFECOPY(tmpsub.newsgroup,str);
638: if(!fgets(str,128,stream)) break;
639: truncsp(str);
640: tmpsub.faddr=atofaddr(str);
641: if(!fgets(str,128,stream)) break;
642: truncsp(str);
643: tmpsub.maxmsgs=atol(str);
644: if(!fgets(str,128,stream)) break;
645: truncsp(str);
646: tmpsub.maxcrcs=atol(str);
647: if(!fgets(str,128,stream)) break;
648: truncsp(str);
649: tmpsub.maxage=atoi(str);
650: if(!fgets(str,128,stream)) break;
651: truncsp(str);
652: tmpsub.ptridx=atoi(str);
653: if(!fgets(str,128,stream)) break;
654: truncsp(str);
655: sprintf(tmpsub.mod_arstr,"%.*s",LEN_ARSTR,str);
656:
657: while(!feof(stream)
658: && strcmp(str,"***END-OF-SUB***")) {
659: if(!fgets(str,128,stream)) break;
660: truncsp(str);
661: }
662: }
663:
664: p=tmp_code;
665: l=strlen(cfg.grp[i]->code_prefix);
666: if(l && strnicmp(p,cfg.grp[i]->code_prefix,l)==0 && strlen(p)!=l)
667: p+=l; /* Skip code prefix, if supplied */
668: prep_code(p); /* Strip invalid chars */
669: SAFECOPY(tmpsub.code_suffix,p); /* THEN truncate to valid length */
670:
671: truncsp(tmpsub.sname);
672: truncsp(tmpsub.lname);
673: truncsp(tmpsub.qwkname);
674:
675: if(tmpsub.code_suffix[0]==0
676: || tmpsub.sname[0]==0
677: || tmpsub.lname[0]==0
678: || tmpsub.qwkname[0]==0)
679: continue;
680:
681: for(j=0;j<cfg.total_subs;j++) {
682: if(cfg.sub[j]->grp!=i)
683: continue;
684: if(!stricmp(cfg.sub[j]->code_suffix,tmpsub.code_suffix))
685: break; }
686: if(j==cfg.total_subs) {
687:
688: if((cfg.sub=(sub_t **)REALLOC(cfg.sub
689: ,sizeof(sub_t *)*(cfg.total_subs+1)))==NULL) {
690: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_subs+1);
691: cfg.total_subs=0;
692: bail(1);
693: break;
694: }
695:
696: if((cfg.sub[j]=(sub_t *)MALLOC(sizeof(sub_t)))
697: ==NULL) {
698: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t));
699: break;
700: }
701: memset(cfg.sub[j],0,sizeof(sub_t)); }
702: if(!k) {
703: ptridx=cfg.sub[j]->ptridx; /* save original ptridx */
704: memcpy(cfg.sub[j],&tmpsub,sizeof(sub_t));
705: cfg.sub[j]->ptridx=ptridx; /* restore original ptridx */
706: } else {
707: cfg.sub[j]->grp=i;
708: if(cfg.total_faddrs)
709: cfg.sub[j]->faddr=cfg.faddr[0];
710: strcpy(cfg.sub[j]->code_suffix,tmpsub.code_suffix);
711: strcpy(cfg.sub[j]->sname,tmpsub.sname);
712: strcpy(cfg.sub[j]->lname,tmpsub.lname);
713: strcpy(cfg.sub[j]->qwkname,tmpsub.qwkname);
714: strcpy(cfg.sub[j]->data_dir,tmpsub.data_dir);
715: if(j==cfg.total_subs)
716: cfg.sub[j]->maxmsgs=1000;
717: }
718: if(j==cfg.total_subs) { /* adding new sub-board */
719: for(ptridx=0;ptridx<USHRT_MAX;ptridx++) {
720: for(n=0;n<cfg.total_subs;n++)
721: if(cfg.sub[n]->ptridx==ptridx)
722: break;
723: if(n==cfg.total_subs)
724: break;
725: }
726: cfg.sub[j]->ptridx=ptridx; /* use new ptridx */
727: cfg.sub[j]->misc=tmpsub.misc;
728: cfg.total_subs++;
729: }
730: uifc.changes=1;
731: ported++;
732: }
733: fclose(stream);
734: uifc.pop(0);
735: sprintf(str,"%lu Message Areas Imported Successfully",ported);
736: uifc.msg(str);
737: break;
738:
739: case 7:
740: sub_cfg(i);
741: break; } } }
742:
743: }
744:
745: void msg_opts()
746: {
747: char str[128],*p;
748: static int msg_dflt;
749: int i,j;
750:
751: while(1) {
752: i=0;
753: sprintf(opt[i++],"%-33.33s%s"
754: ,"BBS ID for QWK Packets",cfg.sys_id);
755: sprintf(opt[i++],"%-33.33s%s"
756: ,"Local Time Zone",smb_zonestr(cfg.sys_timezone,NULL));
757: sprintf(opt[i++],"%-33.33s%u seconds"
758: ,"Maximum Retry Time",cfg.smb_retry_time);
759: if(cfg.max_qwkmsgs)
760: sprintf(str,"%lu",cfg.max_qwkmsgs);
761: else
762: sprintf(str,"Unlimited");
763: sprintf(opt[i++],"%-33.33s%s"
764: ,"Maximum QWK Messages",str);
765: sprintf(opt[i++],"%-33.33s%s","Pre-pack QWK Requirements",cfg.preqwk_arstr);
766: if(cfg.mail_maxage)
767: sprintf(str,"Enabled (%u days old)",cfg.mail_maxage);
768: else
769: strcpy(str,"Disabled");
770: sprintf(opt[i++],"%-33.33s%s","Purge E-mail by Age",str);
771: if(cfg.sys_misc&SM_DELEMAIL)
772: strcpy(str,"Immediately");
773: else
774: strcpy(str,"Daily");
775: sprintf(opt[i++],"%-33.33s%s","Purge Deleted E-mail",str);
776: if(cfg.mail_maxcrcs)
777: sprintf(str,"Enabled (%lu mail CRCs)",cfg.mail_maxcrcs);
778: else
779: strcpy(str,"Disabled");
780: sprintf(opt[i++],"%-33.33s%s","Duplicate E-mail Checking",str);
781: sprintf(opt[i++],"%-33.33s%s","Allow Anonymous E-mail"
782: ,cfg.sys_misc&SM_ANON_EM ? "Yes" : "No");
783: sprintf(opt[i++],"%-33.33s%s","Allow Quoting in E-mail"
784: ,cfg.sys_misc&SM_QUOTE_EM ? "Yes" : "No");
785: sprintf(opt[i++],"%-33.33s%s","Allow Uploads in E-mail"
786: ,cfg.sys_misc&SM_FILE_EM ? "Yes" : "No");
787: sprintf(opt[i++],"%-33.33s%s","Allow Forwarding to NetMail"
788: ,cfg.sys_misc&SM_FWDTONET ? "Yes" : "No");
789: sprintf(opt[i++],"%-33.33s%s","Kill Read E-mail"
790: ,cfg.sys_misc&SM_DELREADM ? "Yes" : "No");
791: sprintf(opt[i++],"%-33.33s%s","Receive E-mail by Real Name"
792: ,cfg.msg_misc&MM_REALNAME ? "Yes" : "No");
793: sprintf(opt[i++],"%-33.33s%s","Users Can View Deleted Messages"
794: ,cfg.sys_misc&SM_USRVDELM ? "Yes" : cfg.sys_misc&SM_SYSVDELM
795: ? "Sysops Only":"No");
796: strcpy(opt[i++],"Extra Attribute Codes...");
797: opt[i][0]=0;
798: uifc.savnum=0;
799: SETHELP(WHERE);
800: /*
801: &Message Options:&
802:
803: This is a menu of system-wide message related options. Messages include
804: E-mail and public posts (on sub-boards).
805: */
806:
807: switch(uifc.list(WIN_ORG|WIN_ACT|WIN_MID|WIN_CHE,0,0,72,&msg_dflt,0
808: ,"Message Options",opt)) {
809: case -1:
810: i=save_changes(WIN_MID);
811: if(i==-1)
812: continue;
813: if(!i) {
814: cfg.new_install=new_install;
815: write_msgs_cfg(&cfg,backup_level);
816: write_main_cfg(&cfg,backup_level);
817: refresh_cfg(&cfg);
818: }
819: return;
820: case 0:
821: strcpy(str,cfg.sys_id);
822: SETHELP(WHERE);
823: /*
824: &BBS ID for QWK Packets:&
825:
826: This is a short system ID for your BBS that is used for QWK packets.
827: It should be an abbreviation of your BBS name or other related string.
828: This ID will be used for your outgoing and incoming QWK packets. If
829: you plan on networking via QWK packets with another Synchronet BBS,
830: this ID should not begin with a number. The maximum length of the ID
831: is eight characters and cannot contain spaces or other invalid DOS
832: filename characters. In a QWK packet network, each system must have
833: a unique QWK system ID.
834: */
835:
836: uifc.input(WIN_MID|WIN_SAV,0,0,"BBS ID for QWK Packets"
837: ,str,LEN_QWKID,K_EDIT|K_UPPER);
838: if(code_ok(str))
839: strcpy(cfg.sys_id,str);
840: else
841: uifc.msg("Invalid ID");
842: break;
843: case 1:
844: strcpy(opt[0],"Yes");
845: strcpy(opt[1],"No");
846: opt[2][0]=0;
847: i=0;
848: SETHELP(WHERE);
849: /*
850: &United States Time Zone:&
851:
852: If your local time zone is the United States, select &Yes&.
853: */
854:
855: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
856: ,"United States Time Zone",opt);
857: if(i==-1)
858: break;
859: if(i==0) {
860: strcpy(opt[i++],"Atlantic");
861: strcpy(opt[i++],"Eastern");
862: strcpy(opt[i++],"Central");
863: strcpy(opt[i++],"Mountain");
864: strcpy(opt[i++],"Pacific");
865: strcpy(opt[i++],"Yukon");
866: strcpy(opt[i++],"Hawaii/Alaska");
867: strcpy(opt[i++],"Bering");
868: opt[i][0]=0;
869: i=0;
870: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
871: ,"Time Zone",opt);
872: if(i==-1)
873: break;
874: uifc.changes=1;
875: switch(i) {
876: case 0:
877: cfg.sys_timezone=AST;
878: break;
879: case 1:
880: cfg.sys_timezone=EST;
881: break;
882: case 2:
883: cfg.sys_timezone=CST;
884: break;
885: case 3:
886: cfg.sys_timezone=MST;
887: break;
888: case 4:
889: cfg.sys_timezone=PST;
890: break;
891: case 5:
892: cfg.sys_timezone=YST;
893: break;
894: case 6:
895: cfg.sys_timezone=HST;
896: break;
897: case 7:
898: cfg.sys_timezone=BST;
899: break; }
900: strcpy(opt[0],"Yes");
901: strcpy(opt[1],"No");
902: opt[2][0]=0;
903: i=1;
904: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
905: ,"Daylight Savings",opt);
906: if(i==-1)
907: break;
908: if(!i)
909: cfg.sys_timezone|=DAYLIGHT;
910: break; }
911: i=0;
912: strcpy(opt[i++],"Midway");
913: strcpy(opt[i++],"Vancouver");
914: strcpy(opt[i++],"Edmonton");
915: strcpy(opt[i++],"Winnipeg");
916: strcpy(opt[i++],"Bogota");
917: strcpy(opt[i++],"Caracas");
918: strcpy(opt[i++],"Rio de Janeiro");
919: strcpy(opt[i++],"Fernando de Noronha");
920: strcpy(opt[i++],"Azores");
921: strcpy(opt[i++],"London");
922: strcpy(opt[i++],"Berlin");
923: strcpy(opt[i++],"Athens");
924: strcpy(opt[i++],"Moscow");
925: strcpy(opt[i++],"Dubai");
926: strcpy(opt[i++],"Kabul");
927: strcpy(opt[i++],"Karachi");
928: strcpy(opt[i++],"Bombay");
929: strcpy(opt[i++],"Kathmandu");
930: strcpy(opt[i++],"Dhaka");
931: strcpy(opt[i++],"Bangkok");
932: strcpy(opt[i++],"Hong Kong");
933: strcpy(opt[i++],"Tokyo");
934: strcpy(opt[i++],"Sydney");
935: strcpy(opt[i++],"Noumea");
936: strcpy(opt[i++],"Wellington");
937: strcpy(opt[i++],"Other...");
938: opt[i][0]=0;
939: i=0;
940: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
941: ,"Time Zone",opt);
942: if(i==-1)
943: break;
944: uifc.changes=1;
945: switch(i) {
946: case 0:
947: cfg.sys_timezone=MID;
948: break;
949: case 1:
950: cfg.sys_timezone=VAN;
951: break;
952: case 2:
953: cfg.sys_timezone=EDM;
954: break;
955: case 3:
956: cfg.sys_timezone=WIN;
957: break;
958: case 4:
959: cfg.sys_timezone=BOG;
960: break;
961: case 5:
962: cfg.sys_timezone=CAR;
963: break;
964: case 6:
965: cfg.sys_timezone=RIO;
966: break;
967: case 7:
968: cfg.sys_timezone=FER;
969: break;
970: case 8:
971: cfg.sys_timezone=AZO;
972: break;
973: case 9:
974: cfg.sys_timezone=LON;
975: break;
976: case 10:
977: cfg.sys_timezone=BER;
978: break;
979: case 11:
980: cfg.sys_timezone=ATH;
981: break;
982: case 12:
983: cfg.sys_timezone=MOS;
984: break;
985: case 13:
986: cfg.sys_timezone=DUB;
987: break;
988: case 14:
989: cfg.sys_timezone=KAB;
990: break;
991: case 15:
992: cfg.sys_timezone=KAR;
993: break;
994: case 16:
995: cfg.sys_timezone=BOM;
996: break;
997: case 17:
998: cfg.sys_timezone=KAT;
999: break;
1000: case 18:
1001: cfg.sys_timezone=DHA;
1002: break;
1003: case 19:
1004: cfg.sys_timezone=BAN;
1005: break;
1006: case 20:
1007: cfg.sys_timezone=HON;
1008: break;
1009: case 21:
1010: cfg.sys_timezone=TOK;
1011: break;
1012: case 22:
1013: cfg.sys_timezone=SYD;
1014: break;
1015: case 23:
1016: cfg.sys_timezone=NOU;
1017: break;
1018: case 24:
1019: cfg.sys_timezone=WEL;
1020: break;
1021: default:
1022: if(cfg.sys_timezone>720 || cfg.sys_timezone<-720)
1023: cfg.sys_timezone=0;
1024: sprintf(str,"%02d:%02d"
1025: ,cfg.sys_timezone/60,cfg.sys_timezone<0
1026: ? (-cfg.sys_timezone)%60 : cfg.sys_timezone%60);
1027: uifc.input(WIN_MID|WIN_SAV,0,0
1028: ,"Time (HH:MM) East (+) or West (-) of Universal "
1029: "Time"
1030: ,str,6,K_EDIT|K_UPPER);
1031: cfg.sys_timezone=atoi(str)*60;
1032: p=strchr(str,':');
1033: if(p) {
1034: if(cfg.sys_timezone<0)
1035: cfg.sys_timezone-=atoi(p+1);
1036: else
1037: cfg.sys_timezone+=atoi(p+1); }
1038: break;
1039: }
1040: break;
1041: case 2:
1042: SETHELP(WHERE);
1043: /*
1044: &Maximum Message Base Retry Time:&
1045:
1046: This is the maximum number of seconds to allow while attempting to open
1047: or lock a message base (a value in the range of 10 to 45 seconds should
1048: be fine).
1049: */
1050: ultoa(cfg.smb_retry_time,str,10);
1051: uifc.input(WIN_MID|WIN_SAV,0,0
1052: ,"Maximum Message Base Retry Time (in seconds)"
1053: ,str,2,K_NUMBER|K_EDIT);
1054: cfg.smb_retry_time=atoi(str);
1055: break;
1056: case 3:
1057: SETHELP(WHERE);
1058: /*
1059: &Maximum Messages Per QWK Packet:&
1060:
1061: This is the maximum number of messages (excluding E-mail), that a user
1062: can have in one QWK packet for download. This limit does not effect
1063: QWK network nodes (&Q& restriction). If set to &0&, no limit is imposed.
1064: */
1065:
1066: ultoa(cfg.max_qwkmsgs,str,10);
1067: uifc.input(WIN_MID|WIN_SAV,0,0
1068: ,"Maximum Messages Per QWK Packet (0=No Limit)"
1069: ,str,6,K_NUMBER|K_EDIT);
1070: cfg.max_qwkmsgs=atol(str);
1071: break;
1072: case 4:
1073: SETHELP(WHERE);
1074: /*
1075: &Pre-pack QWK Requirements:&
1076:
1077: ALL user accounts on the BBS meeting this requirmenet will have a QWK
1078: packet automatically created for them every day after midnight
1079: (during the internal daily event).
1080:
1081: This is mainly intended for QWK network nodes that wish to save connect
1082: time by having their packets pre-packed. If a large number of users meet
1083: this requirement, it can take up a large amount of disk space on your
1084: system (in the &DATA\FILE& directory).
1085: */
1086: getar("Pre-pack QWK (Use with caution!)",cfg.preqwk_arstr);
1087: break;
1088: case 5:
1089: sprintf(str,"%u",cfg.mail_maxage);
1090: SETHELP(WHERE);
1091: /*
1092: &Maximum Age of Mail:&
1093:
1094: This value is the maximum number of days that mail will be kept.
1095: */
1096: uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Mail "
1097: "(in days)",str,5,K_EDIT|K_NUMBER);
1098: cfg.mail_maxage=atoi(str);
1099: break;
1100: case 6:
1101: strcpy(opt[0],"Daily");
1102: strcpy(opt[1],"Immediately");
1103: opt[2][0]=0;
1104: i=cfg.sys_misc&SM_DELEMAIL ? 0:1;
1105: SETHELP(WHERE);
1106: /*
1107: &Purge Deleted E-mail:&
1108:
1109: If you wish to have deleted e-mail physically (and permanently) removed
1110: from your e-mail database immediately after a users exits the reading
1111: e-mail prompt, set this option to &Immediately&.
1112:
1113: For the best system performance and to avoid delays when deleting e-mail
1114: from a large e-mail database, set this option to &Daily& (the default).
1115: Your system maintenance will automatically purge deleted e-mail once a
1116: day.
1117: */
1118:
1119: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1120: ,"Purge Deleted E-mail",opt);
1121: if(!i && cfg.sys_misc&SM_DELEMAIL) {
1122: cfg.sys_misc&=~SM_DELEMAIL;
1123: uifc.changes=1; }
1124: else if(i==1 && !(cfg.sys_misc&SM_DELEMAIL)) {
1125: cfg.sys_misc|=SM_DELEMAIL;
1126: uifc.changes=1; }
1127: break;
1128: case 7:
1129: sprintf(str,"%lu",cfg.mail_maxcrcs);
1130: SETHELP(WHERE);
1131: /*
1132: &Maximum Number of Mail CRCs:&
1133:
1134: This value is the maximum number of CRCs that will be kept for duplicate
1135: mail checking. Once this maximum number of CRCs is reached, the oldest
1136: CRCs will be automatically purged.
1137: */
1138: uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Mail "
1139: "CRCs",str,5,K_EDIT|K_NUMBER);
1140: cfg.mail_maxcrcs=atol(str);
1141: break;
1142: case 8:
1143: strcpy(opt[0],"Yes");
1144: strcpy(opt[1],"No");
1145: opt[2][0]=0;
1146: i=cfg.sys_misc&SM_ANON_EM ? 0:1;
1147: SETHELP(WHERE);
1148: /*
1149: &Allow Anonymous E-mail:&
1150:
1151: If you want users with the &A& exemption to be able to send E-mail
1152: anonymously, set this option to &Yes&.
1153: */
1154:
1155: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1156: ,"Allow Anonymous E-mail",opt);
1157: if(!i && !(cfg.sys_misc&SM_ANON_EM)) {
1158: cfg.sys_misc|=SM_ANON_EM;
1159: uifc.changes=1; }
1160: else if(i==1 && cfg.sys_misc&SM_ANON_EM) {
1161: cfg.sys_misc&=~SM_ANON_EM;
1162: uifc.changes=1; }
1163: break;
1164: case 9:
1165: strcpy(opt[0],"Yes");
1166: strcpy(opt[1],"No");
1167: opt[2][0]=0;
1168: i=cfg.sys_misc&SM_QUOTE_EM ? 0:1;
1169: SETHELP(WHERE);
1170: /*
1171: &Allow Quoting in E-mail:&
1172:
1173: If you want your users to be allowed to use message quoting when
1174: responding in E-mail, set this option to &Yes&.
1175: */
1176:
1177: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1178: ,"Allow Quoting in E-mail",opt);
1179: if(!i && !(cfg.sys_misc&SM_QUOTE_EM)) {
1180: cfg.sys_misc|=SM_QUOTE_EM;
1181: uifc.changes=1; }
1182: else if(i==1 && cfg.sys_misc&SM_QUOTE_EM) {
1183: cfg.sys_misc&=~SM_QUOTE_EM;
1184: uifc.changes=1; }
1185: break;
1186: case 10:
1187: strcpy(opt[0],"Yes");
1188: strcpy(opt[1],"No");
1189: opt[2][0]=0;
1190: i=cfg.sys_misc&SM_FILE_EM ? 0:1;
1191: SETHELP(WHERE);
1192: /*
1193: &Allow File Attachment Uploads in E-mail:&
1194:
1195: If you want your users to be allowed to attach an uploaded file to
1196: an E-mail message, set this option to &Yes&.
1197: */
1198:
1199: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1200: ,"Allow File Attachment Uploads in E-mail",opt);
1201: if(!i && !(cfg.sys_misc&SM_FILE_EM)) {
1202: cfg.sys_misc|=SM_FILE_EM;
1203: uifc.changes=1; }
1204: else if(i==1 && cfg.sys_misc&SM_FILE_EM) {
1205: cfg.sys_misc&=~SM_FILE_EM;
1206: uifc.changes=1; }
1207: break;
1208: case 11:
1209: strcpy(opt[0],"Yes");
1210: strcpy(opt[1],"No");
1211: opt[2][0]=0;
1212: i=cfg.sys_misc&SM_FWDTONET ? 0:1;
1213: SETHELP(WHERE);
1214: /*
1215: &Allow Users to Have Their E-mail Forwarded to NetMail:&
1216:
1217: If you want your users to be able to have any e-mail sent to them
1218: optionally (at the sender's discretion) forwarded to a NetMail address,
1219: set this option to &Yes&.
1220: */
1221:
1222: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1223: ,"Allow Forwarding of E-mail to NetMail",opt);
1224: if(!i && !(cfg.sys_misc&SM_FWDTONET)) {
1225: cfg.sys_misc|=SM_FWDTONET;
1226: uifc.changes=1; }
1227: else if(i==1 && cfg.sys_misc&SM_FWDTONET) {
1228: cfg.sys_misc&=~SM_FWDTONET;
1229: uifc.changes=1; }
1230: break;
1231: case 12:
1232: strcpy(opt[0],"Yes");
1233: strcpy(opt[1],"No");
1234: opt[2][0]=0;
1235: i=cfg.sys_misc&SM_DELREADM ? 0:1;
1236: SETHELP(WHERE);
1237: /*
1238: &Kill Read E-mail Automatically:&
1239:
1240: If this option is set to &Yes&, e-mail that has been read will be
1241: automatically deleted when message base maintenance is run.
1242: */
1243:
1244: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1245: ,"Kill Read E-mail Automatically",opt);
1246: if(!i && !(cfg.sys_misc&SM_DELREADM)) {
1247: cfg.sys_misc|=SM_DELREADM;
1248: uifc.changes=1; }
1249: else if(i==1 && cfg.sys_misc&SM_DELREADM) {
1250: cfg.sys_misc&=~SM_DELREADM;
1251: uifc.changes=1; }
1252: break;
1253: case 13:
1254: strcpy(opt[0],"Yes");
1255: strcpy(opt[1],"No");
1256: opt[2][0]=0;
1257: i=cfg.msg_misc&MM_REALNAME ? 0:1;
1258: SETHELP(WHERE);
1259: /*
1260: `Receive E-mail by Real Name:`
1261:
1262: If this option is set to ~Yes~, e-mail messages may be received when
1263: addressed to a user's real name (rather than their alias).
1264: */
1265:
1266: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1267: ,"Receive E-mail by Real Name",opt);
1268: if(!i && !(cfg.msg_misc&MM_REALNAME)) {
1269: cfg.msg_misc|=MM_REALNAME;
1270: uifc.changes=1;
1271: }
1272: else if(i==1 && cfg.msg_misc&MM_REALNAME) {
1273: cfg.msg_misc&=~MM_REALNAME;
1274: uifc.changes=1;
1275: }
1276: break;
1277: case 14:
1278: strcpy(opt[0],"Yes");
1279: strcpy(opt[1],"No");
1280: strcpy(opt[2],"Sysops Only");
1281: opt[3][0]=0;
1282: i=1;
1283: SETHELP(WHERE);
1284: /*
1285: &Users Can View Deleted Messages:&
1286:
1287: If this option is set to &Yes&, then users will be able to view messages
1288: they've sent and deleted or messages sent to them and they've deleted
1289: with the option of un-deleting the message before the message is
1290: physically purged from the e-mail database.
1291:
1292: If this option is set to &No&, then when a message is deleted, it is no
1293: longer viewable (with SBBS) by anyone.
1294:
1295: If this option is set to &Sysops Only&, then only sysops and sub-ops (when
1296: appropriate) can view deleted messages.
1297: */
1298:
1299: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
1300: ,"Users Can View Deleted Messages",opt);
1301: if(!i && (cfg.sys_misc&(SM_USRVDELM|SM_SYSVDELM))
1302: !=(SM_USRVDELM|SM_SYSVDELM)) {
1303: cfg.sys_misc|=(SM_USRVDELM|SM_SYSVDELM);
1304: uifc.changes=1; }
1305: else if(i==1 && cfg.sys_misc&(SM_USRVDELM|SM_SYSVDELM)) {
1306: cfg.sys_misc&=~(SM_USRVDELM|SM_SYSVDELM);
1307: uifc.changes=1; }
1308: else if(i==2 && (cfg.sys_misc&(SM_USRVDELM|SM_SYSVDELM))
1309: !=SM_SYSVDELM) {
1310: cfg.sys_misc|=SM_SYSVDELM;
1311: cfg.sys_misc&=~SM_USRVDELM;
1312: uifc.changes=1; }
1313: break;
1314: case 15:
1315: SETHELP(WHERE);
1316: /*
1317: &Extra Attribute Codes...&
1318:
1319: Synchronet can suppport the native text attribute codes of other BBS
1320: programs in messages (menus, posts, e-mail, etc.) To enable the extra
1321: attribute codes for another BBS program, set the corresponding option
1322: to &Yes&.
1323: */
1324:
1325: j=0;
1326: while(1) {
1327: i=0;
1328: sprintf(opt[i++],"%-15.15s %-3.3s","WWIV"
1329: ,cfg.sys_misc&SM_WWIV ? "Yes":"No");
1330: sprintf(opt[i++],"%-15.15s %-3.3s","PCBoard"
1331: ,cfg.sys_misc&SM_PCBOARD ? "Yes":"No");
1332: sprintf(opt[i++],"%-15.15s %-3.3s","Wildcat"
1333: ,cfg.sys_misc&SM_WILDCAT ? "Yes":"No");
1334: sprintf(opt[i++],"%-15.15s %-3.3s","Celerity"
1335: ,cfg.sys_misc&SM_CELERITY ? "Yes":"No");
1336: sprintf(opt[i++],"%-15.15s %-3.3s","Renegade"
1337: ,cfg.sys_misc&SM_RENEGADE ? "Yes":"No");
1338: opt[i][0]=0;
1339: j=uifc.list(WIN_BOT|WIN_RHT|WIN_SAV,2,2,0,&j,0
1340: ,"Extra Attribute Codes",opt);
1341: if(j==-1)
1342: break;
1343:
1344: uifc.changes=1;
1345: switch(j) {
1346: case 0:
1347: cfg.sys_misc^=SM_WWIV;
1348: break;
1349: case 1:
1350: cfg.sys_misc^=SM_PCBOARD;
1351: break;
1352: case 2:
1353: cfg.sys_misc^=SM_WILDCAT;
1354: break;
1355: case 3:
1356: cfg.sys_misc^=SM_CELERITY;
1357: break;
1358: case 4:
1359: cfg.sys_misc^=SM_RENEGADE;
1360: break; } } } }
1361: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.