1 /* $Id$
2 ******************************************************************************
3 * Fastecho config to fidoconfig convertion program (main module).
4 *
5 * This file is part of FIDOCONFIG.
6 *
7 * Copyright (C) 1999
8 * Fedor Lizunkov
9 * Fido: 2:5020/960
10 *
11 * Copyright (C) Husky developers team
12 ******************************************************************************/
13
14 char Revision[] = "$Revision$";
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <ctype.h>
20 #include <assert.h>
21
22 #include <huskylib/compiler.h>
23 #include <huskylib/cvtdate.h>
24 #include <huskylib/huskylib.h>
25
26 #include "common.h"
27
28 #ifndef VERSION_H
29 #define VERSION_H
30
31 #include "version.h"
32 #include "../cvsdate.h"
33
34 #endif
35
36 /* #define INC_FE_TYPES */
37 #define INC_FE_BAMPROCS
38 #define FALSE 0
39 #define TRUE 1
40 #include "fecfg146.h"
41
42 #define OUTPUT_FILE "hpt_temp.cfg"
43
44
45 /* Global variables */
46 char *FEconfig=NULL;
47 CONFIG config;
48 Area **area;
49 ExtensionHeader header;
50 SysAddress *sysaddr = NULL;
51 int packers_count = 0, packers2_count = 0;
52 Packers *packers = NULL, *packers2 = NULL;
53 int unpackers_count = 0, unpackers2_count = 0;
54 Unpackers *unpackers = NULL, *unpackers2 = NULL;
55 GroupDefaults **groupdef = NULL;
56 Node **node;
57 ForwardAreaFix *frequest = NULL;
58 FILE *f_cfg=NULL, *f_hpt=NULL;
59
60
parseFEgroup(register unsigned short FEgroup)61 char parseFEgroup(register unsigned short FEgroup)
62 {
63 if (FEgroup <= 25) /* Letters */
64 FEgroup +='A';
65 else if (FEgroup <= 35) /* Numbers */
66 FEgroup +='0';
67 else FEgroup=0;
68 return (char) FEgroup;
69 }
70
71 /* convert FastEcho-GroupBitmap to GroupString for fidoconfig */
72 /* warning: returns pointer to static array! */
grp2str(dword bitmap)73 char *grp2str(dword bitmap)
74 {
75 static char buff[66];
76 char *curr, *ptr, key, ch, tmp;
77
78 ptr = (char*)&bitmap;
79 curr = buff;
80 for (key = 'A', ch = *ptr; key <= 'Z'; key++, ch<<=1) {
81 if (key == 'I' || key == 'Q' || key == 'Y') {
82 ptr++;
83 ch = *ptr;
84 } /* endif */
85 tmp = ch|0x7f;
86 tmp ^=0xff;
87 if (tmp) {
88 *curr = key;
89 curr++;
90 *curr = ',';
91 curr++;
92 } /* endif */
93 } /* endfor */
94 for (key = '1'; key <= '6'; key++, ch <<=1) {
95 tmp = ch|0x7f;
96 tmp ^=0xff;
97 if (tmp) {
98 *curr = key;
99 curr++;
100 *curr = ',';
101 curr++;
102 } /* endif */
103 } /* endfor */
104
105 /* strip last ',' if any */
106 if (curr != buff) curr--;
107
108 /* terminate buff */
109 *curr = 0;
110
111 return buff;
112 }
113
FEaka2str(FEAddress addr)114 char *FEaka2str(FEAddress addr)
115 {
116 static char aka[24];
117
118 if (addr.point)
119 sprintf(aka, "%d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point);
120 else
121 sprintf(aka, "%d:%d/%d", addr.zone, addr.net, addr.node);
122
123 return aka;
124 }
125
126
127 /* return string: zone:net/node.point@domain */
sysAddress2str(SysAddress sysaddr)128 char *sysAddress2str(SysAddress sysaddr)
129 {
130 static char aka[24+sizeof(sysaddr.domain)];
131
132 if (sysaddr.main.point && sysaddr.domain && sysaddr.domain[0] ) {
133 sprintf(aka, "%d:%d/%d.%d@%s", sysaddr.main.zone, sysaddr.main.net,
134 sysaddr.main.node, sysaddr.main.point,
135 sysaddr.domain);
136 } else if (sysaddr.main.point && (sysaddr.domain==NULL || sysaddr.domain[0]) ) {
137 sprintf(aka, "%d:%d/%d.%d", sysaddr.main.zone, sysaddr.main.net,
138 sysaddr.main.node, sysaddr.main.point);
139 } else if (sysaddr.main.point==0 && sysaddr.domain && sysaddr.domain[0] ) {
140 sprintf(aka, "%d:%d/%d@%s", sysaddr.main.zone, sysaddr.main.net,
141 sysaddr.main.node, sysaddr.domain);
142 } else {
143 sprintf(aka, "%d:%d/%d", sysaddr.main.zone, sysaddr.main.net,
144 sysaddr.main.node);
145 } /* endif */
146
147 return aka;
148 }
149
150
Usage(const char * program)151 void Usage(const char *program)
152 {
153 char *temp;
154 printf("%s\n", temp=GenVersionStr( "fecfg2fconf", FC_VER_MAJOR,
155 FC_VER_MINOR, FC_VER_PATCH, FC_VER_BRANCH, cvs_date ));
156 nfree(temp);
157
158 printf("\nUsage:\n"
159 "\t%s [path]fastecho.cfg [output file]\n",
160 OS_independed_basename(program));
161 }
162
163
print_packers(Packers * packers,int packers_count)164 void print_packers( Packers *packers, int packers_count )
165 { int i;
166 for (i = 0; i < packers_count; i++)
167 if ( strlen(packers[i].tag) && strlen(packers[i].command) )
168 fprintf( f_hpt,
169 " Pack %-10s %s $a $f\n",
170 packers[i].tag,
171 packers[i].command );
172 }
173
174
print_unpackers(Unpackers * unpackers,int unpackers_count)175 void print_unpackers( Unpackers *unpackers, int unpackers_count )
176 { int i;
177
178 for (i = 0; i < unpackers_count; i++) {
179
180 if ( strlen(unpackers[i].command) ){
181 fprintf( f_hpt, " Unpack \"" );
182 switch(unpackers[i].callingconvention){
183 case 0: /*default*/
184 fprintf( f_hpt, "%-30s $a $f $p", unpackers[i].command);
185 break;
186 case 1: /*cd path*/
187 fprintf( f_hpt, "cd $p ; %-22s $a", unpackers[i].command);
188 break;
189 case 2:
190 fprintf( f_hpt, "%-30s $a $p $f", unpackers[i].command);
191 break;
192 case 3:
193 fprintf( f_hpt, "%-30s $a $f $p", unpackers[i].command);
194 break;
195 case 4:
196 fprintf( f_hpt, "%-30s $a $f #$p", unpackers[i].command);
197 break;
198 case 5:
199 fprintf( f_hpt, "%-30s $a $f -d $p", unpackers[i].command);
200 break;
201 }
202 fprintf( f_hpt, "\" ");
203 switch(i){
204 case ARC_SeaArc:
205 fprintf( f_hpt, " 0 XX # SeaARC");
206 break;
207 case ARC_PkArc:
208 fprintf( f_hpt, " 0 1a # PKARC");
209 break;
210 case ARC_Pak:
211 fprintf( f_hpt, " -2 fe # PAK");
212 break;
213 case ARC_ArcPlus:
214 fprintf( f_hpt, " 0 XX # ArcPlus");
215 break;
216 case ARC_Zoo:
217 fprintf( f_hpt, " 0 5a4f4f # ZOO");
218 break;
219 case ARC_PkZip:
220 fprintf( f_hpt, " 0 504b0304 # PKZIP");
221 break;
222 case ARC_Lha:
223 fprintf( f_hpt, " 2 2d6c68 # LHA");
224 break;
225 case ARC_Arj:
226 fprintf( f_hpt, " 0 60ea # ARJ");
227 break;
228 case ARC_Sqz:
229 fprintf( f_hpt, " 0 XX # SQZ");
230 break;
231 case ARC_RAR:
232 fprintf( f_hpt, " 0 52617221 # RAR");
233 break;
234 case ARC_UC2:
235 fprintf( f_hpt, " 0 XX # UC2");
236 break;
237 case ARC_Unknown:
238 default:
239 fprintf( f_hpt, " 0 ?? # Unknown");
240 break;
241 }
242 fprintf( f_hpt, "\n");
243 }
244 }
245 }
246
247
print_carbon()248 void print_carbon()
249 { int i,c;
250
251 for (i = 0; i < 10; i++) {
252 if (*((char*)&config.CC[i])) {
253 switch (config.CC[i].what) {
254 case CC_FROM:
255 fprintf(f_hpt, "CarbonFrom ");
256 break;
257 case CC_TO:
258 fprintf(f_hpt, "CarbonTo ");
259 break;
260 case CC_SUBJECT:
261 fprintf(f_hpt, "CarbonSubj ");
262 break;
263 case CC_KLUDGE:
264 fprintf(f_hpt, "CarbonKludge ");
265 break;
266 default:
267 break;
268 } /* endswitch */
269 fprintf(f_hpt, " %s\n", config.CC[i].object);
270 for (c = 0; c < config.AreaCnt; c++) {
271 if (config.CC[i].conference == area[c]->conference)
272 fprintf(f_hpt, "CarbonCopy %s\n\n", area[c]->name);
273 } /* endfor */
274 }
275 } /* endfor */
276 }
277
278
print_areas()279 void print_areas()
280 { int i,ii,c;
281 unsigned int a[] = { AREA_BADMAILBOARD, AREA_DUPEBOARD, AREA_NETMAIL,
282 AREA_LOCAL, AREA_ECHOMAIL };
283
284 for (ii=0; ii<5; ii++)
285 {
286 switch (a[ii]) {
287 case AREA_ECHOMAIL:
288 fprintf(f_hpt, "\n# Echo Areas\n");
289 break;
290 case AREA_NETMAIL:
291 fprintf(f_hpt, "\n# Additional Netmail Areas\n");
292 break;
293 case AREA_LOCAL:
294 fprintf(f_hpt, "\n# Local Areas\n");
295 break;
296 case AREA_BADMAILBOARD:
297 fprintf(f_hpt, "\n# Badmail Area\n");
298 break;
299 case AREA_DUPEBOARD:
300 fprintf(f_hpt, "\n# Dupemail Area\n");
301 break;
302 } /* endswitch */
303
304
305 for (i = 0; i < config.AreaCnt; i++)
306 {
307 if( area[i]->flags.atype!=a[ii] )
308 continue;
309
310 if (area[i]->flags.storage == FE_FIDO || area[i]->flags.storage == FE_SQUISH || area[i]->flags.storage == FE_JAM || area[i]->flags.storage == FE_PASSTHRU)
311 {
312 switch (area[i]->flags.atype) {
313 case AREA_ECHOMAIL:
314 fprintf(f_hpt, "EchoArea ");
315 break;
316 case AREA_NETMAIL:
317 fprintf(f_hpt, "NetmailArea");
318 break;
319 case AREA_LOCAL:
320 fprintf(f_hpt, "LocalArea ");
321 break;
322 case AREA_BADMAILBOARD:
323 fprintf(f_hpt, "BadArea ");
324 break;
325 case AREA_DUPEBOARD:
326 fprintf(f_hpt, "DupeArea ");
327 break;
328 default:
329 continue;
330 } /* endswitch */
331
332 fprintf(f_hpt, " %-16s", area[i]->name);
333
334 if (area[i]->flags.storage == FE_PASSTHRU) {
335 fprintf(f_hpt, " Passthrough");
336 } else {
337 fprintf(f_hpt, " %s", area[i]->path);
338 if (area[i]->flags.storage == FE_SQUISH)
339 fprintf(f_hpt, " -b Squish");
340 else if (area[i]->flags.storage == FE_JAM)
341 fprintf(f_hpt, " -b Jam");
342 } /* endif */
343
344 if (area[i]->info.group <= 25) /* A..Z */
345 fprintf(f_hpt, " -g %c", 'A'+area[i]->info.group);
346 else if (area[i]->info.group <= 35) /* 0..6, possible 0..9 */
347 fprintf(f_hpt, " -g %d", area[i]->info.group-25);
348
349 if (area[i]->desc && *area[i]->desc )
350 fprintf(f_hpt, "\t-d \"%s\"\t", area[i]->desc);
351
352 fprintf(f_hpt, " -lr %d", area[i]->read_sec);
353
354 fprintf(f_hpt, " -lw %d", area[i]->write_sec);
355
356 if (area[i]->advflags.hide)
357 fprintf(f_hpt, " -hide");
358
359 if (area[i]->advflags.mandatory)
360 fprintf(f_hpt, " -mandatory");
361
362 if (area[i]->advflags.manual)
363 fprintf(f_hpt, " -manual");
364
365 if (area[i]->advflags.tinyseen)
366 fprintf(f_hpt, " -tinysb");
367
368 if (area[i]->advflags.disablepsv)
369 fprintf(f_hpt, " -nopause");
370
371 fprintf(f_hpt, " -a %s", sysAddress2str(sysaddr[area[i]->info.aka]));
372
373 if (area[i]->days>0)
374 fprintf(f_hpt, " -p %d", area[i]->days);
375 else if (area[i]->days==0 && config.def_days )
376 fprintf(f_hpt, " -p %u", config.def_days);
377 else if (area[i]->recvdays>0)
378 fprintf(f_hpt, " -p %d", area[i]->recvdays);
379 else if (area[i]->recvdays==0 && config.def_recvdays )
380 fprintf(f_hpt, " -p %u", config.def_recvdays);
381 else if (area[i]->recvdays==-1 || area[i]->days==-1 )
382 fprintf(f_hpt, " -p 0");
383
384 if (area[i]->messages )
385 fprintf(f_hpt, " -$m %d", area[i]->messages );
386 else if( area[i]->messages==0 && config.def_messages )
387 fprintf(f_hpt, " -$m %d", config.def_messages );
388 else if( area[i]->messages==-1 )
389 fprintf(f_hpt, " -$m 0" );
390
391 if (area[i]->flags.atype == AREA_ECHOMAIL && config.flags & KILLDUPES)
392 fprintf(f_hpt, " -dupeCheck del");
393
394 for (c = 0, fprintf(f_hpt, "\t"); c < config.NodeCnt; c++)
395 if (GetBam(node[c]->areas, area[i]->conference))
396 fprintf(f_hpt, " %s", FEaka2str(node[c]->addr));
397
398 fprintf(f_hpt, "\n");
399
400 }else{
401 if ( area[i]->name && *area[i]->name ){
402 if ( area[i]->desc && *area[i]->desc )
403 fprintf(f_hpt, "# !!! # area \"%s\" (\"%s\") stored in HUDSON messagebase, doesn't support by Husky\n", area[i]->name, area[i]->desc);
404 else
405 fprintf(f_hpt, "# !!! # area \"%s\" stored in HUDSON messagebase, doesn't support by Husky\n", area[i]->name);
406 }
407 } /* endif */
408 } /* endfor */
409 }
410 }
411
412 /* Match domain for link's zone */
check_sys_zone(FEAddress * a)413 char *check_sys_zone(FEAddress *a)
414 {
415 int i;
416
417 for (i=0; i < config.AkaCnt; i++)
418 if (*(char*)&sysaddr[i])
419 if (a->zone == sysaddr[i].main.zone && sysaddr[i].domain[0])
420 return sysaddr[i].domain;
421 return NULL;
422 }
423
424 /* output all links configuration */
print_links()425 void print_links()
426 { int i, c;
427 char *tmp;
428
429 for (i = 0; i < config.NodeCnt; i++) {
430 fprintf(f_hpt, "\nLink %s\n", node[i]->name);
431
432 if ( node[i]->addr.zone == sysaddr[node[i]->aka].main.zone && sysaddr[node[i]->aka].domain[0])
433 fprintf(f_hpt, "Aka %s@%s\n", FEaka2str(node[i]->addr), sysaddr[node[i]->aka].domain);
434 else
435 fprintf(f_hpt, "Aka %s\n", FEaka2str(node[i]->addr));
436
437 fprintf(f_hpt, "OurAka %s\n", sysAddress2str(sysaddr[node[i]->aka]) );
438
439 if (node[i]->addr.zone != node[i]->arcdest.zone || node[i]->addr.net != node[i]->arcdest.net ||
440 node[i]->addr.node != node[i]->arcdest.node || node[i]->addr.point != node[i]->arcdest.point )
441 {
442 tmp = check_sys_zone(&node[i]->arcdest);
443 fprintf( f_hpt, "if \"[module]\"==\"hpt\"\n");
444 if (tmp && tmp[0])
445 fprintf( f_hpt, " PackAka %s@%s\n", FEaka2str(node[i]->arcdest), tmp);
446 else
447 fprintf( f_hpt, " PackAka %s\n", FEaka2str(node[i]->arcdest));
448 fprintf( f_hpt, "endif\n");
449 }
450
451 if ( node[i]->password && node[i]->password[0] )
452 fprintf(f_hpt, "PktPwd %s\n", strLower(node[i]->password));
453
454 if ( node[i]->areafixpw && node[i]->areafixpw[0] )
455 fprintf(f_hpt, "AreafixPWD %s\n", strLower(node[i]->areafixpw));
456
457 fprintf(f_hpt, "Level %d\n", node[i]->sec_level);
458
459 if (node[i]->newgroup <= 25)
460 fprintf(f_hpt, "LinkGrp %c\n", 'A'+node[i]->newgroup);
461 else
462 fprintf(f_hpt, "LinkGrp %d\n", node[i]->newgroup-25);
463
464 tmp = grp2str(node[i]->groups);
465
466 if (*tmp != 0)
467 fprintf(f_hpt, "AccessGrp %s\n", tmp);
468
469 if (node[i]->flags.allowareacreate) {
470 fprintf(f_hpt, "AutoAreaCreate on\n");
471 for (c = 0; c < config.GDCnt; c++) {
472
473 if (node[i]->newgroup == groupdef[c]->group)
474 {
475 fprintf(f_hpt, "AutoAreaCreateDefaults ");
476
477 if( (tmp[0]=parseFEgroup(groupdef[c]->group)) != 0 )
478 fprintf(f_hpt, " -g %c", tmp[0] );
479
480 if (groupdef[c]->area.read_sec)
481 fprintf(f_hpt, " -lr %d", groupdef[c]->area.read_sec);
482
483 if (groupdef[c]->area.write_sec)
484 fprintf(f_hpt, " -lw %d", groupdef[c]->area.write_sec);
485
486 if (groupdef[c]->area.days)
487 fprintf(f_hpt, " -p %d", groupdef[c]->area.days);
488 else if (groupdef[c]->area.recvdays)
489 fprintf(f_hpt, " -p %d", groupdef[c]->area.recvdays);
490
491 if (groupdef[c]->area.messages)
492 fprintf(f_hpt, " -$m %d", groupdef[c]->area.messages);
493
494 fprintf(f_hpt, "\n");
495 } /* endif */
496 } /* endfor */
497 } /* endif */
498
499 if (node[i]->maxarcsize) /* -1 - don't set; 0 - use default; >0 = size */
500 fprintf(f_hpt, "ArcmailSize %u\n", node[i]->maxarcsize>0 ? node[i]->maxarcsize : 0);
501
502 fprintf(f_hpt, "EchomailFlavour ");
503 switch (node[i]->flags.arc_status) {
504 case NetNormal:
505 if (node[i]->flags.arc_direct) {
506 fprintf(f_hpt, "Direct\n");
507 } else {
508 fprintf(f_hpt, "Normal\n");
509 } /* endif */
510 break;
511 case NetHold:
512 fprintf(f_hpt, "Hold%s\n", node[i]->flags.arc_direct? " # +Direct" : "");
513 break;
514 case NetCrash:
515 fprintf(f_hpt, "Crash%s\n", node[i]->flags.arc_direct? " # +Direct" : "");
516 break;
517 /* Not implemented yet in hpt */
518 /* case NetImm;
519 fprintf(f_hpt, "Immediate%s\n", node[i]->flags.arc_direct? " # +Direct" : "");
520 break;
521 */
522 default:
523 break;
524 } /* endswitch */
525
526 if (node[i]->flags.noattach)
527 fprintf(f_hpt, "Export off # This is not precision usage \"Echomail flavour: No attach\" from fastecho's configuration");
528
529 if (node[i]->flags.mgr_status!=NetNormal || node[i]->flags.mgr_direct)
530 {
531 fprintf(f_hpt, "AreafixReportsAttr pvt,loc,npd");
532 if(!(config.AreaFixFlags & KEEPRECEIPT))
533 fprintf(f_hpt, ",k/s");
534 switch (node[i]->flags.mgr_status)
535 {
536 case NetHold:
537 fprintf(f_hpt, ",hld");
538 break;
539 case NetCrash:
540 fprintf(f_hpt, ",crash");
541 break;
542 case NetImm:
543 fprintf(f_hpt, ",imm");
544 break;
545 default:
546 break;
547 }
548 if (node[i]->flags.mgr_direct)
549 fprintf(f_hpt, ",dir");
550 fprintf(f_hpt, "\n");
551 }
552
553 /* To future */
554 /*
555 fprintf(f_hpt, "### Fastecho's areafix flags for node ##\n");
556 fprintf(f_hpt, "# areafixtype %d\n", (int)node[i]->afixflags.bits.areafixtype);
557 fprintf(f_hpt, "# allowremote %d\n", (int)node[i]->afixflags.bits.allowremote);
558 fprintf(f_hpt, "# allowdelete %d\n", (int)node[i]->afixflags.bits.allowdelete);
559 fprintf(f_hpt, "# allowrename %d\n", (int)node[i]->afixflags.bits.allowrename);
560 fprintf(f_hpt, "# binarylist %d\n", (int)node[i]->afixflags.bits.binarylist);
561 fprintf(f_hpt, "# addplus %d\n", (int)node[i]->afixflags.bits.addplus);
562 fprintf(f_hpt, "# addtear %d\n", (int)node[i]->afixflags.bits.addtear);
563
564 fprintf(f_hpt, "# sendto %d\n", (int)node[i]->afixflags.bits.sendto);
565 fprintf(f_hpt, "# forward %d\n", (int)node[i]->afixflags.bits.forward);
566 fprintf(f_hpt, "# nosendrules %d\n", (int)node[i]->afixflags.bits.nosendrules);
567 fprintf(f_hpt, "# resv %d\n", (int)node[i]->afixflags.bits.resv);
568 fprintf(f_hpt, "### Fastecho's areafix flags for node end ##\n");
569 */
570 if ( node[i]->afixflags.bits.areafixtype == FSC57AreaFix )
571 fprintf(f_hpt, "AdvancedAreafix on\n");
572
573 if (node[i]->afixflags.bits.forward)
574 fprintf(f_hpt, "ForwardRequests on\n");
575
576 for (c = 0; c < config.FWACnt; c++)
577 if (i == frequest[c].nodenr) {
578 if (!node[i]->afixflags.bits.forward)
579 fprintf(f_hpt, "ForwardRequests off\n");
580 fprintf(f_hpt, "ForwardRequestFile %s\n", strLower(frequest[c].file));
581 }
582
583 if (node[i]->afixflags.bits.nosendrules)
584 fprintf(f_hpt, "NoRules on\n");
585
586 switch (node[i]->afixflags.bits.sendto) {
587 case AreaMgr:
588 fprintf(f_hpt, "RemoteRobotName AreaMgr\n");
589 break;
590 case AreaLink:
591 fprintf(f_hpt, "RemoteRobotName AreaLink\n");
592 break;
593 case EchoMgr:
594 fprintf(f_hpt, "RemoteRobotName EchoMgr\n");
595 break;
596 case AreaFix:
597 default:
598 /* This is HPT's hardcoded default value
599 fprintf(f_hpt, "RemoteRobotName AreaFix\n");
600 */
601 break;
602 } /* endswitch */
603
604
605 /* fprintf(f_hpt, "AllowPktAddrDiffer %s\n", ); */
606
607 if (node[i]->flags.packer != 0x0f)
608 fprintf(f_hpt, "Packer %s\n", packers[node[i]->flags.packer].tag);
609
610 if (node[i]->autopassive)
611 fprintf(f_hpt, "AutoPause %u\n", (unsigned)node[i]->autopassive);
612
613 if (node[i]->flags.passive)
614 fprintf(f_hpt, "Pause earea\n");
615
616 fprintf(f_hpt, "\n");
617 } /* endfor */
618 }
619
620
parseFEconfig()621 int parseFEconfig()
622 {
623 unsigned int c, i;
624 int rc;
625
626 c = 0;
627 while (c < config.offset) {
628 read_fe_extension_header(&header, f_cfg);
629 switch (header.type) {
630 case EH_AKAS:
631 sysaddr = (SysAddress*)calloc((header.offset / FE_SYS_ADDRESS_SIZE),
632 sizeof(SysAddress));
633 for (i = 0; i < header.offset / FE_SYS_ADDRESS_SIZE; i++)
634 {
635 read_fe_sysaddress(sysaddr+i, f_cfg);
636 }
637
638 break;
639 case EH_PACKERS:
640 packers = (Packers*)calloc(header.offset / FE_PACKERS_SIZE,
641 sizeof(Packers));
642 for (i = 0; i < header.offset / FE_PACKERS_SIZE; i++)
643 read_fe_packers(packers + i, f_cfg);
644 packers_count = i;
645 break;
646 case EH_PACKERS2:
647 packers2 = (Packers*)calloc(header.offset / FE_PACKERS_SIZE,
648 sizeof(Packers));
649 for (i = 0; i < header.offset / FE_PACKERS_SIZE; i++)
650 read_fe_packers(packers2 + i, f_cfg);
651 packers2_count = i;
652 break;
653 case EH_UNPACKERS:
654 unpackers = (Unpackers*)calloc(header.offset / FE_UNPACKERS_SIZE,
655 sizeof(Unpackers));
656 for (i = 0; i < header.offset / FE_UNPACKERS_SIZE; i++)
657 read_fe_unpackers(unpackers + i, f_cfg);
658 unpackers_count = i;
659 break;
660 case EH_UNPACKERS2:
661 unpackers2 = (Unpackers*)calloc(header.offset / FE_UNPACKERS_SIZE,
662 sizeof(Unpackers));
663 for (i = 0; i < header.offset / FE_UNPACKERS_SIZE; i++)
664 read_fe_unpackers(unpackers2 + i, f_cfg);
665 unpackers2_count = i;
666 break;
667 case EH_GRPDEFAULTS:
668 groupdef = (GroupDefaults**)calloc(config.GDCnt,
669 sizeof(GroupDefaults*));
670 for (i = 0; i < config.GDCnt; i++) {
671 groupdef[i] = (GroupDefaults*)malloc(sizeof(GroupDefaults));
672 read_fe_groupdefaults(groupdef[i], f_cfg, config.GrpDefRecSize);
673 } /* endfor */
674 break;
675 case EH_AREAFIX: /* 0x000d */
676 frequest = (ForwardAreaFix*)calloc(header.offset /
677 FE_FORWARD_AREAFIX_SIZE,
678 sizeof(ForwardAreaFix));
679 for (i = 0; i < header.offset / FE_FORWARD_AREAFIX_SIZE; i++)
680 read_fe_frequest(frequest + i, f_cfg);
681 break;
682 default:
683 fseek(f_cfg, header.offset, SEEK_CUR);
684 break;
685 } /* endswitch */
686 c += header.offset+FE_EXTHEADER_SIZE;
687 if ((unsigned long)ftell(f_cfg) != c + FE_CONFIG_SIZE)
688 {
689 fprintf(stderr, "%s file seems to be currupt (exp %ld, found %ld)\n",
690 FEconfig, (long)c + FE_CONFIG_SIZE, (long)ftell(f_cfg));
691 fclose(f_cfg);
692 return 4;
693 }
694 } /* endwhile */
695
696 fseek(f_cfg, FE_CONFIG_SIZE+config.offset, SEEK_SET);
697
698 node = (Node**)calloc(config.NodeCnt, sizeof(Node*));
699 for (i = 0; i < config.NodeCnt; i++) {
700 node[i] = (Node*)malloc(sizeof(Node));
701 rc = read_fe_node(node[i], f_cfg, config.NodeRecSize);
702 assert(!rc);
703 } /* endfor */
704
705 fseek(f_cfg, FE_CONFIG_SIZE+config.offset+
706 (config.NodeRecSize*config.NodeCnt), SEEK_SET);
707
708 area = (Area**)calloc(config.AreaCnt, sizeof(Area*));
709 for (i = 0; i < config.AreaCnt; i++) {
710 area[i] = (Area*)malloc(sizeof(Area));
711 read_fe_area(area[i], f_cfg);
712 } /* endfor */
713
714 return 0;
715 }
716
717
disposeFEconfig()718 void disposeFEconfig()
719 {
720 int i;
721
722 for (i = 0; i < config.AreaCnt; i++) {
723 nfree(area[i]);
724 }
725 nfree(area);
726 for (i = 0; i < config.NodeCnt; i++) {
727 free_fe_node(node[i]);
728 nfree(node[i]);
729 } /* endfor */
730 nfree(frequest);
731 nfree(node);
732 nfree(sysaddr);
733 nfree(packers);
734 nfree(unpackers);
735 nfree(packers2);
736 nfree(unpackers2);
737 for (i = 0; i < config.GDCnt; i++) {
738 free_fe_groupdefaults(groupdef[i]);
739 nfree(groupdef[i]);
740 } /* endfor */
741 nfree(groupdef);
742 }
743
744
main(int argc,char ** argv)745 int main(int argc, char **argv)
746 {
747 int i;
748 char *pp, *Version, *output_file = OUTPUT_FILE;
749
750 if (argc == 1) {
751 Usage(argv[0]);
752 exit(1);
753 } /* endif */
754
755 f_cfg = fopen( (FEconfig = argv[1]), "rb" );
756 if (!f_cfg) {
757 fprintf(stderr, "\nCan\'t open %s file.\n", argv[1]);
758 exit(2);
759 } /* endif */
760
761 if(argc>2)
762 output_file = argv[2];
763
764 read_fe_config(&config, f_cfg);
765
766 if (config.revision != REVISION) {
767 fprintf(stderr, "%s file is not fastecho.cfg 1.46\n", argv[1]);
768 fclose(f_cfg);
769 exit(4);
770 } /* endif */
771
772 i = parseFEconfig();
773 if( i ) exit(i);
774
775 fclose(f_cfg);
776
777 /* Extract program version from $Revision$ */
778 for(Version = Revision; *Version && !isdigit(*Version); Version++); /* Skip to digit */
779 for(pp=Version; *pp && (isdigit(*pp) || *pp=='.'); pp++); /* Seek for number end */
780 *pp = '\0'; /* Trim after number */
781
782 f_hpt = fopen(output_file, "wt");
783 if (!f_hpt) {
784 fprintf(stderr, "\nCan\'t open %s file\n", output_file);
785 fclose(f_cfg);
786 exit(3);
787 } /* endif */
788
789 printf ("Writing %s. Please manually check this file!\n", output_file);
790
791 fprintf(f_hpt, "# fastecho v1.46 config (fastecho.cfg) -> %s. (c) 2:5020/960@FidoNet\n", output_file);
792 fprintf(f_hpt, "# Check this file, please!\n\n");
793
794 fprintf(f_hpt, "Version %s\t# Program version\n\n", Version);
795
796 fprintf(f_hpt, "##################################################################\n");
797 fprintf(f_hpt, "# System\n\n");
798 fprintf(f_hpt, "Sysop %s\n", config.sysops[0].name);
799 for (i = 0; i < config.AkaCnt; i++) {
800 if (*(char*)&sysaddr[i]) {
801 fprintf(f_hpt, "Address %s\n", sysAddress2str(sysaddr[i]));
802 } /* endif */
803 } /* endfor */
804
805 fprintf(f_hpt, "\n");
806
807 if( config.UnprotInBound && *config.UnprotInBound )
808 fprintf(f_hpt, "Inbound %s\n", config.UnprotInBound);
809 if( config.InBound && *config.InBound )
810 fprintf(f_hpt, "ProtInbound %s\n", config.InBound);
811 if( config.TempInBound && *config.TempInBound )
812 fprintf(f_hpt, "TempInbound %s\n", config.TempInBound);
813 if( config.OutBound && *config.OutBound )
814 fprintf(f_hpt, "Outbound %s\n", config.OutBound);
815 if( config.TempPath && *config.TempPath )
816 fprintf(f_hpt, "TempOutbound %s\n", config.TempPath);
817 if(config.SwapPath && *config.SwapPath)
818 fprintf(f_hpt, "TempDir %s\n", config.SwapPath);
819 if( config.SemaphorePath && *config.SemaphorePath )
820 fprintf(f_hpt, "busyFileDir %s\n", config.SemaphorePath);
821 if( config.LocalInBound && *config.LocalInBound )
822 fprintf(f_hpt, "LocalInBound %s\n", config.LocalInBound);
823 if( config.RulesPrefix && *config.RulesPrefix )
824 fprintf(f_hpt, "%sRulesDir %s\n",
825 config.AreaFixFlags & SENDCONFERENCERULES? "": "# ",
826 config.RulesDir);
827 pp = strrchr(config.LogFile, '\\');
828 if(pp){
829 *pp=0;
830 fprintf(f_hpt, "Logfiledir %s\n", config.LogFile);
831 }
832
833 fprintf(f_hpt, "\n");
834 switch( config.loglevel ){
835 case 2:
836 fprintf(f_hpt, "LogLevels 0-z # loglevel Full\n");
837 fprintf(f_hpt, "ScreenLogLevels 0-z\n");
838 break;
839 case 1:
840 fprintf(f_hpt, "LogLevels 0-C # loglevel Norm\n");
841 fprintf(f_hpt, "ScreenLogLevels 0-C\n");
842 break;
843 case 0:
844 fprintf(f_hpt, "LogLevels \t\t# loglevel None\n");
845 fprintf(f_hpt, "ScreenLogLevels\n");
846 break;
847 }
848 /* Graphical tossing ? (Norm|Full) : None */
849 fprintf(f_hpt, "LogEchoToScreen %s\n", config.graphics ? "on" : "off");
850
851 fprintf(f_hpt, "\n");
852 if( config.ExtAfter && *config.ExtAfter )
853 fprintf(f_hpt, "AfterUnpack %s\n", config.ExtAfter);
854 if( config.ExtBefore && *config.ExtBefore )
855 fprintf(f_hpt, "BeforePack %s\n", config.ExtBefore);
856
857 if( config.AreaFixHelp && *config.AreaFixHelp )
858 fprintf(f_hpt, "AreaFixHelp %s\n", config.AreaFixHelp);
859
860 if( config.compressfree )
861 fprintf(f_hpt, "MinDiskFreeSpace %d\n", config.compressfree);
862
863 if( config.maxPKT )
864 fprintf(f_hpt, "AreafixMsgSize %u\n", config.maxPKT);
865
866 /*
867 if( config. && *config. )
868 fprintf(f_hpt, " \t%s\n", config.);
869 */
870
871 fprintf( f_hpt, "\n");
872 fprintf( f_hpt, "AreafixKillRequests %s\n",
873 config.AreaFixFlags & KEEPREQUEST ? "off" : "on" );
874 fprintf( f_hpt, "areafixQueryReports %s\n",
875 config.AreaFixFlags & ADDRECEIPTLIST ? "on" : "off" );
876
877 if( packers_count || unpackers_count || packers2_count || unpackers2_count )
878 fprintf(f_hpt, "\n## Packers and unpackers #########################################\n");
879
880 if( packers_count ){
881 fprintf(f_hpt, "## Packers (DOS)\n");
882 fprintf(f_hpt, "if \"[OS]\"!=\"OS/2\"\n");
883 print_packers(packers,packers_count);
884 fprintf(f_hpt, "endif\n");
885 }
886
887 if( unpackers_count ){
888 fprintf(f_hpt, "## Unpackers (DOS)\n\n");
889 fprintf(f_hpt, "if \"[OS]\"!=\"OS/2\"\n");
890 print_unpackers(unpackers,unpackers_count);
891 if( config.Unpacker && config.Unpacker[0] )
892 fprintf( f_hpt, " # Default unpacker\n Unpack \"%-30s $a $f $p\" 0 ??\n", config.Unpacker );
893 fprintf(f_hpt, "endif\n");
894 }
895
896 if( packers2_count ){
897 fprintf(f_hpt, "## Packers (OS/2)\n\n");
898 fprintf(f_hpt, "if \"[OS]\"==\"OS/2\"\n");
899 print_packers(packers2,packers2_count);
900 fprintf(f_hpt, "endif\n");
901 }
902 if( unpackers2_count ){
903 fprintf(f_hpt, "## Unpackers (OS/2)\n\n");
904 fprintf(f_hpt, "if \"[OS]\"==\"OS/2\"\n");
905 if( config.Unpacker2 && config.Unpacker2[0] )
906 fprintf( f_hpt, " # Default unpacker\n Unpack \"%-30s $a $f $p\" 0 ??\n", config.Unpacker2 );
907 print_unpackers(unpackers2,unpackers2_count);
908 fprintf(f_hpt, "endif\n");
909 }
910
911 fprintf(f_hpt, "\n##################################################################\n");
912 fprintf(f_hpt, "# Nodes\n\n");
913
914 fprintf(f_hpt, "\nLinkDefaults\n");
915
916 if( config.maxarcsize )
917 fprintf(f_hpt, "ArcmailSize %u\n", config.maxarcsize);
918 if( config.maxPKT )
919 fprintf(f_hpt, "PktSize %u\n", config.maxPKT);
920 fprintf(f_hpt, "AllowEmptyPktPwd %s\n", config.security>1 ? "off" : "on");
921 if(config.AreaFixFlags & KEEPRECEIPT)
922 fprintf(f_hpt, "AreafixReportsAttr pvt,loc,npd\n");
923 else
924 fprintf(f_hpt, "AreafixReportsAttr pvt,loc,npd,k/s\n");
925 /* if( config. && *config. )
926 fprintf(f_hpt, " %s\n", config.);
927 if( config. && *config. )
928 fprintf(f_hpt, " %s\n", config.);
929 */
930 fprintf(f_hpt, "LinkDefaults end\n");
931
932
933 print_links();
934
935
936
937 fprintf(f_hpt, "\n##################################################################\n");
938 fprintf(f_hpt, "# Areas\n\n");
939
940 fprintf(f_hpt, "EchoAreaDefaults -dupeCheck move -dupeHistory 11");
941 /* Use default values in each echoarea if echoarea falue is -1 */
942 /* if( config.def_days )
943 fprintf(f_hpt, "-p %u ", config.def_days);
944 else if( config.def_recvdays )
945 fprintf(f_hpt, "-p %u ", config.def_recvdays);
946 if( config.def_messages )
947 fprintf(f_hpt, "-$m %u ", config.def_messages);
948 */
949 fprintf(f_hpt, "\n\n");
950
951 fprintf(f_hpt, "# Main netmail\nNetmailArea Netmail %s\n", config.NetMPath);
952
953 print_areas();
954
955 fprintf(f_hpt, "\n");
956 fprintf(f_hpt, "\n##################################################################\n");
957 fprintf(f_hpt, "# Carbon copy\n\n");
958
959 print_carbon();
960
961 fclose(f_hpt);
962
963 disposeFEconfig();
964
965 return 0;
966 }
967