1 /******************************************************************************
2  * FIDOCONFIG --- library for fidonet configs
3  ******************************************************************************
4  * Copyright (C) 1998
5  *
6  * Victor Anikeev
7  * Original Code from: Matthias Tichy
8  *
9  * Fido:     2:5043/3.88 2:5043/17.5
10  * Internet: mgl@pisem.net starwars@bk.ru
11  *  [ please, write e-mails. fidonet doesn't work properly in our city :-( ]
12  *
13  * This file is part of FIDOCONFIG.
14  *
15  * This library is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU Library General Public
17  * License as published by the Free Software Foundation; either
18  * version 2 of the License, or (at your option) any later version.
19  *
20  * This library is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23  * Library General Public License for more details.
24  *
25  * You should have received a copy of the GNU Library General Public
26  * License along with this library; see file COPYING. If not, write to the Free
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  *****************************************************************************/
29 
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <string.h>
33 #include <ctype.h>
34 
35 #include "fidoconf.h"
36 #include "common.h"
37 
38 #ifndef VERSION_H
39 #define VERSION_H
40 
41 #include "version.h"
42 #include "../cvsdate.h"
43 
44 #define VER_MAJOR 1
45 #define VER_MINOR 9
46 #define VER_PATCH 0
47 #define VER_BRANCH BRANCH_CURRENT
48 
49 #endif
50 
51 #include "fc2tor_g.h"
52 
53 #define TAG_NAME 0
54 #define TAG_DESC 1
55 #define TAG_BOTH 2
56 
57 /* group delimeters */
58 
59 #define DELIMS " ,;"
60 
61 unsigned bbslevelsysop = 256;
62 unsigned bbslevelshow = 0;
63 unsigned bbslevellist = 0;
64 
65 int export_mailareas = 0;
66 int export_fileareas = 0;
67 
68 int export_local = 0;
69 int export_echo = 0;
70 int export_netmail = 0;
71 
72 int export_file = 0;
73 int export_bbs = 0;
74 
75 int export_group = 0;
76 int export_security = 0;
77 int export_scanprivmail = 0;
78 int export_scannewfiles = 0;
79 
80 int tag_type = TAG_NAME;
81 int bbsdeffmt = 1;
82 
83 char *bbsulpath = NULL;
84 char *groups = NULL;
85 
writeEchoArea(FILE * f,s_area * area,char type)86 int writeEchoArea(FILE *f, s_area *area, char type) {
87 
88    fprintf(f, "[MsgArea]\n");
89 
90    fprintf(f, "Name ");
91    switch ( tag_type ) {
92    case TAG_NAME: fprintf(f, " \"%s\"\n", area->areaName);
93                   break;
94    case TAG_DESC: fprintf(f, " \"%s\"\n", (area->description!=NULL) ? area->description : area->areaName);
95                   break;
96    case TAG_BOTH: fprintf(f, " \"%s", area->areaName);
97                   fprintf(f, ": %s\"\n", (area->description!=NULL) ? area->description : area->areaName);
98                   break;
99    }
100 
101    fprintf(f, "UseAddress %u:%u/%u.%u\n", area->useAka->zone, area->useAka->net, area->useAka->node, area->useAka->point);
102    fprintf(f, "BasePath %s\n", area->fileName);
103 
104    fprintf(f, "BaseType ");
105    if (area->msgbType == MSGTYPE_SQUISH) fprintf(f, "Squish");
106    else if (area->msgbType == MSGTYPE_JAM) fprintf(f, "Jam");
107    else fprintf(f, "Fido");
108    fprintf(f, "\n");
109 
110    if ( export_group ) fprintf(f, "Group %s\n", area->group);
111 
112    fprintf(f, "Type ");
113    switch (type) {
114      case 0: fprintf(f, "EchoMail");
115              break;
116      case 2: fprintf(f, "EchoMail");
117              break;
118      case 1: fprintf(f, "NetMail");
119              break;
120    }
121    fprintf(f, "\n");
122 
123    if (export_scanprivmail) fprintf(f, "Scan_PrivMail Yes\n");
124 
125    if (export_security) {
126      fprintf(f, "Read_Security  %u\n", area->levelread);
127      fprintf(f, "Write_Security %u\n", area->levelwrite);
128      fprintf(f, "Show_Security  %u\n", (area->hide) ? bbslevelsysop : bbslevelshow);
129      fprintf(f, "Sysop_Security %u\n", bbslevelsysop);
130    }
131    fprintf(f, "\n\n");
132    return 0;
133 }
134 
writeFileArea(FILE * f,s_area * area)135 int writeFileArea(FILE *f, s_area *area) {
136 
137    fprintf(f, "[FileArea]\n");
138 
139    fprintf(f, "Name ");
140    switch ( tag_type ) {
141    case TAG_NAME: fprintf(f, " \"%s\"\n", area->areaName);
142                   break;
143    case TAG_DESC: fprintf(f, " \"%s\"\n", (area->description!=NULL) ? area->description : area->areaName);
144                   break;
145    case TAG_BOTH: fprintf(f, " \"%s", area->areaName);
146                   fprintf(f, ": %s\"\n", (area->description!=NULL) ? area->description : area->areaName);
147                   break;
148    }
149 
150    fprintf(f, "DLPath %s\n", area->fileName);
151    if ( bbsulpath != NULL )
152      fprintf(f, "ULPath %s\n", bbsulpath);
153 
154    fprintf(f, "FileList %sfiles.bbs\n", area->fileName);
155    fprintf(f, "FList_Format %s\n", (bbsdeffmt) ? "FilesBBS" : "CD-List");
156    if ( !bbsdeffmt ) fprintf(f, "Copy_Local Yes\n");
157 
158    if ( export_group ) fprintf(f, "Group %s\n", area->group);
159 
160    if (export_scannewfiles) fprintf(f, "Scan_NewFiles Yes\n");
161 
162    if (export_security) {
163      fprintf(f, "DL_Security  %u\n", area->levelread);
164      fprintf(f, "UL_Security %u\n", area->levelwrite);
165      fprintf(f, "Show_Security  %u\n", (area->hide) ? bbslevelsysop : bbslevelshow);
166      fprintf(f, "List_Security  %u\n", bbslevellist);
167      fprintf(f, "Sysop_Security %u\n", bbslevelsysop);
168    }
169    fprintf(f, "\n\n");
170    return 0;
171 }
172 
writeBBSArea(FILE * f,s_bbsarea * area)173 int writeBBSArea(FILE *f, s_bbsarea *area) {
174 
175    fprintf(f, "[FileArea]\n");
176 
177    fprintf(f, "Name ");
178    switch ( tag_type ) {
179    case TAG_NAME: fprintf(f, " \"%s\"\n", area->areaName);
180                   break;
181    case TAG_DESC: fprintf(f, " \"%s\"\n", (area->description!=NULL) ? area->description : area->areaName);
182                   break;
183    case TAG_BOTH: fprintf(f, " \"%s", area->areaName);
184                   fprintf(f, ": %s\"\n", (area->description!=NULL) ? area->description : area->areaName);
185                   break;
186    }
187 
188    fprintf(f, "DLPath %s\n", area->pathName);
189    if ( bbsulpath != NULL )
190      fprintf(f, "ULPath %s\n", bbsulpath);
191 
192    fprintf(f, "FileList %sfiles.bbs\n", area->pathName);
193    fprintf(f, "FList_Format %s\n", (bbsdeffmt) ? "FilesBBS" : "CD-List");
194    if ( !bbsdeffmt ) fprintf(f, "Copy_Local Yes\n");
195 
196    if (export_scannewfiles) fprintf(f, "Scan_NewFiles Yes\n");
197 
198    if (export_security) {
199      fprintf(f, "List_Security  %u\n", bbslevellist);
200      fprintf(f, "Sysop_Security %u\n", bbslevelsysop);
201    }
202    fprintf(f, "\n\n");
203    return 0;
204 }
205 
generateBBSConfig(s_fidoconfig * config,char * fileName)206 int generateBBSConfig(s_fidoconfig *config, char *fileName) {
207    FILE *f;
208    unsigned int  i;
209    s_area *area;
210 
211    f = fopen(fileName, "a+");
212 
213    if (f!= NULL) {
214 
215     if (export_mailareas && export_netmail) {
216       for (i=0; i<config->netMailAreaCount; i++) {
217         if (isSubSetOfGroups(groups, config->netMailAreas[i].group, DELIMS))
218          writeEchoArea(f, &(config->netMailAreas[i]), 1);
219       }
220     }
221 
222     if (export_mailareas && export_echo) {
223      for (i=0; i<config->echoAreaCount; i++) {
224        area = &(config->echoAreas[i]);
225        if (area->msgbType != MSGTYPE_PASSTHROUGH)
226         if (isSubSetOfGroups(groups, area->group, DELIMS))
227            writeEchoArea(f, area, 0);
228      }
229     }
230 
231     if (export_mailareas && export_local) {
232      for (i=0; i<config->localAreaCount; i++) {
233        area = &(config->localAreas[i]);
234         if (isSubSetOfGroups(groups, area->group, DELIMS))
235          writeEchoArea(f, area, 2);
236      }
237     }
238 
239     if (export_fileareas && export_file) {
240       for (i=0; i<config->fileAreaCount; i++) {
241         if (isSubSetOfGroups(groups, config->fileAreas[i].group, DELIMS))
242           writeFileArea(f, &(config->fileAreas[i]));
243       }
244     }
245 
246     if (export_fileareas && export_bbs) {
247       for (i=0; i<config->bbsAreaCount; i++) {
248 /*        if (isSubSetOfGroups(groups, config->bbsAreas[i].group, DELIMS)) */
249           writeBBSArea(f, &(config->bbsAreas[i]));
250       }
251     }
252 
253     return 0;
254    }
255    else printf("Could not write %s\n", fileName);
256 
257    return 1;
258 }
259 
readDefaultConfig(char * cfg_file,char * def_file)260 int readDefaultConfig(char *cfg_file, char *def_file) {
261   FILE *f1,*f2;
262   char buffer[2048];
263 
264   if ((f1=fopen(def_file,"rt"))==NULL) {
265     perror("Orig. file not found!");
266     return -1;
267   }
268   else {
269     if ((f2=fopen (cfg_file,"wt"))==NULL) {
270       perror("Can't create dest. file!");
271       return -2;
272     }
273     else {
274       while (fgets(buffer,sizeof(buffer),f1))
275         fputs(buffer,f2);
276     }
277     fputs("\n",f2);
278     fclose(f1);
279     fclose(f2);
280   }
281   return 0;
282 }
283 
parseOptions(char * line)284 void parseOptions(char *line) {
285 /*   int options=0;
286    char chr=0;
287 */
288 
289    if ( strncasecmp(line, "-m", 2) == 0 ) {
290     export_mailareas = 1;
291     line+=2;
292     while ( *line ) {
293       switch ( tolower(*line) ) {
294       case 'e': export_echo = 1; break;
295       case 'l': export_local = 1; break;
296       case 'n': export_netmail = 1; break;
297       default: printf("Invalid flag: %c\n", *line);
298       }
299       line++;
300     }
301    } else
302 
303    if ( strncasecmp(line, "-f", 2) == 0 ) {
304     export_fileareas = 1;
305     line+=2;
306     while ( *line ) {
307       switch ( tolower(*line) ) {
308       case 'f': export_file = 1; break;
309       case 'b': export_bbs = 1; break;
310       default: printf("Invalid flag: %c\n", *line);
311       }
312       line++;
313     }
314    } else
315 
316    if ( stricmp(line, "-sc" ) == 0 ) {
317      export_scanprivmail = export_scannewfiles = 1; } else
318 
319    if ( stricmp(line, "-cd" ) == 0 ) bbsdeffmt = 0; else
320 
321    if ( stricmp(line, "-s" ) == 0 ) export_security = 1; else
322    if ( stricmp(line, "-g" ) == 0 ) export_group = 1; else
323 
324    if ( stricmp(line, "-nt" ) == 0 ) tag_type = TAG_NAME; else
325    if ( stricmp(line, "-nd" ) == 0 ) tag_type = TAG_DESC; else
326    if ( stricmp(line, "-nb" ) == 0 ) tag_type = TAG_BOTH; else
327 
328    if ( strncasecmp(line, "-ss", 3 ) == 0 ) {
329      line+=3;
330      sscanf(line, "%u", &bbslevelsysop);
331    } else
332 
333    if ( strncasecmp(line, "-ul", 3 ) == 0 ) {
334      line+=3;
335      bbsulpath = strdup(line);
336    } else
337 
338    if ( strncasecmp(line, "-gr", 3 ) == 0 ) {
339      line+=3;
340      groups = strdup(line);
341    } else
342 
343    printf("Invalid option: %s\n", line);
344 }
345 
main(int argc,char * argv[])346 int main (int argc, char *argv[]) {
347    s_fidoconfig *config;
348    int cont=1;
349 
350    { char *temp;
351      printf("%s\n", temp=GenVersionStr( "fconf2tornado", FC_VER_MAJOR,
352 			FC_VER_MINOR, FC_VER_PATCH, FC_VER_BRANCH, cvs_date ));
353      nfree(temp);
354    }
355 
356    while ((cont<argc) && (*argv[cont]=='-')) {
357         parseOptions(argv[cont]);
358         cont++;
359    }
360 
361    if (!(cont<argc)) {
362       printf("\nUsage:\n");
363       printf("   fconf2tornado -[command [-command...]] <tornado.ctl> [<default.ctl>]\n");
364       printf("    (you may read config defaults from default.ctl)              \n");
365       printf("    -m[<flags>] exports mail areas:   n  netmail areas           \n");
366       printf("                                      e  echo areas              \n");
367       printf("                                      l  local areas             \n");
368       printf("    -f[<flags>] exports file areas:   f  file areas              \n");
369       printf("                                      b  bbs areas               \n");
370       printf("    -s        exports security options                           \n");
371       printf("    -g        exports groups                                     \n");
372       printf("    -nt       exports area tag as name                           \n");
373       printf("    -nd       exports description as name                        \n");
374       printf("    -nb       exports area tag and description as name           \n");
375       printf("    -ss<num>  sets sysop sequrity level (default=256)            \n");
376       printf("    -cd       uses CD-List as FList_Format (default id FilesBBS) \n");
377       printf("    -sc       exports Scan_NewFiles and Scan_PrivMail keywords   \n");
378       printf("    -ul<path> sets default UL_Path for all areas                 \n");
379       printf("    -gr<grps> exports areas with <grp> groups only (default all) \n");
380       printf("\nExamples:                                                      \n");
381       printf("   fconf2tornado -mel -ss256 c:\\tornado\\msgarea.ctl            \n");
382       printf("   fconf2tornado -ff -g -ulc:\\bbs\\upload filearea.ctl          \n");
383       printf("   fconf2tornado -ff -g -grFido temp.ctl                         \n");
384       printf("   fconf2tornado -ff -g -grLocal filearea.ctl temp.ctl           \n");
385       return 1;
386 
387    }
388    printf("Generating Config-file %s\n", argv[cont]);
389 
390    config = readConfig(NULL);
391 
392    config = readConfig(NULL);
393    if (config!= NULL) {
394     if (argv[cont+1]!=NULL) readDefaultConfig(argv[cont], argv[cont+1]);
395     else  remove (argv[cont]);
396      generateBBSConfig(config, argv[cont]);
397      disposeConfig(config);
398      return 0;
399    } return 1;
400 
401 }
402