/****************************************************************************** * FIDOCONFIG --- library for fidonet configs ****************************************************************************** * Copyright (C) 1998-1999 * * Matthias Tichy * * Fido: 2:2433/1245 2:2433/1247 2:2432/605.14 * Internet: mtt@tichy.de * * Grimmestr. 12 Buchholzer Weg 4 * 33098 Paderborn 40472 Duesseldorf * Germany Germany * * This file is part of FIDOCONFIG. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; see file COPYING. If not, write to the Free * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************** * $Id: tparser.c,v 1.241.2.6 2006/02/09 12:11:54 nick_voronin Exp $ */ #include #include #include #include #include #include #include #ifdef HAS_UNISTD_H # include #endif #ifdef HAS_IO_H # include #endif #include "version.h" #include "cvsdate.h" #include "fidoconf.h" #include "xstr.h" #include "common.h" #ifndef VERSION_H #define VERSION_H #endif static s_fidoconfig *config; /* Test for required tokens */ int testConfig(s_fidoconfig *config){ int rc=0; printf("\n"); if(!config->tempDir){ printf("WARNING: TempDir not defined!\n"); rc=1; } if(!config->protInbound){ printf("WARNING: ProtInbound not defined!\n"); rc=1; } if(!config->inbound){ printf("WARNING: Inbound not defined!\n"); rc=1; } if(!config->tempInbound){ printf("WARNING: TempInbound not defined!\n"); rc=1; } if(!config->outbound){ printf("WARNING: Outbound not defined!\n"); rc=1; } if(!config->tempOutbound){ printf("WARNING: TempOutbound not defined!\n"); rc=1; } if(!config->nodelistDir){ printf("WARNING: NodelistDir not defined!\n"); rc=1; } if (config->netMailAreaCount == 0) { printf("You must define at least one NetmailArea!\n"); rc=1; } if (config->dupeArea.areaName == NULL) { printf("You must define DupeArea!\n"); rc=1; } else if (config->dupeArea.fileName == NULL) { printf("DupeArea can not be passthrough!\n"); rc=1; } if (config->badArea.areaName == NULL) { printf("You must define BadArea!\n"); rc=1; } else if (config->badArea.fileName == NULL) { printf("BadArea can not be passthrough!\n"); rc=1; } if( rc ) putchar('\n'); return rc; } /* check to path accuracy */ int testpath(const char *s, const char *t1, const char *t2, const char *t3) { unsigned c; int rc=0; /* list of invalid substrings */ static char *invalids[] = { "/../", "\\..\\", ">", "<", "|", NULL }; /* list of reasons correspondings previous */ static char *reasons[] = { "relative path", "relative path", "output redirect chars not allowed in path name", "input redirect chars not allowed in path name", "in/out pipe char not allowed in path name", NULL }; if(s) { for (c=0;invalids[c];c++) if (strstr(s,invalids[c])){ printf( "WARNING: mistake in %s%s%s%s%s value: %s\n", (t1?t1:""), (t2? " " : ""), (t2?t2:""), (t3? " " : ""), (t3?t3:""), reasons[c] ); rc++; } if(!( strncmp(s,"./",2) && strncmp(s,"../",3) && strncmp(s,".\\",2) && strncmp(s,"..\\",3) )) { printf( "WARNING: mistake in %s%s%s%s%s value: relative path\n", (t1?t1:""), (t2? " " : ""), (t2?t2:""), (t3? " " : ""), (t3?t3:"") ); } } return rc; } /* check to plain file name accuracy */ int testplainfile(const char *s, const char *t1, const char *t2, const char *t3) { static char invalidc[]=":/\\><|"; register char *p; if( s && (p=strpbrk(s,invalidc)) ){ printf("ERROR: %s%s%s%s%s can't contains %c\n", t1, (t2? " " : ""), t2, (t3? " " : ""), t3, *p); return -1; } return 0; } /* check to file names and paths accuracy. Return zero if success. */ int testPathsAndFiles() { int rc=0; register int i; rc+=testpath(config->inbound,"inbound",NULL,NULL ); rc+=testpath(config->outbound,"outbound",NULL,NULL ); rc+=testpath(config->protInbound,"protInbound",NULL,NULL ); rc+=testpath(config->listInbound,"listInbound",NULL,NULL ); rc+=testpath(config->localInbound,"localInbound",NULL,NULL ); rc+=testpath(config->tempInbound,"tempInbound",NULL,NULL ); rc+=testpath(config->logFileDir,"logFileDir",NULL,NULL ); rc+=testpath(config->dupeHistoryDir,"dupeHistoryDir",NULL,NULL ); rc+=testpath(config->nodelistDir,"nodelistDir",NULL,NULL ); rc+=testpath(config->msgBaseDir,"msgBaseDir",NULL,NULL ); rc+=testpath(config->magic,"magic",NULL,NULL ); rc+=testpath(config->areafixhelp,"areafixhelp",NULL,NULL ); rc+=testpath(config->filefixhelp,"filefixhelp",NULL,NULL ); rc+=testpath(config->tempOutbound,"tempOutbound",NULL,NULL ); rc+=testpath(config->ticOutbound,"ticOutbound",NULL,NULL ); rc+=testpath(config->tempDir,"tempDir",NULL,NULL ); rc+=testpath(config->fileAreaBaseDir,"fileAreaBaseDir",NULL,NULL ); rc+=testpath(config->passFileAreaDir,"passFileAreaDir",NULL,NULL ); rc+=testpath(config->busyFileDir,"busyFileDir",NULL,NULL ); rc+=testpath(config->semaDir,"semaDir",NULL,NULL ); rc+=testpath(config->badFilesDir,"badFilesDir",NULL,NULL ); rc+=testpath(config->hptPerlFile,"hptPerlFile",NULL,NULL ); rc+=testpath(config->advStatisticsFile,"advStatisticsFile",NULL,NULL ); rc+=testpath(config->newAreaRefuseFile,"newAreaRefuseFile",NULL,NULL ); rc+=testpath(config->intab,"intab",NULL,NULL ); rc+=testpath(config->outtab,"outtab",NULL,NULL ); rc+=testpath(config->echotosslog,"echotosslog",NULL,NULL ); rc+=testpath(config->statlog,"statlog",NULL,NULL ); rc+=testpath(config->importlog,"importlog",NULL,NULL ); rc+=testpath(config->lockfile,"lockfile",NULL,NULL ); rc+=testpath(config->fileAreasLog,"fileAreasLog",NULL,NULL ); rc+=testpath(config->fileNewAreasLog,"fileNewAreasLog",NULL,NULL ); rc+=testpath(config->longNameList,"longNameList",NULL,NULL ); rc+=testpath(config->fileArcList,"fileArcList",NULL,NULL ); rc+=testpath(config->filePassList,"filePassList",NULL,NULL ); rc+=testpath(config->fileDupeList,"fileDupeList",NULL,NULL ); rc+=testpath(config->netmailFlag,"netmailFlag",NULL,NULL ); rc+=testpath(config->aacFlag,"aacFlag",NULL,NULL ); rc+=testpath(config->afcFlag,"afcFlag",NULL,NULL ); rc+=testpath(config->reqidxDir,"reqidxDir",NULL,NULL ); rc+=testpath(config->rulesDir,"rulesDir",NULL,NULL ); rc+=testpath(config->seqDir,"seqDir",NULL,NULL ); rc+=testplainfile(config->fidoUserList,"fidoUserList",NULL,NULL ); /* extension = file name suffix test as file name */ rc+=testplainfile(config->tossingExt,"tossingExt",NULL,NULL ); /* checks area pathes */ rc+=testpath(config->dupeArea.fileName,"Dupearea filename",NULL,NULL ); rc+=testpath(config->badArea.fileName,"Badarea filename",NULL,NULL ); for (i=0;inetMailAreaCount;i++) rc+=testpath(config->netMailAreas[i].fileName,"Netmailarea",config->netMailAreas[i].areaName, config->netMailAreas[i].msgbType==MSGTYPE_SDM ?"pathname":"filename"); for (i=0;iechoAreaCount;i++) rc+=testpath(config->echoAreas[i].fileName,"Echoarea",config->echoAreas[i].areaName, config->echoAreas[i].msgbType==MSGTYPE_SDM ?"pathname":"filename"); for (i=0;ilocalAreaCount;i++) rc+=testpath(config->localAreas[i].fileName,"Localarea",config->localAreas[i].areaName, config->localAreas[i].msgbType==MSGTYPE_SDM ?"pathname":"filename"); for (i=0;ifileAreaCount;i++) rc+=testpath( config->fileAreas[i].pathName, "Filearea", config->fileAreas[i].areaName, "pathname" ); for (i=0;ibbsAreaCount;i++) rc+=testpath( config->bbsAreas[i].pathName, "BBSarea", config->bbsAreas[i].areaName, "pathname" ); for (i=0;inodelistCount;i++){ rc+=testplainfile( config->nodelists[i].nodelistName, "Nodelist", config->nodelists[i].nodelistName, NULL ); rc+=testpath( config->nodelists[i].diffUpdateStem, "Nodelist's", config->nodelists[i].nodelistName, "diffUpdateStem"); rc+=testpath( config->nodelists[i].fullUpdateStem, "Nodelist's", config->nodelists[i].nodelistName, "fullUpdateStem" ); } for (i=0;ifilelistCount;i++) { rc+=testplainfile( config->filelists[i].destFile, "Filelist", config->filelists[i].destFile, NULL ); rc+=testpath( config->filelists[i].dirHdrTpl, "Filelist's", config->filelists[i].destFile, "dirHdrTpl" ); rc+=testpath( config->filelists[i].dirEntryTpl, "Filelist's", config->filelists[i].destFile, "dirEntryTpl" ); rc+=testpath( config->filelists[i].dirFtrTpl, "Filelist's", config->filelists[i].destFile, "dirFtrTpl" ); rc+=testpath( config->filelists[i].globHdrTpl, "Filelist's", config->filelists[i].destFile, "globHdrTpl" ); rc+=testpath( config->filelists[i].globFtrTpl, "Filelist's", config->filelists[i].destFile, "globFtrTpl" ); rc+=testpath( config->filelists[i].dirListHdrTpl, "Filelist's", config->filelists[i].destFile, "dirListHdrTpl" ); rc+=testpath( config->filelists[i].dirListEntryTpl, "Filelist's", config->filelists[i].destFile, "dirListEntryTpl" ); rc+=testpath( config->filelists[i].dirListFtrTpl, "Filelist's", config->filelists[i].destFile, "dirListFtrTpl" ); } /* test links */ for (i=0;ilinkCount;i++){ rc+=testpath( config->links[i].autoAreaCreateFile, "Link", config->links[i].name, "autoAreaCreateFile" ); rc+=testpath( config->links[i].autoFileCreateFile, "Link", config->links[i].name, "autoFileCreateFile" ); rc+=testpath( config->links[i].forwardRequestFile, "Link", config->links[i].name, "forwardRequestFile" ); rc+=testpath( config->links[i].denyFwdFile, "Link", config->links[i].name, "denyFwdFile" ); rc+=testpath( config->links[i].forwardFileRequestFile, "Link", config->links[i].name, "forwardFileRequestFile" ); rc+=testpath( config->links[i].msgBaseDir, "Link", config->links[i].name, "msgBaseDir" ); rc+=testpath( config->links[i].fileBaseDir, "Link", config->links[i].name, "fileBaseDir" ); rc+=testpath( config->links[i].fileBox, "Link", config->links[i].name, "fileBox" ); } /* rc+=testplainfile(config->,""); rc+=testplainfile(config->,""); rc+=testpath(config->,""); rc+=testpath(config->,""); */ return rc; } void printAddr(ps_addr addr) { if(addr) { if (addr->domain != NULL) { if(addr->point) printf(" %d:%d/%d.%d@%s ", addr->zone, addr->net, addr->node, addr->point, addr->domain); else printf(" %d:%d/%d@%s ", addr->zone, addr->net, addr->node, addr->domain); }else{ if(addr->point) printf(" %d:%d/%d.%d ", addr->zone, addr->net, addr->node, addr->point); else printf(" %d:%d/%d ", addr->zone, addr->net, addr->node); } } } void printArea(s_area area) { UINT i; printf("%s \n", area.areaName); printf("Description: "); if (area.description != NULL) printf("%s",area.description); printf("\n-> %s\t", area.fileName ? area.fileName : ""); if (area.msgbType == MSGTYPE_SDM) printf("SDM"); else if (area.msgbType == MSGTYPE_SQUISH) printf("Squish"); else if (area.msgbType == MSGTYPE_JAM) printf("Jam"); else printf("Passthrough"); printf("\t Use AKA: "); if (area.useAka == NULL) printf ("(not configured)"); else printAddr(area.useAka); printf("\n"); printf("DOS Style File (8+3) %s\n", (area.DOSFile) ? "on (-dosfile)" : "off (-nodosfile)"); printf("Level read (-lr): %d\n", area.levelread); printf("Level write (-lw): %d\n", area.levelwrite); if (area.group) printf("Group - %s\n", area.group); if (area.nopack) { printf("Purge never (option \"-nopack\") (ignoring: max (-$m): %u msgs\tpurge (-p): %u days)\tdupeHistory %u\n", area.max, area.purge, area.dupeHistory); } else { printf("Purging enabled (option \"-pack\") max (-$m): %u msgs\tpurge (-p): %u days\tdupeHistory %u\n", area.max, area.purge, area.dupeHistory); } printf("Options: "); if (area.tinySB) printf("tinySB "); else printf("noTinySB "); if (area.killSB) printf("killSB "); else printf("noKillSB "); if (area.keepUnread) printf("keepUnread "); else printf("noKeepUnread "); if (area.killRead) printf("killRead "); else printf("noKillRead "); if (area.hide) printf("hide "); else printf("noHide "); if (area.killMsgBase) printf("kill "); else printf("noKill "); if (area.manual) printf("manual "); else printf("noManual "); if (area.noPause) printf("noPause "); else printf("pause "); if (area.nolink) printf("nolink "); else printf("link "); if (area.mandatory) printf("mandatory "); else printf("noMandatory "); if (area.debug) printf("debug "); else printf("noDebug "); if (area.DOSFile) printf("DOSFile "); else printf("noDOSFile "); if (area.nopack) printf("noPack "); else printf("pack "); if (area.ccoff) printf("ccoff "); else printf("noCCoff "); if (area.keepsb) printf("keepSB "); else printf("noKeepSB "); printf("\n"); printf("DupeCheck: "); if (area.dupeCheck==dcOff) printf("off"); if (area.dupeCheck==dcMove) printf("move"); if (area.dupeCheck==dcDel) printf("delete"); printf("\n"); printf("Messagebase permissions (unixes only): "); if(area.fperm!=-1) printf("%o ",area.fperm); else printf("system default"); printf(", owner: "); if(area.uid!=-1) printf("%05u ",area.uid); else printf("not defined"); printf(", group: "); if(area.gid!=-1) printf("%05u ",area.gid); else printf("not defined"); printf("\n"); if (area.downlinkCount) printf("Links:\n"); else printf("No links\n"); for (i = 0; ilink->hisAka)); printf(" level %d,", area.downlinks[i]->link->level); /* printf(" exp. %s,", (area.downlinks[i]->export) ? "on" : "off"); printf(" imp. %s,", (area.downlinks[i]->import) ? "on" : "off");*/ if(area.downlinks[i]->export || area.downlinks[i]->import) printf(" "); else printf(" no access"); if(area.downlinks[i]->export) printf("read"); if(area.downlinks[i]->export && area.downlinks[i]->import) printf("/"); if(area.downlinks[i]->import) printf("write"); if((area.downlinks[i]->export + area.downlinks[i]->import)==1) printf(" only"); printf(","); printf(" defLink %s,", (area.downlinks[i]->defLink) ? "on" : "off"); printf(" mand. %s.\n", (area.downlinks[i]->mandatory) ? "on" : "off"); } if (area.sbaddCount) { printf("addSeenBys: "); for (i=0; i 0) printf("Purge (-p): %u days\n", area.purge); else printf("Purging disabled (-p 0)\n"); printf("Options: "); if (area.hide) printf("hide "); else printf("noHide "); if (area.manual) printf("manual "); else printf("noManual "); if (area.mandatory) printf("mandatory "); else printf("noMandatory "); if (area.sendorig) printf("sendorig "); else printf("noSendOrig "); if (area.noPause) printf("noPause "); else printf("pause "); if (area.noCRC) printf("noCRC "); else printf("crc "); if (area.noreplace) printf("noReplace "); else printf("replace "); if (area.nodiz) printf("noDiz "); else printf("diz "); printf("\n"); if (area.group) printf("Group (-g): %s\n", area.group); if (area.downlinkCount) printf("Links:\n"); else printf("No links\n"); for (i = 0; ilink->hisAka)); printf(" level %d,", area.downlinks[i]->link->level); if(area.downlinks[i]->export || area.downlinks[i]->import) printf(" "); else printf(" no access"); if(area.downlinks[i]->export) printf("receive"); if(area.downlinks[i]->export && area.downlinks[i]->import) printf("/"); if(area.downlinks[i]->import) printf("send"); if((area.downlinks[i]->export + area.downlinks[i]->import)==1) printf(" only"); printf(","); /* printf(" export %s,", (area.downlinks[i]->export) ? "on" : "off"); printf(" import %s,", (area.downlinks[i]->import) ? "on" : "off"); */ printf(" mandatory %s", (area.downlinks[i]->mandatory) ? "on" : "off"); if (area.downlinks[i]->defLink) printf("; this is (default) uplink.\n"); else printf(".\n"); } printf("-------\n"); } void printBbsArea(s_bbsarea area) { printf("%s \n", area.areaName); printf("Description: %s\n",area.description); printf("Path: %s\t", area.pathName); printf("\n"); printf("-------\n"); } void printFilelist(s_filelist *fl) { switch (fl->flType) { case flDir: printf("type: directory\n"); break; case flGlobal: printf("type: global\n"); break; case flDirList: printf("type: dirlist\n"); break; default: printf("internal error: unknown flType!\n"); break; } printf("destination file: %s\n", fl->destFile); if ((fl->flType == flGlobal) || (fl->flType == flDir)) { printf("directory header template: %s\n", fl->dirHdrTpl); printf("directory entry template: %s\n", fl->dirEntryTpl); printf("directory footer template: %s\n", fl->dirFtrTpl); } switch (fl->flType) { case flGlobal: printf("global header template: %s\n", fl->globHdrTpl); printf("global footer template: %s\n", fl->globFtrTpl); break; case flDirList: printf("dirlist header template: %s\n", fl->dirListHdrTpl); printf("dirlist entry template: %s\n", fl->dirListEntryTpl); printf("dirlist footer template: %s\n", fl->dirListFtrTpl); break; case flDir: /* just avoid a warning */ break; } printf("-------\n"); } static char *cvtFlavour(e_flavour flavour) { switch (flavour) { case hold: return "hold"; case normal: return "normal"; case direct: return "direct"; case crash: return "crash"; case immediate: return "immediate"; default: fprintf(stderr, "Unknown flavour, update tparser!\n"); return ""; } } int printLink(s_link link) { unsigned int i, rc=0; printf("Link: "); printAddr(&(link.hisAka)); printf(" (ourAka "); printAddr(link.ourAka); printf(")\n"); if (link.hisPackAka.zone!=0) { printf("PackAka: "); printAddr(&(link.hisPackAka)); printf("\n"); } printf("Name: %s\n", link.name); if (link.defaultPwd) printf("defaultPwd: %s\n", link.defaultPwd); if (link.pktPwd) printf("pktPwd: %s\n", link.pktPwd); if (link.ticPwd) printf("ticPwd: %s\n", link.ticPwd); if (link.areaFixPwd) printf("areafixPwd: %s\n", link.areaFixPwd); if (link.fileFixPwd) printf("filefixPwd: %s\n", link.fileFixPwd); if (link.bbsPwd) printf("bbsPwd: %s\n", link.bbsPwd); if (link.sessionPwd) { printf("sessionPwd: %s\n", link.sessionPwd); if(strlen(link.sessionPwd)>8) { printf("WARNING: sessionPwd too long, should be not more what 8 chars usually.\nMore long password may cause error in some mailers.\n"); fprintf(stderr,"WARNING: sessionPwd too long, should be not more what 8 chars usually.\n"); } } if (link.handle!=link.name) printf("handle: %s\n", link.handle); if (link.email) { printf("email: %s\n", link.email); switch (link.emailEncoding) { case eeMIME: printf("emailEncoding: MIME\n"); break; case eeSEAT: printf("emailEncoding: SEAT\n"); break; case eeUUE: printf("emailEncoding: UUE\n"); break; default: printf("Internal error: Unknown encoding #%d!\n", link.emailEncoding); } } if (link.emailFrom) printf("emailFrom: %s\n", link.emailFrom); if (link.emailSubj) printf("emailSubj: %s\n", link.emailSubj); printf("Level: %u\n", link.level); printf("Export: %s\n",(link.export) ? "on" : "off"); printf("Import: %s\n",(link.import) ? "on" : "off"); printf("Mandatory: %s\n",(link.mandatory) ? "on" : "off"); printf("AvailList: "); switch(link.availlist) { case AVAILLIST_FULL: printf("Full\n"); break; case AVAILLIST_UNIQUE: printf("Unique\n"); break; case AVAILLIST_UNIQUEONE: printf("UniqueOne\n"); break; default: printf("Unknown (m.b. fidoconf <--> tparser incompatible?)"); break; } if ((link.Pause & EPAUSE) == EPAUSE) printf("Link in paused for echoes, no export\n"); if ((link.Pause & FPAUSE) == FPAUSE) printf("Link in paused for fileEchoes, no export\n"); if (link.autoPause) printf("AutoPause over %u days\n", link.autoPause); if (link.numOptGrp > 0) { printf("OptGrp "); for (i = 0; i < link.numOptGrp; i++) { if (i > 0) printf(","); printf("%s", link.optGrp[i]); } printf("\n"); } printf("AutoAreaCreate %s\n", (link.autoAreaCreate) ? "on" : "off"); printf("AutoAreaCreateSubdirs %s\n", (link.autoAreaCreateSubdirs) ? "on" : "off"); if (link.autoAreaCreateFile) printf("AutoAreaCreateFile: %s\n", link.autoAreaCreateFile); if (link.numFrMask > 0) { printf("ForwardRequestMask: "); for (i = 0; i < link.numFrMask; i++) { if (i > 0) printf(","); printf("%s", link.frMask[i]); } printf("\n"); } if (link.numDfMask > 0) { printf("DenyFwdMask: "); for (i = 0; i < link.numDfMask; i++) { if (i > 0) printf(","); printf("%s", link.dfMask[i]); } printf("\n"); } if (link.autoAreaCreateDefaults) printf("AutoAreaCreateDefaults: %s\n", link.autoAreaCreateDefaults); printf("delNotReceivedTIC: %s\n", link.delNotReceivedTIC ? "on" : "off"); printf("FileFixFSC87Subset %s\n", (link.FileFixFSC87Subset) ? "on" : "off"); printf("AutoFileCreate %s\n", (link.autoFileCreate) ? "on" : "off"); printf("AutoFileCreateSubdirs %s\n", (link.autoFileCreateSubdirs) ? "on" : "off"); if (link.autoFileCreateFile) printf("AutoFileCreateFile: %s\n", link.autoFileCreateFile); if (link.autoFileCreateDefaults) { printf("AutoFileCreateDefaults: %s\n", link.autoFileCreateDefaults); if (strstr(link.autoFileCreateDefaults, "passthrough")) printf("WARNING: found 'passthrough' in AutoFileCreateDefaults, use LinkFileBaseDir for these purposes.\n"); } if (link.LinkGrp) printf("LinkGrp %s\n",link.LinkGrp); if (link.numAccessGrp) { unsigned int i; printf("AccessGrp "); for (i = 0; i < link.numAccessGrp; i++) { if (i > 0) printf(", %s", link.AccessGrp[i]); else printf("%s", link.AccessGrp[0]); } printf("\n"); } printf("AreaFix %s\n", (link.AreaFix) ? "on" : "off"); if (link.afixEchoLimit) printf("AreaFixEchoLimit %u\n", link.afixEchoLimit); if (link.ffixEchoLimit) printf("FileFixEchoLimit %u\n", link.ffixEchoLimit); printf("FileFix %s\n", (link.FileFix) ? "on" : "off"); printf("Forward Requests to this link is %s\n",(link.forwardRequests)?"on":"off"); printf("File Forward Requests to this link is %s\n",(link.forwardFileRequests)?"on":"off"); if (link.forwardAreaPriority) printf("ForwardAreaPriority: %u\n", link.forwardAreaPriority); if (link.forwardFilePriority) printf("ForwardFilePriority: %u\n", link.forwardFilePriority); printf("Forward Requests Access: %s\n", (link.denyFRA) ? "off" : "on"); printf("Unconditional Forward Requests Access: %s\n",(link.denyUFRA)?"off":"on"); if (link.RemoteRobotName) printf("RemoteRobotName %s\n", link.RemoteRobotName); else printf("RemoteRobotName areafix\n"); if (link.RemoteFileRobotName) printf("RemoteFileRobotName %s\n", link.RemoteFileRobotName); else printf("RemoteFileRobotName filefix\n"); if (link.forwardRequestFile) printf("ForwardRequestFile %s\n",link.forwardRequestFile); if (link.forwardFileRequestFile) printf("ForwardFileRequestFile %s\n",link.forwardFileRequestFile); if (link.denyFwdFile) printf("DenyFwdFile %s\n",link.denyFwdFile); if (link.msgBaseDir) printf("MsgBaseDir %s\n",link.msgBaseDir); if (link.fileBaseDir) printf("LinkFileBaseDir %s\n",link.fileBaseDir); if (link.packerDef) printf("PackerDefault %s\n", link.packerDef->packer); else printf("PackerDefault none\n"); if (link.fileBox) { printf("fileBox %s\n", link.fileBox); printf("fileBoxAlways: %s\n", link.fileBoxAlways ? "on": "off"); } printf("TickerPackToBox %s\n", (link.tickerPackToBox) ? "on" : "off"); if (link.pktSize != 0) printf("pktSize - %u kb\n",link.pktSize); if (link.arcmailSize != 0) printf("arcmailSize - %u kb\n",link.arcmailSize); if (link.packerDef) { printf("packNetmail: %s\n",(link.packNetmail)?"on":"off"); if (link.packNetmail) printf("maxUnpackedNetmail: %d kb\n", link.maxUnpackedNetmail); } else if (link.packNetmail) printf("Packer not defined but packNetmail is on\n"); printf("TIC files %s\n", (link.noTIC == 0) ? "on" : "off"); printf("forwardPkts "); switch (link.forwardPkts){ case fOff : printf("off\n"); break; case fSecure : printf("secure\n"); break; case fOn : printf("on\n"); break; } printf("allowEmptyPktPwd "); switch (link.allowEmptyPktPwd){ case eOff : printf("off\n"); break; case eSecure : printf("secure\n"); break; case eOn : printf("on\n"); break; } printf("allowPktAddrDiffer "); switch (link.allowPktAddrDiffer) { case pdOff : printf("off\n"); break; case pdOn : printf("on\n"); break; default: fprintf(stderr, "Error in keyword allowPktAddrDiffer\n"); } printf("AdvancedAreaFix %s\n", (link.advancedAreafix) ? "on" : "off"); switch (link.linkBundleNameStyle) { case eUndef: /* Don't print senseless information... printf("linkBundleNameStyle: undefined (like BundleNameStyle)\n"); */ break; case eAddrDiff: printf("linkBundleNameStyle: addrDiff\n"); break; case eAddrDiffAlways: printf("linkBundleNameStyle: addrDiffAlways\n"); break; case eTimeStamp: printf("linkBundleNameStyle: timeStamp\n"); break; case eAmiga: printf("linkBundleNameStyle: Amiga\n"); break; case eAddrsCRC32: printf("linkBundleNameStyle: AddrsCRC32\n"); break; case eAddrsCRC32Always: printf("linkBundleNameStyle: AddrsCRC32Always\n"); break; default: printf("WARNING: linkBundleNameStyle is UNKNOWN! Update tparser please!\n"); break; } printf("arcNetmail %s\n", (link.arcNetmail) ? "on" : "off"); printf("echoMailFlavour %s\n", cvtFlavour(link.echoMailFlavour)); printf("fileEchoFlavour %s\n", cvtFlavour(link.fileEchoFlavour)); printf("noRules %s\n", (link.noRules) ? "on" : "off"); printf("reducedSeenBy %s\n", (link.reducedSeenBy) ? "on" : "off"); printf("-------\n"); return rc; } /* Some dumb checks ;-) */ void checkLogic(s_fidoconfig *config) { register UINT i,j; register INT k; int robotsarea_ok; s_link *link; s_area *area; register char *areaName; robotsarea_ok = config->robotsArea? 0:1; for (i=0; i+1linkCount; i++) { for (j=i+1; jlinkCount; j++) { if (addrComp(config->links[i].hisAka, config->links[j].hisAka) == 0) { if (strcmp(config->links[i].name, config->links[j].name)!=0) continue; printf("ERROR: duplication of link "); printAddr(&(config->links[i].hisAka)); printf("\n"); printf("remove it, or change the name!\n"); exit(-1); } } /* Check file permissions */ if (config->links[i].autoAreaCreateFile){ k = open( config->links[i].autoAreaCreateFile, O_RDWR | O_APPEND ); if( k<0 ){ printf( "ERROR: link " ); printAddr(&(config->links[i].hisAka)); printf( " AutoAreaCreateFile '%s': %s\n", config->links[i].autoAreaCreateFile, strerror(errno) ); exit(-1); }else close(k); } if (config->links[i].autoFileCreateFile){ k = open( config->links[i].autoFileCreateFile, O_RDWR | O_APPEND ); if( k<0 ){ printf( "ERROR: link " ); printAddr((&config->links[i].hisAka)); printf( " AutoFileCreateFile '%s': %s\n", config->links[i].autoFileCreateFile, strerror(errno) ); exit(-1); }else close(k); } } for (i=0; iechoAreaCount; i++) { area = &(config->echoAreas[i]); areaName = area->areaName; if(config->robotsArea && sstricmp(config->robotsArea,areaName)==0) robotsarea_ok = 1; /* j=i+1 */ for (j=i+1; j < config->echoAreaCount; j++) { if (stricmp(config->echoAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } for (j=0; j < config->localAreaCount; j++) { if (stricmp(config->localAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } for (j=0; j < config->netMailAreaCount; j++) { if (stricmp(config->netMailAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } /* Check for area link duplication */ for (j=0; j+1downlinkCount; j++) { link = area->downlinks[j]->link; for (k=j+1;kdownlinkCount; k++) { if (link == area->downlinks[k]->link) { printf("ERROR: duplication of link "); printAddr(&(link->hisAka)); printf(" in area %s\n", areaName); exit(-1); } } } } for (i=0; ilocalAreaCount; i++) { area = &(config->localAreas[i]); areaName = config->localAreas[i].areaName; if(config->robotsArea && sstricmp(config->robotsArea,areaName)==0) robotsarea_ok = 1; for (j=0; j < config->echoAreaCount; j++) { if (stricmp(config->echoAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } /* j=i+1 */ for (j=i+1; j < config->localAreaCount; j++) { if (stricmp(config->localAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } for (j=0; j < config->netMailAreaCount; j++) { if (stricmp(config->netMailAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } /* Check for area link duplication */ for (j=0; j+1downlinkCount; j++) { link = area->downlinks[j]->link; for (k=j+1;kdownlinkCount; k++) { if (link == area->downlinks[k]->link) { printf("ERROR: duplication of link "); printAddr(&(link->hisAka)); printf(" in area %s\n", areaName); exit(-1); } } } } for (i=0; inetMailAreaCount; i++) { area = &(config->netMailAreas[i]); areaName = config->netMailAreas[i].areaName; if(config->robotsArea && sstricmp(config->robotsArea,areaName)==0) robotsarea_ok = 1; for (j=0; j < config->echoAreaCount; j++) { if (stricmp(config->echoAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } for (j=0; j < config->localAreaCount; j++) { if (stricmp(config->localAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } /* j=i+1 */ for (j=i+1; j < config->netMailAreaCount; j++) { if (stricmp(config->netMailAreas[j].areaName, areaName)==0) { printf("ERROR: duplication of area %s\n", areaName); exit(-1); } } /* Check for area link duplication */ for (j=0; j+1downlinkCount; j++) { link = area->downlinks[j]->link; for (k=j+1;kdownlinkCount; k++) { if (link == area->downlinks[k]->link) { printf("ERROR: duplication of link"); printAddr(&(link->hisAka)); printf("in area %s\n", areaName); exit(-1); } } } } if( !robotsarea_ok ) { printf("ERROR: robotsarea value is not an existing area\n"); exit(-1); } } void printCarbons(s_fidoconfig *config) { UINT i; s_carbon *cb; char *crbKey="", *nspc, *cbaName, *tempc=NULL; printf("\n=== CarbonCopy ===\n"); printf("CarbonAndQuit %s\n", (config->carbonAndQuit) ? "on" : "off"); printf("CarbonKeepSb %s\n", (config->carbonKeepSb) ? "on" : "off"); printf("CarbonOut %s\n", (config->carbonOut) ? "on" : "off"); printf("ExcludePassthroughCarbon %s\n", (config->exclPassCC) ? "on" : "off"); printf("Exclude \" * Forward from area \" string: %s\n\n", (config->carbonExcludeFwdFrom) ? "on" : "off"); for (i = 0, cb=&(config->carbons[0]); i< config->carbonCount; i++, cb++) { if (cb->rule&CC_NOT){ nspc=""; printf("|NOT "); }else nspc="| "; switch(cb->ctype){ case ct_to: crbKey= "To: "; break; case ct_from: crbKey= "From: "; break; case ct_kludge: crbKey= "Kludge: "; break; case ct_subject: crbKey= "Subj: "; break; case ct_msgtext: crbKey= "Text: "; break; case ct_fromarea: crbKey= "FromArea: "; break; case ct_group: crbKey= "Groups: "; break; case ct_addr: crbKey= "Addr: "; break; } printf("%sCarbon%s\"%s\"\n", nspc, crbKey, (cb->ctype==ct_addr) ? (tempc=aka2str5d(cb->addr)) : cb->str); nfree(tempc); if (cb->rule&CC_AND) continue; if(cb->areaName!=NULL){ cbaName = cb->areaName; if(*cbaName=='*') ++cbaName; } else cbaName = "UNKNOWN"; if (cb->extspawn) printf("CarbonExtern: \"%s\"", cbaName); else { switch (cb->move) { case 0: printf("CarbonCopy: "); break; case 2: printf("CarbonDelete"); break; case 1: default: printf("CarbonMove: "); break; } if (cb->areaName) { if(stricmp(cbaName, cb->area->areaName)) { printf(" !!! \"%s\" wanted !!! using \"%s\"", cbaName, cb->area->areaName); } else { printf("\"%s\"", cb->area->areaName); } } else if (cb->move != 2) printf(" !!! No area specified !!!"); } putchar('\n'); if (cb->reason) printf("CarbonReason: %s\n", cb->reason); if (cb->export) printf("Copied messages will be exported.\n"); if (cb->netMail) printf("Active on netMail\n"); if(cb->areaName!=NULL) if (*cb->areaName=='*') printf("CarbonAndQuit ignored.\n"); printf("-------\n"); } } void printRemaps(s_fidoconfig *config) { unsigned i; printf("\n=== Remap config ===\n"); for( i=0; iremapCount; i++ ){ printf( "ToName: \"%s\" and ToAddress:", sstrlen(config->remaps[i].toname) ? config->remaps[i].toname : "" ); if (config->remaps[i].oldaddr.zone==0) printf(" "); else printAddr(&(config->remaps[i].oldaddr)); printf("=>"); printAddr(&(config->remaps[i].newaddr)); putchar('\n'); } } void printSeqOutrun(unsigned long seqOutrun) { if (seqOutrun % (365l*24*60*60) == 0) printf("seqOutrun: %luy\n", seqOutrun / (365l*24*60*60)); else if (seqOutrun % (31l*24*60*60) == 0) printf("seqOutrun: %lum\n", seqOutrun / (31l*24*60*60)); else if (seqOutrun % (7l*24*60*60) == 0) printf("seqOutrun: %luw\n", seqOutrun / (7l*24*60*60)); else if (seqOutrun % (24*60*60) == 0) printf("seqOutrun: %lud\n", seqOutrun / (24*60*60)); else if (seqOutrun % (60*60) == 0) printf("seqOutrun: %luh\n", seqOutrun / (60*60)); else printf("seqOutrun: %lu\n", seqOutrun); } static int dumpcfg(char *fileName) { char *line; if (fileName==NULL) fileName = getConfigFileName(); if (fileName == NULL) { printf("Could not find Config-file\n"); return EX_UNAVAILABLE; } if (init_conf(fileName)) return 0; while ((line = configline()) != NULL) { line = trimLine(line); line = stripComment(line); if (line[0] != 0) { line = shell_expand(line); line = vars_expand(line); puts(line); } else puts(line); nfree(line); } close_conf(); nfree(fileName); return 0; } void usage() { printf("\tParses Fidoconfig checks your Fidoconfig for errors and gives"); printf("you some\n\thints to solve the problems.\n\n"); printf("run: tparser [-Dvar=value] [-E] [-P] [/path/to/config/file]\n"); exit(0); } const char *smapi_cvs_date(){ static #include return cvs_date; } int main(int argc, char **argv) { /* s_fidoconfig *config = NULL; use global variable */ UINT i, j, hpt=0, preproc=0, rc=0; int k; char *cfgFile=NULL, *module; #include "cvsdate.h" printf("%s\n", module = GenVersionStr( "tparser", FC_VER_MAJOR, FC_VER_MINOR, FC_VER_PATCH, FC_VER_BRANCH, cvs_date )); nfree(module); /* used as a temporary variable */ if( !CheckFidoconfigVersion(1,4,0,BRANCH_STABLE,0) ) { printf("Incompatible version of FIDOCONFIG library: require fidoconfig-1.4.0-stable at %s\n",cvs_date); exit(255); } if( !CheckSmapiVersion(2,4,0,smapi_cvs_date()) ) { printf("Incompatible version of SMAPI: require smapi-2.4.0-stable at %s\n",smapi_cvs_date()); exit(255); } printf("using smapi-2.4.0-stable at %s and fidoconfig-1.4.0-stable at %s\n\n",smapi_cvs_date(),cvs_date); for (k=1; kcfgVersionMajor, config->cfgVersionMinor); if (config->name != NULL) printf("Name: %s\n", config->name); if (config->sysop != NULL) printf("Sysop: %s\n", config->sysop); if (config->location != NULL)printf("Location: %s\n", config->location); for (i=0; iaddrCount; i++) { if (config->addr[i].domain != NULL) printf("Addr: %u:%u/%u.%u@%s\n", config->addr[i].zone, config->addr[i].net, config->addr[i].node, config->addr[i].point, config->addr[i].domain); else printf("Addr: %u:%u/%u.%u\n", config->addr[i].zone, config->addr[i].net, config->addr[i].node, config->addr[i].point); } #if defined(__UNIX__) printf("FileAreaCreatePerms: %o\n", config->fileAreaCreatePerms); #endif if (config->loglevels) printf("LogLevels %s\n", config->loglevels); printf("LogEchoToScreen %s\n", (config->logEchoToScreen) ? "on" : "off"); if (config->logEchoToScreen && config->screenloglevels) printf("ScreenLogLevels %s\n", config->screenloglevels); if (config->echotosslog != NULL) printf("EchoTossLog: %s\n", config->echotosslog); if (config->importlog != NULL) printf("ImportLog: %s\n", config->importlog); if (config->statlog != NULL) printf("StatLog: %s\n", config->statlog); if (config->inbound != NULL) printf("Inbound: %s\n", config->inbound); if (config->tempInbound != NULL) printf("tempInbound: %s\n", config->tempInbound); if (config->protInbound != NULL) printf("ProtInbound: %s\n", config->protInbound); if (config->localInbound != NULL) printf("LocalInbound: %s\n", config->localInbound); if (config->listInbound != NULL) printf("ListInbound: %s\n", config->listInbound); if (config->ticOutbound != NULL) printf("TicOutbound: %s\n", config->ticOutbound); if (config->outbound != NULL) printf("Outbound: %s\n", config->outbound); if (config->tempOutbound != NULL) printf("tempOutbound: %s\n", config->tempOutbound); for (i=0; i< config->publicCount; i++) printf("Public: #%u %s\n", i+1, config->publicDir[i]); if (config->reqidxDir) printf ("ReqIdxDir: %s\n", config->reqidxDir); if (config->dupeHistoryDir != NULL) printf("DupeHistoryDir: %s\n", config->dupeHistoryDir); if (config->logFileDir != NULL) printf("LogFileDir: %s\n", config->logFileDir); if (config->tempDir != NULL) printf("TempDir: %s\n", config->tempDir); if (config->msgBaseDir != NULL) printf("MsgBaseDir: %s\n", config->msgBaseDir); if (config->fileAreaBaseDir) printf("FileAreaBaseDir: %s\n", config->fileAreaBaseDir); if (config->passFileAreaDir) printf("passFileAreaDir: %s\n", config->passFileAreaDir); if (config->busyFileDir) printf("busyFileDir: %s\n", config->busyFileDir); if (config->magic) printf("Magic: %s\n", config->magic); if (config->semaDir) printf("semaDir: %s\n", config->semaDir); if (config->badFilesDir) printf("BadFilesDir: %s\n", config->badFilesDir); if (config->rulesDir) printf("rulesDir: %s\n", config->rulesDir); if (config->advStatisticsFile) printf("advStatisticsFile: %s\n", config->advStatisticsFile); if (config->hptPerlFile) printf("hptPerlFile: %s\n", config->hptPerlFile); if (config->newAreaRefuseFile) printf("NewAreaRefuseFile: %s\n", config->newAreaRefuseFile); if (config->netmailFlag) printf("NetmailFlag: %s\n",config->netmailFlag); if (config->aacFlag) printf("AutoAreaCreateFlag: %s\n",config->aacFlag); if (config->afcFlag) printf("AutoFileCreateFlag: %s\n",config->afcFlag); if (config->minDiskFreeSpace) printf("MinDiskFreeSpace: %u Mb\n", config->minDiskFreeSpace); if (config->syslogFacility) printf ("SyslogFacility: %d\n", config->syslogFacility); if (config->lockfile) { printf("LockFile: %s\n",config->lockfile); if (config->advisoryLock==0) printf("AdvisoryLock: off\n"); else printf("AdvisoryLock: %u\n",config->advisoryLock); } if (hpt==0) { printf("LongDirNames: %s\n",(config->longDirNames) ? "on": "off"); printf("SplitDirs: %s\n",(config->splitDirs) ? "on": "off"); } printf("Ignore Capability Word: %s\n",(config->ignoreCapWord) ? "on": "off"); printf("ProcessBundles %s\n",(config->noProcessBundles) ? "off" : "on"); switch (config->bundleNameStyle) { case eUndef: printf("BundleNameStyle: undefined (timeStamp)\n"); break; case eAddrDiff: printf("BundleNameStyle: addrDiff\n"); break; case eAddrDiffAlways: printf("BundleNameStyle: addrDiffAlways\n"); break; case eTimeStamp: printf("BundleNameStyle: timeStamp\n"); break; case eAmiga: printf("BundleNameStyle: Amiga\n"); break; case eAddrsCRC32: printf("BundleNameStyle: AddrsCRC32\n"); break; case eAddrsCRC32Always: printf("BundleNameStyle: AddrsCRC32Always\n"); break; default: printf("WARNING: BundleNameStyle is UNKNOWN! Update tparser please!\n"); break; } if (config->fileBoxesDir) printf ("fileBoxesDir: %s\n", config->fileBoxesDir); printf("DupeBaseType: "); if (config->typeDupeBase==textDupes) printf("textDupes\n"); if (config->typeDupeBase==hashDupes) printf("hashDupes\n"); if (config->typeDupeBase==hashDupesWmsgid) printf("hashDupesWmsgid\n"); if (config->typeDupeBase==commonDupeBase) { printf("commonDupeBase\n"); printf("AreasMaxDupeAge: %d\n",config->areasMaxDupeAge); } if (config->numPublicGroup > 0) { printf("PublicGroups: "); for (i = 0; i < config->numPublicGroup; i++) printf( (i>0) ? ",%s" : "%s", config->PublicGroup[i]); printf("\n"); } printf("createAreasCase: %s\n", (config->createAreasCase == eLower) ? "Lower" : "Upper"); printf("areasFileNameCase: %s\n", (config->areasFileNameCase == eLower) ? "Lower" : "Upper"); printf("DisableTID: %s\n", (config->disableTID) ? "on" : "off"); printf("DisablePID: %s\n", (config->disablePID) ? "on" : "off"); printf("keepTrsMail: %s\n", (config->keepTrsMail) ? "on" : "off"); printf("keepTrsFiles: %s\n", (config->keepTrsFiles) ? "on" : "off"); printf("createFwdNonPass: %s\n", config->createFwdNonPass ? "on" : "off"); #if defined ( __NT__ ) printf("SetConsoleTitle: %s\n", (config->setConsoleTitle) ? "on" : "off"); #endif if (config->processPkt != NULL) printf("processPkt: %s\n", config->processPkt); if (config->tossingExt != NULL) printf("tossingExt: %s\n", config->tossingExt); if (config->seqDir != NULL) printf("seqDir: %s\n", config->seqDir); if (config->seqOutrun != 0) printSeqOutrun(config->seqOutrun); if (config->addToSeenCount) { printf("AddToSeen:"); for (i=0; iaddToSeenCount; i++) { printf(" %u/%u", config->addToSeen[i].net,config->addToSeen[i].node ); } printf("\n"); } if (config->ignoreSeenCount) { printf("IgnoreSeen:"); for (i=0; iignoreSeenCount; i++) { printf(" %u/%u", config->ignoreSeen[i].net,config->ignoreSeen[i].node ); } printf("\n"); } if (config->tearline || config->origin) printf("\n"); if (config->tearline) printf("--- %s\n", config->tearline); if (config->origin) printf("* Origin: %s (%s)\n", config->origin, aka2str(config->addr[0])); printf("AutoPassive: %s\n", config->autoPassive ? "on" : "off"); printf("packNetMailOnScan: %s\n", config->packNetMailOnScan ? "on" : "off"); printf("NotValidFileNameChars: %s\n", config->notValidFNChars ? config->notValidFNChars : "\"*/:;<=>?\\|%`'&+"); printf("\n=== AREAFIX CONFIG ===\n"); if (config->areafixNames) printf("AreafixNames: %s\n", config->areafixNames); printf("areafixFromPkt: %s\n",(config->areafixFromPkt) ? "on": "off"); printf("areafixQueryReports: %s\n",(config->areafixQueryReports)?"on":"off"); { char *attrs = attr2str(config->areafixReportsAttr); printf("areafixReportsAttr: %s%s%s\n", attrs ? strUpper(attrs) : "", attrs ? " " : "", config->areafixReportsFlags ? config->areafixReportsFlags : ""); nfree(attrs); } printf("areafixKillRequests: %s\n",(config->areafixKillRequests)?"on":"off"); if (config->areafixMsgSize) printf("areafixMsgSize - %u\n", config->areafixMsgSize); if (config->areafixSplitStr) printf("areafixSplitStr - \"%s\"\n", config->areafixSplitStr); if (config->areafixOrigin) printf("areafixOrigin - \"%s\"\n", config->areafixOrigin); if (config->areafixFromName) printf("areafixFromName - \"%s\"\n", config->areafixFromName); printf("RobotsArea: %s\n",(config->robotsArea)?config->robotsArea:"all areas"); if (config->areafixhelp) printf("areafixHelp: %s\n",config->areafixhelp); if (config->areafixQueueFile) printf("areafixQueueFile: %s\n",config->areafixQueueFile); printf("ForwardRequestTimeout: %d\n",config->forwardRequestTimeout); printf("IdlePassthruTimeout : %d\n",config->idlePassthruTimeout); printf("KilledRequestTimeout : %d\n",config->killedRequestTimeout); if (hpt==0) { printf("\n=== FILEFIX CONFIG ===\n"); { char *attrs = attr2str(config->filefixReportsAttr); printf("filefixReportsAttr: %s%s%s\n", attrs ? strUpper(attrs) : "", attrs ? " " : "", config->filefixReportsFlags ? config->filefixReportsFlags : ""); nfree(attrs); } printf("filefixKillRequests: %s\n",(config->filefixKillRequests)?"on":"off"); if (config->filefixFromName) printf("filefixFromName: \"%s\"\n", config->filefixFromName); if (config->filefixNames) printf("filefixNames: \"%s\"\n", config->filefixNames); if (config->filefixhelp) printf("filefixHelp: %s\n", config->filefixhelp); printf("\n=== TICKER CONFIG ===\n"); /* not used if (config->fileAreasLog) printf("FileAreasLog: %s\n", config->fileAreasLog); if (config->fileNewAreasLog) printf("FileNewAreasLog: %s\n", config->fileNewAreasLog); if (config->fileArcList) printf("FileArcList: %s\n", config->fileArcList); if (config->filePassList) printf("FileArcList: %s\n", config->filePassList); if (config->fileDupeList) printf("FileArcList: %s\n", config->fileDupeList); */ printf("AddDLC: %s\n",(config->addDLC) ? "on": "off"); /* not used printf("FileSingleDescLine: %s\n",(config->fileSingleDescLine) ? "on": "off"); printf("FileCheckDest: %s\n",(config->fileCheckDest) ? "on": "off"); */ if(config->fDescNameCount) { for(i = 0; i < config->fDescNameCount; i++) printf("FileDescName: %s\n", config->fileDescNames[i]); } else { printf("FileDescName: off"); } printf("FileDescPos: %u\n", config->fileDescPos); if (config->fileLDescString) printf("FileLDescString: %s\n", config->fileLDescString); printf("DLCDigits: %u\n", config->DLCDigits); /* not used printf("FileMaxDupeAge: %u\n", config->fileMaxDupeAge); printf("FileFileUMask: %o\n", config->fileFileUMask); printf("FileDirUMask: %o\n", config->fileDirUMask); if (config->fileLocalPwd) printf("FileLocalPwd: %s\n", config->fileLocalPwd); */ if (config->saveTicCount) { for (i = 0; i< config->saveTicCount; i++) { printf("SaveTic for %s in %s\n", config->saveTic[i].fileAreaNameMask, config->saveTic[i].pathName ); } } printf("\n=== FILE ANNOUNCER CONFIG ===\n"); if (config->announceSpool) printf("AnnounceSpool: %s\n", config->announceSpool); if(config->ADCount) { for (i = 0; i< config->ADCount; i++) { printf("\n----- announce group -----\n"); if(config->AnnDefs[i].annAreaTag) printf("AnnAreaTag: %s\n",config->AnnDefs[i].annAreaTag); if(config->AnnDefs[i].annInclude == NULL) printf("AnnInclude: *\n"); else { printf("AnnInclude:"); for (j = 0; j < config->AnnDefs[i].numbI; j++) { printf(" %s",config->AnnDefs[i].annInclude[j]); } printf("\n"); } if(config->AnnDefs[i].annExclude != NULL) { printf("AnnExclude:"); for (j = 0; j < config->AnnDefs[i].numbE; j++) { printf(" %s",config->AnnDefs[i].annExclude[j]); } printf("\n"); } if(config->AnnDefs[i].annto) printf("AnnTo : %s\n",config->AnnDefs[i].annto); if(config->AnnDefs[i].annfrom) printf("AnnFrom : %s\n",config->AnnDefs[i].annfrom); if(config->AnnDefs[i].annaddrto) { printf("AnnAddrTo : "); printAddr(config->AnnDefs[i].annaddrto); printf("\n"); } if(config->AnnDefs[i].annaddrfrom) { printf("AnnAddrFrom: "); printAddr(config->AnnDefs[i].annaddrfrom); printf("\n"); } if(config->AnnDefs[i].annsubj) printf("AnnSubj : %s\n",config->AnnDefs[i].annsubj); if(config->AnnDefs[i].annorigin) { printf( "AnnOrigin : %s\n \" * Origin: %s (", config->AnnDefs[i].annorigin, config->AnnDefs[i].annorigin ); printAddr(config->AnnDefs[i].annaddrfrom); printf(")\"\n"); } if(config->AnnDefs[i].annorigin) printf("AnnMessFlags : %s\n",config->AnnDefs[i].annmessflags); printf("AnnFileOrigin: %s\n", config->AnnDefs[i].annforigin ? "on" : "off"); printf("AnnFileRFrom : %s\n", config->AnnDefs[i].annfrfrom ? "on" : "off"); } } } printf("\n=== FILELIST CONFIG ===\n"); for (i = 0; i < config->filelistCount; i++) printFilelist(&(config->filelists[i])); printf("\n=== LINKER CONFIG ===\n"); switch (config->LinkWithImportlog) { case lwiYes: printf("LinkWithImportlog Yes\n"); break; case lwiNo: printf("LinkWithImportlog No\n"); break; case lwiKill: printf("LinkWithImportlog Kill\n"); break; default: printf("Internal error: Unknown value #%d for LinkWithImportLog!\n", config->LinkWithImportlog); } printf("\n=== LINK CONFIG ===\n"); printf("%u links in config\n", config->linkCount); for (i = 0; i < config->linkCount; i++) printLink(config->links[i]); printf("\n=== AREA CONFIG ===\n"); printf("kludgeAreaNetmail "); switch (config->kludgeAreaNetmail) { case kanKill: printf("kill"); break; case kanIgnore: printf("ignore"); break; case kanEcho: printf ("echomail"); break; } printf("\n"); printf("\n=== NetMailAreas ===\n"); for (i = 0; i< config->netMailAreaCount; i++) { printArea(config->netMailAreas[i]); } printf("\n=== DupeMailArea ===\n"); if (config->dupeArea.areaName) printArea(config->dupeArea); printf("\n=== BadMailArea ===\n"); if (config->badArea.areaName) printArea(config->badArea); printf("\n=== EchoAreas ===\n"); for (i = 0; i< config->echoAreaCount; i++) { printArea(config->echoAreas[i]); } printf("\n=== LocalAreas ===\n"); for (i = 0; i< config->localAreaCount; i++) { printArea(config->localAreas[i]); } if (hpt==0) { printf("\n=== FileAreas ===\n"); for (i=0; ifileAreaCount; i++) { printFileArea(config->fileAreas[i]); } printf("\n=== BbsAreas ===\n"); for (i=0; ibbsAreaCount; i++) { printBbsArea(config->bbsAreas[i]); } } if(config->carbonCount) printCarbons(config); if(config->remapCount) printRemaps(config); printf("\n=== ROUTE CONFIG ===\n"); for (i = 0; i < config->routeCount; i++) { if (config->route[i].routeVia == 0) { printf("Route %s via ", config->route[i].pattern); printAddr( &(config->route[i].target->hisAka)); printf("\n"); } else { printf("Route"); switch (config->route[i].id) { case id_route : break; case id_routeMail : printf("Mail"); break; case id_routeFile : printf("File"); break; } printf(" %s ", config->route[i].pattern); switch (config->route[i].routeVia) { case route_zero: printf("zero\n"); break; case noroute: printf("direct\n"); break; case nopack: printf("nopack\n"); break; case host: printf("via host\n"); break; case hub: printf("via hub\n"); break; case boss: printf("via boss\n"); break; case route_extern: break; /* internal only */ } } } if (hpt==0) { printf("\n=== NODELIST CONFIG ===\n"); if (config->nodelistDir != NULL) { printf("NodelistDir: %s\n", config->nodelistDir); } if (config->fidoUserList != NULL) { printf("Fidouser List File: %s\n", config->fidoUserList); } printf("-------\n"); for (i = 0; i < config->nodelistCount; i++) { printf("Nodelist %s\n", config->nodelists[i].nodelistName); if (config->nodelists[i].diffUpdateStem != NULL) printf("Nodediff Update File %s\n", config->nodelists[i].diffUpdateStem); if (config->nodelists[i].fullUpdateStem != NULL) printf("Full Nodelist Update File %s\n", config->nodelists[i].fullUpdateStem); if (config->nodelists[i].defaultZone != 0) printf("Zone Number %d\n", config->nodelists[i].defaultZone); switch (config->nodelists[i].format) { case fts5000: printf ("Standard nodelist format\n"); break; case points24: printf ("Points24 nodelist format\n"); break; case points4d: printf ("Points4D nodelist format\n"); break; default: printf ("Unknown nodelist format???\n"); break; } printf("-------\n"); } } printf("\n=== PACK CONFIG ===\n"); for (i = 0; i < config->packCount; i++) { printf("Packer: %s Call: %s\n", config->pack[i].packer, config->pack[i].call); } if (config->defarcmailSize!=0) printf("\nDefault Arcmail Size - %u kb\n",config->defarcmailSize); printf("\n=== UNPACK CONFIG ===\n"); for (i = 0; i < config->unpackCount; i++) { printf("UnPacker: Call: %s Offset %d Match code ", config->unpack[i].call, config->unpack[i].offset); for (k = 0; k < config->unpack[i].codeSize; k++) printf("%02x", (int) config->unpack[i].matchCode[k]); printf(" Mask : "); for (k = 0; k < config->unpack[i].codeSize; k++) printf("%02x", (int) config->unpack[i].mask[k]); printf("\n"); } if (config->beforePack) printf("Before Pack - \"%s\"\n",config->beforePack); if (config->afterUnpack) printf("After Unpack - \"%s\"\n",config->afterUnpack); if (config->ReportTo) printf("ReportTo\t%s\n", config->ReportTo); if (hpt==0) { printf("\n=== EXEC CONFIG ===\n"); for (i = 0; i < config->execonfileCount; i++) { printf("ExecOnFile: Area %s File %s Call %s\n", config->execonfile[i].filearea, config->execonfile[i].filename, config->execonfile[i].command); } } printf( "\n=== EMAILPKT CONFIG ===\n" ); if( config->sendmailcmd ) { printf( "sendMailCmd: %s\n", config->sendmailcmd ); }else printf( "sendMailCmd:\n" ); printf( "\n" ); rc = testPathsAndFiles(); if( rc ) { puts("============================"); testConfig(config); puts("============================"); } disposeConfig(config); if( rc ) fprintf(stderr,"Errors or warnings found!\n"); } /* endif */ return rc; }