/* $Id: fidoconf.h,v 1.124.2.3 2002/10/11 17:47:30 stas_degteff Exp $ */
/******************************************************************************
 * 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
 *****************************************************************************/

#ifndef FIDOCONFIG_H
#define FIDOCONFIG_H
#include <time.h>
#include <stdio.h>
#include <smapi/msgapi.h>
#include "typesize.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _MAKE_DLL
#   if defined(_MSC_VER) && (_MSC_VER >= 1200)
#		define _MAKE_DLL_MVC_
#       ifndef _FCONF_EXT
#           define FCONF_EXT __declspec(dllimport)
#       else
#           define FCONF_EXT __declspec(dllexport)
#       endif //_FCONF_EXT
#   else
#       define FCONF_EXT
#   endif
#else
#   define FCONF_EXT
#endif

#define MSGTYPE_PASSTHROUGH 0x04

/* PATH_DELIM used for consruct full pathname
 */
#ifndef PATH_DELIM
#  if defined(SASC) || defined(UNIX)
#    define PATH_DELIM  '/'
#  else
#    define PATH_DELIM  '\\'
#  endif
#endif

#define strend(str) ((str) + strlen(str) - 1)

extern char *actualLine, *actualKeyword;

#ifndef _MAKE_DLL_MVC_
extern    int  actualLineNr;
extern    char CommentChar;
#else
FCONF_EXT int  actualLineNr;
FCONF_EXT char CommentChar;
#endif

extern char wasError;
#define TRUE_COMMENT	"!#$%;"


FCONF_EXT char *striptwhite(char *str);

typedef struct addr {

   unsigned int zone, net, node, point;
   char   *domain;

} s_addr, *ps_addr, hs_addr;

typedef struct  pack {
   char    *packer;
   char    *call;
} s_pack, *ps_pack;

typedef struct execonfile {
   char    *filearea;
   char    *filename;
   char    *command;
} s_execonfile, *ps_execonfile;

typedef enum flavour {normal, hold, crash, direct, immediate} e_flavour;
typedef enum pollType {PKT, REQUEST, FLOFILE} e_pollType;
typedef enum _forward {fOff, fOn, fSecure} e_forward;
typedef enum emptypktpwd {eOff, eSecure, eOn} e_emptypktpwd;
typedef enum pktheaderdiffer {pdOff, pdOn} e_pktheaderdiffer;
typedef enum nameCase { eLower, eUpper} e_nameCase;
typedef enum nameCaseConvertion { cLower, cUpper, cDontTouch } e_nameCaseConvertion;
typedef enum bundleFileNameStyle { eUndef, eTimeStamp, eAddrDiff, eAddrDiffAlways, eAmiga} e_bundleFileNameStyle;
typedef enum emailEncoding { eeMIME, eeSEAT, eeUUE } e_emailEncoding;
typedef enum pauses        { NOPAUSE, EPAUSE, FPAUSE } e_pauses;


typedef struct link {
    s_addr hisAka, *ourAka;
    char *name;
    char *defaultPwd,               // 8 byte passwords
        *pktPwd,
        *ticPwd,
        *areaFixPwd,
        *fileFixPwd,
        *bbsPwd,
        *sessionPwd;
    char *handle;              // nickname
    char *email;
    char *emailFrom; // sender address for outgoing emails
    char *emailSubj;
    e_emailEncoding emailEncoding;
    unsigned int autoAreaCreate;       // 0 if not allowed for autoareacreate
    unsigned int autoFileCreate;       // 0 if not allowed for autofilecreate
    unsigned int AreaFix;              // 0 if not allowed for areafix
    unsigned int FileFix;              // 0 if not allowed for filefix
    unsigned int FileFixFSC87Subset;   // 1 if only FSC87-commands are allowable in TIC files
    unsigned int forwardRequests;      // 0 if not allowed forward requests
    unsigned int forwardFileRequests;  // 0 if not allowed forward requests for file areas
    unsigned int denyFRA; // denyFwdReqAccess
    unsigned int denyUFRA; // denyUncondFwdReqAccess

    int  allowEmptyPktPwd;     // 1 if you want to allow empty packet password in
    //   PKT files found in the protected inbound
    int  allowPktAddrDiffer;   // 1 if you want to allow the originating address
    //   in MSG differ from address in PKT
    //   (only for areafix requests)
    e_forward forwardPkts;     // defines, if pkts should be forwarded to this link
    char *pktFile, *packFile;  // used only internally by hpt
    char *floFile, *bsyFile;   // dito
    ps_pack packerDef;
    e_flavour echoMailFlavour, fileEchoFlavour;
    char *LinkGrp;         // link's group for autocreate areas
    char **AccessGrp;      // groups for echo access
    unsigned int numAccessGrp;
    char *autoAreaCreateFile;  // file where autocreated areas are written to
    char *autoFileCreateFile;
    char *autoAreaCreateDefaults;// add default string for autocreated area here
    char *autoFileCreateDefaults;
    char *forwardRequestFile;  // list of available areas from this link
    char *denyFwdFile;
    unsigned int forwardAreaPriority;// Priority when requests area from uplinks
    char *RemoteRobotName;     // Name remote robot (need for ForwardRequest)
    char *forwardFileRequestFile;  // list of available file-areas from this link
    unsigned int forwardFilePriority;// Priority when requests file-area from uplinks
    char *RemoteFileRobotName;     // Name of remote file (tic) robot (need for FileForwardRequest)
    void *msg;                 // active msg to the link (used in areafix)
    unsigned int noTIC;        // 0 if TIC files should be generated
    unsigned int Pause;        // 0 if no pause (default)
                               // 1 echo pause
                               // 2 fecho pause
    unsigned autoPause;        // in days
    unsigned level;	           // 0-65535
    unsigned arcmailSize;      // max arcmail size in kb
    unsigned pktSize;          // max .pkt size in kb
    unsigned maxUnpackedNetmail; // max size of *.?ut file in kb. If
                                 // more, then put it into
                                 // bundle. Default 100 (used in bsopack)
    unsigned int packNetmail;    // allows to pack outbound
                                 // netmail. Default no (used in bsopack)
    unsigned int export, import, mandatory; // Default link's options
    char **optGrp; // groups for this options
    unsigned int numOptGrp;
    unsigned int delNotRecievedTIC; //1 - if file not recieved, then remove TIC
    unsigned int advancedAreafix;  // 1 - send ~areatag when area delete
    e_bundleFileNameStyle linkBundleNameStyle; // Style bundle filenames (timeStamp, addrDiff...
    char *msgBaseDir;
    char *fileBaseDir;
    char **frMask; // forwardRequestMask groups
    unsigned int numFrMask;
    char **dfMask; // don't forward this
    unsigned int numDfMask;

    unsigned int afixEchoLimit;

    unsigned int autoAreaCreateSubdirs;
    unsigned int autoFileCreateSubdirs;
    char  *fileBox;
    unsigned int fileBoxAlways;
    unsigned int tickerPackToBox;
    unsigned int  arcNetmail; // 1 if pack netmail into arcmail bundles
    char useFileBox; // internal
    char sb; // internal
    unsigned int noRules;
    FILE *pkt;	// for internal usage


} s_link, *ps_link;

typedef enum routing {route_zero, host, hub, boss, noroute, nopack, route_extern} e_routing;

typedef enum id {id_route, id_routeMail, id_routeFile} e_id;

typedef struct route {
   e_flavour flavour;
   ps_link   target;   // if target = NULL use
   e_routing routeVia; // this
   char      *pattern;
   char      *viaStr;  // fix for realloc of config->links
   e_id      id;
} s_route, *ps_route;

typedef enum dupeCheck {dcOff, dcMove, dcDel} e_dupeCheck;

typedef struct arealink {
   ps_link link;
   unsigned int export;		// 1 - export yes, 0 - export no
   unsigned int import;		// 1 - import yes, 0 - import no
   unsigned int mandatory;	// 1 - mandatory yes, 0 - mandatory no
   unsigned int defLink;	// 1 - default uplink
} s_arealink, *ps_arealink;

typedef struct area {
   char *areaName;
   char *fileName;
   char *description;

   int msgbType;        // MSGTYPE_SDM or MSGTYPE_SQUISH or
                        // MSGTYPE_JAM or MSGTYPE_PASSTHROUGH
   ps_addr useAka;

   ps_arealink *downlinks;  // array of pointers to s_link
   unsigned int downlinkCount;

   unsigned purge, max, dupeHistory;
   char keepUnread, killRead;

   e_dupeCheck dupeCheck;
   char tinySB, killSB, hide, noPause, mandatory, DOSFile, debug;

   unsigned levelread;	      // 0-65535
   unsigned levelwrite;	      // 0-65535
   void *dupes;        // used internally by hpt. pointer to dupeDataBase
   void *newDupes;     // dito
   unsigned int imported;      // dito

   char *group;                      // used by reader (and areafix soon)

   int ccoff;          // 1 if carbon copy is not allowed from this area

   // Owner and Group options, msgbase mode
   // not set if:  uid = -1 , gid = -1 , fperm = -1
   unsigned int uid, gid, fperm;

   int nolink;         // do not reply-link area
   int keepsb;         // keep seen-by's and path
   int scn;            // 1 if scanned (number of scanned messages-1)
   int nopack;         // do not pack area

   ps_addr       sbadd;
   unsigned int  sbaddCount;
   ps_addr       sbign;
   unsigned int  sbignCount;

   HAREA harea;        //  for internal usage;

} s_area, *ps_area;

typedef struct fileareatype {
   char *areaName;
   char *pathName;
   char *description;

   int sendorig;       // 1 - Send Original
   int pass;           // 1 - Passthrough File Area
   int noCRC;          // 0 if CRC check should be done on incoming files
   int noreplace;      // 1 - no replace files in this filearea
   int nodiz;          // 1 - do not try to get description from <fileDescName>
   ps_addr useAka;

   ps_arealink *downlinks;  // array of pointers to s_link
   unsigned int downlinkCount;

   unsigned levelread;	      // 0-65535
   unsigned levelwrite;	      // 0-65535

   char mandatory, hide, noPause;

   char *group;                      // used by reader (and areafix soon)
} s_filearea, *ps_filearea;

typedef struct bbsareatype {
   char *areaName;
   char *pathName;
   char *description;
} s_bbsarea, *ps_bbsarea;

typedef enum carbonType {ct_to, ct_from, ct_kludge, ct_subject, ct_group,
                         ct_fromarea, ct_msgtext, ct_addr} e_carbonType;
enum {CC_OR=0, CC_AND, CC_NOT};

typedef struct carbon {
   e_carbonType ctype;
   char         *str;     // string to compare
   char         *reason;  // reason of copy
   ps_area      area;     // area to copy messages
   s_addr       addr;     // from addr to compare
   char         *areaName;// name of area to copy messages
   int          export;   // export copied msg?
   int          netMail;  // do this in netmail, not echomail
   int          move;	  // move (not copy) original msg
   int          extspawn; // areaName is name of external program to exec
   int          rule;     // OR|AND|NOT with next carbon expr.
} s_carbon, *ps_carbon;

typedef struct unpack {
   int     offset;
   unsigned char *matchCode;
   unsigned char *mask;
   int     codeSize;
   char    *call;
} s_unpack, *ps_unpack;

typedef struct remap {
   s_addr  oldaddr;
   s_addr  newaddr;
   char   *toname;
} s_remap, *ps_remap;

/* FTS5000 is the standard nodelist format,
   POINTS24 is the German Pointlist format
   POINTS4D is a full 4D pointlist (with 3d "boss" entries) */

typedef enum nodelistFormat { fts5000, points24, points4d } e_nodelistFormat;

typedef struct nodelist {
   char *nodelistName;        /* name of unpacked nodelist w/o path */
   char *diffUpdateStem;      /* with pathname */
   char *fullUpdateStem;      /* with pathname */
   unsigned int defaultZone;
   int format;
} s_nodelist, *ps_nodelist;

typedef enum typeDupeCheck {
                    hashDupes, /*Base bild from crc32*/
              hashDupesWmsgid, /*Base bild from crc32+MSGID*/
                    textDupes, /*Base bild from FromName+ToName+Subj+MSGID*/
               commonDupeBase  /*Common base for all areas bild from crc32*/
} e_typeDupeCheck;

typedef struct savetictype {
   char *fileAreaNameMask;
   char *pathName;
   int  fileAction;            /* 0 - do nothing */
                               /* 1 - copy file    -  save tic with ticked file */
                               /* 2 - link file  */

} s_savetic, *ps_savetic;

typedef enum linkWithImportLog { lwiNo, lwiYes, lwiKill } e_linkWithImportLog;
typedef enum kludgeAreaNetmail { kanKill, kanIgnore, kanEcho } e_kludgeAreaNetmail;

typedef enum filelistType { flDir, flGlobal, flDirList } e_filelistType;

typedef struct filelist
{
  e_filelistType flType;
  char *destFile;        /* name of file to be written                  */
  char *dirHdrTpl;       /* filename of directory header template       */
  char *dirEntryTpl;     /*             directory entry                 */
  char *dirFtrTpl;       /*             directory footer                */
  char *globHdrTpl;      /*             global header (flGlobal only)   */
  char *globFtrTpl;      /*             global footer (flGlobal only)   */
  char *dirListHdrTpl;   /*             dirlist header (flDirlist only) */
  char *dirListEntryTpl; /*             dirlist entry  (flDirlist only) */
  char *dirListFtrTpl;   /*             dirlist footer (flDirlist only) */
} s_filelist, *ps_filelist;

typedef struct permissions
{
  char *addrMask;	/* address mask for permissions settings */
  char *areaMask;       /* area mask */
} s_permissions;

typedef struct fidoconfig {
   unsigned int    cfgVersionMajor, cfgVersionMinor;
   char     *name, *location, *sysop, *email;

   unsigned int   addrCount;
   ps_addr  addr;

   unsigned int publicCount;
   char     **publicDir;

   unsigned int  linkCount;
   ps_link  links;

   char     *inbound, *outbound, *protInbound, *listInbound, *localInbound, *tempInbound;
   char     *logFileDir, *dupeHistoryDir, *nodelistDir, *msgBaseDir;
   char     *magic, *areafixhelp, *filefixhelp, *tempOutbound, *ticOutbound;
   char     *tempDir;         /* Common temporary files directory */
   char     *fileAreaBaseDir;
   char     *passFileAreaDir; //Passthrough File Area
   char     *busyFileDir;
   char     *semaDir, *badFilesDir;
   char     *loglevels, *screenloglevels;
   char     *hptPerlFile;

   s_area   dupeArea, badArea;
   unsigned int   netMailAreaCount;
   ps_area  netMailAreas;
   unsigned int   echoAreaCount;
   ps_area  echoAreas;
   unsigned int   localAreaCount;
   ps_area  localAreas;
   unsigned int   fileAreaCount;
   ps_filearea  fileAreas;
   unsigned int   bbsAreaCount;
   ps_bbsarea  bbsAreas;

   s_area  EchoAreaDefault;
   s_filearea FileAreaDefault;

   unsigned int   routeCount;
   ps_route route;

   unsigned int   packCount;
   ps_pack  pack;
   unsigned int   unpackCount;
   ps_unpack unpack;

   char     *intab, *outtab;
   char     *echotosslog, *statlog, *importlog, *lockfile;
   unsigned loguid, loggid, logperm;
   char     *fileAreasLog, *longNameList, *fileNewAreasLog;
   char     *fileArcList, *filePassList, *fileDupeList;
   char     *msgidfile;

   e_linkWithImportLog LinkWithImportlog;
   e_kludgeAreaNetmail kludgeAreaNetmail;

   unsigned int   carbonCount;
   ps_carbon carbons;
   unsigned int   carbonAndQuit;
   unsigned int   carbonKeepSb;  // keep SeenBy's and PATH in carbon area
   unsigned int   carbonOut;     // carbon outgoing messages
   unsigned int   exclPassCC;    // don't carbon passthough
   unsigned int   carbonExcludeFwdFrom; // don't print " * Forwarded from area"

   unsigned int  remapCount;
   ps_remap remaps;

   unsigned int areafixFromPkt, areafixKillReports, areafixKillRequests;
   unsigned int areafixMsgSize, areafixQueryReports;
   unsigned int forwardRequestTimeout;
   unsigned int killedRequestTimeout;
   unsigned int idlePassthruTimeout;
   char *areafixSplitStr, *areafixOrigin, *robotsArea;
   char *areafixQueueFile;

   char     **PublicGroup;
   unsigned int numPublicGroup;
   char     *ReportTo;

   unsigned int   execonfileCount;
   ps_execonfile execonfile;

   unsigned int logEchoToScreen;
   unsigned int separateBundles;
   unsigned int defarcmailSize;
   unsigned int ignoreCapWord;
   unsigned int noProcessBundles;
   unsigned int disableTID;

   char *afterUnpack, *beforePack;
   char *processPkt;

   unsigned int createDirs;
   unsigned int longDirNames, splitDirs;

   unsigned int addDLC, fileSingleDescLine, fileCheckDest;
   unsigned int filefixKillReports, filefixKillRequests;
   e_nameCaseConvertion convertLongNames, convertShortNames;

   char     *fileDescName;
   unsigned int fileDescPos, DLCDigits, fileMaxDupeAge;
   unsigned int fileFileUMask, fileDirUMask;
   unsigned int originInAnnounce; //Show origin in announce (for htick)
   unsigned int MaxTicLineLength; // Maximum length line in TIC (for htick)

   char     *fileLocalPwd, *fileLDescString;

   unsigned int   saveTicCount;
   ps_savetic    saveTic;

   unsigned int nodelistCount;
   ps_nodelist nodelists;

   char     *fidoUserList; /* without path name - is in nodelistDir */

   e_typeDupeCheck typeDupeBase;
   unsigned int areasMaxDupeAge;

   ps_link   linkDefaults;
   int      describeLinkDefaults;
   e_nameCase createAreasCase;
   e_nameCase areasFileNameCase;
   char *tossingExt;

#if defined ( __NT__ )
   unsigned int setConsoleTitle; /* change console title */
#endif

   ps_addr       addToSeen;
   unsigned int  addToSeenCount;

   ps_addr       ignoreSeen;
   unsigned int  ignoreSeenCount;

   char *tearline, *origin;

   e_bundleFileNameStyle bundleNameStyle;

   unsigned int keepTrsMail; // Keep Transit Netmail
   unsigned int keepTrsFiles; // Keep Transit Files
   unsigned int createFwdNonPass;
   unsigned int autoPassive;

   ps_filelist filelists;
   unsigned int filelistCount;

   char *netmailFlag;
   char *aacFlag;

   unsigned int minDiskFreeSpace;
   unsigned int advisoryLock;

   char *areafixNames;
   char *reqidxDir;         /* directory for herp request index files */

   int syslogFacility;     /* facility to use when logging via syslog */

   s_permissions *readOnly; /* temporary storage of address & area masks */
   int readOnlyCount;
   s_permissions *writeOnly;
   int writeOnlyCount;
   char *fileBoxesDir;
   char *notValidFNChars;
   char *rulesDir;
   unsigned int packNetMailOnScan;

   char**   uuEGrp; // uueEchoAreaGroups;
   unsigned int numuuEGrp;

   /* for emailpkt */
   char *sendmailcmd;   /* send e-mail command line*/

} s_fidoconfig, *ps_fidoconfig;

struct message {
   //Address block
   s_addr destAddr, origAddr;

//   UINT16 attributes;
   dword  attributes;
   UCHAR  datetime[22];
   CHAR   netMail;
   INT32  textLength;
   INT    recode;

   char   *toUserName, *fromUserName, *subjectLine;
   char   *text;
};

struct pktHeader {
   /* Address block */
   s_addr destAddr, origAddr;

   UINT16 auxNet;

   /* product specific */
   UCHAR  hiProductCode,
          loProductCode;
   UCHAR  majorProductRev,
          minorProductRev;

   /* date */
   time_t pktCreated;

   UINT16 capabilityWord;

   UINT32 prodData;

   char  pktPassword[9]; /* password + \0 */
};

typedef struct pktHeader s_pktHeader;
typedef struct message   s_message;


typedef enum { M_NOTDEF=0,M_HPT, M_HTICK, M_OTHER } e_known_moduls;

typedef struct {
    int module;
//  module = 0 - not defined
//  module = 1 - hpt
//  module = 2 - htick
//  module = 3 - all other
    ps_fidoconfig config;
    // for future usage
} sApp;

#ifndef _MAKE_DLL_MVC_
	extern sApp theApp;
#else
	FCONF_EXT sApp theApp;
#endif

FCONF_EXT void SetAppModule(int mod); // setup struct sApp

FCONF_EXT ps_fidoconfig readConfig(char *cfgFile);

FCONF_EXT void disposeConfig(ps_fidoconfig config);

FCONF_EXT ps_link getLink(s_fidoconfig *config, char *addr);
FCONF_EXT ps_link getLinkForArea(const s_fidoconfig *config, char *addr, s_area *area);
FCONF_EXT ps_link getLinkForFileArea(const s_fidoconfig *config, char *addr, s_filearea *area);
FCONF_EXT ps_link getLinkFromAddr(s_fidoconfig *config, s_addr aka);
FCONF_EXT ps_addr getAddr(const s_fidoconfig *config, char *addr);
int    existAddr(s_fidoconfig *config, s_addr aka);

/* find echo & local areas in config */
FCONF_EXT ps_area getArea(ps_fidoconfig config, char *areaName);

/* find only echo areas in config */
FCONF_EXT ps_area getEchoArea(ps_fidoconfig config, char *areaName);

/* find netmail areas in config */
FCONF_EXT ps_area getNetMailArea(ps_fidoconfig config, char *areaName);

/**
 * This function return 0 if the link is not linked to the area,
 * else it returns 1.
 */
FCONF_EXT int isLinkOfArea(ps_link link, s_area *area);

/**
 * This function return -1 if the link is not linked to the area,
 * else it returns index of link into arealinks array.
 */

FCONF_EXT int isAreaLink(s_addr link, s_area *area);

/**
 * This function tests if link addr is our aka.
 */

FCONF_EXT int isOurAka(ps_fidoconfig config, s_addr link);



/**
 * This function dumps the config to a file. The file is in fidoconfig format so,
 * it is possible to change the config in memory and write it to disk.
 * All formatting and comments are removed and the include structure of the config
 * cannot be recreated. So be careful. A file called <fileName> which already exists
 * will be overwritten.
 * 1 if there were problems writing the config
 * 0 else
 */
int dumpConfigToFile(ps_fidoconfig config, char *fileName);

// the following functions are for internal use.
// Only use them if you really know what you do.
FCONF_EXT char *readLine(FILE *F);
FCONF_EXT int  parseLine(char *line, ps_fidoconfig config);
FCONF_EXT char *getConfigFileName(void);
FCONF_EXT char *trimLine(char *line);
FCONF_EXT void carbonNames2Addr(s_fidoconfig *config);
FCONF_EXT int  init_conf(char *conf_name);
FCONF_EXT void close_conf(void);
FCONF_EXT void setvar(char *name, char *value);
FCONF_EXT char *getvar(char *name);
void closeall(void);
FCONF_EXT char *configline(void);
FCONF_EXT char *stripComment(char *line);
void checkIncludeLogic(ps_fidoconfig config);

FCONF_EXT const char* getCurConfName();
FCONF_EXT long getCurConfPos();
FCONF_EXT long get_hcfgPos();
FCONF_EXT FILE *get_hcfg();
FCONF_EXT const char *cfgEol();

/**
 * This method can be used to get a program-specifically config-filename, in the same directories which are searched for fidoconfig.
 * envVar should be set to a string which resembles a environment-variable which should be checked if it includes the fileName.
 * configName is the filename of the config *without* any prefixes.
 * e.g.
 *      getConfigFileNameForProgram("FIDOCONFIG", "config");
 * is the call which is used for fidoconfig
 */

char *getConfigFileNameForProgram(char *envVar, char *configName);

int isLinkOfFileArea(ps_link link, ps_filearea area);
FCONF_EXT ps_filearea getFileArea(ps_fidoconfig config, char *areaName);

// this function can be used to dump config to stdout or to an already opened file.
void dumpConfig(ps_fidoconfig config, FILE *f);

// return 1 if group found in array of strings, else return 0
FCONF_EXT int grpInArray(char *group, char **strarray, unsigned int len);

// define exit codes for non unix systems
#ifndef _SYSEXITS_H
#define _SYSEXITS_H
#define EX_OK           0       /* successful termination */
#define EX_USAGE        64      /* command line usage error */
#define EX_NOINPUT      66      /* cannot open input */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_CONFIG       78      /* configuration error */
#endif

#ifdef __cplusplus
 }
#endif

#endif
