/* 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)); }