OSSP CVS Repository

ossp - ossp-pkg/rc/rc_config.c 1.12
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/rc/rc_config.c 1.12
/*  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 <string.h>

#include "rc.h"
#include "rc_const.h"               /* String constants                 */

static int m_nLocks = 0;            /* Server locks, not thread-safe FIXME  */
static char *m_szSummary = NULL;    /* Configuration summary storage        */


/***************************************
* configConstruct(void)                *
* Construct a configuration            *
***************************************/
rc_return_t configConstruct(void)
{
    ex_t Except;

    if (m_nLocks == 0) {                    /* If we don't have one yet */
        ex_try {                            /* then construct a new one */
            clioptConstruct();              /* Member cliopt instance   */
        }
        ex_catch(Except) {
            rethrow;
        }
    }
    m_nLocks++;                             /* FIXME not threadsafe     */

    return(RC_THROW(RC_OK));
}

/***************************************
* configGetXXX(rc_opt_t)               *
* Configuration accessors              *
***************************************/
const char *configGetval(rc_opt_t Optname)
{
    ex_t Except;
    char *szTemp = NULL;

    if (m_nLocks) {                         /* Make sure config exists      */
        ex_try {
            if ((szTemp = (char *)clioptGetval(Optname)))
                return((const char *)szTemp);
/*            else if (szTemp = envoptGetval(Optname))
                return((const char *)szTemp);
            else if (szTemp = cnfoptGetval(Optname))
                return((const char *)szTemp);*/
            else
                return(NULL);               /* Special case when not found  */
        }
        ex_catch(Except) {
            rethrow;
        }
    }
    else {
        RC_THROW(RC_ERR_USE);
    }
    return(NULL);   /* Not reached  */
}

const char *configGetname(rc_opt_t Optname)
{
    static char *s_szOptnametab[] = { /* NULL is for alignment */
        NULL,        RC_USE_NAME, RC_DBG_NAME, RC_VER_NAME,
        RC_EVL_NAME, RC_HLP_NAME, RC_INF_NAME, RC_LBL_NAME,
        RC_PRN_NAME, RC_SIL_NAME, RC_RAW_NAME, RC_VRB_NAME,
        RC_EXC_NAME, RC_LOC_NAME, RC_CNF_NAME, RC_FNC_NAME,
        RC_QRY_NAME, RC_TMP_NAME, RC_OWN_NAME, RC_GRP_NAME,
        RC_MSK_NAME, RC_ASS_NAME, RC_DEF_NAME, RC_REF_NAME,
        RC_PRM_NAME, RC_TRM_NAME, RC_NCF_NAME, RC_CMN_NAME,
        RC_DFL_NAME, RC_ERR_NAME
    };

    if (m_nLocks) { /* Make sure config exists  */
        return((const char *)s_szOptnametab[Optname]);
    }
    else {
        RC_THROW(RC_ERR_USE);
    }
    return(NULL);   /* Not reached  */
}

/***************************************
* configSummarize(void)                *
* Configuration summary                *
***************************************/
const char *configSummarize(void)
{
    ex_t Except;
    int i = 0;
    int bCaught = FALSE;

    while (!bCaught) {
        ex_try {    /* FIXME Not threadsafe, wrap with crit section */
            if (configGetval(i)) { /* FIXME Is realloc portable here? */
                /* FIXME Unportable kludge to ensure storage FIXME */
                m_szSummary = realloc(m_szSummary, sizeof("OptionXXis") + \
                    sizeof(configGetname(i)) + sizeof(configGetval(i) + 8));
                if (!(strcmp(configGetval(i), "1"))) {
                    strcat(m_szSummary, "Option ");
                    strcat(m_szSummary, configGetname(i));
                    strcat(m_szSummary, " is on.\n");
                }
                else {
                    strcat(m_szSummary, "Option ");
                    strcat(m_szSummary, configGetname(i));
                    strcat(m_szSummary, " is ");
                    strcat(m_szSummary, configGetval(i));
                    strcat(m_szSummary, ".\n");
                }
            }
        }           /* FIXME Not threadsafe, wrap with crit section */
        ex_catch(Except) {  /* Breaks the otherwise endless loop above */
            bCaught = TRUE;
        }
        i++;
    }

    return ((const char *)m_szSummary);
}

/************************************************
* configLoad(int, char **)                      *
* Load a configuration                          *
************************************************/
rc_return_t configLoad(int argc, char *argv[])
{
    ex_t Except;

    ex_try {    /* Parse option groups in order of priority     */
        clioptParse(argc, argv);        /* Command line options */
/*        envoptParse(m_nLocks->pOpt);*/    /* Environment options  */
/*        cnfoptParse(m_nLocks->pOpt);*/    /* Configfile options   */
    }
    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 (--m_nLocks == 0) {          /* If m_nLocks is 0, deallocate */
        ex_try {                    /* FIXME, not thread-safe       */
            clioptDestruct();
            if (m_szSummary)
                free(m_szSummary);
        }
        ex_catch(Except) {
            rethrow;
        }
    }
    else
        return(RC_THROW(RC_ERR_USE));

    return(RC_THROW(RC_OK));
}

CVSTrac 2.0.1