|
|
1.1 root 1: /* scfglib2.c */
2:
3: /* Synchronet configuration library routines */
4:
5: /* $Id: scfglib2.c,v 1.39 2005/09/20 03:39:52 deuce Exp $ */
6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
11: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html *
12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #include "sbbs.h"
39: #include "scfglib.h"
40:
41: /****************************************************************************/
42: /* Reads in LIBS.CNF and initializes the associated variables */
43: /****************************************************************************/
44: BOOL read_file_cfg(scfg_t* cfg, char* error)
45: {
46: char str[MAX_PATH+1],fname[13],c,cmd[LEN_CMD+1];
47: short i,j,n;
48: long offset=0,t;
49: FILE *instream;
50:
51: strcpy(fname,"file.cnf");
52: sprintf(str,"%s%s",cfg->ctrl_dir,fname);
53: if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
54: sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
55: return(FALSE);
56: }
57:
58: get_int(cfg->min_dspace,instream);
59: get_int(cfg->max_batup,instream);
60:
61: get_int(cfg->max_batdn,instream);
62:
63: get_int(cfg->max_userxfer,instream);
64:
65: get_int(t,instream); /* unused - was cdt_byte_value */
66: get_int(cfg->cdt_up_pct,instream);
67: get_int(cfg->cdt_dn_pct,instream);
68: get_int(t,instream); /* unused - was temp_ext */
69: get_str(cmd,instream); /* unused - was temp_cmd */
70: get_int(cfg->leech_pct,instream);
71: get_int(cfg->leech_sec,instream);
72: get_int(cfg->file_misc,instream);
73:
74: for(i=0;i<30;i++)
75: get_int(n,instream);
76:
77: /**************************/
78: /* Extractable File Types */
79: /**************************/
80:
81: get_int(cfg->total_fextrs,instream);
82:
83: if(cfg->total_fextrs) {
84: if((cfg->fextr=(fextr_t **)malloc(sizeof(fextr_t *)*cfg->total_fextrs))==NULL)
85: return allocerr(instream,error,offset,fname,sizeof(fextr_t*)*cfg->total_fextrs);
86: } else
87: cfg->fextr=NULL;
88:
89: for(i=0; i<cfg->total_fextrs; i++) {
90: if(feof(instream))
91: break;
92: if((cfg->fextr[i]=(fextr_t *)malloc(sizeof(fextr_t)))==NULL)
93: return allocerr(instream,error,offset,fname,sizeof(fextr_t));
94: memset(cfg->fextr[i],0,sizeof(fextr_t));
95: get_str(cfg->fextr[i]->ext,instream);
96: get_str(cfg->fextr[i]->cmd,instream);
97: get_str(cfg->fextr[i]->arstr,instream);
98: cfg->fextr[i]->ar=ARSTR(cfg->fextr[i]->arstr,cfg);
99:
100: for(j=0;j<8;j++)
101: get_int(n,instream);
102: }
103: cfg->total_fextrs=i;
104:
105: /***************************/
106: /* Compressable File Types */
107: /***************************/
108:
109: get_int(cfg->total_fcomps,instream);
110:
111: if(cfg->total_fcomps) {
112: if((cfg->fcomp=(fcomp_t **)malloc(sizeof(fcomp_t *)*cfg->total_fcomps))==NULL)
113: return allocerr(instream,error,offset,fname,sizeof(fcomp_t*)*cfg->total_fcomps);
114: } else
115: cfg->fcomp=NULL;
116:
117: for(i=0; i<cfg->total_fcomps; i++) {
118: if(feof(instream))
119: break;
120: if((cfg->fcomp[i]=(fcomp_t *)malloc(sizeof(fcomp_t)))==NULL)
121: return allocerr(instream,error,offset,fname,sizeof(fcomp_t));
122: memset(cfg->fcomp[i],0,sizeof(fcomp_t));
123: get_str(cfg->fcomp[i]->ext,instream);
124: get_str(cfg->fcomp[i]->cmd,instream);
125: get_str(cfg->fcomp[i]->arstr,instream);
126: cfg->fcomp[i]->ar=ARSTR(cfg->fcomp[i]->arstr,cfg);
127:
128: for(j=0;j<8;j++)
129: get_int(n,instream);
130: }
131: cfg->total_fcomps=i;
132:
133: /***********************/
134: /* Viewable File Types */
135: /***********************/
136:
137: get_int(cfg->total_fviews,instream);
138:
139: if(cfg->total_fviews) {
140: if((cfg->fview=(fview_t **)malloc(sizeof(fview_t *)*cfg->total_fviews))==NULL)
141: return allocerr(instream,error,offset,fname,sizeof(fview_t*)*cfg->total_fviews);
142: } else
143: cfg->fview=NULL;
144:
145: for(i=0; i<cfg->total_fviews; i++) {
146: if(feof(instream)) break;
147: if((cfg->fview[i]=(fview_t *)malloc(sizeof(fview_t)))==NULL)
148: return allocerr(instream,error,offset,fname,sizeof(fview_t));
149: memset(cfg->fview[i],0,sizeof(fview_t));
150: get_str(cfg->fview[i]->ext,instream);
151: get_str(cfg->fview[i]->cmd,instream);
152: get_str(cfg->fview[i]->arstr,instream);
153: cfg->fview[i]->ar=ARSTR(cfg->fview[i]->arstr,cfg);
154:
155: for(j=0;j<8;j++)
156: get_int(n,instream);
157: }
158: cfg->total_fviews=i;
159:
160: /***********************/
161: /* Testable File Types */
162: /***********************/
163:
164: get_int(cfg->total_ftests,instream);
165:
166: if(cfg->total_ftests) {
167: if((cfg->ftest=(ftest_t **)malloc(sizeof(ftest_t *)*cfg->total_ftests))==NULL)
168: return allocerr(instream,error,offset,fname,sizeof(ftest_t*)*cfg->total_ftests);
169: } else
170: cfg->ftest=NULL;
171:
172: for(i=0; i<cfg->total_ftests; i++) {
173: if(feof(instream)) break;
174: if((cfg->ftest[i]=(ftest_t *)malloc(sizeof(ftest_t)))==NULL)
175: return allocerr(instream,error,offset,fname,sizeof(ftest_t));
176: memset(cfg->ftest[i],0,sizeof(ftest_t));
177: get_str(cfg->ftest[i]->ext,instream);
178: get_str(cfg->ftest[i]->cmd,instream);
179: get_str(cfg->ftest[i]->workstr,instream);
180: get_str(cfg->ftest[i]->arstr,instream);
181: cfg->ftest[i]->ar=ARSTR(cfg->ftest[i]->arstr,cfg);
182:
183: for(j=0;j<8;j++)
184: get_int(n,instream);
185: }
186: cfg->total_ftests=i;
187:
188: /*******************/
189: /* Download events */
190: /*******************/
191:
192: get_int(cfg->total_dlevents,instream);
193:
194: if(cfg->total_dlevents) {
195: if((cfg->dlevent=(dlevent_t **)malloc(sizeof(dlevent_t *)*cfg->total_dlevents))
196: ==NULL)
197: return allocerr(instream,error,offset,fname,sizeof(dlevent_t*)*cfg->total_dlevents);
198: } else
199: cfg->dlevent=NULL;
200:
201: for(i=0; i<cfg->total_dlevents; i++) {
202: if(feof(instream)) break;
203: if((cfg->dlevent[i]=(dlevent_t *)malloc(sizeof(dlevent_t)))==NULL)
204: return allocerr(instream,error,offset,fname,sizeof(dlevent_t));
205: memset(cfg->dlevent[i],0,sizeof(dlevent_t));
206: get_str(cfg->dlevent[i]->ext,instream);
207: get_str(cfg->dlevent[i]->cmd,instream);
208: get_str(cfg->dlevent[i]->workstr,instream);
209: get_str(cfg->dlevent[i]->arstr,instream);
210: cfg->dlevent[i]->ar=ARSTR(cfg->dlevent[i]->arstr,cfg);
211:
212: for(j=0;j<8;j++)
213: get_int(n,instream);
214: }
215: cfg->total_dlevents=i;
216:
217:
218: /***************************/
219: /* File Transfer Protocols */
220: /***************************/
221:
222: get_int(cfg->total_prots,instream);
223:
224: if(cfg->total_prots) {
225: if((cfg->prot=(prot_t **)malloc(sizeof(prot_t *)*cfg->total_prots))==NULL)
226: return allocerr(instream,error,offset,fname,sizeof(prot_t*)*cfg->total_prots);
227: } else
228: cfg->prot=NULL;
229:
230: for(i=0;i<cfg->total_prots;i++) {
231: if(feof(instream)) break;
232: if((cfg->prot[i]=(prot_t *)malloc(sizeof(prot_t)))==NULL)
233: return allocerr(instream,error,offset,fname,sizeof(prot_t));
234: memset(cfg->prot[i],0,sizeof(prot_t));
235:
236: get_int(cfg->prot[i]->mnemonic,instream);
237: get_str(cfg->prot[i]->name,instream);
238: get_str(cfg->prot[i]->ulcmd,instream);
239: get_str(cfg->prot[i]->dlcmd,instream);
240: get_str(cfg->prot[i]->batulcmd,instream);
241: get_str(cfg->prot[i]->batdlcmd,instream);
242: get_str(cfg->prot[i]->blindcmd,instream);
243: get_str(cfg->prot[i]->bicmd,instream);
244: get_int(cfg->prot[i]->misc,instream);
245: get_str(cfg->prot[i]->arstr,instream);
246: cfg->prot[i]->ar=ARSTR(cfg->prot[i]->arstr,cfg);
247:
248: for(j=0;j<8;j++)
249: get_int(n,instream);
250: }
251: cfg->total_prots=i;
252:
253: /************************/
254: /* Alternate File Paths */
255: /************************/
256:
257: get_int(cfg->altpaths,instream);
258:
259: if(cfg->altpaths) {
260: if((cfg->altpath=(char **)malloc(sizeof(char *)*cfg->altpaths))==NULL)
261: return allocerr(instream,error,offset,fname,sizeof(char *)*cfg->altpaths);
262: } else
263: cfg->altpath=NULL;
264:
265: for(i=0;i<cfg->altpaths;i++) {
266: if(feof(instream)) break;
267: fread(str,LEN_DIR+1,1,instream);
268: offset+=LEN_DIR+1;
269: backslash(str);
270: j=LEN_DIR+1;
271: if((cfg->altpath[i]=(char *)malloc(j))==NULL)
272: return allocerr(instream,error,offset,fname,j);
273: memset(cfg->altpath[i],0,j);
274: strcpy(cfg->altpath[i],str);
275: for(j=0;j<8;j++)
276: get_int(n,instream);
277: }
278:
279: cfg->altpaths=i;
280:
281: /******************/
282: /* File Libraries */
283: /******************/
284:
285: get_int(cfg->total_libs,instream);
286:
287: if(cfg->total_libs) {
288: if((cfg->lib=(lib_t **)malloc(sizeof(lib_t *)*cfg->total_libs))==NULL)
289: return allocerr(instream,error,offset,fname,sizeof(lib_t *)*cfg->total_libs);
290: } else
291: cfg->lib=NULL;
292:
293: for(i=0;i<cfg->total_libs;i++) {
294: if(feof(instream)) break;
295: if((cfg->lib[i]=(lib_t *)malloc(sizeof(lib_t)))==NULL)
296: return allocerr(instream,error,offset,fname,sizeof(lib_t));
297: memset(cfg->lib[i],0,sizeof(lib_t));
298: cfg->lib[i]->offline_dir=INVALID_DIR;
299:
300: get_str(cfg->lib[i]->lname,instream);
301: get_str(cfg->lib[i]->sname,instream);
302:
303: get_str(cfg->lib[i]->arstr,instream);
304: cfg->lib[i]->ar=ARSTR(cfg->lib[i]->arstr,cfg);
305:
306: get_str(cfg->lib[i]->parent_path,instream);
307:
308: get_str(cfg->lib[i]->code_prefix,instream);
309:
310: get_int(c,instream);
311:
312: for(j=0;j<3;j++)
313: get_int(n,instream); /* 0x0000 */
314:
315: for(j=0;j<16;j++)
316: get_int(n,instream); /* 0xffff */
317: }
318: cfg->total_libs=i;
319:
320: /********************/
321: /* File Directories */
322: /********************/
323:
324: cfg->sysop_dir=cfg->user_dir=cfg->upload_dir=INVALID_DIR;
325: get_int(cfg->total_dirs,instream);
326:
327: if(cfg->total_dirs) {
328: if((cfg->dir=(dir_t **)malloc(sizeof(dir_t *)*(cfg->total_dirs+1)))==NULL)
329: return allocerr(instream,error,offset,fname,sizeof(dir_t *)*(cfg->total_dirs+1));
330: } else
331: cfg->dir=NULL;
332:
333: for(i=0;i<cfg->total_dirs;i++) {
334: if(feof(instream)) break;
335: if((cfg->dir[i]=(dir_t *)malloc(sizeof(dir_t)))==NULL)
336: return allocerr(instream,error,offset,fname,sizeof(dir_t));
337: memset(cfg->dir[i],0,sizeof(dir_t));
338:
339: get_int(cfg->dir[i]->lib,instream);
340: get_str(cfg->dir[i]->lname,instream);
341: get_str(cfg->dir[i]->sname,instream);
342:
343: if(!stricmp(cfg->dir[i]->sname,"SYSOP")) /* Sysop upload directory */
344: cfg->sysop_dir=i;
345: else if(!stricmp(cfg->dir[i]->sname,"USER")) /* User to User xfer dir */
346: cfg->user_dir=i;
347: else if(!stricmp(cfg->dir[i]->sname,"UPLOADS")) /* Upload directory */
348: cfg->upload_dir=i;
349: else if(!stricmp(cfg->dir[i]->sname,"OFFLINE")) /* Offline files dir */
350: cfg->lib[cfg->dir[i]->lib]->offline_dir=i;
351:
352: get_str(cfg->dir[i]->code_suffix,instream);
353:
354: get_str(cfg->dir[i]->data_dir,instream);
355:
356: get_str(cfg->dir[i]->arstr,instream);
357: get_str(cfg->dir[i]->ul_arstr,instream);
358: get_str(cfg->dir[i]->dl_arstr,instream);
359: get_str(cfg->dir[i]->op_arstr,instream);
360:
361: cfg->dir[i]->ar=ARSTR(cfg->dir[i]->arstr,cfg);
362: cfg->dir[i]->ul_ar=ARSTR(cfg->dir[i]->ul_arstr,cfg);
363: cfg->dir[i]->dl_ar=ARSTR(cfg->dir[i]->dl_arstr,cfg);
364: cfg->dir[i]->op_ar=ARSTR(cfg->dir[i]->op_arstr,cfg);
365:
366: get_str(cfg->dir[i]->path,instream);
367:
368: get_str(cfg->dir[i]->upload_sem,instream);
369:
370: get_int(cfg->dir[i]->maxfiles,instream);
371: if(cfg->dir[i]->maxfiles>MAX_FILES)
372: cfg->dir[i]->maxfiles=MAX_FILES;
373: get_str(cfg->dir[i]->exts,instream);
374: get_int(cfg->dir[i]->misc,instream);
375: get_int(cfg->dir[i]->seqdev,instream);
376: get_int(cfg->dir[i]->sort,instream);
377: get_str(cfg->dir[i]->ex_arstr,instream);
378: cfg->dir[i]->ex_ar=ARSTR(cfg->dir[i]->ex_arstr,cfg);
379:
380: get_int(cfg->dir[i]->maxage,instream);
381: get_int(cfg->dir[i]->up_pct,instream);
382: get_int(cfg->dir[i]->dn_pct,instream);
383: get_int(c,instream);
384: for(j=0;j<24;j++)
385: get_int(n,instream);
386: }
387:
388: cfg->total_dirs=i;
389:
390: /**********************/
391: /* Text File Sections */
392: /**********************/
393:
394: get_int(cfg->total_txtsecs,instream);
395:
396:
397: if(cfg->total_txtsecs) {
398: if((cfg->txtsec=(txtsec_t **)malloc(sizeof(txtsec_t *)*cfg->total_txtsecs))==NULL)
399: return allocerr(instream,error,offset,fname,sizeof(txtsec_t *)*cfg->total_txtsecs);
400: } else
401: cfg->txtsec=NULL;
402:
403: for(i=0;i<cfg->total_txtsecs;i++) {
404: if(feof(instream)) break;
405: if((cfg->txtsec[i]=(txtsec_t *)malloc(sizeof(txtsec_t)))==NULL)
406: return allocerr(instream,error,offset,fname,sizeof(txtsec_t));
407: memset(cfg->txtsec[i],0,sizeof(txtsec_t));
408:
409: get_str(cfg->txtsec[i]->name,instream);
410: get_str(cfg->txtsec[i]->code,instream);
411: get_str(cfg->txtsec[i]->arstr,instream);
412: cfg->txtsec[i]->ar=ARSTR(cfg->txtsec[i]->arstr,cfg);
413:
414: for(j=0;j<8;j++)
415: get_int(n,instream);
416: }
417: cfg->total_txtsecs=i;
418:
419: fclose(instream);
420: return(TRUE);
421: }
422:
423: /****************************************************************************/
424: /* Reads in XTRN.CNF and initializes the associated variables */
425: /****************************************************************************/
426: BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
427: {
428: char str[MAX_PATH+1],fname[13],c;
429: short i,j,n;
430: long offset=0;
431: FILE *instream;
432:
433: strcpy(fname,"xtrn.cnf");
434: sprintf(str,"%s%s",cfg->ctrl_dir,fname);
435: if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
436: sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
437: return(FALSE);
438: }
439:
440: /*************/
441: /* Swap list */
442: /*************/
443:
444: get_int(cfg->total_swaps,instream);
445:
446: if(cfg->total_swaps) {
447: if((cfg->swap=(swap_t **)malloc(sizeof(swap_t *)*cfg->total_swaps))==NULL)
448: return allocerr(instream,error,offset,fname,sizeof(swap_t *)*cfg->total_swaps);
449: } else
450: cfg->swap=NULL;
451:
452: for(i=0;i<cfg->total_swaps;i++) {
453: if(feof(instream)) break;
454: if((cfg->swap[i]=(swap_t *)malloc(sizeof(swap_t)))==NULL)
455: return allocerr(instream,error,offset,fname,sizeof(swap_t));
456: get_str(cfg->swap[i]->cmd,instream);
457: }
458: cfg->total_swaps=i;
459:
460: /********************/
461: /* External Editors */
462: /********************/
463:
464: get_int(cfg->total_xedits,instream);
465:
466: if(cfg->total_xedits) {
467: if((cfg->xedit=(xedit_t **)malloc(sizeof(xedit_t *)*cfg->total_xedits))==NULL)
468: return allocerr(instream,error,offset,fname,sizeof(xedit_t *)*cfg->total_xedits);
469: } else
470: cfg->xedit=NULL;
471:
472: for(i=0;i<cfg->total_xedits;i++) {
473: if(feof(instream)) break;
474: if((cfg->xedit[i]=(xedit_t *)malloc(sizeof(xedit_t)))==NULL)
475: return allocerr(instream,error,offset,fname,sizeof(xedit_t));
476: memset(cfg->xedit[i],0,sizeof(xedit_t));
477:
478: get_str(cfg->xedit[i]->name,instream);
479: get_str(cfg->xedit[i]->code,instream);
480: get_str(cfg->xedit[i]->lcmd,instream);
481: get_str(cfg->xedit[i]->rcmd,instream);
482:
483: get_int(cfg->xedit[i]->misc,instream);
484: get_str(cfg->xedit[i]->arstr,instream);
485: cfg->xedit[i]->ar=ARSTR(cfg->xedit[i]->arstr,cfg);
486:
487: get_int(cfg->xedit[i]->type,instream);
488: get_int(c,instream);
489: for(j=0;j<7;j++)
490: get_int(n,instream);
491: }
492: cfg->total_xedits=i;
493:
494:
495: /*****************************/
496: /* External Program Sections */
497: /*****************************/
498:
499: get_int(cfg->total_xtrnsecs,instream);
500:
501: if(cfg->total_xtrnsecs) {
502: if((cfg->xtrnsec=(xtrnsec_t **)malloc(sizeof(xtrnsec_t *)*cfg->total_xtrnsecs))
503: ==NULL)
504: return allocerr(instream,error,offset,fname,sizeof(xtrnsec_t *)*cfg->total_xtrnsecs);
505: } else
506: cfg->xtrnsec=NULL;
507:
508: for(i=0;i<cfg->total_xtrnsecs;i++) {
509: if(feof(instream)) break;
510: if((cfg->xtrnsec[i]=(xtrnsec_t *)malloc(sizeof(xtrnsec_t)))==NULL)
511: return allocerr(instream,error,offset,fname,sizeof(xtrnsec_t));
512: memset(cfg->xtrnsec[i],0,sizeof(xtrnsec_t));
513:
514: get_str(cfg->xtrnsec[i]->name,instream);
515: get_str(cfg->xtrnsec[i]->code,instream);
516: get_str(cfg->xtrnsec[i]->arstr,instream);
517: cfg->xtrnsec[i]->ar=ARSTR(cfg->xtrnsec[i]->arstr,cfg);
518:
519: for(j=0;j<8;j++)
520: get_int(n,instream);
521: }
522: cfg->total_xtrnsecs=i;
523:
524:
525: /*********************/
526: /* External Programs */
527: /*********************/
528:
529: get_int(cfg->total_xtrns,instream);
530:
531: if(cfg->total_xtrns) {
532: if((cfg->xtrn=(xtrn_t **)malloc(sizeof(xtrn_t *)*cfg->total_xtrns))==NULL)
533: return allocerr(instream,error,offset,fname,sizeof(xtrn_t *)*cfg->total_xtrns);
534: } else
535: cfg->xtrn=NULL;
536:
537: for(i=0;i<cfg->total_xtrns;i++) {
538: if(feof(instream)) break;
539: if((cfg->xtrn[i]=(xtrn_t *)malloc(sizeof(xtrn_t)))==NULL)
540: return allocerr(instream,error,offset,fname,sizeof(xtrn_t));
541: memset(cfg->xtrn[i],0,sizeof(xtrn_t));
542:
543: get_int(cfg->xtrn[i]->sec,instream);
544: get_str(cfg->xtrn[i]->name,instream);
545: get_str(cfg->xtrn[i]->code,instream);
546: get_str(cfg->xtrn[i]->arstr,instream);
547: get_str(cfg->xtrn[i]->run_arstr,instream);
548: cfg->xtrn[i]->ar=ARSTR(cfg->xtrn[i]->arstr,cfg);
549: cfg->xtrn[i]->run_ar=ARSTR(cfg->xtrn[i]->run_arstr,cfg);
550:
551: get_int(cfg->xtrn[i]->type,instream);
552: get_int(cfg->xtrn[i]->misc,instream);
553: get_int(cfg->xtrn[i]->event,instream);
554: get_int(cfg->xtrn[i]->cost,instream);
555: get_str(cfg->xtrn[i]->cmd,instream);
556: get_str(cfg->xtrn[i]->clean,instream);
557: get_str(cfg->xtrn[i]->path,instream);
558: get_int(cfg->xtrn[i]->textra,instream);
559: get_int(cfg->xtrn[i]->maxtime,instream);
560: for(j=0;j<7;j++)
561: get_int(n,instream);
562: }
563: cfg->total_xtrns=i;
564:
565:
566: /****************/
567: /* Timed Events */
568: /****************/
569:
570: get_int(cfg->total_events,instream);
571:
572: if(cfg->total_events) {
573: if((cfg->event=(event_t **)malloc(sizeof(event_t *)*cfg->total_events))==NULL)
574: return allocerr(instream,error,offset,fname,sizeof(event_t *)*cfg->total_events);
575: } else
576: cfg->event=NULL;
577:
578: for(i=0;i<cfg->total_events;i++) {
579: if(feof(instream)) break;
580: if((cfg->event[i]=(event_t *)malloc(sizeof(event_t)))==NULL)
581: return allocerr(instream,error,offset,fname,sizeof(event_t));
582: memset(cfg->event[i],0,sizeof(event_t));
583:
584: get_str(cfg->event[i]->code,instream);
585: get_str(cfg->event[i]->cmd,instream);
586: get_int(cfg->event[i]->days,instream);
587: get_int(cfg->event[i]->time,instream);
588: get_int(cfg->event[i]->node,instream);
589: get_int(cfg->event[i]->misc,instream);
590: get_str(cfg->event[i]->dir,instream);
591: get_int(cfg->event[i]->freq,instream);
592: get_int(cfg->event[i]->mdays,instream);
593:
594: for(j=0;j<5;j++)
595: get_int(n,instream);
596: }
597: cfg->total_events=i;
598:
599: /********************************/
600: /* Native (32-bit) Program list */
601: /********************************/
602:
603: get_int(cfg->total_natvpgms,instream);
604:
605: if(cfg->total_natvpgms) {
606: if((cfg->natvpgm=(natvpgm_t **)malloc(sizeof(natvpgm_t *)*cfg->total_natvpgms))==NULL)
607: return allocerr(instream,error,offset,fname,sizeof(natvpgm_t *)*cfg->total_natvpgms);
608: } else
609: cfg->natvpgm=NULL;
610:
611: for(i=0;i<cfg->total_natvpgms;i++) {
612: if(feof(instream)) break;
613: if((cfg->natvpgm[i]=(natvpgm_t *)malloc(sizeof(natvpgm_t)))==NULL)
614: return allocerr(instream,error,offset,fname,sizeof(natvpgm_t));
615: get_str(cfg->natvpgm[i]->name,instream);
616: cfg->natvpgm[i]->misc=0;
617: }
618: cfg->total_natvpgms=i;
619: for(i=0;i<cfg->total_natvpgms;i++) {
620: if(feof(instream)) break;
621: get_int(cfg->natvpgm[i]->misc,instream);
622: }
623:
624: /*******************/
625: /* Global Hot Keys */
626: /*******************/
627:
628: get_int(cfg->total_hotkeys,instream);
629:
630: if(cfg->total_hotkeys) {
631: if((cfg->hotkey=(hotkey_t **)malloc(sizeof(hotkey_t *)*cfg->total_hotkeys))==NULL)
632: return allocerr(instream,error,offset,fname,sizeof(hotkey_t *)*cfg->total_hotkeys);
633: } else
634: cfg->hotkey=NULL;
635:
636: for(i=0;i<cfg->total_hotkeys;i++) {
637: if(feof(instream)) break;
638: if((cfg->hotkey[i]=(hotkey_t *)malloc(sizeof(hotkey_t)))==NULL)
639: return allocerr(instream,error,offset,fname,sizeof(hotkey_t));
640: memset(cfg->hotkey[i],0,sizeof(hotkey_t));
641:
642: get_int(cfg->hotkey[i]->key,instream);
643: get_str(cfg->hotkey[i]->cmd,instream);
644:
645: for(j=0;j<8;j++)
646: get_int(n,instream);
647: }
648: cfg->total_hotkeys=i;
649:
650: /************************************/
651: /* External Program-related Toggles */
652: /************************************/
653: get_int(cfg->xtrn_misc,instream);
654:
655: fclose(instream);
656: return(TRUE);
657: }
658:
659: /****************************************************************************/
660: /* Reads in CHAT.CNF and initializes the associated variables */
661: /****************************************************************************/
662: BOOL read_chat_cfg(scfg_t* cfg, char* error)
663: {
664: char str[MAX_PATH+1],fname[13];
665: short i,j,n;
666: long offset=0;
667: FILE *instream;
668:
669: strcpy(fname,"chat.cnf");
670: sprintf(str,"%s%s",cfg->ctrl_dir,fname);
671: if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
672: sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
673: return(FALSE);
674: }
675:
676: /*********/
677: /* Gurus */
678: /*********/
679:
680: get_int(cfg->total_gurus,instream);
681:
682: if(cfg->total_gurus) {
683: if((cfg->guru=(guru_t **)malloc(sizeof(guru_t *)*cfg->total_gurus))==NULL)
684: return allocerr(instream,error,offset,fname,sizeof(guru_t *)*cfg->total_gurus);
685: } else
686: cfg->guru=NULL;
687:
688: for(i=0;i<cfg->total_gurus;i++) {
689: if(feof(instream)) break;
690: if((cfg->guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL)
691: return allocerr(instream,error,offset,fname,sizeof(guru_t));
692: memset(cfg->guru[i],0,sizeof(guru_t));
693:
694: get_str(cfg->guru[i]->name,instream);
695: get_str(cfg->guru[i]->code,instream);
696:
697: get_str(cfg->guru[i]->arstr,instream);
698: cfg->guru[i]->ar=ARSTR(cfg->guru[i]->arstr,cfg);
699:
700: for(j=0;j<8;j++)
701: get_int(n,instream);
702: }
703: cfg->total_chans=i;
704:
705:
706: /********************/
707: /* Chat Action Sets */
708: /********************/
709:
710: get_int(cfg->total_actsets,instream);
711:
712: if(cfg->total_actsets) {
713: if((cfg->actset=(actset_t **)malloc(sizeof(actset_t *)*cfg->total_actsets))==NULL)
714: return allocerr(instream,error,offset,fname,sizeof(actset_t *)*cfg->total_actsets);
715: } else
716: cfg->actset=NULL;
717:
718: for(i=0;i<cfg->total_actsets;i++) {
719: if(feof(instream)) break;
720: if((cfg->actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL)
721: return allocerr(instream,error,offset,fname,sizeof(actset_t));
722: get_str(cfg->actset[i]->name,instream);
723: }
724: cfg->total_actsets=i;
725:
726:
727: /****************/
728: /* Chat Actions */
729: /****************/
730:
731: get_int(cfg->total_chatacts,instream);
732:
733: if(cfg->total_chatacts) {
734: if((cfg->chatact=(chatact_t **)malloc(sizeof(chatact_t *)*cfg->total_chatacts))
735: ==NULL)
736: return allocerr(instream,error,offset,fname,sizeof(chatact_t *)*cfg->total_chatacts);
737: } else
738: cfg->chatact=NULL;
739:
740: for(i=0;i<cfg->total_chatacts;i++) {
741: if(feof(instream)) break;
742: if((cfg->chatact[i]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL)
743: return allocerr(instream,error,offset,fname,sizeof(chatact_t));
744: memset(cfg->chatact[i],0,sizeof(chatact_t));
745:
746: get_int(cfg->chatact[i]->actset,instream);
747: get_str(cfg->chatact[i]->cmd,instream);
748: get_str(cfg->chatact[i]->out,instream);
749: for(j=0;j<8;j++)
750: get_int(n,instream);
751: }
752:
753: cfg->total_chatacts=i;
754:
755:
756: /***************************/
757: /* Multinode Chat Channels */
758: /***************************/
759:
760: get_int(cfg->total_chans,instream);
761:
762: if(cfg->total_chans) {
763: if((cfg->chan=(chan_t **)malloc(sizeof(chan_t *)*cfg->total_chans))==NULL)
764: return allocerr(instream,error,offset,fname,sizeof(chan_t *)*cfg->total_chans);
765: } else
766: cfg->chan=NULL;
767:
768: for(i=0;i<cfg->total_chans;i++) {
769: if(feof(instream)) break;
770: if((cfg->chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL)
771: return allocerr(instream,error,offset,fname,sizeof(chan_t));
772: memset(cfg->chan[i],0,sizeof(chan_t));
773:
774: get_int(cfg->chan[i]->actset,instream);
775: get_str(cfg->chan[i]->name,instream);
776:
777: get_str(cfg->chan[i]->code,instream);
778:
779: get_str(cfg->chan[i]->arstr,instream);
780: cfg->chan[i]->ar=ARSTR(cfg->chan[i]->arstr,cfg);
781:
782: get_int(cfg->chan[i]->cost,instream);
783: get_int(cfg->chan[i]->guru,instream);
784: get_int(cfg->chan[i]->misc,instream);
785: for(j=0;j<8;j++)
786: get_int(n,instream);
787: }
788: cfg->total_chans=i;
789:
790:
791: /**************/
792: /* Chat Pages */
793: /**************/
794:
795: get_int(cfg->total_pages,instream);
796:
797: if(cfg->total_pages) {
798: if((cfg->page=(page_t **)malloc(sizeof(page_t *)*cfg->total_pages))==NULL)
799: return allocerr(instream,error,offset,fname,sizeof(page_t *)*cfg->total_pages);
800: } else
801: cfg->page=NULL;
802:
803: for(i=0;i<cfg->total_pages;i++) {
804: if(feof(instream)) break;
805: if((cfg->page[i]=(page_t *)malloc(sizeof(page_t)))==NULL)
806: return allocerr(instream,error,offset,fname,sizeof(page_t));
807: memset(cfg->page[i],0,sizeof(page_t));
808:
809: get_str(cfg->page[i]->cmd,instream);
810:
811: get_str(cfg->page[i]->arstr,instream);
812: cfg->page[i]->ar=ARSTR(cfg->page[i]->arstr,cfg);
813:
814: get_int(cfg->page[i]->misc,instream);
815: for(j=0;j<8;j++)
816: get_int(n,instream);
817: }
818: cfg->total_pages=i;
819:
820:
821: fclose(instream);
822: return(TRUE);
823: }
824:
825: /****************************************************************************/
826: /* Read one line of up to 256 characters from the file pointed to by */
827: /* 'stream' and put upto 'maxlen' number of character into 'outstr' and */
828: /* truncate spaces off end of 'outstr'. */
829: /****************************************************************************/
830: char *readline(long *offset, char *outstr, int maxlen, FILE *instream)
831: {
832: char str[257];
833:
834: if(fgets(str,256,instream)==NULL)
835: return(NULL);
836: sprintf(outstr,"%.*s",maxlen,str);
837: truncsp(outstr);
838: (*offset)+=maxlen;
839: return(outstr);
840: }
841:
842: /****************************************************************************/
843: /* Turns char string of flags into a long */
844: /****************************************************************************/
845: long aftol(char *str)
846: {
847: char ch;
848: size_t c=0;
849: ulong l=0UL;
850:
851: while(str[c]) {
852: ch=toupper(str[c]);
853: if(ch>='A' && ch<='Z')
854: l|=FLAG(ch);
855: c++;
856: }
857: return(l);
858: }
859:
860: /*****************************************************************************/
861: /* Converts a long into an ASCII Flag string (A-Z) that represents bits 0-25 */
862: /*****************************************************************************/
863: char *ltoaf(long l,char *str)
864: {
865: size_t c=0;
866:
867: while(c<26) {
868: if(l&(long)(1L<<c))
869: str[c]='A'+c;
870: else str[c]=' ';
871: c++;
872: }
873: str[c]=0;
874: return(str);
875: }
876:
877: /****************************************************************************/
878: /* Returns the actual attribute code from a string of ATTR characters */
879: /****************************************************************************/
880: uchar attrstr(char *str)
881: {
882: uchar atr;
883: ulong l=0;
884:
885: atr=LIGHTGRAY;
886: while(str[l]) {
887: switch(toupper(str[l])) {
888: case 'H': /* High intensity */
889: atr|=HIGH;
890: break;
891: case 'I': /* Blink */
892: atr|=BLINK;
893: break;
894: case 'K': /* Black */
895: atr=(atr&0xf8)|BLACK;
896: break;
897: case 'W': /* White */
898: atr=(atr&0xf8)|LIGHTGRAY;
899: break;
900: case 'R':
901: atr=(uchar)((atr&0xf8)|RED);
902: break;
903: case 'G':
904: atr=(uchar)((atr&0xf8)|GREEN);
905: break;
906: case 'Y': /* Yellow */
907: atr=(uchar)((atr&0xf8)|BROWN);
908: break;
909: case 'B':
910: atr=(uchar)((atr&0xf8)|BLUE);
911: break;
912: case 'M':
913: atr=(uchar)((atr&0xf8)|MAGENTA);
914: break;
915: case 'C':
916: atr=(uchar)((atr&0xf8)|CYAN);
917: break;
918: case '0': /* Black Background */
919: atr=(uchar)(atr&0x8f);
920: break;
921: case '1': /* Red Background */
922: atr=(uchar)((atr&0x8f)|BG_RED);
923: break;
924: case '2': /* Green Background */
925: atr=(uchar)((atr&0x8f)|BG_GREEN);
926: break;
927: case '3': /* Yellow Background */
928: atr=(uchar)((atr&0x8f)|BG_BROWN);
929: break;
930: case '4': /* Blue Background */
931: atr=(uchar)((atr&0x8f)|BG_BLUE);
932: break;
933: case '5': /* Magenta Background */
934: atr=(uchar)((atr&0x8f)|BG_MAGENTA);
935: break;
936: case '6': /* Cyan Background */
937: atr=(uchar)((atr&0x8f)|BG_CYAN);
938: break;
939: case '7': /* White Background */
940: atr=(uchar)((atr&0x8f)|BG_LIGHTGRAY);
941: break;
942: }
943: l++;
944: }
945: return(atr);
946: }
947:
948: void free_file_cfg(scfg_t* cfg)
949: {
950: uint i;
951:
952: if(cfg->fextr!=NULL) {
953: for(i=0;i<cfg->total_fextrs;i++) {
954: FREE_AR(cfg->fextr[i]->ar);
955: FREE_AND_NULL(cfg->fextr[i]);
956: }
957: FREE_AND_NULL(cfg->fextr);
958: }
959:
960: if(cfg->fcomp!=NULL) {
961: for(i=0;i<cfg->total_fcomps;i++) {
962: FREE_AR(cfg->fcomp[i]->ar);
963: FREE_AND_NULL(cfg->fcomp[i]);
964: }
965: FREE_AND_NULL(cfg->fcomp);
966: }
967:
968: if(cfg->fview!=NULL) {
969: for(i=0;i<cfg->total_fviews;i++) {
970: FREE_AR(cfg->fview[i]->ar);
971: FREE_AND_NULL(cfg->fview[i]);
972: }
973: FREE_AND_NULL(cfg->fview);
974: }
975:
976: if(cfg->ftest!=NULL) {
977: for(i=0;i<cfg->total_ftests;i++) {
978: FREE_AR(cfg->ftest[i]->ar);
979: FREE_AND_NULL(cfg->ftest[i]);
980: }
981: FREE_AND_NULL(cfg->ftest);
982: }
983:
984: if(cfg->dlevent!=NULL) {
985: for(i=0;i<cfg->total_dlevents;i++) {
986: FREE_AR(cfg->dlevent[i]->ar);
987: FREE_AND_NULL(cfg->dlevent[i]);
988: }
989: FREE_AND_NULL(cfg->dlevent);
990: }
991:
992: if(cfg->prot!=NULL) {
993: for(i=0;i<cfg->total_prots;i++) {
994: FREE_AR(cfg->prot[i]->ar);
995: FREE_AND_NULL(cfg->prot[i]);
996: }
997: FREE_AND_NULL(cfg->prot);
998: }
999:
1000: if(cfg->altpath!=NULL) {
1001: for(i=0;i<cfg->altpaths;i++)
1002: FREE_AND_NULL(cfg->altpath[i]);
1003: FREE_AND_NULL(cfg->altpath);
1004: }
1005:
1006: if(cfg->lib!=NULL) {
1007: for(i=0;i<cfg->total_libs;i++) {
1008: FREE_AR(cfg->lib[i]->ar);
1009: FREE_AND_NULL(cfg->lib[i]);
1010: }
1011: FREE_AND_NULL(cfg->lib);
1012: }
1013:
1014: if(cfg->dir!=NULL) {
1015: for(i=0;i<cfg->total_dirs;i++) {
1016: #if 0 /*ndef SCFG */
1017: if(cfg->dir[i]->data_dir!=cfg->data_dir_dirs)
1018: FREE_AND_NULL(cfg->dir[i]->data_dir);
1019: #endif
1020: FREE_AR(cfg->dir[i]->ar);
1021: FREE_AR(cfg->dir[i]->ul_ar);
1022: FREE_AR(cfg->dir[i]->dl_ar);
1023: FREE_AR(cfg->dir[i]->op_ar);
1024: FREE_AR(cfg->dir[i]->ex_ar);
1025: FREE_AND_NULL(cfg->dir[i]);
1026: }
1027: FREE_AND_NULL(cfg->dir);
1028: }
1029:
1030: if(cfg->txtsec!=NULL) {
1031: for(i=0;i<cfg->total_txtsecs;i++) {
1032: FREE_AR(cfg->txtsec[i]->ar);
1033: FREE_AND_NULL(cfg->txtsec[i]);
1034: }
1035: FREE_AND_NULL(cfg->txtsec);
1036: }
1037: }
1038:
1039: void free_chat_cfg(scfg_t* cfg)
1040: {
1041: int i;
1042:
1043: if(cfg->actset!=NULL) {
1044: for(i=0;i<cfg->total_actsets;i++) {
1045: FREE_AND_NULL(cfg->actset[i]);
1046: }
1047: FREE_AND_NULL(cfg->actset);
1048: }
1049:
1050: if(cfg->chatact!=NULL) {
1051: for(i=0;i<cfg->total_chatacts;i++) {
1052: FREE_AND_NULL(cfg->chatact[i]);
1053: }
1054: FREE_AND_NULL(cfg->chatact);
1055: }
1056:
1057: if(cfg->chan!=NULL) {
1058: for(i=0;i<cfg->total_chans;i++) {
1059: FREE_AR(cfg->chan[i]->ar);
1060: FREE_AND_NULL(cfg->chan[i]);
1061: }
1062: FREE_AND_NULL(cfg->chan);
1063: }
1064:
1065: if(cfg->guru!=NULL) {
1066: for(i=0;i<cfg->total_gurus;i++) {
1067: FREE_AR(cfg->guru[i]->ar);
1068: FREE_AND_NULL(cfg->guru[i]);
1069: }
1070: FREE_AND_NULL(cfg->guru);
1071: }
1072:
1073: if(cfg->page!=NULL) {
1074: for(i=0;i<cfg->total_pages;i++) {
1075: FREE_AR(cfg->page[i]->ar);
1076: FREE_AND_NULL(cfg->page[i]);
1077: }
1078: FREE_AND_NULL(cfg->page);
1079: }
1080:
1081: }
1082:
1083: void free_xtrn_cfg(scfg_t* cfg)
1084: {
1085: int i;
1086:
1087: if(cfg->swap!=NULL) {
1088: for(i=0;i<cfg->total_swaps;i++) {
1089: FREE_AND_NULL(cfg->swap[i]);
1090: }
1091: FREE_AND_NULL(cfg->swap);
1092: }
1093:
1094: if(cfg->xedit!=NULL) {
1095: for(i=0;i<cfg->total_xedits;i++) {
1096: FREE_AR(cfg->xedit[i]->ar);
1097: FREE_AND_NULL(cfg->xedit[i]);
1098: }
1099: FREE_AND_NULL(cfg->xedit);
1100: }
1101:
1102: if(cfg->xtrnsec!=NULL) {
1103: for(i=0;i<cfg->total_xtrnsecs;i++) {
1104: FREE_AR(cfg->xtrnsec[i]->ar);
1105: FREE_AND_NULL(cfg->xtrnsec[i]);
1106: }
1107: FREE_AND_NULL(cfg->xtrnsec);
1108: }
1109:
1110: if(cfg->xtrn!=NULL) {
1111: for(i=0;i<cfg->total_xtrns;i++) {
1112: FREE_AR(cfg->xtrn[i]->ar);
1113: FREE_AR(cfg->xtrn[i]->run_ar);
1114: FREE_AND_NULL(cfg->xtrn[i]);
1115: }
1116: FREE_AND_NULL(cfg->xtrn);
1117: }
1118:
1119: if(cfg->event!=NULL) {
1120: for(i=0;i<cfg->total_events;i++) {
1121: FREE_AND_NULL(cfg->event[i]);
1122: }
1123: FREE_AND_NULL(cfg->event);
1124: }
1125:
1126: if(cfg->natvpgm!=NULL) {
1127: for(i=0;i<cfg->total_natvpgms;i++) {
1128: FREE_AND_NULL(cfg->natvpgm[i]);
1129: }
1130: FREE_AND_NULL(cfg->natvpgm);
1131: }
1132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.