ossp-pkg/rc/rc_config.c
1.7
/* OSSP rc - Run-command processor
** Copyright (c) 2002 Ralf S. Engelschall
** Copyright (c) 2002 Cable & Wireless Deutschland GmbH
** Copyright (c) 2002 The OSSP Project <http://www.ossp.org/>
**
** This file is part of OSSP rc, a portable Run-command processor
** which can be found at http://www.ossp.org/pkg/lib/rc/
**
** Permission to use, copy, modify, and distribute this software for
** any purpose with or without fee is hereby granted, provided that
** the above copyright notice and this permission notice appear in all
** copies.
**
** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
** CONTRIBUTORS 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.
**
** rc_config.c: Run-command processor ISO C source file
*/
#include <stdio.h>
#include <stdlib.h>
#include "rc.h"
#include "rc_private.h"
#include "rc_const.h" /* String constants */
#include "rc_option.h" /* Option operations rely on popt */
static rc_config_t *s_pInst = NULL; /* Singleton configuration instance */
/***************************************
* configConstruct(void) *
* Construct a configuration *
***************************************/
rc_return_t configConstruct(void)
{
ex_t Except;
if (s_pInst == NULL) { /* If we don't have one */
s_pInst = malloc(sizeof(s_pInst)); /* yet, then allocate */
if (!s_pInst) /* a configuration */
return(RC_THROW(RC_ERR_MEM)); /* instance */
s_pInst->nLocks = 0;
ex_try {
/* Make a config instance */
}
ex_catch(Except) {
rethrow;
}
}
s_pInst->nLocks++; /* FIXME not threadsafe */
return(RC_THROW(RC_OK));
}
/***************************************
* configGetXXXX(void) *
* Configuration accessors *
***************************************/
short configGetvers(void)
{
ex_t Except;
short nVer = 0;
if (s_pInst != NULL) {
ex_try {
}
ex_catch(Except) {
rethrow;
}
}
else {
RC_THROW(RC_ERR_USE);
return(NULL);
}
return(nVer);
}
/************************************************
* configLoad(int, char **) *
* Load a configuration *
************************************************/
rc_return_t configLoad(int argc, char *argv[])
{
ex_t Except;
ex_try { /* Parse through each type of option */
/* FIXME s_pInst->pOpt will hold a copy of the command line */
// coptParse(s_pInst->pOpt); /* First priority options */
// eoptParse(s_pInst->pOpt); /* Medium priority options */
// foptParse(s_pInst->pOpt); /* Low priority options */
coptParse(argc, argv); /* FIXME Patch for now */
/* FIXME s_pInst->pOpt will hold a copy of the command line */
}
ex_catch(Except) {
rethrow;
}
ex_try {
}
ex_catch(Except) {
rethrow;
}
return(RC_THROW(RC_OK));
}
/***************************************
* configDestruct(void) *
* Destruct a configuration *
***************************************/
rc_return_t configDestruct(void)
{
ex_t Except;
if (s_pInst) {
if (!(--s_pInst->nLocks)) { /* If nLocks is 0, dealloc */
ex_try { /* FIXME, not thread-safe */
}
ex_catch(Except) {
rethrow;
}
free(s_pInst); /* Deallocate configuration */
s_pInst = NULL; /* and clear its reference */
}
}
else
return(RC_THROW(RC_ERR_USE));
return(RC_THROW(RC_OK));
}