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