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