Index: ossp-pkg/rc/Makefile.in
RCS File: /v/ossp/cvs/ossp-pkg/rc/Makefile.in,v
rcsdiff -q -kk '-r1.32' '-r1.33' -u '/v/ossp/cvs/ossp-pkg/rc/Makefile.in,v' 2>/dev/null
--- Makefile.in 2003/05/20 11:45:11 1.32
+++ Makefile.in 2003/06/18 14:35:29 1.33
@@ -59,10 +59,10 @@
TARGET_PROGS = rc
TARGET_MANS = rc.1 rc-sample.5
-SRCS = rc.c rc_error.c rc_anal.c rc_script.c rc_lab.c rc_sect.c rc_config.c \
+SRCS = rc.c rc_error.c rc_list.c rc_script.c rc_file.c rc_sect.c rc_config.c \
rc_cliopt.c rc_proc.c rc_version.c rc_pcre.c rc_util.c
-OBJS = rc.o rc_error.o rc_anal.o rc_script.o rc_lab.o rc_sect.o rc_config.o \
+OBJS = rc.o rc_error.o rc_list.o rc_script.o rc_file.o rc_sect.o rc_config.o \
rc_cliopt.o rc_proc.o rc_version.o rc_pcre.o rc_util.o
SUBDIRS = @SUBDIR_EX@ @SUBDIR_POPT@
Index: ossp-pkg/rc/rc.h
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc.h,v
rcsdiff -q -kk '-r1.48' '-r1.49' -u '/v/ossp/cvs/ossp-pkg/rc/rc.h,v' 2>/dev/null
--- rc.h 2003/06/13 18:33:07 1.48
+++ rc.h 2003/06/18 14:35:29 1.49
@@ -98,11 +98,10 @@
rc_return_t clioptSetrcfile(const char *);
rc_return_t clioptSetsecs(const char **);
-/* Analyser function prototypes */
-rc_anal_t *analNew(void);
-rc_return_t analDelete(rc_anal_t *);
-rc_return_t analRcs(rc_anal_t *, const char *);
-rc_return_t analGloblocs(rc_anal_t *);
+/* List function prototypes */
+rc_list_t *listNew(void);
+rc_return_t listDelete(rc_list_t *);
+rc_return_t listPopulate(rc_list_t *, const char *);
/* Script function prototypes */
rc_script_t *scriptNew(void);
@@ -114,12 +113,13 @@
const char *scriptTostring(rc_script_t *);
rc_return_t scriptDelete(rc_script_t *);
-/* Label function prototypes */
-rc_label_t *labelNew(const char *);
-rc_return_t labelAppendsec(rc_label_t *, rc_section_t *);
-rc_return_t labelDelete(rc_label_t *);
-const char *labelGetname(rc_label_t *);
-rc_return_t labelSetname(rc_label_t *, const char *);
+/* Rcfile function prototypes */
+rc_file_t *rcfileNew(const char *);
+rc_return_t rcfileAppendsec(rc_file_t *, rc_section_t *);
+const char *rcfileGetname(rc_file_t *);
+rc_return_t rcfileSetname(rc_file_t *, const char *);
+short rcfileExists(rc_file_t *);
+rc_return_t rcfileDelete(rc_file_t *);
/* Section function prototypes */
rc_section_t *sectionNew(const char *);
Index: ossp-pkg/rc/rc_anal.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/Attic/rc_anal.c,v
co -q -kk -p'1.20' '/v/ossp/cvs/ossp-pkg/rc/Attic/rc_anal.c,v' | diff -u - /dev/null -L'ossp-pkg/rc/rc_anal.c' 2>/dev/null
--- ossp-pkg/rc/rc_anal.c
+++ /dev/null 2025-04-19 11:29:57.000000000 +0200
@@ -1,171 +0,0 @@
-/* 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_anal.c: Run-command processor ISO C source file
-*/
-
-#include
-#include
-#include
-
-#include "rc.h" /* Public interfaces */
-#include "rc_const.h" /* String constants */
-#include "rc_config.h" /* Configuration interface */
-
-
-/************************************************
-* analNew(void) *
-* Construct a new analyser *
-************************************************/
-rc_anal_t *analNew(void)
-{
- rc_anal_t *pNew = NULL;
-
- /* Allocate storage for 1 anal object */
- pNew = calloc(1, sizeof(rc_anal_t));
- return(pNew);
-}
-
-/************************************************
-* private analRcs(rc_anal_t *, const char *) *
-* Read a rc file identifier to analyse *
-************************************************/
-rc_return_t analRcs(rc_anal_t *pInst, const char *kszName)
-{
- ex_t Except;
-
- assert(!(pInst)->m_pszRcs); /* Rcs should be NULL until we set them */
-
- if (!kszName)
- return(RC_THROW(RC_ERR_RCF));
- else { /* Only enter block with valid string, strdup can't handle NULL */
- pInst->m_pszRcs = malloc(sizeof(char **));
- if (strcmp(kszName, RC_GLOB_WILD)) {
- pInst->m_pszRcs = malloc(sizeof(*(pInst->m_pszRcs)) * 2);
- pInst->m_pszRcs[0] = strdup(kszName);
- pInst->m_pszRcs[0] = strdup(kszName);
- pInst->m_pszRcs[1] = NULL;
- pInst->m_nRcs = 1; /* We handle just one rc file */
- }
- else { /* Wildcard rcfile indicates we must glob the locs directories */
- try {
- analGloblocs(pInst);
- }
- catch(Except)
- rethrow;
- }
- }
-
- return(RC_THROW(RC_OK));
-}
-
-/************************************************
-* analGloblocs(rc_anal_t *pInst) *
-* Glob all files of the location directories *
-************************************************/
-rc_return_t analGloblocs(rc_anal_t *pInst)
-{
- DIR *pLocdir = NULL;
- struct dirent *pDirent = NULL;
- char *szLocations = NULL; /* Locations of run command files */
- int nCount = 0; /* How many globbed files we find */
- int nIter = 0; /* Used to step through found files */
-
- assert(pInst); /* Sanity check */
-
- /* Build the location path name */
- if (!configGetval(RC_LOC_VAL)) {
- szLocations = NULL;
- szLocations = strdup("./"); /* FIXME: Relocate default val */
- RC_THROW(RC_ERR_INT); /* Config should have given a locs default */
- }
- else { /* Only enter block with valid string, strdup can't handle NULL */
- if (*(configGetval(RC_LOC_VAL) + strlen(configGetval(RC_LOC_VAL)) - sizeof (char)) != '/') {
- szLocations = malloc(strlen(configGetval(RC_LOC_VAL)) + \
- sizeof (char) + \
- sizeof (char));
- strcpy(szLocations, configGetval(RC_LOC_VAL));
- strcat(szLocations, "/");
- }
- else
- szLocations = strdup(configGetval(RC_LOC_VAL));
- }
-
- /* First just learn how many globbed files we have */
- if ((pLocdir = opendir(szLocations)) == NULL)
- return(RC_THROW(RC_ERR_DIR));
- for (pDirent = readdir(pLocdir); pDirent; pDirent = readdir(pLocdir))
- if (!strncmp(pDirent->d_name, "rc.", 3))
- nCount++;
- closedir(pLocdir);
-
- if (nCount == 0) /* Check out the health of this directory listing */
- return(RC_THROW(RC_ERR_DIR));
- else /* Allocate for the string array to hold directory entry names */
- pInst->m_pszRcs = malloc(sizeof(pInst->m_pszRcs) * (nCount + 1));
-
- /* Loop through file index setting rc file names according to dirent */
- if ((pLocdir = opendir(szLocations)) == NULL)
- return(RC_THROW(RC_ERR_DIR));
- for (pDirent = readdir(pLocdir); pDirent; pDirent = readdir(pLocdir)) {
- if (!strncmp(pDirent->d_name, "rc.", 3)) {
- pInst->m_pszRcs[nIter] = strdup(pDirent->d_name + \
- strlen("rc.") * sizeof(char));
- nIter++;
- }
- }
- closedir(pLocdir);
-
- pInst->m_pszRcs[nIter] = NULL; /* Terminate */
- pInst->m_nRcs = nCount; /* Store how many globbed files there are */
-
- return(RC_THROW(RC_OK));
-}
-
-/************************************************
-* analDelete(rc_anal_t *) *
-* Destruct an analyser *
-************************************************/
-rc_return_t analDelete(rc_anal_t *pInst)
-{
-/* FIXME: It could be that pInst needs to be a double pointer to */
-/* be properly used in destruction. Otherwise members are */
-/* just copies of the stack parameters passed in. */
- int nIter = 0;
-
- assert(pInst); /* Verify sanity */
-
- if (pInst->m_pszRcs && pInst->m_pszRcs[nIter])
- while (pInst->m_pszRcs[nIter]) /* Rc file names */
- free(pInst->m_pszRcs[nIter++]);
- if (pInst->m_pszRcs) /* Rc file name index */
- free(pInst->m_pszRcs);
-
- free(pInst);
-
- return(RC_THROW(RC_OK));
-}
-
Index: ossp-pkg/rc/rc_config.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_config.c,v
rcsdiff -q -kk '-r1.32' '-r1.33' -u '/v/ossp/cvs/ossp-pkg/rc/rc_config.c,v' 2>/dev/null
--- rc_config.c 2003/06/13 18:33:07 1.32
+++ rc_config.c 2003/06/18 14:35:29 1.33
@@ -74,10 +74,10 @@
char **pszTemp = NULL; /* For holding the section string vector */
try {
- fprintf(stderr, "Run command file: %s\n", configGetrcfile());
+ fprintf(stderr, "# Run command file: %s\n", configGetrcfile());
pszTemp = (char **)configGetsecs();
- fprintf(stderr, "Sections:");
+ fprintf(stderr, "# Sections:");
for (i = 0; pszTemp[i]; i++)
fprintf(stderr, " %s", pszTemp[i]);
fputc('\n', stderr);
@@ -86,11 +86,12 @@
for (i = 0; i < RC_NUMOPTS; i++) {
if (configGetval(i) == NULL); /* NOP */
else if (!(strcmp(configGetval(i), "1")))
- fprintf(stderr, "Option %s is on.\n", configGetname(i));
+ fprintf(stderr, "# Option %s is on.\n", configGetname(i));
else
- fprintf(stderr, "Option %s is %s.\n", configGetname(i),\
+ fprintf(stderr, "# Option %s is %s.\n", configGetname(i),\
configGetval(i));
}
+ fputc('\n', stderr);
}
catch(Except)
Index: ossp-pkg/rc/rc_const.h
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_const.h,v
rcsdiff -q -kk '-r1.24' '-r1.25' -u '/v/ossp/cvs/ossp-pkg/rc/rc_const.h,v' 2>/dev/null
--- rc_const.h 2003/06/13 18:33:07 1.24
+++ rc_const.h 2003/06/18 14:35:29 1.25
@@ -37,9 +37,15 @@
#define RC_SLO_TEXT "The silent option may not be combined with output options.\n"
#define RC_SUM_TEXT "Option argument summary.\n"
#define RC_RUT_TEXT "Failed to set the user id. Please become the root user and try again.\n"
-#define RC_EVN_TEXT "# Evaluating section %s of script %s.\n"
-#define RC_EXN_TEXT "# Executing section %s of script %s.\n"
-#define RC_PRN_TEXT "# Printing section %s of script %s.\n"
+
+/* Generic text, should not include newline termination */
+#define RC_VST_TEXT "# Start of run command script operations."
+#define RC_EVF_TEXT "# Evaluating code from functions file."
+#define RC_EVN_TEXT "# Evaluating section %s of script %s."
+#define RC_EXF_TEXT "# Executing code from functions file."
+#define RC_EXN_TEXT "# Executing section %s of script %s."
+#define RC_PNF_TEXT "# Printing code from functions file."
+#define RC_PRN_TEXT "# Printing section %s of script %s."
/* Single word user text, should not include termination */
#define RC_CMN_TEXT "common"
Index: ossp-pkg/rc/rc_file.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_file.c,v
co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/rc/rc_file.c,v' | diff -u /dev/null - -L'ossp-pkg/rc/rc_file.c' 2>/dev/null
--- ossp-pkg/rc/rc_file.c
+++ - 2025-04-19 11:30:02.798467084 +0200
@@ -0,0 +1,182 @@
+/* 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_file.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 */
+
+
+/************************************************
+* rcfileNew(void) *
+* Construct a new rcfile *
+************************************************/
+rc_file_t *rcfileNew(const char *szName)
+{
+ rc_file_t *pRcfile = NULL;
+
+ pRcfile = (rc_file_t *)calloc(1, sizeof(rc_file_t)); /* Allocate and clear */
+ if (!pRcfile) /* Ensure storage */
+ RC_THROW(RC_ERR_MEM);
+
+ if (szName) {
+ pRcfile->m_szName = malloc((strlen(szName) + 1) * sizeof(char));
+ strcpy(pRcfile->m_szName, szName);
+ }
+ else
+ pRcfile->m_szName = NULL;
+
+ /* Default values */
+ pRcfile->m_nSecs = -1;
+ pRcfile->m_ppSecvec = NULL;
+
+ return(pRcfile);
+}
+
+/****************************************************
+* rcfileAppendsec(rc_file_t *, rc_section_t *) *
+* Append a section to this rcfile *
+****************************************************/
+rc_return_t rcfileAppendsec(rc_file_t *pRcfile, rc_section_t *pInsec)
+{
+ assert(pRcfile); /* Rcfile parameter must be valid */
+ if (!pInsec) /* Check sanity */
+ return(RC_THROW(RC_ERR_USE));
+
+ /* When appending to a brand new rcfile, reset the object key (m_nSecs) */
+ if (pRcfile->m_nSecs == -1)
+ pRcfile->m_nSecs = 0;
+
+ /* First make our vector larger to hold one more section */
+ pRcfile->m_ppSecvec = realloc(pRcfile->m_ppSecvec, sizeof(rc_section_t *) \
+ * (pRcfile->m_nSecs + 1));
+ pRcfile->m_ppSecvec[pRcfile->m_nSecs] = sectionNew(pInsec->m_szName);
+ pRcfile->m_ppSecvec[pRcfile->m_nSecs + 1] = NULL;
+
+ /* Simple value copy */
+ pRcfile->m_ppSecvec[pRcfile->m_nSecs]->m_nPri = pInsec->m_nPri;
+ pRcfile->m_ppSecvec[pRcfile->m_nSecs]->m_nUid = pInsec->m_nUid;
+
+ /* Deep copy of user name */
+ if (pInsec->m_szLogin) {
+ pRcfile->m_ppSecvec[pRcfile->m_nSecs]->m_szLogin = \
+ malloc((strlen(pInsec->m_szLogin) + sizeof(char)) * sizeof(char));
+ strcpy(pRcfile->m_ppSecvec[pRcfile->m_nSecs]->m_szLogin, pInsec->m_szLogin);
+ }
+
+ /* Deep copy of section text */
+ if (pInsec->m_szData) {
+ pRcfile->m_ppSecvec[pRcfile->m_nSecs]->m_szData = \
+ malloc((strlen(pInsec->m_szData) + sizeof(char)) * sizeof(char));
+ strcpy(pRcfile->m_ppSecvec[pRcfile->m_nSecs]->m_szData, pInsec->m_szData);
+ }
+
+ /* Finally increment section count */
+ pRcfile->m_nSecs++;
+
+ return(RC_THROW(RC_OK));
+}
+
+/************************************************
+* rcfileGetXXX(rc_file_t *) *
+* Accessor methods *
+************************************************/
+const char *rcfileGetname(rc_file_t *pRcfile)
+{ /* Name of rcfile, used for display during verbose */
+ if (pRcfile)
+ return(pRcfile->m_szName);
+ else
+ RC_THROW(RC_ERR_USE);
+
+ return(0); /* Not reached */
+}
+
+/************************************************
+* rcfileSetXXX(rc_file_t *, const ... *) *
+* Accessor methods *
+************************************************/
+rc_return_t rcfileSetname(rc_file_t *pRcfile, const char *szName)
+{ /* Name of rcfile, used for display during verbose */
+ if (pRcfile) {
+ pRcfile->m_szName = malloc((strlen(szName) + 1) * sizeof (char));
+ strcpy(pRcfile->m_szName, szName);
+ return(RC_THROW(RC_OK));
+ }
+
+ return(RC_THROW(RC_ERR_USE));
+}
+
+/************************************************
+* rcfileExists(rc_file_t *) *
+* Tests for an existing rcfile object *
+************************************************/
+short rcfileExists(rc_file_t *pRcfile)
+{ /* Key on name of rcfile */
+ if (pRcfile) {
+ if (pRcfile->m_szName)
+ return(TRUE); /* Object does indeed exist */
+ else
+ return(FALSE); /* Object does not exist */
+ }
+
+ return(RC_THROW(RC_ERR_USE));
+}
+
+/************************************************
+* rcfileDelete(rc_file_t *) *
+* Destruct a rcfile *
+************************************************/
+rc_return_t rcfileDelete(rc_file_t *pRcfile)
+{
+ int nSecs = pRcfile->m_nSecs;
+
+ /* Cleanup our junk */
+ if (pRcfile) {
+ pRcfile->m_nSecs = 0; /* Blank the section count */
+ if (pRcfile->m_szName) { /* Destroy the rc name */
+ free(pRcfile->m_szName);
+ pRcfile->m_szName = NULL;
+ }
+ while (nSecs-- > 0) { /* Destroy the section vector */
+ if (pRcfile->m_ppSecvec[nSecs]) {
+ sectionDelete(pRcfile->m_ppSecvec[nSecs]);
+ pRcfile->m_ppSecvec[nSecs] = NULL;
+ }
+ }
+ free(pRcfile->m_ppSecvec);
+ pRcfile->m_ppSecvec = NULL;
+ free(pRcfile);
+ pRcfile = NULL;
+ }
+ else /* Dumbass passed an empty rcfile object */
+ assert(FALSE);
+
+ return(RC_THROW(RC_OK));
+}
+
Index: ossp-pkg/rc/rc_lab.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/Attic/rc_lab.c,v
co -q -kk -p'1.4' '/v/ossp/cvs/ossp-pkg/rc/Attic/rc_lab.c,v' | diff -u - /dev/null -L'ossp-pkg/rc/rc_lab.c' 2>/dev/null
--- ossp-pkg/rc/rc_lab.c
+++ /dev/null 2025-04-19 11:29:57.000000000 +0200
@@ -1,154 +0,0 @@
-/* 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));
-}
-
Index: ossp-pkg/rc/rc_list.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_list.c,v
co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/rc/rc_list.c,v' | diff -u /dev/null - -L'ossp-pkg/rc/rc_list.c' 2>/dev/null
--- ossp-pkg/rc/rc_list.c
+++ - 2025-04-19 11:30:02.804181344 +0200
@@ -0,0 +1,169 @@
+/* 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_list.c: Run-command processor ISO C source file
+*/
+
+#include
+#include
+#include
+
+#include "rc.h" /* Public interfaces */
+#include "rc_const.h" /* String constants */
+#include "rc_config.h" /* Configuration interface */
+
+
+/************************************************
+* listNew(void) *
+* Construct a new rcfile list *
+************************************************/
+rc_list_t *listNew(void)
+{
+ rc_list_t *pNew = NULL;
+
+ /* Allocate storage for one list object */
+ pNew = calloc(1, sizeof(rc_list_t));
+ return(pNew);
+}
+
+/**************************************************
+* private listPopulate(rc_list_t *, const char *) *
+* Read the rcfile identifier and analyse it *
+**************************************************/
+rc_return_t listPopulate(rc_list_t *pInst, const char *kszName)
+{
+ ex_t Except;
+
+ assert(pInst); /* Verify sanity */
+ assert(!pInst->m_ppFilevec); /* Rcfiles should be NULL until we set them */
+
+ if (!kszName)
+ return(RC_THROW(RC_ERR_RCF));
+ else { /* Only enter block with valid string, strdup can't handle NULL */
+ pInst->m_ppFilevec = malloc(sizeof (rc_file_t *));
+ if (strcmp(kszName, RC_GLOB_WILD)) {
+ pInst->m_ppFilevec[0] = rcfileNew(kszName); /* For an object */
+ pInst->m_ppFilevec[1] = rcfileNew(NULL); /* For the tail */
+ pInst->m_nFiles = 1; /* We handle just one rc file */
+ }
+ else { /* Wildcard rcfile indicates to glob the locs directories */
+ try {
+ DIR *pLocdir = NULL;
+ struct dirent *pDirent = NULL;
+ char *szLocations = NULL; /* Locations of run command files */
+ int nCount = 0; /* How many globbed files we find */
+ int nIter = 0; /* Used to step through found files */
+
+ assert(pInst); /* Sanity check */
+
+ /* Build the location path name */
+ if (!configGetval(RC_LOC_VAL)) {
+ szLocations = NULL;
+ szLocations = strdup("./"); /* FIXME: Relocate default val */
+ RC_THROW(RC_ERR_INT); /* Config should have given a locs default */
+ }
+ else { /* Only enter block with valid string, strdup can't handle NULL */
+ if (*(configGetval(RC_LOC_VAL) + strlen(configGetval(RC_LOC_VAL)) - \
+ sizeof (char)) != '/') {
+ szLocations = malloc(strlen(configGetval(RC_LOC_VAL)) + \
+ sizeof (char) + \
+ sizeof (char));
+ strcpy(szLocations, configGetval(RC_LOC_VAL));
+ strcat(szLocations, "/");
+ }
+ else
+ szLocations = strdup(configGetval(RC_LOC_VAL));
+ }
+
+ /* First just learn how many globbed files we have */
+ if ((pLocdir = opendir(szLocations)) == NULL)
+ return(RC_THROW(RC_ERR_DIR));
+ for (pDirent = readdir(pLocdir); pDirent; pDirent = readdir(pLocdir))
+ if (!strncmp(pDirent->d_name, "rc.", strlen("rc.")))
+ nCount++;
+ closedir(pLocdir);
+
+ /* Prepare resources before entering rcfile allocation loop */
+ if (nCount == 0) /* Check out the health of this directory listing */
+ return(RC_THROW(RC_ERR_DIR));
+ nIter = 0; /* Used in the next for block, so initialize */
+ pInst->m_ppFilevec = calloc(nCount + 1, sizeof (rc_file_t *));
+ if (!pInst->m_ppFilevec) /* Guard against memory overruns */
+ return(RC_THROW(RC_ERR_MEM));
+ if ((pLocdir = opendir(szLocations)) == NULL)
+ return(RC_THROW(RC_ERR_DIR));
+
+ /* Loop through file index setting rc file names according to dirent */
+ for (pDirent = readdir(pLocdir); pDirent; pDirent = readdir(pLocdir))
+ if (!strncmp(pDirent->d_name, "rc.", strlen("rc.")))
+ pInst->m_ppFilevec[nIter++] = rcfileNew(pDirent->d_name + strlen("rc.") * sizeof (char));
+
+ /* Clean up our used resources and prepare to exit */
+ pInst->m_ppFilevec[nIter] = rcfileNew(NULL); /* Make the tail */
+ pInst->m_nFiles = nIter; /* Store how many globbed files */
+ assert(nCount == nIter); /* Be cautious, ensure numbers */
+ free(szLocations); /* Cleanup our temp */
+ szLocations = NULL; /* locations string */
+ closedir(pLocdir);
+ }
+ catch(Except)
+ rethrow;
+ }
+ }
+
+ return(RC_THROW(RC_OK));
+}
+
+/************************************************
+* listDelete(rc_list_t *) *
+* Destruct a rcfile list *
+************************************************/
+rc_return_t listDelete(rc_list_t *pInst)
+{
+/* FIXME: It could be that pInst needs to be a double pointer to */
+/* be properly used in destruction. Otherwise members are */
+/* just copies of the stack parameters passed in. */
+ int nIter = 0;
+
+ assert(pInst); /* Verify sanity */
+
+ if (pInst->m_ppFilevec) {
+ for (nIter = 0; nIter <= pInst->m_nFiles; nIter++) {
+ if (pInst->m_ppFilevec[nIter]) {
+ free(pInst->m_ppFilevec[nIter]); /* Deallocate a rcfile */
+ pInst->m_ppFilevec[nIter] = NULL;
+ }
+ }
+ free(pInst->m_ppFilevec); /* Deallocate the rcfile vector */
+ pInst->m_ppFilevec = NULL;
+ }
+
+ free(pInst); /* Deallocate the list itself */
+ pInst = NULL;
+
+ return(RC_THROW(RC_OK));
+}
+
Index: ossp-pkg/rc/rc_private.h
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_private.h,v
rcsdiff -q -kk '-r1.32' '-r1.33' -u '/v/ossp/cvs/ossp-pkg/rc/rc_private.h,v' 2>/dev/null
--- rc_private.h 2003/06/13 18:33:07 1.32
+++ rc_private.h 2003/06/18 14:35:29 1.33
@@ -73,12 +73,6 @@
typedef int rc_opt_t; /* For use with RC_XXX_VAL definitions */
-/* Analyser type */
-typedef struct {
- short m_nRcs; /* How many rc files */
- char **m_pszRcs; /* Rc file names */
-} rc_anal_t;
-
/* Script type */
typedef char * rc_script_t;
@@ -89,21 +83,26 @@
char *m_szName;
char *m_szLogin;
char *m_szData;
- size_t m_Bytes;
} rc_section_t;
-/* Label type */
+/* Rcfile class */
typedef struct {
short m_nSecs;
char *m_szName;
rc_section_t **m_ppSecvec;
-} rc_label_t;
+} rc_file_t;
+
+/* List class (can be implemented as array) */
+typedef struct {
+ short m_nFiles;
+ rc_file_t **m_ppFilevec;
+} rc_list_t;
/* Processor class */
typedef struct {
- rc_anal_t *m_pAnal;
+ rc_script_t *m_pScriptfunc;
rc_script_t *m_pScriptcom;
- rc_label_t **m_ppLabvec;
+ rc_list_t *m_pList;
} rc_proc_t;
#endif /* __OSSPRC_PRIVATE_H__ */
Index: ossp-pkg/rc/rc_proc.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_proc.c,v
rcsdiff -q -kk '-r1.45' '-r1.46' -u '/v/ossp/cvs/ossp-pkg/rc/rc_proc.c,v' 2>/dev/null
--- rc_proc.c 2003/06/13 18:33:07 1.45
+++ rc_proc.c 2003/06/18 14:35:29 1.46
@@ -50,10 +50,10 @@
ex_try {
pNewrc = malloc(sizeof(rc_proc_t));
- pNewrc->m_pAnal = analNew(); /* Construct a configuration analyser */
- analRcs (pNewrc->m_pAnal, configGetrcfile()); /* Preprocess analysis */
- pNewrc->m_pScriptcom = scriptNew(); /* Construct a run-command script */
- pNewrc->m_ppLabvec = calloc(pNewrc->m_pAnal->m_nRcs, sizeof(rc_label_t *));
+ pNewrc->m_pList = listNew(); /* Construct a rcfile list */
+ listPopulate(pNewrc->m_pList, configGetrcfile()); /* Prepopulate list */
+ pNewrc->m_pScriptfunc = scriptNew(); /* Construct a functions script */
+ pNewrc->m_pScriptcom = scriptNew(); /* Construct a common script */
}
ex_catch(Except)
rethrow;
@@ -71,40 +71,38 @@
int nFdrc = -1;
int nFdfunc = -1;
int nRet = 0;
- int nRc = 0;
+ int nRcs = 0;
ex_t Except;
char *sBuf = NULL;
- rc_section_t *pSec = NULL;
char *szLocex = NULL;
rc_script_t *pTempscript = NULL;
+ rc_section_t *pSec = NULL;
short nTotalsecs = vectorCount(configGetsecs());
- assert(*pRc->m_pAnal->m_pszRcs);
+ assert(pRc->m_pList->m_ppFilevec);
sBuf = (char *)calloc(1, RC_READ_BUFSIZE);
/* Open the func file if it exists in the configuration */
if (configGetval(RC_FNC_VAL)) {
-/* FIXME: Funcfile data does not belong in config section data! */
+ /* FIXME: Funcfile data does not belong in config section data! */
if ((nFdfunc = open(configGetval(RC_FNC_VAL), O_RDONLY)) >= 0) {
/* Read data from the func file */
while ((nRet = read(nFdfunc, sBuf, RC_READ_BUFSIZE)) > 0)
- scriptAppend(pRc->m_pScriptcom, sBuf, nRet);
+ scriptAppend(pRc->m_pScriptfunc, sBuf, nRet);
if (nRet == -1) /* Handle read errors */
RC_THROW(RC_ERR_IO);
- scriptAppend(pRc->m_pScriptcom, "\n", sizeof(char));
+ scriptAppend(pRc->m_pScriptfunc, "\n", sizeof("\n"));
}
else
RC_THROW(RC_ERR_FNC);
}
/* Iteratively read possibly globbed rc files */
- for (nRc = 0; nRc < pRc->m_pAnal->m_nRcs; nRc++)
+ for (nRcs = 0; nRcs < pRc->m_pList->m_nFiles; nRcs++)
{
- assert(*pRc->m_pAnal->m_pszRcs);
-
- /* Construct a new label */
- pRc->m_ppLabvec[nRc] = labelNew(pRc->m_pAnal->m_pszRcs[nRc]);
+ if (!pRc->m_pList->m_ppFilevec[nRcs])
+ RC_THROW(RC_ERR_INT); /* Rcfile vector is missing its tail */
/* Build the location path name */
if (!configGetval(RC_LOC_VAL)) {
@@ -117,21 +115,21 @@
szLocex = malloc(strlen(configGetval(RC_LOC_VAL)) + \
sizeof (char) + \
strlen("rc.") + \
- strlen(pRc->m_pAnal->m_pszRcs[nRc]) + \
+ strlen(pRc->m_pList->m_ppFilevec[nRcs]->m_szName) + \
sizeof (char));
strcpy(szLocex, configGetval(RC_LOC_VAL));
strcat(szLocex, "/");
strcat(szLocex, "rc."); /* FIXME: Make the prefix configurable */
- strcat(szLocex, pRc->m_pAnal->m_pszRcs[nRc]);
+ strcat(szLocex, pRc->m_pList->m_ppFilevec[nRcs]->m_szName);
}
else {
szLocex = malloc(strlen(configGetval(RC_LOC_VAL)) + \
strlen("rc.") + \
- strlen(pRc->m_pAnal->m_pszRcs[nRc]) + \
+ strlen(pRc->m_pList->m_ppFilevec[nRcs]->m_szName) + \
sizeof (char));
strcpy(szLocex, configGetval(RC_LOC_VAL));
strcat(szLocex, "rc."); /* FIXME: Make the prefix configurable */
- strcat(szLocex, pRc->m_pAnal->m_pszRcs[nRc]);
+ strcat(szLocex, pRc->m_pList->m_ppFilevec[nRcs]->m_szName);
}
}
@@ -162,10 +160,10 @@
pSec = scriptSection(pTempscript, configGetsecs()[nSect]);
if (pSec) /* Only copy if the section lookup succeeds */
- labelAppendsec(pRc->m_ppLabvec[nRc], pSec);
+ rcfileAppendsec(pRc->m_pList->m_ppFilevec[nRcs], pSec);
else if (configGetval(RC_DBG_VAL)) /* Only show if debug set */
fprintf(stderr, "#Warning: Missing section '%s' in %s!\n",\
- configGetsecs()[nSect], pRc->m_pAnal->m_pszRcs[nRc]);
+ configGetsecs()[nSect], pRc->m_pList->m_ppFilevec[nRcs]->m_szName);
if (pSec) { /* Cleanup iterative section string */
sectionDelete(pSec);
@@ -211,6 +209,7 @@
pid_t Pidexec = -1; /* When spawning before execv(3) */
char *szTmpfile = NULL; /* Path of temporary file */
char *szTmp = NULL; /* Generic temporary string */
+ char *szFunc = NULL; /* Stores func script text */
char *szCom = NULL; /* Stores common script text */
char *szExec = NULL; /* Used only during exec mode */
char *szVerbose = NULL; /* Used when handling verbose mode */
@@ -228,43 +227,64 @@
/****************************************************/
if (configGetval(RC_EVL_VAL)) { /* Evaluate */
/* Allocate a block of section pointers to use temporarily */
- ppSectmp = calloc(pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *));
+ ppSectmp = calloc(pRc->m_pList->m_nFiles, sizeof(rc_section_t *));
pFatscript = scriptNew();
scriptAppend(pFatscript, RC_BANG_STR, strlen(RC_BANG_STR)); /* Shebang */
+ /* Conditionally output initial notice in verbal mode */
+ if (configGetval(RC_VRB_VAL)) {
+ szVerbose = malloc((strlen(RC_VST_TEXT) + 2) * sizeof (char));
+ sprintf(szVerbose, "%s", RC_VST_TEXT);
+ strcat(szVerbose, "\n");
+ scriptAppend(pFatscript, szVerbose, strlen(szVerbose));
+ free(szVerbose);
+ szVerbose = NULL;
+ }
+ /* Conditionally print funcs section notice in verbal mode */
+ if (configGetval(RC_VRB_VAL)) {
+ szVerbose = malloc((strlen(RC_EVF_TEXT) + 2) * sizeof (char));
+ sprintf(szVerbose, "%s", RC_EVF_TEXT);
+ strcat(szVerbose, "\n");
+ scriptAppend(pFatscript, szVerbose, strlen(szVerbose));
+ free(szVerbose);
+ szVerbose = NULL;
+ }
+ scriptAppend(pFatscript, scriptTostring(pRc->m_pScriptfunc), \
+ strlen(scriptTostring(pRc->m_pScriptfunc)));
/* Conditionally print common section notice in verbal mode */
if (configGetval(RC_VRB_VAL)) {
- nBytes = (strlen(RC_PRN_TEXT) + strlen(RC_CMN_TEXT) * 2 + 1) * sizeof (char);
+ nBytes = (strlen(RC_EVN_TEXT) + strlen(RC_CMN_TEXT) * 2 + 2) * sizeof (char);
szVerbose = malloc(nBytes);
- sprintf(szVerbose, RC_PRN_TEXT, RC_CMN_TEXT, RC_CMN_TEXT);
+ sprintf(szVerbose, RC_EVN_TEXT, RC_CMN_TEXT, RC_CMN_TEXT);
+ strcat(szVerbose, "\n");
scriptAppend(pFatscript, szVerbose, strlen(szVerbose));
free(szVerbose);
+ szVerbose = NULL;
}
scriptAppend(pFatscript, scriptTostring(pRc->m_pScriptcom), \
strlen(scriptTostring(pRc->m_pScriptcom)));
for (nSecs = 0; nSecs < nTotalsecs; nSecs++) {
- for (nRcs = 0; nRcs < pRc->m_pAnal->m_nRcs; nRcs++) {
- nTmp = 0;
- while (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs && \
- strcmp(pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
- configGetsecs()[nSecs]))
- nTmp++;
- if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs)
- ppSectmp[nRcs] = pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp];
+ for (nRcs = 0; nRcs < pRc->m_pList->m_nFiles; nRcs++) {
+ for (nTmp = 0; nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs && \
+ strcmp(pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
+ configGetsecs()[nSecs]); nTmp++);
+ if (nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs)
+ ppSectmp[nRcs] = pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp];
else
ppSectmp[nRcs] = NULL;
}
- qsort((void *)ppSectmp, (size_t)pRc->m_pAnal->m_nRcs, \
+ qsort((void *)ppSectmp, (size_t)pRc->m_pList->m_nFiles, \
sizeof(rc_section_t *), priCompare);
- nTmp = 0;
- while (nTmp < pRc->m_pAnal->m_nRcs && ppSectmp[nTmp]) {
+ for (nTmp = 0; nTmp < pRc->m_pList->m_nFiles && ppSectmp[nTmp]; nTmp++) {
/* Conditionally print each section notice in verbal mode */
if (configGetval(RC_VRB_VAL)) {
szTmp = (char *)sectionGetname(ppSectmp[nTmp]);
- nBytes = (strlen(RC_EVN_TEXT) + strlen(szTmp) + 1) * sizeof (char);
+ nBytes = (strlen(RC_EVN_TEXT) + strlen(szTmp) + 2) * sizeof (char);
szVerbose = malloc(nBytes);
sprintf(szVerbose, RC_EVN_TEXT, szTmp, szTmp);
+ strcat(szVerbose, "\n");
scriptAppend(pFatscript, szVerbose, strlen(szVerbose));
free(szVerbose);
+ szVerbose = NULL;
}
if ((szTmp = (char *)sectionGetlogin(ppSectmp[nTmp])) != NULL) {
scriptAppend(pFatscript, "#su ", strlen("#su "));
@@ -273,7 +293,6 @@
}
szTmp = (char *)sectionGetdata(ppSectmp[nTmp]);
scriptAppend(pFatscript, szTmp, strlen(szTmp) + 1);
- nTmp++;
}
}
free(ppSectmp);
@@ -303,11 +322,11 @@
/* that allows rc to run unprivileged (as long as no privileged */
/* code is used in the script sections to be executed */
for (nSecs = 0; nSecs < nTotalsecs; nSecs++) {
- for (nTmp = 0; nTmp < pRc->m_pAnal->m_nRcs; nTmp++) {
- if (pRc->m_ppLabvec[nTmp]->m_ppSecvec && \
- pRc->m_ppLabvec[nTmp]->m_ppSecvec[nSecs]) {
+ for (nTmp = 0; nTmp < pRc->m_pList->m_nFiles; nTmp++) {
+ if (pRc->m_pList->m_ppFilevec[nTmp]->m_ppSecvec && \
+ pRc->m_pList->m_ppFilevec[nTmp]->m_ppSecvec[nSecs]) {
nRunuid = getuid();
- nSectuid = pRc->m_ppLabvec[nTmp]->m_ppSecvec[nSecs]->m_nUid;
+ nSectuid = pRc->m_pList->m_ppFilevec[nTmp]->m_ppSecvec[nSecs]->m_nUid;
/* See if root user status is needed, and bail out if so */
if (nRunuid != 0 && nSectuid != -1 && nRunuid != nSectuid) {
fprintf(stderr, RC_RUT_TEXT);
@@ -317,44 +336,57 @@
}
}
/* Allocate a block of section pointers to use temporarily */
- ppSectmp = calloc(pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *));
- szCom = (char *)scriptTostring(pRc->m_pScriptcom);
+ ppSectmp = calloc(pRc->m_pList->m_nFiles, sizeof(rc_section_t *));
+ szFunc = (char *)scriptTostring(pRc->m_pScriptfunc);
+ szCom = (char *)scriptTostring(pRc->m_pScriptcom);
for (nSecs = 0; nSecs < nTotalsecs; nSecs++) {
- for (nRcs = 0; nRcs < pRc->m_pAnal->m_nRcs; nRcs++) {
- nTmp = 0;
- while (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs && \
- strcmp(pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
- configGetsecs()[nSecs]))
- nTmp++;
- if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs)
- ppSectmp[nRcs] = pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp];
+ for (nRcs = 0; nRcs < pRc->m_pList->m_nFiles; nRcs++) {
+ for (nTmp = 0; nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs && \
+ strcmp(pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
+ configGetsecs()[nSecs]); nTmp++);
+ if (nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs)
+ ppSectmp[nRcs] = pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp];
else
ppSectmp[nRcs] = NULL;
}
- qsort((void *)ppSectmp, (size_t)pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *), priCompare);
+ qsort((void *)ppSectmp, (size_t)pRc->m_pList->m_nFiles, sizeof(rc_section_t *), priCompare);
pszVec[0] = "/bin/sh"; /* Run the bourne shell over the following */
pszVec[1] = "-c"; /* Append script code of the sections */
pszVec[3] = NULL; /* Add a NULL to mark the end of the chain */
nTmp = 0; /* Count from zero until however many sections we have */
- while (nTmp < pRc->m_pAnal->m_nRcs && ppSectmp[nTmp]) {
+ while (nTmp < pRc->m_pList->m_nFiles && ppSectmp[nTmp]) {
/* Conditionally print common and other section notices in verbal mode */
if (configGetval(RC_VRB_VAL)) {
- size_t nComverb = 0;
- size_t nCommon = 0;
+ size_t nSizverb = 0;
+ size_t nPrescr = 0;
size_t nSecverb = 0;
size_t nSection = 0;
- nComverb = (strlen(RC_EXN_TEXT) + strlen(RC_CMN_TEXT) * 2 \
+
+ /* Allocate space just for string to prepare for verbose */
+ nSizverb = (strlen(RC_EXN_TEXT) + strlen(RC_CMN_TEXT) * 2 \
+ strlen(RC_ECHO_STR) + strlen("\"\"") + 1) * sizeof (char);
- szVerbose = malloc(nComverb);
+ szVerbose = malloc(nSizverb);
sprintf(szVerbose, RC_EXN_TEXT, RC_CMN_TEXT, RC_CMN_TEXT);
- nCommon = (strlen(szCom) + strlen(RC_BANG_STR) + 1) * sizeof (char);
- szExec = malloc(nComverb + nCommon);
+
+ /* Allocate space for entire string to execvp(3) */
+ nPrescr = (strlen(RC_VST_TEXT) + strlen(RC_EXF_TEXT) + \
+ strlen(szVerbose) + strlen(szFunc) + strlen(szCom) + \
+ strlen(RC_BANG_STR) + 1) * sizeof (char);
+ szExec = malloc(nSizverb + nPrescr);
+
strcpy(szExec, RC_BANG_STR); /* Start out with the bang string */
strcat(szExec, RC_ECHO_STR); /* Continue with the echo string */
strcat(szExec, "\""); /* Append a quote next to the echo */
- strcat(szExec, szVerbose); /* Continue with the verboseity text */
- strcat(szExec, "\""); /* Finalize the verbosity notice */
- strcat(szExec, szCom); /* Then with the common script code */
+ strcat(szExec, RC_VST_TEXT); /* Continue with the start text */
+ strcat(szExec, "\n"); /* Stick a newline inbetween */
+ strcat(szExec, RC_EXF_TEXT); /* Continue with the func text */
+ strcat(szExec, "\";"); /* Finalize the verbosity notice */
+ strcat(szExec, szFunc); /* Continue with the common script code */
+ strcat(szExec, RC_ECHO_STR); /* Continue with the echo string */
+ strcat(szExec, "\""); /* Append a quote next to the echo */
+ strcat(szExec, szVerbose); /* Continue with the common text */
+ strcat(szExec, "\";"); /* Finalize the verbosity notice */
+ strcat(szExec, szCom); /* Then with the funcs script code */
szTmp = (char *)sectionGetname(ppSectmp[nTmp]);
nSecverb = (strlen(RC_EXN_TEXT) + strlen(szTmp) * 2 \
+ strlen(RC_ECHO_STR) + strlen("\"\"") + 1) * sizeof (char);
@@ -362,11 +394,11 @@
sprintf(szVerbose, RC_EXN_TEXT, szTmp, szTmp);
szTmp = (char *)sectionGetdata(ppSectmp[nTmp]);
nSection = (strlen(szTmp) + 1) * sizeof (char);
- realloc(szExec, nComverb + nCommon + nSecverb + nSection);
+ realloc(szExec, nSizverb + nPrescr + nSecverb + nSection);
strcat(szExec, RC_ECHO_STR); /* Start out with the echo string */
strcat(szExec, "\""); /* Append a quote next to the echo */
strcat(szExec, szVerbose); /* Continue with the verboseity text */
- strcat(szExec, "\""); /* Finalize the verbosity notice */
+ strcat(szExec, "\";"); /* Finalize the verbosity notice */
strcat(szExec, szTmp); /* Then with the new script code */
pszVec[2] = szExec; /* Launch the new process image now */
free(szVerbose);
@@ -396,11 +428,13 @@
}
else {
szTmp = (char *)sectionGetdata(ppSectmp[nTmp]);
- szExec = malloc((strlen(szCom) + strlen(szTmp) + 1) * sizeof(char));
- strcpy(szExec, RC_BANG_STR); /* Start out with the shebang string */
- strcat(szExec, szCom); /* Continue with just the common script code */
- strcat(szExec, szTmp); /* And build a section onto the command chain */
- pszVec[2] = szExec; /* Actually launch the new process image now */
+ szExec = malloc((strlen(szFunc) + strlen(szCom) + \
+ strlen(szTmp) + 1) * sizeof(char));
+ strcpy(szExec, RC_BANG_STR); /* Start out with the shebang string */
+ strcat(szExec, szFunc); /* Continue with just the funcs script code */
+ strcat(szExec, szCom); /* Continue with just the common script code */
+ strcat(szExec, szTmp); /* And build a section onto the command chain */
+ pszVec[2] = szExec; /* Actually launch the new process image now */
/* Spawn the section shell code */
switch (Pidexec = fork()){
@@ -430,35 +464,43 @@
}
else if (configGetval(RC_PRN_VAL)) { /* Print */
/* Allocate a block of section pointers to use as a temporary */
- ppSectmp = calloc(pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *));
+ ppSectmp = calloc(pRc->m_pList->m_nFiles, sizeof(rc_section_t *));
pBangscript = scriptNew();
scriptAppend(pBangscript, RC_BANG_STR, (strlen(RC_BANG_STR) + 1) * sizeof (char));
+ scriptDump(pBangscript); /* Dump the shebang */
+ scriptDelete(pBangscript);
+
+ /* Conditionally output initial notice in verbal mode */
+ if (configGetval(RC_VRB_VAL))
+ fprintf(stderr, "%s\n", RC_VST_TEXT);
+ /* Conditionally print funcs section notice in verbal mode */
+ if (configGetval(RC_VRB_VAL))
+ fprintf(stderr, "%s\n", RC_EVF_TEXT);
+ scriptDump(pRc->m_pScriptfunc); /* Dump the funcs script */
/* Conditionally print common section notice in verbal mode */
if (configGetval(RC_VRB_VAL)) {
- nBytes = (strlen(RC_PRN_TEXT) + strlen(RC_CMN_TEXT) * 2 + 1) * sizeof (char);
+ nBytes = (strlen(RC_EVN_TEXT) + strlen(RC_CMN_TEXT) * 2 + 2) * sizeof (char);
szVerbose = malloc(nBytes);
- sprintf(szVerbose, RC_PRN_TEXT, RC_CMN_TEXT, RC_CMN_TEXT);
- scriptAppend(pBangscript, szVerbose, (strlen(szVerbose) + 1) * sizeof (char));
+ sprintf(szVerbose, RC_EVN_TEXT, RC_CMN_TEXT, RC_CMN_TEXT);
+ strcat(szVerbose, "\n");
+ fprintf(stderr, szVerbose);
free(szVerbose);
+ szVerbose = NULL;
}
- scriptDump(pBangscript); /* Dump the common script with shebang */
- scriptDump(pRc->m_pScriptcom); /* Dump the rest of the common script */
- scriptDelete(pBangscript);
+ scriptDump(pRc->m_pScriptcom); /* Dump the common script */
+
for (nSecs = 0; nSecs < nTotalsecs; nSecs++) {
- for (nRcs = 0; nRcs < pRc->m_pAnal->m_nRcs; nRcs++) {
- nTmp = 0;
- while (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs && \
- strcmp(pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
- configGetsecs()[nSecs]))
- nTmp++;
- if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs)
- ppSectmp[nRcs] = pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp];
+ for (nRcs = 0; nRcs < pRc->m_pList->m_nFiles; nRcs++) {
+ for (nTmp = 0; nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs && \
+ strcmp(pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
+ configGetsecs()[nSecs]); nTmp++);
+ if (nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs)
+ ppSectmp[nRcs] = pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp];
else
ppSectmp[nRcs] = NULL;
}
- qsort((void *)ppSectmp, (size_t)pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *), priCompare);
- nTmp = 0;
- while (nTmp < pRc->m_pAnal->m_nRcs && ppSectmp[nTmp]) {
+ qsort((void *)ppSectmp, (size_t)pRc->m_pList->m_nFiles, sizeof(rc_section_t *), priCompare);
+ for (nTmp = 0; nTmp < pRc->m_pList->m_nFiles && ppSectmp[nTmp]; nTmp++) {
/* Conditionally print each section notice in verbal mode */
if (configGetval(RC_VRB_VAL)) {
szTmp = (char *)sectionGetname(ppSectmp[nTmp]);
@@ -467,9 +509,9 @@
sprintf(szVerbose, RC_PRN_TEXT, szTmp, szTmp);
fprintf(stderr, "%s", szVerbose);
free(szVerbose);
+ szVerbose = NULL;
}
sectionDump(ppSectmp[nTmp]);
- nTmp++;
}
}
free(ppSectmp);
@@ -477,27 +519,21 @@
}
else if (configGetval(RC_PAR_VAL)) { /* Parse names */
/* Allocate a block of section pointers to use as a temporary */
- ppSectmp = calloc(pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *));
- fprintf(stderr, "file %s, section %s\n", pRc->m_ppLabvec[nRcs]->m_szName, RC_CMN_TEXT);
+ ppSectmp = calloc(pRc->m_pList->m_nFiles, sizeof(rc_section_t *));
+ fprintf(stderr, "file %s, section %s\n", pRc->m_pList->m_ppFilevec[nRcs]->m_szName, RC_CMN_TEXT);
for (nSecs = 0; nSecs < nTotalsecs; nSecs++) {
- for (nRcs = 0; nRcs < pRc->m_pAnal->m_nRcs; nRcs++) {
- nTmp = 0;
- while (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs && \
- strcmp(pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
- configGetsecs()[nSecs])) {
- nTmp++;
- }
- if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs)
- ppSectmp[nRcs] = pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp];
+ for (nRcs = 0; nRcs < pRc->m_pList->m_nFiles; nRcs++) {
+ for (nTmp = 0; nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs && \
+ strcmp(pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp]->m_szName, \
+ configGetsecs()[nSecs]); nTmp++);
+ if (nTmp < pRc->m_pList->m_ppFilevec[nRcs]->m_nSecs)
+ ppSectmp[nRcs] = pRc->m_pList->m_ppFilevec[nRcs]->m_ppSecvec[nTmp];
else
ppSectmp[nRcs] = NULL;
}
- qsort((void *)ppSectmp, (size_t)pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *), priCompare);
- nTmp = 0;
- while (nTmp < pRc->m_pAnal->m_nRcs && ppSectmp[nTmp]) {
+ qsort((void *)ppSectmp, (size_t)pRc->m_pList->m_nFiles, sizeof(rc_section_t *), priCompare);
+ for (nTmp = 0; nTmp < pRc->m_pList->m_nFiles && ppSectmp[nTmp]; nTmp++)
fprintf(stderr, "section %s\n", ppSectmp[nTmp]->m_szName);
- nTmp++;
- }
}
free(ppSectmp);
ppSectmp = NULL;
@@ -514,20 +550,26 @@
************************************************/
rc_return_t procDelete(rc_proc_t *pRc)
{
- int nRcs = pRc->m_pAnal->m_nRcs;
+ int nRcs = pRc->m_pList->m_nFiles;
- /* Destroy the label vector */
- while (nRcs-- > 0) {
- if (pRc->m_ppLabvec[nRcs]) {
- labelDelete(pRc->m_ppLabvec[nRcs]);
- pRc->m_ppLabvec[nRcs] = NULL;
- }
- }
- free(pRc->m_ppLabvec);
- pRc->m_ppLabvec = NULL;
- scriptDelete(pRc->m_pScriptcom); /* Destroy the script */
- analDelete(pRc->m_pAnal); /* Destroy the analyser */
+ scriptDelete(pRc->m_pScriptcom); /* Destroy the common script */
+ pRc->m_pScriptcom = NULL;
+ scriptDelete(pRc->m_pScriptfunc); /* Destroy the funcs script */
+ pRc->m_pScriptcom = NULL;
+
+ /* Destroy the rcfile objects */
+ while (nRcs-- > 0)
+ if (rcfileExists(pRc->m_pList->m_ppFilevec[nRcs])) {
+ rcfileDelete(pRc->m_pList->m_ppFilevec[nRcs]);
+ pRc->m_pList->m_ppFilevec[nRcs] = NULL;
+ }
+
+ free(pRc->m_pList->m_ppFilevec);
+ pRc->m_pList->m_ppFilevec = NULL;
+ listDelete(pRc->m_pList); /* Destroy the rcfile list */
+ pRc->m_pList = NULL;
free(pRc); /* Free the processor itself */
+ pRc = NULL;
return(RC_THROW(RC_OK));
}
Index: ossp-pkg/rc/rc_script.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_script.c,v
rcsdiff -q -kk '-r1.30' '-r1.31' -u '/v/ossp/cvs/ossp-pkg/rc/rc_script.c,v' 2>/dev/null
--- rc_script.c 2003/06/13 18:33:07 1.30
+++ rc_script.c 2003/06/18 14:35:29 1.31
@@ -354,7 +354,7 @@
************************************************/
rc_return_t scriptDelete(rc_script_t *pScript)
{
- assert(pScript); /* Check for a valid incoming script */
+ assert(pScript); /* Check for a valid incoming script */
if (*pScript) {
free(*pScript);
@@ -363,7 +363,7 @@
else
RC_THROW(RC_WRN_NUL);
- free(pScript);
+ free(pScript); /* Free the script itself */
pScript = NULL;
return(RC_THROW(RC_OK));
Index: ossp-pkg/rc/rc_sect.c
RCS File: /v/ossp/cvs/ossp-pkg/rc/rc_sect.c,v
rcsdiff -q -kk '-r1.13' '-r1.14' -u '/v/ossp/cvs/ossp-pkg/rc/rc_sect.c,v' 2>/dev/null
--- rc_sect.c 2003/06/13 11:50:37 1.13
+++ rc_sect.c 2003/06/18 14:35:29 1.14
@@ -69,7 +69,6 @@
pSec = (rc_section_t *)malloc(sizeof(rc_section_t));
pSec->m_nPri = pOrigsec->m_nPri;
pSec->m_nUid = pOrigsec->m_nUid;
- pSec->m_Bytes = pOrigsec->m_Bytes;
/* Deep copy of user name */
if (pOrigsec->m_szLogin) {
@@ -145,16 +144,6 @@
return(0); /* Not reached */
}
-size_t sectionGetlen(rc_section_t *pSec)
-{ /* Data length of section, length of a script body of a particular section */
- if (pSec)
- return(pSec->m_Bytes);
- else
- RC_THROW(RC_ERR_USE);
-
- return(0); /* Not reached */
-}
-
/************************************************
* sectionSetXXX(rc_section_t *) *
* Accessor methods *
@@ -204,14 +193,14 @@
rc_return_t sectionSetdata(rc_section_t *pSec, const char *kszScript)
{ /* Data of section, this is the script body of the particular section */
if (pSec) {
- pSec->m_Bytes = (strlen(kszScript) + sizeof(char)) * sizeof(char);
+ size_t nBytes = (strlen(kszScript) + sizeof(char)) * sizeof(char);
if (pSec->m_szData) { /* The section data is already in use */
free(pSec->m_szData);
- pSec->m_szData = malloc(pSec->m_Bytes);
+ pSec->m_szData = malloc(nBytes);
strcpy(pSec->m_szData, kszScript);
}
else { /* Set the data the usual way */
- pSec->m_szData = malloc(pSec->m_Bytes);
+ pSec->m_szData = malloc(nBytes);
strcpy(pSec->m_szData, kszScript);
}
return(RC_THROW(RC_OK));
@@ -223,15 +212,15 @@
rc_return_t sectionSetndata(rc_section_t *pSec, const char *kszScript, size_t Len)
{ /* Data of section, this is the script body of the particular section */
if (pSec) {
- pSec->m_Bytes = (Len + 1) * sizeof(char); /* Set size */
+ size_t nBytes = (Len + 1) * sizeof(char); /* Set size */
if (pSec->m_szData) { /* The section data is already in use */
free(pSec->m_szData);
- pSec->m_szData = malloc(pSec->m_Bytes);
+ pSec->m_szData = malloc(nBytes);
strncpy(pSec->m_szData, kszScript, Len);
*(pSec->m_szData + Len) = '\0'; /* Terminate outgoing */
}
else { /* Set the data the usual way */
- pSec->m_szData = malloc(pSec->m_Bytes);
+ pSec->m_szData = malloc(nBytes);
strncpy(pSec->m_szData, kszScript, Len);
*(pSec->m_szData + Len) = '\0'; /* Terminate outgoing */
}