ossp-pkg/rc/rc_config.c
1.6
/* 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 */
#include "val.h" /* OSSP val library holds config */
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 val instance */
val_create(&s_pInst->pOpt); /* to hold individual */
} /* configuration values */
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 {
val_get(s_pInst->pOpt, RC_VER_NAME, &nVer);
}
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 { /* Register and set configuration values */
/* FIXME This is real bad, replace with our own */
val_reg(s_pInst->pOpt, RC_VER_NAME, VAL_TYPE_SHORT, RC_VER_DESC, NULL);
val_set(s_pInst->pOpt, RC_VER_NAME, 1);
}
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 */
val_destroy(s_pInst->pOpt); /* Destroy val instance and */
} /* Assume that pOpt is NULL */
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));
}