/* OSSP rc - Run-command processor
** Copyright (c) 2002 Ralf S. Engelschall
** Copyright (c) 2002 Cable & Wireless Deutschland GmbH
** Copyright (c) 2002 The OSSP Project
**
** 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_proc.c: Run-command processor ISO C source file
*/
#include /* Standard system headers */
#include /* For reading rc files */
#include /* For reading rc files */
#include /* For string manipulation */
/* FIXME: Remove */
#include
#include "rc.h" /* Public interfaces */
#include "rc_config.h" /* Option definitions */
/************************************************
* procNew(void) *
* Construct a processor *
************************************************/
rc_proc_t *procNew(void)
{
rc_proc_t *pNewrc = NULL;
pNewrc = malloc(sizeof(rc_proc_t));
pNewrc->m_pAnal = analNew(); /* Construct a configuration analyser */
pNewrc->m_pScript = scriptNew(); /* Construct a run-command script */
analParse(pNewrc->m_pAnal); /* Preprocess the anal configuration */
return(pNewrc);
}
/************************************************
* procReadtmp(rc_proc_t *, const char *) *
* Open and store a temp file *
************************************************/
rc_return_t procReadtmp(rc_proc_t *pRc, const char *szTmpname)
{
fprintf(stderr, "%s!!!\n", szTmpname);
return(RC_THROW(RC_OK));
}
/************************************************
* procPopulate(rc_proc_t *) *
* Populate the processor with run commands *
************************************************/
rc_return_t procPopulate(rc_proc_t *pRc)
{
int nFdrc = 0;
int nFdfunc = 0;
int nRet = 0;
int nIter = 0;
char *sBuf = NULL;
char *szSec = NULL;
char *szLocex = NULL;
rc_script_t *pTempscript = NULL;
assert(*pRc->m_pAnal->m_szRcs);
sBuf = (char *)calloc(1, RC_READ_BUFSIZE);
pTempscript = scriptNew();
/* Open the func file if it exists in the configuration */
if (pRc->m_pAnal->m_szFuncs) {
if ((nFdfunc = open(pRc->m_pAnal->m_szFuncs, O_RDONLY)) == -1) {
/* RC_THROW(RC_ERR_IO);*/
fprintf(stderr, "Problem with procPopulate open(2) of %s\n", pRc->m_pAnal->m_szFuncs);
}
}
/* Read the func file if it was opened successfully */
/* We unfortunately make the assumption that 0 is an invalid filedesc */
if (nFdfunc) {
/* Read data from the func file */
while ((nRet = read(nFdfunc, sBuf, RC_READ_BUFSIZE)) > 0) {
scriptAppend(pRc->m_pScript, sBuf, nRet);
}
if (nRet == -1) /* Handle read errors */
TRACE("Problem with procPopulate read(2)");
/* RC_THROW(RC_ERR_IO);*/
}
/* Iteratively read possibly globbed rc files */
for (nIter = 0; pRc->m_pAnal->m_szRcs[nIter]; nIter++)
{
szLocex = (char *)malloc(strlen(pRc->m_pAnal->m_szLocs) + strlen(pRc->m_pAnal->m_szRcs[nIter]) + 2);
strcpy(szLocex, pRc->m_pAnal->m_szLocs);
strcat(szLocex, pRc->m_pAnal->m_szRcs[nIter]);
/* Open the rc file unconditionally */
if ((nFdrc = open(szLocex, O_RDONLY)) == -1) {
/* RC_THROW(RC_ERR_IO);*/
fprintf(stderr, "Problem with procPopulate open(2) of %s\n", szLocex);
}
/* Read data from the rc file into a temporary script */
while ((nRet = read(nFdrc, sBuf, RC_READ_BUFSIZE)) > 0)
scriptAppend(pTempscript, sBuf, nRet);
if (nRet == -1) /* Handle read errors */
TRACE("Problem with procPopulate read(2)");
/* RC_THROW(RC_ERR_IO);*/
/* Extract a section from the temp script, and append it to other one */
szSec = scriptSection(pTempscript, "start"); /* Extract section */
scriptAppend(pRc->m_pScript, szSec, strlen(szSec)); /* Append section */
free(szLocex); /* Free our temporarily constructed Location + Rcfile */
szLocex = NULL;
close(nFdrc); /* Close Rc file handle */
}
close(nFdfunc); /* Close Func file handle */
/* Memory cleanups */
scriptDelete(pTempscript);
if (sBuf) {
free(sBuf);
sBuf = NULL;
}
if (szSec) {
free(szSec);
szSec = NULL;
}
return(RC_THROW(RC_OK));
}
/************************************************
* procRun(rc_proc_t *) *
* Run the processed run-command script *
************************************************/
rc_return_t procRun(rc_proc_t *pRc)
{
if (configGetval(RC_DBG_VAL)) /* Dump the running config table */
configDebug(); /* if debug switch is turned on */
/* This will print the script to a hardcoded dump device, probably stderr */
scriptDump(pRc->m_pScript);
return(RC_THROW(RC_OK));
}
/************************************************
* procDelete(rc_proc_t *) *
* Destruct a processor *
************************************************/
rc_return_t procDelete(rc_proc_t *pRc)
{
scriptDelete(pRc->m_pScript); /* Destroy the script */
analDelete(pRc->m_pAnal); /* Destroy the analyser */
free(pRc); /* Free the processor itself */
return(RC_THROW(RC_OK));
}