OSSP CVS Repository

ossp - Check-in [3355]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 3355
Date: 2003-May-20 19:14:17 (local)
2003-May-20 17:14:17 (UTC)
User:ms
Branch:
Comment: Put priority scheduling back in, safeguard priCompare logic against invalid parameters, generally complete the print mode and exec mode processor operations for milestone one.
Tickets:
Inspections:
Files:
ossp-pkg/rc/rc_proc.c      1.27 -> 1.28     56 inserted, 28 deleted
ossp-pkg/rc/rc_util.c      1.7 -> 1.8     14 inserted, 2 deleted

ossp-pkg/rc/rc_proc.c 1.27 -> 1.28

--- rc_proc.c    2003/05/20 15:06:42     1.27
+++ rc_proc.c    2003/05/20 17:14:17     1.28
@@ -194,15 +194,13 @@
 ************************************************/
 rc_return_t procRun(rc_proc_t *pRc)
 {
-    int   nTmp  = 0;
-    int   nRcs  = 0;
-    int   nSecs = 0;
-    char *pszVec[RC_EXEC_MAXARGS];
-
-    /* Conditionally sort the section vector according to explicit priority
-    if (!strcmp(configGetrcfile(), RC_GLOB_WILD)) {
-        qsort((void *)pRc->m_ppSectvec, (size_t)nTotsecs, sizeof (rc_section_t *), priCompare);
-    } */
+    int   nTmp   = 0;               /* Generic index */
+    int   nRcs   = 0;               /* Rc index      */
+    int   nSecs  = 0;               /* Section index */
+    char *szTmp  = NULL;            /* Generic temporary string      */
+    char *szExec = NULL;            /* Used only during exec mode    */
+    char *pszVec[RC_EXEC_MAXARGS];  /* For passing in to execv(3)    */
+    rc_section_t **ppSectmp = NULL; /* Used with priority scheduling */
 
     /****************************************************/
     /* This will execute, evaluate, or print the script */
@@ -213,33 +211,52 @@
     if (configGetval(RC_EVL_VAL))                               /* Evaluate */
         fprintf(stderr, "Error: Evaluate is not implemented yet.\n"); /* FIX */
     else if (configGetval(RC_EXC_VAL)) {                        /* Execute  */
-        pszVec[0] = "/bin/sh";
-        pszVec[1] = "-c";
-        pszVec[2] = (char *)scriptTostring(pRc->m_pScriptcom);
-        pszVec[3] = NULL;   /* Add a NULL to mark the end of the chain */
-        if (execvp(*pszVec, pszVec) == -1) {                    /* launch */
-            TRACE("Bad, execvp for common script in child returned -1");
-            return(RC_THROW(RC_ERR_INT));
-        }
-        for (nSecs = 0; nSecs < pRc->m_pAnal->m_nSecs; nSecs++)
+        /* Allocate a block of section pointers to use as a temporary */
+        ppSectmp = calloc(pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *));
+        /* Allocate the command chain string to execute with execv(3) */
+        szTmp = (char *)scriptTostring(pRc->m_pScriptcom);
+        szExec = malloc((strlen(szTmp) + 1) * sizeof(char));
+        strcpy(szExec, szTmp);
+        for (nSecs = 0; nSecs < pRc->m_pAnal->m_nSecs; 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, \
                                 pRc->m_pAnal->m_pszSecs[nSecs]))
                     nTmp++;
-                if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs) {
-                    pszVec[2] = (char *)sectionGetdata(pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp]);
-                    if (execvp(*pszVec, pszVec) == -1) {        /* launch */
-                        TRACE("Bad, execvp for subsection in child returned -1");
-                        return(RC_THROW(RC_ERR_INT));
-                    }
-                }
+                if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs)
+                    ppSectmp[nRcs] = pRc->m_ppLabvec[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]) {
+                szTmp = (char *)sectionGetdata(ppSectmp[nTmp]);
+                szExec = realloc(szExec, (strlen(szExec) + 1) * sizeof(char) + \
+                                         (strlen(szTmp) + 1) * sizeof(char));
+                strcat(szExec, szTmp); /* Build onto the command chain */
+                nTmp++;
+            }
+        }
+        free(ppSectmp);
+        ppSectmp = NULL;
+
+        /* Actually launch the new process image now */
+        pszVec[0] = "/bin/sh";
+        pszVec[1] = "-c";
+        pszVec[2] = szExec;
+        pszVec[3] = NULL;   /* Add a NULL to mark the end of the chain */
+        if (execvp(*pszVec, pszVec) == -1) {                    /* launch */
+            TRACE("Bad, execvp for common script in child returned -1");
+            return(RC_THROW(RC_ERR_INT));
+        }
     }
     else if (configGetval(RC_PRN_VAL)) {                        /* Print  */
-        scriptDump(pRc->m_pScriptcom);
-        for (nSecs = 0; nSecs < pRc->m_pAnal->m_nSecs; nSecs++)
+        /* Allocate a block of section pointers to use as a temporary */
+        ppSectmp = calloc(pRc->m_pAnal->m_nRcs, sizeof(rc_section_t *));
+        scriptDump(pRc->m_pScriptcom); /* Dump the common script */
+        for (nSecs = 0; nSecs < pRc->m_pAnal->m_nSecs; nSecs++) {
             for (nRcs = 0; nRcs < pRc->m_pAnal->m_nRcs; nRcs++) {
                 nTmp = 0;
                 while (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs && \
@@ -247,8 +264,19 @@
                                 pRc->m_pAnal->m_pszSecs[nSecs]))
                     nTmp++;
                 if (nTmp < pRc->m_ppLabvec[nRcs]->m_nSecs)
-                    sectionDump(pRc->m_ppLabvec[nRcs]->m_ppSecvec[nTmp]);
+                    ppSectmp[nRcs] = pRc->m_ppLabvec[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]) {
+                sectionDump(ppSectmp[nTmp]);
+                nTmp++;
+            }
+        }
+        free(ppSectmp);
+        ppSectmp = NULL;
     }
     else /* Something is wrong here */
         return(RC_THROW(RC_ERR_INT));


ossp-pkg/rc/rc_util.c 1.7 -> 1.8

--- rc_util.c    2003/05/15 22:22:30     1.7
+++ rc_util.c    2003/05/20 17:14:17     1.8
@@ -109,8 +109,20 @@
 /* Section priority compare, to use with qsort(3) */
 int priCompare(const void *pkv1, const void *pkv2)
 {
-    int nOne = ((rc_section_t *)pkv1)->m_nPri;
-    int nTwo = ((rc_section_t *)pkv2)->m_nPri;
+    int nOne = 0;
+    int nTwo = 0;
+
+    if (pkv1) {
+        nOne = ((rc_section_t *)pkv1)->m_nPri;
+        if (pkv2)
+            nTwo = ((rc_section_t *)pkv2)->m_nPri;
+        else
+            return (-1);
+    }
+    else if (pkv2)
+        return (1);
+    else
+        return (0);
 
     if (nOne)
         if (nTwo)

CVSTrac 2.0.1