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