/********************************************************************
 * lindner
 * 3.19
 * 1995/02/13 19:07:06
 * /home/arcwelder/GopherSrc/CVS/gopher+/gopherd/gopherdconf.h,v
 * Exp
 *
 * Paul Lindner, University of Minnesota CIS.
 *
 * Copyright 1991, 1992 by the Regents of the University of Minnesota
 * see the file "Copyright" in the distribution for conditions of use.
 *********************************************************************
 * MODULE: gopherdconf.h
 * Header file for routines in gopherdconf.c
 *********************************************************************
 * Revision History:
 * gopherdconf.h,v
 * Revision 3.19  1995/02/13  19:07:06  lindner
 * Add MaxConnection limit for total server
 *
 * Revision 3.18  1995/02/11  06:21:27  lindner
 * remove pid junk
 *
 * Revision 3.17  1994/12/15  17:33:20  lindner
 * Add BlockScript: keyword support
 *
 * Revision 3.16  1994/08/18  22:28:47  lindner
 * Abstract for top level and malloc casts
 *
 * Revision 3.15  1994/07/22  22:56:19  lindner
 * More NO_AUTH stuff..
 *
 * Revision 3.14  1994/07/22  22:32:28  lindner
 * fix num args
 *
 * Revision 3.13  1994/07/22  22:29:01  lindner
 * Remove tix.h
 *
 * Revision 3.12  1994/07/21  17:23:06  lindner
 * Add File Separator code
 *
 * Revision 3.11  1994/06/29  05:30:10  lindner
 * Add code to handle lists of authscripts and authitems
 *
 * Revision 3.10  1994/03/17  04:31:01  lindner
 * Many, many parameter additions
 *
 * Revision 3.9  1994/03/08  15:56:03  lindner
 * gcc -Wall fixes
 *
 * Revision 3.8  1994/01/21  03:59:54  lindner
 * Add support for Timezone
 *
 * Revision 3.7  1993/09/30  17:05:15  lindner
 * start of subconf
 *
 * Revision 3.6  1993/09/21  04:16:52  lindner
 * Move cache settings into gopherd.conf
 *
 * Revision 3.5  1993/08/23  19:37:32  lindner
 * Add a semicolon
 *
 * Revision 3.4  1993/08/23  18:46:20  lindner
 * Crude addition of a veronica top-level block
 *
 * Revision 3.3  1993/08/20  18:03:11  lindner
 * Mods to allow gopherd.conf files control ftp gateway access
 *
 * Revision 3.2  1993/03/24  20:25:46  lindner
 * Addition for secureusers file
 *
 * Revision 3.1.1.1  1993/02/11  18:02:52  lindner
 * Gopher+1.2beta release
 *
 * Revision 1.2  1993/01/30  23:57:44  lindner
 * Added macros for Geog and Lang
 *
 * Revision 1.1  1992/12/10  23:13:27  lindner
 * gopher 1.1 release
 *
 *
 *********************************************************************/



#ifndef GOPHERDCONF_H
#define GOPHERDCONF_H

#include "boolean.h"
#include "STRstring.h"
#include "STAarray.h"
#include "ext.h"		/** Filename extensions **/
#include "site.h"		/** Hostname/IP security **/
#include "AUTH.h"		/** Username/pw security  */

/**************************************************************************
 * A structure that defines all the changable parameters of a gopher server
 * Read from the file gopherd.conf
 */

struct gdconf_struct {
     ExtArray     *Extensions;	   /* Filename extensions  */
     SiteArray    *Sites;	   /* IPnum/hostname based security */
     AUTHarray    *Authroutines;   /* Authentication routines/scripts */
     AUTHITEMS    *Authitems;	   /* list of items to authenticate */
     String       *Serverpw;       /* The internal server password */

     Accesslevel  Defaccess;       /* Default access level for unknowns **/

     boolean      RunFromInetd;    /* -I option **/
     boolean      Caching;         /* -C option **/
     int          Cachetime;       /* Cachetime: ***/
     String       *Logfile;        /* The filename for the logfile **/
     String       *Errorfile;      /* The filename for the Errorfile **/
     String       *BummerMsg;      /* Message given to non-secure sites **/
     String       *Data_Dir;       /* Where our data directory is **/
     String       *Hostname;       /* A FQDN for the host **/
     int          Port;            /* The Port we're running at **/
     boolean      chroot;          /* Are we chroot()ing? **/

     boolean      Securityon;      /* Are we restricting access or not? **/
 
     String       *Admin;          /* Administrator info **/
     String       *AdminEmail;     /* E-mail address of administrator **/
     
     String       *Site;           /* Description of site **/
     String       *Org;            /* Name of Organization **/
     String       *Loc;            /* Location of site **/
     String       *Geog;           /* Latitude and Longitude **/
     String       *Lang;           /* Default language ***/

     double       MaxLoad;         /* Maximum Load Average ***/

     int          TZ;              /* Timezone **/
     String       *TimeZoneText;   /* Timezone in Text Format ***/

     String       *Tixfile;        /* Tickets file ***/
     boolean      VeronicaIndex;   /* Index it or not? **/

     String       *Abstract;       /* The abstract for the server */
     
     StrArray     *other_dirs;     /* Subdirectories ***/
     StrArray     *other_gdcs;     /* The associated gdc file ***/

     StrArray     *FileSeparators; /* Separators for Multipart files */
     
     StrArray     *BlkScriptBlocks;/* Block Names for block generation */
     StrArray     *BlkScripts;     /* Associated Script to run for Block */

     int          MaxConnections;  /* # of connections we can handle.. */
};

typedef struct gdconf_struct GDCobj;

#define GDCgetDefAccess(a)      ((a)->Defaccess)

#define GDCgetInetdActive(a)    ((a)->RunFromInetd)
#define GDCsetInetdActive(a,b)  ((a)->RunFromInetd=(b))

#define GDCgetCaching(a)        ((a)->Caching)
#define GDCsetCaching(a,b)      ((a)->Caching=(b))

#define GDCgetCachetime(a)      ((a)->Cachetime)
#define GDCsetCachetime(a,b)    ((a)->Cachetime=(b))

#define GDCgetLogfile(a)        STRget((a)->Logfile)
#define GDCsetLogfile(a,b)      STRset((a)->Logfile,(b))

#define GDCgetErrorfile(a)      STRget((a)->Errorfile)
#define GDCsetErrorfile(a,b)    STRset((a)->Errorfile,(b))

#define GDCgetDatadir(a)        STRget((a)->Data_Dir)

#define GDCgetHostname(a)       STRget((a)->Hostname)
#define GDCsetHostname(a,b)     STRset((a)->Hostname,(b))

#define GDCgetPort(a)           ((a)->Port)

#define GDCgetchroot(a)         ((a)->chroot)

#define GDCgetBummerMsg(a)      STRget((a)->BummerMsg)
#define GDCsetBummerMsg(a,b)    STRset((a)->BummerMsg,(b))

#define GDCgetAdmin(a)       STRget((a)->Admin)
#define GDCsetAdmin(a,b)     STRset((a)->Admin,(b))

#define GDCgetAdminEmail(a)  STRget((a)->AdminEmail)
#define GDCsetAdminEmail(a,b) STRset((a)->AdminEmail,(b))

#define GDCgetSite(a)        STRget((a)->Site)
#define GDCsetSite(a,b)      STRset((a)->Site,(b))

#define GDCgetOrg(a)         STRget((a)->Org)
#define GDCsetOrg(a,b)       STRset((a)->Org,(b))

#define GDCgetLoc(a)         STRget((a)->Loc)
#define GDCsetLoc(a,b)       STRset((a)->Loc,(b))

#define GDCsetGeog(a,b)      STRset((a)->Geog,(b))
#define GDCgetGeog(a)        STRget((a)->Geog)

#define GDCgetLang(a)        STRget((a)->Lang)
#define GDCsetLang(a,b)      STRset((a)->Lang,(b))

#define GDCgetTixfile(a)        STRget((a)->Tixfile)
#define GDCsetTixfile(a,b)      STRset((a)->Tixfile,(b))

#define GDCgetShouldIndex(a)    ((a)->VeronicaIndex)
#define GDCsetShouldIndex(a,b)  ((a)->VeronicaIndex=(b))

#define GDCgetOtherGDCpath(a,b)  (STAgetText((a)->other_dirs,(b)))
#define GDCgetOtherGDCconf(a,b)  (STAgetText((a)->other_gdcs,(b)))

#define GDCgetTZ(a)             (a)->TZ
#define GDCsetTZ(a,b)           ((a)->TZ=(b))

#define GDCgetTimeZone(a)	STRget((a)->TimeZoneText)
#define GDCsetTimeZone(a,b)	STRset((a)->TimeZoneText,(b))

#define GDCgetMaxLoad(a)	(a)->MaxLoad
#define GDCsetMaxLoad(a,b)	((a)->MaxLoad=(b))

#define GDCgetPW(a)             (STRget((a)->Serverpw))
#define GDCsetPW(a,b)           (STRset((a)->Serverpw,(b)))

#define GDCgetAbstract(a)       (STRget((a)->Abstract))
#define GDCsetAbstract(a,b)     (STRset((a)->Abstract,(b)))

#define GDCgetFileSep(a,b)      (STAgetText((a)->FileSeparators,(b)))
#define GDCgetNumFileSep(a)     (STAgetTop((a)->FileSeparators))

#define GDCnumBlkScripts(a)     (STAgetTop((a)->BlkScripts))
#define GDCgetBlkName(a,b)      (STAgetText((a)->BlkScriptBlocks,(b)))
#define GDCgetBlkScript(a,b)    (STAgetText((a)->BlkScripts,(b)))

#define GDCgetMaxconns(a)       ((a)->MaxConnections)
#define GDCsetMaxconns(a,b)     ((a)->MaxConnections=(b))
/*
 * Real live functions in gopherdconf.c
 */

GDCobj       *GDCnew();
void         GDCinit(/* gdc, FILE* gdc.conf file */);
void         GDCdestroy(/* gdc */);

boolean      GDCignore(/* gdc, char *filename */);


#ifndef NO_AUTHENTICATION
  AccessResult      GDCCanRead(/* gdc, hostname, ipnum */);
  AccessResult      GDCCanBrowse(/* gdc, hostname, ipnum */);
  AccessResult      GDCCanSearch(/* gdc, hostname, ipnum */);
  AccessResult      GDCCanFTP(/* gdc, hostname, ipnum */);

  char             *GDCauthType();
  AUTHresult        GDCvalidate();
  char            **GDCauthAsk();
#else
#  define GDCCanRead(a,b,c,d)   (SITE_OK)
#  define GDCCanBrowse(a,b,c,d) (SITE_OK)
#  define GDCCanSearch(a,b,c,d) (SITE_OK)
#  define GDCCanFTP(a,b,c,d)    (SITE_OK)
#  define GDCauthType(a,b)      (NULL)
#  define GDCvalidate(a,b,c,d,e,f) (AUTHRES_OK)
#  define GDCauthAsk(a,b)       (NULL)
#endif


boolean      GDCExtension(/*gdc, ext, Gtype, Prefix*/);

void         GDCpushOtherGDC();
void         GDCaddFileSep();
void         GDCpushBlockScript();
#endif /* GOPHERDCONF_H */
