/*******************************************************************************
* Copyright (c) 2007, Perforce Software, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE
* SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*******************************************************************************/
#ifndef CONFIG_H
# define CONFIG_H
#ifdef __cplusplus
class Server;
class VarList;
class Config
{
public:
static int DropPrivs( Error *e );
static int RestorePrivs( Error *e );
Config();
~Config();
//
// Parse the configuration file
//
void Parse( const char *cfg_file, Error *e );
//
// Number of configured servers
//
int ServerCount() const { return servers.Count(); }
//
// Get servers by number
Server * GetServer( int i ) const;
//
// Get server by name
//
Server * GetServer( StrPtr &name );
Server * GetServer( const char *name );
//
// Add a server to the configuration
//
Server * AddServer( const char *name,
int type,
VarList *settings,
VarList *env );
//
// Add variables to the global environment
//
void SetGlobalEnvironment( VarList *vars );
//
// Add variables to the global settings
//
void SetGlobalSettings( VarList *vars );
//
// Get location for pid files
//
const StrPtr & PidDir() const { return pid_dir; }
//
// Location for pid files
//
void SetPidDir( const char *path ) { pid_dir = path; }
//
// Get the global environment
//
VarList * GetEnv() const { return env; }
//
// Get the type id for a type of server
//
int ServerType( const char *type );
//
// Debugging
//
void Dump();
//
// Debugging
//
void SetDebug( int d ) { debug = d; }
int Debug() const { return debug; }
private:
void MergeGlobalSettings();
private:
VarArray servers;
VarList * env;
VarList * settings;
StrBuf pid_dir;
int debug;
};
//
// Our one and only, global config object
//
extern Config *parsed_config;
#endif /* c++ */
#ifdef __cplusplus
extern "C" {
#endif
/*
* These shim functions bridge the C/C++ divide. By liberal use of casting,
* they allow our YACC parser to build up a C++ object based configuration
*/
/* Build a VarList containing one var */
void * MakeVar( char *var, char *val );
/* Add a var to a VarList, returning updated list */
void * AddVar( void *varList, void *var );
/* Make a server spec */
void * MakeServerSpec( void *settings, void *env );
/* Add more settings to an existing server spec */
void AddServerSettings( void *server_spec, void *settings);
/* Add a server definition to the config */
void * MakeServer( char *name, int type, void *server_spec );
/* Add global environment definitions */
void AddEnviron( void *varList );
/* Add global settings */
void AddSettings( void *varList );
#ifdef __cplusplus
}
#endif
#endif