|
|
1.1 root 1: #line 2 "SCFGXTRN.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: extern char *wday[];
6:
7: char *daystr(char days);
8:
9:
10: /****************************************************************************/
11: /* Synchronet configuration utility */
12: /****************************************************************************/
13:
14: #include "scfg.h"
15:
16: void xprogs_cfg()
17: {
18: static int xprogs_dflt;
19: int i;
20: char str[81];
21:
22: while(1) {
23: i=0;
24: strcpy(opt[i++],"Fixed Events");
25: strcpy(opt[i++],"Timed Events");
26: strcpy(opt[i++],"Global Swap List");
27: strcpy(opt[i++],"OS/2 Program List");
28: strcpy(opt[i++],"External Editors");
29: strcpy(opt[i++],"Online Programs");
30: opt[i][0]=0;
31: SETHELP(WHERE);
32: /*
33: &Online External Programs:&
34:
35: From this menu, you can configure external events, external editors, or
36: online external programs (doors).
37: */
38: switch(ulist(WIN_ORG|WIN_CHE|WIN_ACT,0,0,0,&xprogs_dflt,0
39: ,"External Programs",opt)) {
40: case -1:
41: i=save_changes(WIN_MID);
42: if(i==-1)
43: break;
44: if(!i) {
45: write_xtrn_cfg();
46: write_main_cfg(); }
47: return;
48: case 0:
49: fevents_cfg();
50: break;
51: case 1:
52: tevents_cfg();
53: break;
54: case 2:
55: swap_cfg();
56: break;
57: case 3:
58: os2pgm_cfg();
59: break;
60: case 4:
61: xedit_cfg();
62: break;
63: case 5:
64: xtrnsec_cfg();
65: break; } }
66: }
67:
68: void fevents_cfg()
69: {
70: static int event_dflt;
71: char str[81],*p;
72: int i;
73:
74: while(1) {
75: i=0;
76: sprintf(opt[i++],"%-32.32s%.40s","Logon Event",sys_logon);
77: sprintf(opt[i++],"%-32.32s%.40s","Logout Event",sys_logout);
78: sprintf(opt[i++],"%-32.32s%.40s","Daily Event",sys_daily);
79: opt[i][0]=0;
80: savnum=0;
81: SETHELP(WHERE);
82: /*
83: &External Events:&
84:
85: From this menu, you can configure the logon and logout events, and the
86: system daily event.
87: */
88: switch(ulist(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&event_dflt,0
89: ,"Fixed Events",opt)) {
90: case -1:
91: return;
92: case 0:
93: SETHELP(WHERE);
94: /*
95: &Logon Event:&
96:
97: This is the command line for a program that will execute during the
98: logon sequence of every user. The program cannot have user interaction.
99: The program will be executed after the LOGON message is displayed and
100: before the logon user list is displayed. If you wish to place a program
101: in the logon sequence of users that includes interaction or requires
102: account information, you probably want to use an online external
103: program configured to run as a logon event.
104: */
105: uinput(WIN_MID|WIN_SAV,0,0,"Logon Event"
106: ,sys_logon,50,K_EDIT);
107: break;
108: case 1:
109: SETHELP(WHERE);
110: /*
111: &Logout Event:&
112:
113: This is the command line for a program that will execute during the
114: logout sequence of every user. This program cannot have user
115: interaction because it is executed after carrier is dropped. If you
116: wish to have a program execute before carrier is dropped, you probably
117: want to use an &Online External Program& configured to run as a logoff
118: event.
119: */
120: uinput(WIN_MID|WIN_SAV,0,0,"Logout Event"
121: ,sys_logout,50,K_EDIT);
122: break;
123: case 2:
124: SETHELP(WHERE);
125: /*
126: &Daily Event:&
127:
128: This is the command line for a program that will run after the first
129: user that logs on after midnight, logs off (regardless of what node).
130: */
131: uinput(WIN_MID|WIN_SAV,0,0,"Daily Event"
132: ,sys_daily,50,K_EDIT);
133:
134: break; } }
135: }
136:
137: void tevents_cfg()
138: {
139: static int dflt,dfltopt,bar;
140: char str[81],done=0,*p;
141: int j,k;
142: uint i;
143: static event_t savevent;
144:
145: while(1) {
146: for(i=0;i<total_events && i<MAX_OPTS;i++)
147: sprintf(opt[i],"%-8.8s %.50s",event[i]->code,event[i]->cmd);
148: opt[i][0]=0;
149: j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_RHT;
150: savnum=0;
151: if(total_events)
152: j|=WIN_DEL|WIN_GET;
153: if(total_events<MAX_OPTS)
154: j|=WIN_INS|WIN_INSACT;
155: if(savevent.code[0])
156: j|=WIN_PUT;
157: SETHELP(WHERE);
158: /*
159: &Timed Events:&
160:
161: This is a list of the configured timed external events.
162:
163: To add an event hit INS .
164:
165: To delete an event, select it and hit DEL .
166:
167: To configure an event, select it and hit ENTER .
168: */
169: i=ulist(j,0,0,45,&dflt,&bar,"Timed Events",opt);
170: if((signed)i==-1)
171: return;
172: if((i&MSK_ON)==MSK_INS) {
173: i=total_events;
174: SETHELP(WHERE);
175: /*
176: &Timed Event Internal Code:&
177:
178: This is the internal code for the timed event.
179: */
180: if(uinput(WIN_MID|WIN_SAV,0,0,"Event Internal Code",str,8
181: ,K_UPPER)<1)
182: continue;
183: if((event=(event_t **)REALLOC(event
184: ,sizeof(event_t *)*(total_events+1)))==NULL) {
185: errormsg(WHERE,ERR_ALLOC,nulstr,total_events+1);
186: total_events=0;
187: bail(1);
188: continue; }
189: if((event[i]=(event_t *)MALLOC(sizeof(event_t)))==NULL) {
190: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(event_t));
191: continue; }
192: memset((event_t *)event[i],0,sizeof(event_t));
193: strcpy(event[i]->code,str);
194: event[i]->node=1;
195: event[i]->days=0xff;
196: total_events++;
197: changes=1;
198: continue; }
199: if((i&MSK_ON)==MSK_DEL) {
200: i&=MSK_OFF;
201: FREE(event[i]);
202: total_events--;
203: for(j=i;j<total_events;j++)
204: event[j]=event[j+1];
205: changes=1;
206: continue; }
207: if((i&MSK_ON)==MSK_GET) {
208: i&=MSK_OFF;
209: savevent=*event[i];
210: continue; }
211: if((i&MSK_ON)==MSK_PUT) {
212: i&=MSK_OFF;
213: *event[i]=savevent;
214: changes=1;
215: continue; }
216: done=0;
217: while(!done) {
218: k=0;
219: sprintf(opt[k++],"%-32.32s%s","Internal Code",event[i]->code);
220: sprintf(opt[k++],"%-32.32s%.40s","Start-up Directory",event[i]->dir);
221: sprintf(opt[k++],"%-32.32s%.40s","Command Line",event[i]->cmd);
222: sprintf(opt[k++],"%-32.32s%u","Execution Node",event[i]->node);
223: sprintf(opt[k++],"%-32.32s%s","Execution Days",daystr(event[i]->days));
224: sprintf(opt[k++],"%-32.32s%02u:%02u","Execution Time"
225: ,event[i]->time/60,event[i]->time%60);
226: sprintf(opt[k++],"%-32.32s%s","Requires Exclusive Execution"
227: ,event[i]->misc&EVENT_EXCL ? "Yes":"No");
228: sprintf(opt[k++],"%-32.32s%s","Force Users Off-line For Event"
229: ,event[i]->misc&EVENT_FORCE ? "Yes":"No");
230: opt[k][0]=0;
231: SETHELP(WHERE);
232: /*
233: &Timed Event:&
234:
235: This is the configuration menu for a timed event. An event is an
236: external program that performs some type of automated function on the
237: system. Use this menu to configure how and when this event will be
238: executed.
239:
240: If you need the BBS to swap out of memory for this event (to make more
241: available memory), add the program name (first word of the command line)
242: to &Global Swap List& from the &External Programs& menu.
243: */
244: savnum=1;
245: sprintf(str,"%s Timed Event",event[i]->code);
246: switch(ulist(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT,0,0,70,&dfltopt,0
247: ,str,opt)) {
248: case -1:
249: done=1;
250: break;
251: case 0:
252: strcpy(str,event[i]->code);
253: SETHELP(WHERE);
254: /*
255: &Timed Event Internal Code:&
256:
257: Every timed event must have its own unique internal code for Synchronet
258: to reference it by. It is helpful if this code is an abreviation of the
259: command line.
260: */
261: uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
262: ,str,8,K_EDIT|K_UPPER);
263: if(code_ok(str))
264: strcpy(event[i]->code,str);
265: else {
266: helpbuf=invalid_code;
267: umsg("Invalid Code");
268: helpbuf=0; }
269: break;
270: case 1:
271: SETHELP(WHERE);
272: /*
273: &Timed Event Start-up Directory:&
274:
275: This is the DOS drive/directory where the event program is located.
276: If a path is specified here, it will be made the current directory
277: before the event's command line is executed. This eliminates the need
278: for batch files that just change the current drive and directory before
279: executing the event.
280:
281: If this option is not used, the current NODE's directory will be the
282: current DOS drive/directory before the command line is executed.
283: */
284: uinput(WIN_MID|WIN_SAV,0,10,"Directory"
285: ,event[i]->dir,50,K_EDIT|K_UPPER);
286: break;
287: case 2:
288: SETHELP(WHERE);
289: /*
290: &Timed Event Command Line:&
291:
292: This is the command line to execute upon this timed event.
293: */
294: uinput(WIN_MID|WIN_SAV,0,10,"Command"
295: ,event[i]->cmd,50,K_EDIT);
296: break;
297: case 3:
298: SETHELP(WHERE);
299: /*
300: &Timed Event Node:&
301:
302: This is the node number to execute the timed event.
303: */
304: sprintf(str,"%u",event[i]->node);
305: uinput(WIN_MID|WIN_SAV,0,0,"Node Number"
306: ,str,3,K_EDIT|K_NUMBER);
307: event[i]->node=atoi(str);
308: break;
309: case 4:
310: j=0;
311: while(1) {
312: for(k=0;k<7;k++)
313: sprintf(opt[k],"%s %s"
314: ,wday[k],(event[i]->days&(1<<k)) ? "Yes":"No");
315: opt[k][0]=0;
316: savnum=2;
317: SETHELP(WHERE);
318: /*
319: &Days to Execute Event:&
320:
321: These are the days of the week that this event will be executed.
322: */
323: k=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
324: ,"Days to Execute Event",opt);
325: if(k==-1)
326: break;
327: event[i]->days^=(1<<k);
328: changes=1; }
329: break;
330: case 5:
331: sprintf(str,"%2.2d:%2.2d",event[i]->time/60
332: ,event[i]->time%60);
333: SETHELP(WHERE);
334: /*
335: &Time to Execute Event:&
336:
337: This is the time (in 24 hour HH:MM format) to execute the event.
338: */
339: if(uinput(WIN_MID|WIN_SAV,0,0
340: ,"Time to Execute Event (HH:MM)"
341: ,str,5,K_UPPER|K_EDIT)>0) {
342: event[i]->time=atoi(str)*60;
343: if((p=strchr(str,':'))!=NULL)
344: event[i]->time+=atoi(p+1); }
345: break;
346: case 6:
347: k=1;
348: strcpy(opt[0],"Yes");
349: strcpy(opt[1],"No");
350: opt[2][0]=0;
351: savnum=2;
352: SETHELP(WHERE);
353: /*
354: &Exclusive Event Execution:&
355:
356: If this event must be run exclusively (all nodes inactive), set this
357: option to &Yes&.
358: */
359: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Exclusive Execution"
360: ,opt);
361: if(!k && !(event[i]->misc&EVENT_EXCL)) {
362: event[i]->misc|=EVENT_EXCL;
363: changes=1; }
364: else if(k==1 && event[i]->misc&EVENT_EXCL) {
365: event[i]->misc&=~EVENT_EXCL;
366: changes=1; }
367: break;
368: case 7:
369: k=1;
370: strcpy(opt[0],"Yes");
371: strcpy(opt[1],"No");
372: opt[2][0]=0;
373: savnum=2;
374: SETHELP(WHERE);
375: /*
376: &Force Users Off-line for Event:&
377:
378: If you want to have your users' on-line time reduced so the event can
379: execute precisely on time, set this option to &Yes&.
380: */
381: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
382: ,"Force Users Off-line for Event",opt);
383: if(!k && !(event[i]->misc&EVENT_FORCE)) {
384: event[i]->misc|=EVENT_FORCE;
385: changes=1; }
386: else if(k==1 && event[i]->misc&EVENT_FORCE) {
387: event[i]->misc&=~EVENT_FORCE;
388: changes=1; }
389: break;
390:
391: } } }
392: }
393:
394:
395: void xtrn_cfg(uint section)
396: {
397: static int ext_dflt,ext_bar,opt_dflt,time_dflt;
398: char str[128],code[9],done=0,*p;
399: int j,k;
400: uint i,n,xtrnnum[MAX_OPTS+1];
401: static xtrn_t savxtrn;
402:
403: while(1) {
404: for(i=0,j=0;i<total_xtrns && j<MAX_OPTS;i++)
405: if(xtrn[i]->sec==section) {
406: sprintf(opt[j],"%-25s",xtrn[i]->name);
407: xtrnnum[j++]=i; }
408: xtrnnum[j]=total_xtrns;
409: opt[j][0]=0;
410: savnum=2;
411: i=WIN_ACT|WIN_CHE|WIN_SAV|WIN_RHT;
412: if(j)
413: i|=WIN_DEL|WIN_GET;
414: if(total_xtrns<MAX_OPTS)
415: i|=WIN_INS|WIN_INSACT|WIN_XTR;
416: if(savxtrn.name[0])
417: i|=WIN_PUT;
418: SETHELP(WHERE);
419: /*
420: &Online External Programs:&
421:
422: This is a list of the configured online external programs (doors).
423:
424: To add a program, select the desired location with the arrow keys and
425: hit INS .
426:
427: To delete a program, select it with the arrow keys and hit DEL .
428:
429: To configure a program, select it with the arrow keys and hit ENTER .
430: */
431: sprintf(str,"%s Online Programs",xtrnsec[section]->name);
432: i=ulist(i,0,0,45,&ext_dflt,&ext_bar,str,opt);
433: if((signed)i==-1)
434: return;
435: if((i&MSK_ON)==MSK_INS) {
436: i&=MSK_OFF;
437: SETHELP(WHERE);
438: /*
439: &Online Program Name:&
440:
441: This is the name or description of the online program (door).
442: */
443: if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Name",str,25
444: ,0)<1)
445: continue;
446: sprintf(code,"%.8s",str);
447: p=strchr(code,SP);
448: if(p) *p=0;
449: strupr(code);
450: SETHELP(WHERE);
451: /*
452: &Online Program Internal Code:&
453:
454: Every online program must have its own unique code for Synchronet to
455: refer to it internally. This code is usually an abreviation of the
456: online program name.
457: */
458: if(uinput(WIN_MID|WIN_SAV,0,0,"Internal Code"
459: ,code,8,K_EDIT|K_UPPER)<1)
460: continue;
461: if(!code_ok(code)) {
462: helpbuf=invalid_code;
463: umsg("Invalid Code");
464: helpbuf=0;
465: continue; }
466: if((xtrn=(xtrn_t **)REALLOC(xtrn,sizeof(xtrn_t *)*(total_xtrns+1)))
467: ==NULL) {
468: errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrns+1);
469: total_xtrns=0;
470: bail(1);
471: continue; }
472: if(j)
473: for(n=total_xtrns;n>xtrnnum[i];n--)
474: xtrn[n]=xtrn[n-1];
475: if((xtrn[xtrnnum[i]]=(xtrn_t *)MALLOC(sizeof(xtrn_t)))==NULL) {
476: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xtrn_t));
477: continue; }
478: memset((xtrn_t *)xtrn[xtrnnum[i]],0,sizeof(xtrn_t));
479: strcpy(xtrn[xtrnnum[i]]->name,str);
480: strcpy(xtrn[xtrnnum[i]]->code,code);
481: xtrn[xtrnnum[i]]->sec=section;
482: total_xtrns++;
483: changes=1;
484: continue; }
485: if((i&MSK_ON)==MSK_DEL) {
486: i&=MSK_OFF;
487: FREE(xtrn[xtrnnum[i]]);
488: total_xtrns--;
489: for(j=xtrnnum[i];j<total_xtrns;j++)
490: xtrn[j]=xtrn[j+1];
491: changes=1;
492: continue; }
493: if((i&MSK_ON)==MSK_GET) {
494: i&=MSK_OFF;
495: savxtrn=*xtrn[xtrnnum[i]];
496: continue; }
497: if((i&MSK_ON)==MSK_PUT) {
498: i&=MSK_OFF;
499: *xtrn[xtrnnum[i]]=savxtrn;
500: xtrn[xtrnnum[i]]->sec=section;
501: changes=1;
502: continue; }
503: done=0;
504: i=xtrnnum[i];
505: while(!done) {
506: k=0;
507: sprintf(opt[k++],"%-27.27s%s","Name",xtrn[i]->name);
508: sprintf(opt[k++],"%-27.27s%s","Internal Code",xtrn[i]->code);
509: sprintf(opt[k++],"%-27.27s%.40s","Start-up Directory",xtrn[i]->path);
510: sprintf(opt[k++],"%-27.27s%.40s","Command Line",xtrn[i]->cmd);
511: sprintf(opt[k++],"%-27.27s%.40s","Clean-up Command Line",xtrn[i]->clean);
512: if(xtrn[i]->cost)
513: sprintf(str,"%lu credits",xtrn[i]->cost);
514: else
515: strcpy(str,"None");
516: sprintf(opt[k++],"%-27.27s%s","Execution Cost",str);
517: sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",xtrn[i]->ar);
518: sprintf(opt[k++],"%-27.27s%.40s","Execution Requirements"
519: ,xtrn[i]->run_ar);
520: sprintf(opt[k++],"%-27.27s%s","Multiple Concurrent Users"
521: ,xtrn[i]->misc&MULTIUSER ? "Yes" : "No");
522: sprintf(opt[k++],"%-27.27s%s%s","Intercept I/O Interrupts"
523: ,xtrn[i]->misc&IO_INTS ? "Yes" : "No"
524: ,xtrn[i]->misc&WWIVCOLOR ? ", WWIV" : nulstr);
525: sprintf(opt[k++],"%-27.27s%s","Swap BBS out of Memory"
526: ,xtrn[i]->misc&SWAP ? "Yes" : "No");
527: sprintf(opt[k++],"%-27.27s%s","Modify User Data"
528: ,xtrn[i]->misc&MODUSERDAT ? "Yes" : "No");
529: switch(xtrn[i]->event) {
530: case EVENT_LOGON:
531: strcpy(str,"Logon");
532: break;
533: case EVENT_LOGOFF:
534: strcpy(str,"Logoff");
535: break;
536: case EVENT_NEWUSER:
537: strcpy(str,"New User");
538: break;
539: case EVENT_BIRTHDAY:
540: strcpy(str,"Birthday");
541: break;
542: default:
543: strcpy(str,"No");
544: break; }
545: if(xtrn[i]->misc&EVENTONLY && xtrn[i]->event)
546: strcat(str,", Only");
547: sprintf(opt[k++],"%-27.27s%s","Execute on Event",str);
548: switch(xtrn[i]->type) {
549: case XTRN_SBBS:
550: sprintf(str,"%-15s %s","Synchronet","XTRN.DAT");
551: break;
552: case XTRN_WWIV:
553: sprintf(str,"%-15s %s","WWIV","CHAIN.TXT");
554: break;
555: case XTRN_GAP:
556: sprintf(str,"%-15s %s","GAP","DOOR.SYS");
557: break;
558: case XTRN_RBBS:
559: sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
560: break;
561: case XTRN_RBBS1:
562: sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
563: break;
564: case XTRN_WILDCAT:
565: sprintf(str,"%-15s %s","Wildcat","CALLINFO.BBS");
566: break;
567: case XTRN_PCBOARD:
568: sprintf(str,"%-15s %s","PCBoard","PCBOARD.SYS");
569: break;
570: case XTRN_SPITFIRE:
571: sprintf(str,"%-15s %s","SpitFire","SFDOORS.DAT");
572: break;
573: case XTRN_UTI:
574: sprintf(str,"%-15s %s","MegaMail","UTIDOOR.TXT");
575: break;
576: case XTRN_SR:
577: sprintf(str,"%-15s %s","Solar Realms","DOORFILE.SR");
578: break;
579: case XTRN_TRIBBS:
580: sprintf(str,"%-15s %s","TriBBS","TRIBBS.SYS");
581: break;
582: default:
583: strcpy(str,"None");
584: break; }
585: sprintf(opt[k++],"%-23.23s%-4s%s","BBS Drop File Type"
586: ,xtrn[i]->misc&REALNAME ? "(R)":nulstr,str);
587: sprintf(opt[k++],"%-27.27s%s","Place Drop File In"
588: ,xtrn[i]->misc&STARTUPDIR ? "Start-Up Directory":"Node Directory");
589: sprintf(opt[k++],"Time Options...");
590: opt[k][0]=0;
591: savnum=3;
592: SETHELP(WHERE);
593: /*
594: &Online Program Configuration:&
595:
596: This menu is for configuring the selected online program.
597: */
598: switch(ulist(WIN_SAV|WIN_ACT|WIN_MID,0,0,60,&opt_dflt,0,xtrn[i]->name
599: ,opt)) {
600: case -1:
601: done=1;
602: break;
603: case 0:
604: SETHELP(WHERE);
605: /*
606: &Online Program Name:&
607:
608: This is the name or description of the online program (door).
609: */
610: strcpy(str,xtrn[i]->name);
611: if(!uinput(WIN_MID|WIN_SAV,0,10,"Online Program Name"
612: ,xtrn[i]->name,25,K_EDIT))
613: strcpy(xtrn[i]->name,str);
614: break;
615: case 1:
616: SETHELP(WHERE);
617: /*
618: &Online Program Internal Code:&
619:
620: Every online program must have its own unique code for Synchronet to
621: refer to it internally. This code is usually an abreviation of the
622: online program name.
623: */
624: strcpy(str,xtrn[i]->code);
625: uinput(WIN_MID|WIN_SAV,0,10,"Internal Code"
626: ,str,8,K_UPPER|K_EDIT);
627: if(code_ok(str))
628: strcpy(xtrn[i]->code,str);
629: else {
630: helpbuf=invalid_code;
631: umsg("Invalid Code");
632: helpbuf=0; }
633: break;
634: case 2:
635: SETHELP(WHERE);
636: /*
637: &Online Program Start-up Directory:&
638:
639: This is the DOS drive/directory where the online program is located.
640: If a path is specified here, it will be made the current directory
641: before the program's command line is executed. This eliminates the need
642: for batch files that just change the current drive and directory before
643: executing the program.
644:
645: If this option is not used, the current NODE's directory will be the
646: current DOS drive/directory before the command line is executed.
647: */
648: uinput(WIN_MID|WIN_SAV,0,10,"Directory"
649: ,xtrn[i]->path,50,K_EDIT|K_UPPER);
650: break;
651: case 3:
652: SETHELP(WHERE);
653: /*
654: &Online Program Command Line:&
655:
656: This is the command line to execute to run the online program.
657: */
658: uinput(WIN_MID|WIN_SAV,0,10,"Command"
659: ,xtrn[i]->cmd,50,K_EDIT);
660: break;
661: case 4:
662: SETHELP(WHERE);
663: /*
664: &Online Program Clean-up Command:&
665:
666: This is the command line to execute after the main command line. This
667: option is usually only used for multiuser online programs.
668: */
669: uinput(WIN_MID|WIN_SAV,0,10,"Clean-up"
670: ,xtrn[i]->clean,50,K_EDIT);
671: break;
672: case 5:
673: ultoa(xtrn[i]->cost,str,10);
674: SETHELP(WHERE);
675: /*
676: &Online Program Cost to Run:&
677:
678: If you want users to be charged credits to run this online program,
679: set this value to the number of credits to charge. If you want this
680: online program to be free, set this value to &0&.
681: */
682: uinput(WIN_MID|WIN_SAV,0,0,"Cost to Run (in Credits)"
683: ,str,10,K_EDIT|K_NUMBER);
684: xtrn[i]->cost=atol(str);
685: break;
686: case 6:
687: savnum=4;
688: sprintf(str,"%s Access",xtrn[i]->name);
689: getar(str,xtrn[i]->ar);
690: break;
691: case 7:
692: savnum=4;
693: sprintf(str,"%s Execution",xtrn[i]->name);
694: getar(str,xtrn[i]->run_ar);
695: break;
696: case 8:
697: k=1;
698: strcpy(opt[0],"Yes");
699: strcpy(opt[1],"No");
700: opt[2][0]=0;
701: SETHELP(WHERE);
702: /*
703: &Supports Multiple Users:&
704:
705: If this online program supports multiple simultaneous users (nodes),
706: set this option to &Yes&.
707: */
708: savnum=4;
709: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Supports Multiple Users"
710: ,opt);
711: if(!k && !(xtrn[i]->misc&MULTIUSER)) {
712: xtrn[i]->misc|=MULTIUSER;
713: changes=1; }
714: else if(k==1 && xtrn[i]->misc&MULTIUSER) {
715: xtrn[i]->misc&=~MULTIUSER;
716: changes=1; }
717: break;
718: case 9:
719: k=1;
720: strcpy(opt[0],"Yes");
721: strcpy(opt[1],"No");
722: opt[2][0]=0;
723: SETHELP(WHERE);
724: /*
725: &Intercept I/O Interrupts:&
726:
727: If this online program has its own serial communication abilities, set
728: this option to &No&.
729: */
730: savnum=4;
731: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts"
732: ,opt);
733: if(!k && !(xtrn[i]->misc&IO_INTS)) {
734: xtrn[i]->misc|=IO_INTS;
735: changes=1; }
736: else if(k==1 && xtrn[i]->misc&IO_INTS) {
737: xtrn[i]->misc&=~(IO_INTS|WWIVCOLOR);
738: changes=1; }
739: if(!(xtrn[i]->misc&IO_INTS))
740: break;
741: k=1;
742: strcpy(opt[0],"Yes");
743: strcpy(opt[1],"No");
744: opt[2][0]=0;
745: SETHELP(WHERE);
746: /*
747: &Program Uses WWIV Color Codes:&
748:
749: If this program was written for use exclusively under WWIV, set this
750: option to &Yes&.
751: */
752: savnum=4;
753: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
754: ,"Program Uses WWIV Color Codes"
755: ,opt);
756: if(!k && !(xtrn[i]->misc&WWIVCOLOR)) {
757: xtrn[i]->misc|=WWIVCOLOR;
758: changes=1; }
759: else if(k==1 && xtrn[i]->misc&WWIVCOLOR) {
760: xtrn[i]->misc&=~WWIVCOLOR;
761: changes=1; }
762: break;
763: case 10:
764: k=0;
765: strcpy(opt[0],"Yes");
766: strcpy(opt[1],"No");
767: opt[2][0]=0;
768: SETHELP(WHERE);
769: /*
770: &Swap BBS out of Memory to Run Executable:&
771:
772: If this online programs requires a large amount of free memory,
773: set this option to &Yes& to have the BBS swapped out of memory.
774: */
775: savnum=4;
776: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
777: ,"Swap BBS out of Memory",opt);
778: if(!k && !(xtrn[i]->misc&SWAP)) {
779: xtrn[i]->misc|=SWAP;
780: changes=1; }
781: else if(k==1 && xtrn[i]->misc&SWAP) {
782: xtrn[i]->misc&=~SWAP;
783: changes=1; }
784: break;
785: case 11:
786: k=1;
787: strcpy(opt[0],"Yes");
788: strcpy(opt[1],"No");
789: opt[2][0]=0;
790: SETHELP(WHERE);
791: /*
792: &Program Can Modify User Data:&
793:
794: If this online programs recognizes the Synchronet MODUSER.DAT format
795: or the RBBS/QuickBBS EXITINFO.BBS format and you want it to be able to
796: modify the data of users who run the program, set this option to &Yes&.
797: */
798: savnum=4;
799: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
800: ,"Program Can Modify User Data",opt);
801: if(!k && !(xtrn[i]->misc&MODUSERDAT)) {
802: xtrn[i]->misc|=MODUSERDAT;
803: changes=1; }
804: else if(k==1 && xtrn[i]->misc&MODUSERDAT) {
805: xtrn[i]->misc&=~MODUSERDAT;
806: changes=1; }
807: break;
808: case 12:
809: k=0;
810: strcpy(opt[k++],"No");
811: strcpy(opt[k++],"Logon");
812: strcpy(opt[k++],"Logoff");
813: strcpy(opt[k++],"New User");
814: strcpy(opt[k++],"Birthday");
815: opt[k][0]=0;
816: switch(xtrn[i]->event) {
817: default:
818: k=0;
819: break;
820: case EVENT_LOGON:
821: k=1;
822: break;
823: case EVENT_LOGOFF:
824: k=2;
825: break;
826: case EVENT_NEWUSER:
827: k=3;
828: break;
829: case EVENT_BIRTHDAY:
830: k=4;
831: break; }
832: SETHELP(WHERE);
833: /*
834: &Execute Online Program on Event:&
835:
836: If you would like this online program to automatically execute on a
837: specific user event, select the event. Otherwise, select &No&.
838: */
839: savnum=4;
840: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
841: ,"Execute on Event",opt);
842: if(k==-1)
843: break;
844: if(xtrn[i]->event!=k) {
845: xtrn[i]->event=k;
846: changes=1; }
847: if(!xtrn[i]->event)
848: break;
849: k=1;
850: strcpy(opt[0],"Yes");
851: strcpy(opt[1],"No");
852: opt[2][0]=0;
853: SETHELP(WHERE);
854: /*
855: &Execute Online Program as Event Only:&
856:
857: If you would like this online program to execute as an event only
858: (not available to users on the online program menu), set this option
859: to &Yes&.
860: */
861: savnum=4;
862: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k
863: ,0,"Execute as Event Only"
864: ,opt);
865: if(!k && !(xtrn[i]->misc&EVENTONLY)) {
866: xtrn[i]->misc|=EVENTONLY;
867: changes=1; }
868: else if(k==1 && xtrn[i]->misc&EVENTONLY) {
869: xtrn[i]->misc&=~EVENTONLY;
870: changes=1; }
871: break;
872: case 13:
873: k=0;
874: strcpy(opt[k++],"None");
875: sprintf(opt[k++],"%-15s %s","Synchronet","XTRN.DAT");
876: sprintf(opt[k++],"%-15s %s","WWIV","CHAIN.TXT");
877: sprintf(opt[k++],"%-15s %s","GAP","DOOR.SYS");
878: sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
879: sprintf(opt[k++],"%-15s %s","Wildcat","CALLINFO.BBS");
880: sprintf(opt[k++],"%-15s %s","PCBoard","PCBOARD.SYS");
881: sprintf(opt[k++],"%-15s %s","SpitFire","SFDOORS.DAT");
882: sprintf(opt[k++],"%-15s %s","MegaMail","UTIDOOR.TXT");
883: sprintf(opt[k++],"%-15s %s","Solar Realms","DOORFILE.SR");
884: sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
885: sprintf(opt[k++],"%-15s %s","TriBBS","TRIBBS.SYS");
886: opt[k][0]=0;
887: k=xtrn[i]->type;
888: SETHELP(WHERE);
889: /*
890: &Online Program BBS Drop File Type:&
891:
892: If this online program requires a specific BBS data (drop) file
893: format, select the file format from the list.
894: */
895: savnum=4;
896: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
897: ,"BBS Drop File Type",opt);
898: if(k==-1)
899: break;
900: if(xtrn[i]->type!=k) {
901: xtrn[i]->type=k;
902: changes=1; }
903: if(xtrn[i]->type && uq&UQ_ALIASES) {
904: strcpy(opt[0],"Yes");
905: strcpy(opt[1],"No");
906: opt[2][0]=0;
907: k=1;
908: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Use Real Names",opt);
909: if(k==0 && !(xtrn[i]->misc&REALNAME)) {
910: xtrn[i]->misc|=REALNAME;
911: changes=1; }
912: else if(k==1 && xtrn[i]->misc&REALNAME) {
913: xtrn[i]->misc&=~REALNAME;
914: changes=1; } }
915: break;
916: case 14:
917: k=0;
918: strcpy(opt[0],"Node Directory");
919: strcpy(opt[1],"Start-up Directory");
920: opt[2][0]=0;
921: SETHELP(WHERE);
922: /*
923: &Directory for Drop File:&
924:
925: You can have the data file created in the current &Node Directory& or the
926: &Start-up Directory& (if one is specified).
927: */
928: savnum=4;
929: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Create Drop File In"
930: ,opt);
931: if(!k && xtrn[i]->misc&STARTUPDIR) {
932: xtrn[i]->misc&=~STARTUPDIR;
933: changes=1; }
934: else if(k==1 && !(xtrn[i]->misc&STARTUPDIR)) {
935: xtrn[i]->misc|=STARTUPDIR;
936: changes=1; }
937: break;
938: case 15:
939: while(1) {
940: k=0;
941: if(xtrn[i]->textra)
942: sprintf(str,"%u minutes",xtrn[i]->textra);
943: else
944: strcpy(str,"None");
945: sprintf(opt[k++],"%-25.25s%s","Extra Time",str);
946: if(xtrn[i]->maxtime)
947: sprintf(str,"%u minutes",xtrn[i]->maxtime);
948: else
949: strcpy(str,"None");
950: sprintf(opt[k++],"%-25.25s%s","Maximum Time",str);
951: sprintf(opt[k++],"%-25.25s%s","Suspended (Free) Time"
952: ,xtrn[i]->misc&FREETIME ? "Yes" : "No");
953: opt[k][0]=0;
954: SETHELP(WHERE);
955: /*
956: &Online Program Time Options:&
957:
958: This sub-menu allows you to define specific preferences regarding the
959: time users spend running this program.
960: */
961: savnum=4;
962: k=ulist(WIN_SAV|WIN_ACT|WIN_RHT|WIN_BOT,0,0,40
963: ,&time_dflt,0
964: ,"Online Program Time Options",opt);
965: if(k==-1)
966: break;
967: savnum=5;
968: switch(k) {
969: case 0:
970: itoa(xtrn[i]->textra,str,10);
971: SETHELP(WHERE);
972: /*
973: &Extra Time to Give User in Program:&
974:
975: If you want to give users extra time while in this online program,
976: set this value to the number of minutes to add to their current time
977: left online.
978: */
979: uinput(WIN_MID|WIN_SAV,0,0
980: ,"Extra Time to Give User (in minutes)"
981: ,str,2,K_EDIT|K_NUMBER);
982: xtrn[i]->textra=atoi(str);
983: break;
984: case 1:
985: itoa(xtrn[i]->maxtime,str,10);
986: SETHELP(WHERE);
987: /*
988: &Maximum Time Allowed in Program:&
989:
990: If this program supports a drop file that contains the number of minutes
991: left online for the current user, this option allows the sysop to set
992: the maximum number of minutes that will be allowed in the drop file.
993:
994: Setting this option to &0&, disables this feature.
995: */
996: uinput(WIN_MID|WIN_SAV,0,0
997: ,"Maximum Time (in minutes, 0=disabled)"
998: ,str,2,K_EDIT|K_NUMBER);
999: xtrn[i]->maxtime=atoi(str);
1000: break;
1001: case 2:
1002: k=1;
1003: strcpy(opt[0],"Yes");
1004: strcpy(opt[1],"No");
1005: opt[2][0]=0;
1006: SETHELP(WHERE);
1007: /*
1008: &Suspended (Free) Time:&
1009:
1010: If you want the user's time online to be suspended while running this
1011: online program (e.g. Free Time), set this option to &Yes&.
1012: */
1013: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
1014: ,"Suspended (Free) Time",opt);
1015: if(!k && !(xtrn[i]->misc&FREETIME)) {
1016: xtrn[i]->misc|=FREETIME;
1017: changes=1; }
1018: else if(k==1 && xtrn[i]->misc&FREETIME) {
1019: xtrn[i]->misc&=~FREETIME;
1020: changes=1; }
1021: break; } }
1022: break;
1023:
1024: } } }
1025: }
1026:
1027: void xedit_cfg()
1028: {
1029: static int dflt,dfltopt,bar;
1030: char str[81],code[81],done=0,*p;
1031: int j,k;
1032: uint i;
1033: static xedit_t savxedit;
1034:
1035: while(1) {
1036: for(i=0;i<total_xedits && i<MAX_OPTS;i++)
1037: sprintf(opt[i],"%-8.8s %.40s",xedit[i]->code,xedit[i]->lcmd);
1038: opt[i][0]=0;
1039: j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_RHT;
1040: savnum=0;
1041: if(total_xedits)
1042: j|=WIN_DEL|WIN_GET;
1043: if(total_xedits<MAX_OPTS)
1044: j|=WIN_INS|WIN_INSACT|WIN_XTR;
1045: if(savxedit.name[0])
1046: j|=WIN_PUT;
1047: SETHELP(WHERE);
1048: /*
1049: &External Editors:&
1050:
1051: This is a list of the configured external editors.
1052:
1053: To add an editor, select the desired location and hit INS .
1054:
1055: To delete an editor, select it and hit DEL .
1056:
1057: To configure an editor, select it and hit ENTER .
1058: */
1059: i=ulist(j,0,0,45,&dflt,&bar,"External Editors",opt);
1060: if((signed)i==-1)
1061: return;
1062: if((i&MSK_ON)==MSK_INS) {
1063: i&=MSK_OFF;
1064: SETHELP(WHERE);
1065: /*
1066: &External Editor Name:&
1067:
1068: This is the name or description of the external editor.
1069: */
1070: if(uinput(WIN_MID|WIN_SAV,0,0,"External Editor Name",str,40
1071: ,0)<1)
1072: continue;
1073: sprintf(code,"%.8s",str);
1074: p=strchr(code,SP);
1075: if(p) *p=0;
1076: strupr(code);
1077: SETHELP(WHERE);
1078: /*
1079: &External Editor Internal Code:&
1080:
1081: This is the internal code for the external editor.
1082: */
1083: if(uinput(WIN_MID|WIN_SAV,0,0,"External Editor Internal Code",code,8
1084: ,K_UPPER|K_EDIT)<1)
1085: continue;
1086: if(!code_ok(code)) {
1087: helpbuf=invalid_code;
1088: umsg("Invalid Code");
1089: helpbuf=0;
1090: continue; }
1091:
1092: if((xedit=(xedit_t **)REALLOC(xedit
1093: ,sizeof(xedit_t *)*(total_xedits+1)))==NULL) {
1094: errormsg(WHERE,ERR_ALLOC,nulstr,total_xedits+1);
1095: total_xedits=0;
1096: bail(1);
1097: continue; }
1098: if(total_xedits)
1099: for(j=total_xedits;j>i;j--)
1100: xedit[j]=xedit[j-1];
1101: if((xedit[i]=(xedit_t *)MALLOC(sizeof(xedit_t)))==NULL) {
1102: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xedit_t));
1103: continue; }
1104: memset((xedit_t *)xedit[i],0,sizeof(xedit_t));
1105: strcpy(xedit[i]->name,str);
1106: strcpy(xedit[i]->code,code);
1107: total_xedits++;
1108: changes=1;
1109: continue; }
1110: if((i&MSK_ON)==MSK_DEL) {
1111: i&=MSK_OFF;
1112: FREE(xedit[i]);
1113: total_xedits--;
1114: for(j=i;j<total_xedits;j++)
1115: xedit[j]=xedit[j+1];
1116: changes=1;
1117: continue; }
1118: if((i&MSK_ON)==MSK_GET) {
1119: i&=MSK_OFF;
1120: savxedit=*xedit[i];
1121: continue; }
1122: if((i&MSK_ON)==MSK_PUT) {
1123: i&=MSK_OFF;
1124: *xedit[i]=savxedit;
1125: changes=1;
1126: continue; }
1127: done=0;
1128: while(!done) {
1129: k=0;
1130: sprintf(opt[k++],"%-32.32s%s","Name",xedit[i]->name);
1131: sprintf(opt[k++],"%-32.32s%s","Internal Code",xedit[i]->code);
1132: sprintf(opt[k++],"%-32.32s%.40s","Local Command Line",xedit[i]->lcmd);
1133: sprintf(opt[k++],"%-32.32s%.40s","Remote Command Line",xedit[i]->rcmd);
1134: sprintf(opt[k++],"%-32.32s%.40s","Access Requirements",xedit[i]->ar);
1135: sprintf(opt[k++],"%-32.32s%s%s","Intercept I/O Interrupts"
1136: ,xedit[i]->misc&IO_INTS ? "Yes":"No"
1137: ,xedit[i]->misc&WWIVCOLOR ? ", WWIV" : nulstr);
1138: sprintf(opt[k++],"%-32.32s%s","Quoted Text"
1139: ,xedit[i]->misc"EALL ? "All":xedit[i]->misc"ENONE
1140: ? "None" : "Prompt User");
1141: sprintf(opt[k++],"%-32.32s%s","QuickBBS Style (MSGTMP)"
1142: ,xedit[i]->misc&QUICKBBS ? "Yes":"No");
1143: sprintf(opt[k++],"%-32.32s%s","Expand Line Feeds to CRLF"
1144: ,xedit[i]->misc&EXPANDLF ? "Yes":"No");
1145: switch(xedit[i]->type) {
1146: case XTRN_SBBS:
1147: sprintf(str,"%-15s %s","Synchronet","XTRN.DAT");
1148: break;
1149: case XTRN_WWIV:
1150: sprintf(str,"%-15s %s","WWIV","CHAIN.TXT");
1151: break;
1152: case XTRN_GAP:
1153: sprintf(str,"%-15s %s","GAP","DOOR.SYS");
1154: break;
1155: case XTRN_RBBS:
1156: sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
1157: break;
1158: case XTRN_RBBS1:
1159: sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
1160: break;
1161: case XTRN_WILDCAT:
1162: sprintf(str,"%-15s %s","Wildcat","CALLINFO.BBS");
1163: break;
1164: case XTRN_PCBOARD:
1165: sprintf(str,"%-15s %s","PCBoard","PCBOARD.SYS");
1166: break;
1167: case XTRN_SPITFIRE:
1168: sprintf(str,"%-15s %s","SpitFire","SFDOORS.DAT");
1169: break;
1170: case XTRN_UTI:
1171: sprintf(str,"%-15s %s","MegaMail","UTIDOOR.TXT");
1172: break;
1173: case XTRN_SR:
1174: sprintf(str,"%-15s %s","Solar Realms","DOORFILE.SR");
1175: break;
1176: case XTRN_TRIBBS:
1177: sprintf(str,"%-15s %s","TriBBS","TRIBBS.SYS");
1178: break;
1179: default:
1180: strcpy(str,"None");
1181: break; }
1182: sprintf(opt[k++],"%-32.32s%s","BBS Drop File Type",str);
1183: opt[k][0]=0;
1184: SETHELP(WHERE);
1185: /*
1186: &External Editor Configuration:&
1187:
1188: This menu allows you to change the settings for the selected external
1189: message editor. External message editors are very common on BBSs. Some
1190: popular editors include &SyncEdit&, &WWIVedit&, &FEdit&, &GEdit&, &IceEdit&,
1191: and many others.
1192: */
1193:
1194: savnum=1;
1195: sprintf(str,"%s Editor",xedit[i]->name);
1196: switch(ulist(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT,0,0,70,&dfltopt,0
1197: ,str,opt)) {
1198: case -1:
1199: done=1;
1200: break;
1201: case 0:
1202: SETHELP(WHERE);
1203: /*
1204: &External Editor Name:&
1205:
1206: This is the name or description of the external editor.
1207: */
1208: strcpy(str,xedit[i]->name);
1209: if(!uinput(WIN_MID|WIN_SAV,0,10,"External Editor Name"
1210: ,xedit[i]->name,40,K_EDIT))
1211: strcpy(xedit[i]->name,str);
1212: break;
1213: case 1:
1214: strcpy(str,xedit[i]->code);
1215: SETHELP(WHERE);
1216: /*
1217: &External Editor Internal Code:&
1218:
1219: Every external editor must have its own unique internal code for
1220: Synchronet to reference it by. It is helpful if this code is an
1221: abreviation of the name.
1222: */
1223: uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
1224: ,str,8,K_EDIT|K_UPPER);
1225: if(code_ok(str))
1226: strcpy(xedit[i]->code,str);
1227: else {
1228: helpbuf=invalid_code;
1229: umsg("Invalid Code");
1230: helpbuf=0; }
1231: break;
1232: case 2:
1233: SETHELP(WHERE);
1234: /*
1235: &External Editor Local Command Line:&
1236:
1237: This is the command line to execute when using this editor locally.
1238: */
1239: uinput(WIN_MID|WIN_SAV,0,10,"Local"
1240: ,xedit[i]->lcmd,50,K_EDIT);
1241: break;
1242:
1243: case 3:
1244: SETHELP(WHERE);
1245: /*
1246: &External Editor Remote Command Line:&
1247:
1248: This is the command line to execute when using this editor remotely.
1249: */
1250: uinput(WIN_MID|WIN_SAV,0,10,"Remote"
1251: ,xedit[i]->rcmd,50,K_EDIT);
1252: break;
1253: case 4:
1254: savnum=2;
1255: sprintf(str,"%s External Editor",xedit[i]->name);
1256: getar(str,xedit[i]->ar);
1257: break;
1258: case 5:
1259: k=1;
1260: strcpy(opt[0],"Yes");
1261: strcpy(opt[1],"No");
1262: opt[2][0]=0;
1263: savnum=2;
1264: SETHELP(WHERE);
1265: /*
1266: &Intercept I/O Interrupts:&
1267:
1268: If this external editor has its own serial communication abilities or
1269: requires a FOSSIL driver, set this option to &No&.
1270: */
1271: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts"
1272: ,opt);
1273: if(!k && !(xedit[i]->misc&IO_INTS)) {
1274: xedit[i]->misc|=IO_INTS;
1275: changes=1; }
1276: else if(k==1 && xedit[i]->misc&IO_INTS) {
1277: xedit[i]->misc&=~(IO_INTS|WWIVCOLOR);
1278: changes=1; }
1279: if(!(xedit[i]->misc&IO_INTS))
1280: break;
1281: k=1;
1282: strcpy(opt[0],"Yes");
1283: strcpy(opt[1],"No");
1284: opt[2][0]=0;
1285: savnum=2;
1286: SETHELP(WHERE);
1287: /*
1288: &Editor Uses WWIV Color Codes:&
1289:
1290: If this editor was written for use exclusively under WWIV, set this
1291: option to &Yes&.
1292: */
1293: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
1294: ,"Editor Uses WWIV Color Codes",opt);
1295: if(!k && !(xedit[i]->misc&WWIVCOLOR)) {
1296: xedit[i]->misc|=WWIVCOLOR;
1297: changes=1; }
1298: else if(k==1 && xedit[i]->misc&WWIVCOLOR) {
1299: xedit[i]->misc&=~WWIVCOLOR;
1300: changes=1; }
1301: break;
1302: case 6:
1303: k=3;
1304: strcpy(opt[0],"All");
1305: strcpy(opt[1],"None");
1306: strcpy(opt[2],"Prompt User");
1307: opt[3][0]=0;
1308: savnum=2;
1309: SETHELP(WHERE);
1310: /*
1311: &Quoted Text:&
1312:
1313: If you want all the message text to be automatically entered into the
1314: message edit/quote file (&INPUT.MSG& or &MSGTMP&), select &All&.
1315:
1316: If you want the user to be prompted for which lines to quote before
1317: running the editor, select &Prompt User&.
1318:
1319: If you want none of the lines to be automatically quoted, select &None&.
1320: This option is mainly for use with editors that support the "ES.TXT&
1321: drop file (like &SyncEdit v2.x&).
1322: */
1323: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Quoted Text"
1324: ,opt);
1325: if(!k && !(xedit[i]->misc"EALL)) {
1326: xedit[i]->misc|=QUOTEALL;
1327: xedit[i]->misc&=~QUOTENONE;
1328: changes=1; }
1329: else if(k==1 && !(xedit[i]->misc"ENONE)) {
1330: xedit[i]->misc|=QUOTENONE;
1331: xedit[i]->misc&=~QUOTEALL;
1332: changes=1; }
1333: else if(k==2 && xedit[i]->misc&(QUOTENONE|QUOTEALL)) {
1334: xedit[i]->misc&=~(QUOTENONE|QUOTEALL);
1335: changes=1; }
1336: break;
1337: case 7:
1338: k=1;
1339: strcpy(opt[0],"Yes");
1340: strcpy(opt[1],"No");
1341: opt[2][0]=0;
1342: savnum=2;
1343: SETHELP(WHERE);
1344: /*
1345: &QuickBBS Style (MSGTMP):&
1346:
1347: If this external editor uses the QuickBBS style MSGTMP interface, set
1348: this option to &Yes&.
1349: */
1350: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"QuickBBS Style (MSGTMP)"
1351: ,opt);
1352: if(!k && !(xedit[i]->misc&QUICKBBS)) {
1353: xedit[i]->misc|=QUICKBBS;
1354: changes=1; }
1355: else if(k==1 && xedit[i]->misc&QUICKBBS) {
1356: xedit[i]->misc&=~QUICKBBS;
1357: changes=1; }
1358: break;
1359: case 8:
1360: k=1;
1361: strcpy(opt[0],"Yes");
1362: strcpy(opt[1],"No");
1363: opt[2][0]=0;
1364: savnum=2;
1365: SETHELP(WHERE);
1366: /*
1367: &Expand Line Feeds to Carriage Return/Line Feed Pairs:&
1368:
1369: If this external editor saves new lines as a single line feed character
1370: instead of a carriage return/line feed pair, set this option to &Yes&.
1371: */
1372: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Expand LF to CRLF"
1373: ,opt);
1374: if(!k && !(xedit[i]->misc&EXPANDLF)) {
1375: xedit[i]->misc|=EXPANDLF;
1376: changes=1; }
1377: else if(k==1 && xedit[i]->misc&EXPANDLF) {
1378: xedit[i]->misc&=~EXPANDLF;
1379: changes=1; }
1380: break;
1381: case 9:
1382: k=0;
1383: strcpy(opt[k++],"None");
1384: sprintf(opt[k++],"%-15s %s","Synchronet","XTRN.DAT");
1385: sprintf(opt[k++],"%-15s %s","WWIV","CHAIN.TXT");
1386: sprintf(opt[k++],"%-15s %s","GAP","DOOR.SYS");
1387: sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
1388: sprintf(opt[k++],"%-15s %s","Wildcat","CALLINFO.BBS");
1389: sprintf(opt[k++],"%-15s %s","PCBoard","PCBOARD.SYS");
1390: sprintf(opt[k++],"%-15s %s","SpitFire","SFDOORS.DAT");
1391: sprintf(opt[k++],"%-15s %s","MegaMail","UTIDOOR.TXT");
1392: sprintf(opt[k++],"%-15s %s","Solar Realms","DOORFILE.SR");
1393: sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
1394: sprintf(opt[k++],"%-15s %s","TriBBS","TRIBBS.SYS");
1395: opt[k][0]=0;
1396: k=xedit[i]->type;
1397: SETHELP(WHERE);
1398: /*
1399: &External Program BBS Drop File Type:&
1400:
1401: If this external editor requires a specific BBS data (drop) file
1402: format, select the file format from the list.
1403: */
1404: savnum=2;
1405: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
1406: ,"BBS Drop File Type",opt);
1407: if(k==-1)
1408: break;
1409: if(xedit[i]->type!=k) {
1410: xedit[i]->type=k;
1411: changes=1; }
1412: break;
1413:
1414: } } }
1415: }
1416:
1417:
1418: void swap_cfg()
1419: {
1420: static int dflt,bar;
1421: char str[81];
1422: int j,k;
1423: uint i;
1424:
1425: while(1) {
1426: for(i=0;i<MAX_OPTS && i<total_swaps;i++)
1427: sprintf(opt[i],"%-25s",swap[i]->cmd);
1428: opt[i][0]=0;
1429: j=WIN_ACT|WIN_CHE|WIN_L2R|WIN_SAV;
1430: savnum=0;
1431: if(total_swaps)
1432: j|=WIN_DEL;
1433: if(total_swaps<MAX_OPTS)
1434: j|=WIN_INS|WIN_INSACT|WIN_XTR;
1435: SETHELP(WHERE);
1436: /*
1437: &External Program Global Swap List:&
1438:
1439: This is a list of the external program (executable file) names to swap
1440: the BBS out of memory for. They are termed &Global& because if you add
1441: a program name to this list, the BBS will swap to run it regardless of
1442: when, where, or why the program is run from the BBS.
1443:
1444: Use INS and DELETE to add and remove swappable programs.
1445:
1446: To change the filename of a program, hit ENTER .
1447:
1448: To swap whenever &PKZIP& is run, add &PKZIP& to the list.
1449:
1450: To swap for all &DOS Shells&, add &COMMAND.COM& to the list.
1451: */
1452: i=ulist(j,0,0,17,&dflt,&bar,"Global Swap List",opt);
1453: if((signed)i==-1)
1454: return;
1455: if((i&MSK_ON)==MSK_INS) {
1456: i&=MSK_OFF;
1457: SETHELP(WHERE);
1458: /*
1459: &Swappable Program Name:&
1460:
1461: This is the executable filename of the external program.
1462: */
1463: if(uinput(WIN_MID|WIN_SAV,0,0,"Program Name",str,12
1464: ,K_UPPER)<1)
1465: continue;
1466: if((swap=(swap_t **)REALLOC(swap
1467: ,sizeof(swap_t *)*(total_swaps+1)))==NULL) {
1468: errormsg(WHERE,ERR_ALLOC,nulstr,total_swaps+1);
1469: total_swaps=0;
1470: bail(1);
1471: continue; }
1472: if(total_swaps)
1473: for(j=total_swaps;j>i;j--)
1474: swap[j]=swap[j-1];
1475: if((swap[i]=(swap_t *)MALLOC(sizeof(swap_t)))==NULL) {
1476: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(swap_t));
1477: continue; }
1478: memset((swap_t *)swap[i],0,sizeof(swap_t));
1479: strcpy(swap[i]->cmd,str);
1480: total_swaps++;
1481: changes=1;
1482: continue; }
1483: if((i&MSK_ON)==MSK_DEL) {
1484: i&=MSK_OFF;
1485: FREE(swap[i]);
1486: total_swaps--;
1487: for(j=i;j<total_swaps;j++)
1488: swap[j]=swap[j+1];
1489: changes=1;
1490: continue; }
1491: SETHELP(WHERE);
1492: /*
1493: &Swappable Program Name:&
1494:
1495: This is the executable filename of the external program.
1496: */
1497: strcpy(str,swap[i]->cmd);
1498: if(uinput(WIN_MID|WIN_SAV,0,5,"Program Name",str,12
1499: ,K_UPPER|K_EDIT)>0)
1500: strcpy(swap[i]->cmd,str); }
1501: }
1502:
1503: int os2pgm_cfg()
1504: {
1505: static int dflt,bar;
1506: char str[81];
1507: int j,k;
1508: uint i;
1509:
1510: while(1) {
1511: for(i=0;i<MAX_OPTS && i<total_os2pgms;i++)
1512: sprintf(opt[i],"%-12s %-12s",os2pgm[i]->name
1513: ,os2pgm[i]->misc&OS2_POPEN ? "(port open)":nulstr);
1514: opt[i][0]=0;
1515: j=WIN_ACT|WIN_CHE|WIN_L2R|WIN_SAV;
1516: savnum=0;
1517: if(total_os2pgms)
1518: j|=WIN_DEL;
1519: if(total_os2pgms<MAX_OPTS)
1520: j|=WIN_INS|WIN_INSACT|WIN_XTR;
1521: SETHELP(WHERE);
1522: /*
1523: &OS/2 Program List:&
1524:
1525: This is a list of all native OS/2 external program (executable file)
1526: names that you may execute under &Synchronet for OS/2&. This list is not
1527: used in Synchronet for DOS. Any programs not listed here will be assumed
1528: to be DOS programs and executed accordingly.
1529:
1530: Use INS and DELETE to add and remove OS/2 programs.
1531:
1532: To change the filename of a program, hit ENTER .
1533: */
1534: i=ulist(j,0,0,30,&dflt,&bar,"OS/2 Program List",opt);
1535: if((signed)i==-1)
1536: break;
1537: if((i&MSK_ON)==MSK_INS) {
1538: i&=MSK_OFF;
1539: SETHELP(WHERE);
1540: /*
1541: &OS/2 Program Name:&
1542:
1543: This is the executable filename of the OS/2 external program.
1544: */
1545: if(uinput(WIN_MID|WIN_SAV,0,0,"OS/2 Program Name",str,12
1546: ,K_UPPER)<1)
1547: continue;
1548: if((os2pgm=(os2pgm_t **)REALLOC(os2pgm
1549: ,sizeof(os2pgm_t *)*(total_os2pgms+1)))==NULL) {
1550: errormsg(WHERE,ERR_ALLOC,nulstr,total_os2pgms+1);
1551: total_os2pgms=0;
1552: bail(1);
1553: continue; }
1554: if(total_os2pgms)
1555: for(j=total_os2pgms;j>i;j--)
1556: os2pgm[j]=os2pgm[j-1];
1557: if((os2pgm[i]=(os2pgm_t *)MALLOC(sizeof(os2pgm_t)))==NULL) {
1558: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(os2pgm_t));
1559: continue; }
1560: memset((os2pgm_t *)os2pgm[i],0,sizeof(os2pgm_t));
1561: strcpy(os2pgm[i]->name,str);
1562:
1563: SETHELP(WHERE);
1564: /*
1565: &Leave COM Port Open During Execution:&
1566:
1567: If this program accesses the COM port via handle (currently open COM
1568: port), set this option to &Yes&, otherwise set it to &No&.
1569: */
1570: strcpy(opt[0],"Yes (This Program Uses Port Handle)");
1571: strcpy(opt[1],"No (This Program Uses Port Number)");
1572: opt[2][0]=0;
1573: j=1;
1574: if(ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
1575: ,"Leave COM Port Open During Execution?",opt)==0)
1576: os2pgm[i]->misc|=OS2_POPEN;
1577: total_os2pgms++;
1578: changes=1;
1579: continue; }
1580: if((i&MSK_ON)==MSK_DEL) {
1581: i&=MSK_OFF;
1582: FREE(os2pgm[i]);
1583: total_os2pgms--;
1584: for(j=i;j<total_os2pgms;j++)
1585: os2pgm[j]=os2pgm[j+1];
1586: changes=1;
1587: continue; }
1588: SETHELP(WHERE);
1589: /*
1590: &OS/2 Program Name:&
1591:
1592: This is the executable filename of the OS/2 external program.
1593: */
1594: strcpy(str,os2pgm[i]->name);
1595: if(uinput(WIN_MID|WIN_SAV,0,5,"OS/2 Program Name",str,12
1596: ,K_UPPER|K_EDIT)>0)
1597: strcpy(os2pgm[i]->name,str);
1598:
1599: SETHELP(WHERE);
1600: /*
1601: &Leave COM Port Open During Execution:&
1602:
1603: If this program accesses the COM port via handle (currently open COM
1604: port), set this option to &Yes&, otherwise set it to &No&.
1605: */
1606: strcpy(opt[0],"Yes (This Program Uses Port Handle)");
1607: strcpy(opt[1],"No (This Program Uses Port Number)");
1608: opt[2][0]=0;
1609: j=1;
1610: savnum=1;
1611: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
1612: ,"Leave COM Port Open During Execution",opt);
1613: if(j==0 && !(os2pgm[i]->misc&OS2_POPEN)) {
1614: os2pgm[i]->misc|=OS2_POPEN;
1615: changes=1; }
1616: else if(j==1 && os2pgm[i]->misc&OS2_POPEN) {
1617: os2pgm[i]->misc&=~OS2_POPEN;
1618: changes=1; }
1619: }
1620: return(0);
1621: }
1622:
1623:
1624: void xtrnsec_cfg()
1625: {
1626: static int xtrnsec_dflt,xtrnsec_opt;
1627: char str[81],code[9],done=0,*p;
1628: int j,k;
1629: uint i;
1630: static xtrnsec_t savxtrnsec;
1631:
1632: while(1) {
1633: for(i=0;i<total_xtrnsecs && i<MAX_OPTS;i++)
1634: sprintf(opt[i],"%-25s",xtrnsec[i]->name);
1635: opt[i][0]=0;
1636: j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_BOT;
1637: savnum=0;
1638: if(total_xtrnsecs)
1639: j|=WIN_DEL|WIN_GET;
1640: if(total_xtrnsecs<MAX_OPTS)
1641: j|=WIN_INS|WIN_INSACT|WIN_XTR;
1642: if(savxtrnsec.name[0])
1643: j|=WIN_PUT;
1644: SETHELP(WHERE);
1645: /*
1646: &Online Program Sections:&
1647:
1648: This is a list of &Online Program Sections& configured for your system.
1649:
1650: To add an online program section, select the desired location with the
1651: arrow keys and hit INS .
1652:
1653: To delete an online program section, select it and hit DEL .
1654:
1655: To configure an online program section, select it and hit ENTER .
1656: */
1657: i=ulist(j,0,0,45,&xtrnsec_dflt,0,"Online Program Sections",opt);
1658: if((signed)i==-1)
1659: return;
1660: if((i&MSK_ON)==MSK_INS) {
1661: i&=MSK_OFF;
1662: SETHELP(WHERE);
1663: /*
1664: &Online Program Section Name:&
1665:
1666: This is the name of this section.
1667: */
1668: if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Section Name",str,40
1669: ,0)<1)
1670: continue;
1671: sprintf(code,"%.8s",str);
1672: p=strchr(code,SP);
1673: if(p) *p=0;
1674: strupr(code);
1675: SETHELP(WHERE);
1676: /*
1677: &Online Program Section Internal Code:&
1678:
1679: Every online program section must have its own unique internal code
1680: for Synchronet to reference it by. It is helpful if this code is an
1681: abreviation of the name.
1682: */
1683: if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Section Internal Code"
1684: ,code,8,K_EDIT|K_UPPER)<1)
1685: continue;
1686: if(!code_ok(code)) {
1687: helpbuf=invalid_code;
1688: umsg("Invalid Code");
1689: helpbuf=0;
1690: continue; }
1691: if((xtrnsec=(xtrnsec_t **)REALLOC(xtrnsec
1692: ,sizeof(xtrnsec_t *)*(total_xtrnsecs+1)))==NULL) {
1693: errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrnsecs+1);
1694: total_xtrnsecs=0;
1695: bail(1);
1696: continue; }
1697: if(total_xtrnsecs) {
1698: for(j=total_xtrnsecs;j>i;j--)
1699: xtrnsec[j]=xtrnsec[j-1];
1700: for(j=0;j<total_xtrns;j++)
1701: if(xtrn[j]->sec>=i)
1702: xtrn[j]->sec++; }
1703:
1704:
1705: if((xtrnsec[i]=(xtrnsec_t *)MALLOC(sizeof(xtrnsec_t)))==NULL) {
1706: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xtrnsec_t));
1707: continue; }
1708: memset((xtrnsec_t *)xtrnsec[i],0,sizeof(xtrnsec_t));
1709: strcpy(xtrnsec[i]->name,str);
1710: strcpy(xtrnsec[i]->code,code);
1711: total_xtrnsecs++;
1712: changes=1;
1713: continue; }
1714: if((i&MSK_ON)==MSK_DEL) {
1715: i&=MSK_OFF;
1716: FREE(xtrnsec[i]);
1717: for(j=0;j<total_xtrns;) {
1718: if(xtrn[j]->sec==i) { /* delete xtrns of this group */
1719: FREE(xtrn[j]);
1720: total_xtrns--;
1721: k=j;
1722: while(k<total_xtrns) { /* move all xtrns down */
1723: xtrn[k]=xtrn[k+1];
1724: k++; } }
1725: else j++; }
1726: for(j=0;j<total_xtrns;j++) /* move xtrn group numbers down */
1727: if(xtrn[j]->sec>i)
1728: xtrn[j]->sec--;
1729: total_xtrnsecs--;
1730: while(i<total_xtrnsecs) {
1731: xtrnsec[i]=xtrnsec[i+1];
1732: i++; }
1733: changes=1;
1734: continue; }
1735: if((i&MSK_ON)==MSK_GET) {
1736: i&=MSK_OFF;
1737: savxtrnsec=*xtrnsec[i];
1738: continue; }
1739: if((i&MSK_ON)==MSK_PUT) {
1740: i&=MSK_OFF;
1741: *xtrnsec[i]=savxtrnsec;
1742: changes=1;
1743: continue; }
1744: done=0;
1745: while(!done) {
1746: k=0;
1747: sprintf(opt[k++],"%-27.27s%s","Name",xtrnsec[i]->name);
1748: sprintf(opt[k++],"%-27.27s%s","Internal Code",xtrnsec[i]->code);
1749: sprintf(opt[k++],"%-27.27s%.40s","Access Requirements"
1750: ,xtrnsec[i]->ar);
1751: sprintf(opt[k++],"%s","Available Online Programs...");
1752: opt[k][0]=0;
1753: savnum=1;
1754: sprintf(str,"%s Program Section",xtrnsec[i]->name);
1755: switch(ulist(WIN_SAV|WIN_ACT|WIN_MID,0,0,60,&xtrnsec_opt,0,str
1756: ,opt)) {
1757: case -1:
1758: done=1;
1759: break;
1760: case 0:
1761: SETHELP(WHERE);
1762: /*
1763: &Online Program Section Name:&
1764:
1765: This is the name of this section.
1766: */
1767: strcpy(str,xtrnsec[i]->name); /* save */
1768: if(!uinput(WIN_MID|WIN_SAV,0,10
1769: ,"Online Program Section Name"
1770: ,xtrnsec[i]->name,40,K_EDIT))
1771: strcpy(xtrnsec[i]->name,str);
1772: break;
1773: case 1:
1774: strcpy(str,xtrnsec[i]->code);
1775: SETHELP(WHERE);
1776: /*
1777: &Online Program Section Internal Code:&
1778:
1779: Every online program section must have its own unique internal code
1780: for Synchronet to reference it by. It is helpful if this code is an
1781: abreviation of the name.
1782: */
1783: uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
1784: ,str,8,K_EDIT|K_UPPER);
1785: if(code_ok(str))
1786: strcpy(xtrnsec[i]->code,str);
1787: else {
1788: helpbuf=invalid_code;
1789: umsg("Invalid Code");
1790: helpbuf=0; }
1791: break;
1792: case 2:
1793: getar(xtrnsec[i]->name,xtrnsec[i]->ar);
1794: break;
1795: case 3:
1796: xtrn_cfg(i);
1797: break; } } }
1798: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.