/* 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_lab.c: Run-command processor ISO C source file
*/
#include /* For string copy and such data ops */
#include /* For memory ops */
#include "rc.h" /* Public Rc interface */
/************************************************
* labelNew(void) *
* Construct a new label *
************************************************/
rc_label_t *labelNew(const char *szName)
{
rc_label_t *pLab = NULL;
pLab = (rc_label_t *)calloc(1, sizeof(rc_label_t));
if (pLab) {
pLab->m_szName = malloc((strlen(szName) + 1) * sizeof(char));
strcpy(pLab->m_szName, szName);
}
else
RC_THROW(RC_ERR_MEM);
return(pLab);
}
/****************************************************
* labelAppendsec(rc_label_t *, rc_section_t *) *
* Append a section to this label *
****************************************************/
rc_return_t labelAppendsec(rc_label_t *pLabel, rc_section_t *pInsec)
{
assert(pLabel); /* Label parameter must be valid */
if (!pInsec) /* Check sanity */
return(RC_THROW(RC_ERR_USE));
/* First make our vector larger to hold one more section */
pLabel->m_ppSecvec = realloc(pLabel->m_ppSecvec, sizeof(rc_section_t *)\
* (pLabel->m_nSecs + 1));
pLabel->m_ppSecvec[pLabel->m_nSecs] = sectionNew(pInsec->m_szName);
pLabel->m_ppSecvec[pLabel->m_nSecs + 1] = NULL;
/* Simple value copy */
pLabel->m_ppSecvec[pLabel->m_nSecs]->m_nPri = pInsec->m_nPri;
pLabel->m_ppSecvec[pLabel->m_nSecs]->m_nUid = pInsec->m_nUid;
pLabel->m_ppSecvec[pLabel->m_nSecs]->m_Bytes = pInsec->m_Bytes;
/* Deep copy of user name */
if (pInsec->m_szLogin) {
pLabel->m_ppSecvec[pLabel->m_nSecs]->m_szLogin =\
malloc((strlen(pInsec->m_szLogin) + sizeof(char)) * sizeof(char));
strcpy(pLabel->m_ppSecvec[pLabel->m_nSecs]->m_szLogin, pInsec->m_szLogin);
}
/* Deep copy of section text */
if (pInsec->m_szData) {
pLabel->m_ppSecvec[pLabel->m_nSecs]->m_szData =\
malloc((strlen(pInsec->m_szData) + sizeof(char)) * sizeof(char));
strcpy(pLabel->m_ppSecvec[pLabel->m_nSecs]->m_szData, pInsec->m_szData);
}
/* Finally increment section count */
pLabel->m_nSecs++;
return(RC_THROW(RC_OK));
}
/************************************************
* labelGetXXX(rc_label_t *) *
* Accessor methods *
************************************************/
const char *labelGetname(rc_label_t *pLab)
{ /* Name of label, used for display during verbose */
if (pLab)
return(pLab->m_szName);
else
RC_THROW(RC_ERR_USE);
return(0); /* Not reached */
}
/************************************************
* labelSetXXX(rc_label_t *, const ... *) *
* Accessor methods *
************************************************/
rc_return_t labelSetname(rc_label_t *pLab, const char *szName)
{ /* Name of label, used for display during verbose */
if (pLab) {
pLab->m_szName = malloc((strlen(szName) + 1) * sizeof (char));
strcpy(pLab->m_szName, szName);
return(RC_THROW(RC_OK));
}
return(RC_THROW(RC_ERR_USE));
}
/************************************************
* labelDelete(rc_label_t *) *
* Destruct a label *
************************************************/
rc_return_t labelDelete(rc_label_t *pLab)
{
int nSecs = pLab->m_nSecs;
/* Cleanup our junk */
if (pLab) {
pLab->m_nSecs = 0; /* Blank the section count */
if (pLab->m_szName) /* Destroy the rc name */
free(pLab->m_szName);
while (nSecs-- > 0) { /* Destroy the section vector */
if (pLab->m_ppSecvec[nSecs]) {
sectionDelete(pLab->m_ppSecvec[nSecs]);
pLab->m_ppSecvec[nSecs] = NULL;
}
}
free(pLab->m_ppSecvec);
pLab->m_ppSecvec = NULL;
free(pLab);
}
else /* Dumbass passed an empty label object */
assert(FALSE);
return(RC_THROW(RC_OK));
}