Author: baggins                      Date: Tue Sep 13 22:51:53 2005 GMT
Module: nps                           Tag: HEAD
---- Log message:
- added call_command function to eliminate the use of popen
- cleane up call_iproute function

---- Files affected:
nps/poci:
   nws_poci.c (1.13 -> 1.14) 

---- Diffs:

================================================================
Index: nps/poci/nws_poci.c
diff -u nps/poci/nws_poci.c:1.13 nps/poci/nws_poci.c:1.14
--- nps/poci/nws_poci.c:1.13    Tue Sep 13 18:50:07 2005
+++ nps/poci/nws_poci.c Wed Sep 14 00:51:48 2005
@@ -444,7 +444,7 @@
                        }
                        break;
                default:
-                       return -1;
+                       return -EINVAL;
        }
        if (outbuf != NULL) {
                *outbuf = malloc(1024);
@@ -452,10 +452,9 @@
                        outbuf = NULL;
        }
        if (pipe (ippipe) == -1) {
-               fprintf(stderr, "pipe sie nie udal\n");
                if (outbuf != NULL)
                        free(*outbuf);
-               return -1;
+               return -EPIPE;
        }
        pid = fork();
        if (pid < 0) {
@@ -463,7 +462,7 @@
                        free(*outbuf);
                close(ippipe[0]);
                close(ippipe[1]);
-               return -1;
+               return -errno;
        }
        if (pid == 0) {
                close(0);
@@ -471,39 +470,115 @@
                close(2);
                open("/dev/null", O_RDONLY);    // redirect stdin to /dev/null
                dup(0);                         // stdout too
-               dup(ippipe[1]);                 // and stderr to a pipe
+               if (outbuf != NULL)
+                       dup(ippipe[1]);         // and stderr to a pipe
+               else
+                       dup(0);
                close(ippipe[0]);
                close(ippipe[1]);
                execv(program, argv);
-       } else {
-               if (outbuf != NULL) {
-                       size = 1024;
-                       freesp = 1024;
-                       tmpbuf = *outbuf;
-                       while ((i = read(ippipe[0], tmpbuf, freesp)) > 0) {
-                               freesp -= i;
-                               tmpbuf += i;
-                               if (freesp == 0) {
-                                       // unlikely
-                                       tmpbuf = realloc(*outbuf, size + 1024);
-                                       if (tmpbuf == NULL)
-                                               break;
-                                       *outbuf = tmpbuf;
-                                       tmpbuf += size;
-                                       size += 1024;
-                               }
+       }
+       if (outbuf != NULL) {
+               size = 1024;
+               freesp = 1024;
+               tmpbuf = *outbuf;
+               while ((i = read(ippipe[0], tmpbuf, freesp)) > 0) {
+                       freesp -= i;
+                       tmpbuf += i;
+                       if (freesp == 0) {
+                               // unlikely
+                               tmpbuf = realloc(*outbuf, size + 1024);
+                               if (tmpbuf == NULL)
+                                       break;
+                               *outbuf = tmpbuf;
+                               tmpbuf += size;
+                               size += 1024;
                        }
-                       *tmpbuf = '\0';
                }
-               waitpid(pid, &status, 0);
-               close(ippipe[0]);
-               close(ippipe[1]);
-               if (WIFEXITED(status))
-                       return WEXITSTATUS(status);
-               else
-                       return -1;
+               *tmpbuf = '\0';
+       }
+       waitpid(pid, &status, 0);
+       close(ippipe[0]);
+       close(ippipe[1]);
+       if (WIFEXITED(status))
+               return WEXITSTATUS(status);
+       else if (WIFSIGNALED(status))
+               return WTERMSIG(status);
+       else
+               return -ECHILD;
+}
+
+int call_command(char *program, char *args, char **outbuf)
+{
+       char *tmpbuf;
+       char *argv[16];
+       pid_t pid;
+       int status, i, size, freesp, cmdpipe[2];
+
+       i = 1;
+       argv[0] = program;
+       if (args == NULL)
+               tmpbuf = NULL;
+       else
+               tmpbuf = strtok(args, "\t ");
+       while ((tmpbuf != NULL) && (i < 16)) {
+               argv[i++] = tmpbuf;
+               tmpbuf = strtok(NULL, "\t ");
+       }
+       argv[i] = NULL;
+
+       *outbuf = malloc(1024);
+       if (*outbuf == NULL)
+               return -ENOMEM;
+
+       if (pipe(cmdpipe) == -1) {
+               free(*outbuf);
+               return -EPIPE;
+       }
+       pid = fork();
+       if (pid < 0) {
+               free(*outbuf);
+               close(cmdpipe[0]);
+               close(cmdpipe[1]);
+               return -errno;
+       }
+       if (pid == 0) {
+               close(0);
+               close(1);
+               close(2);
+               open("/dev/null", O_RDONLY);    // redirect stdin to /dev/null
+               dup(cmdpipe[1]);                // stdout
+               dup(cmdpipe[1]);                // and stderr to a pipe
+               close(cmdpipe[0]);
+               close(cmdpipe[1]);
+               execv(program, argv);
+       }
+       size = 1024;
+       freesp = 1024;
+       tmpbuf = *outbuf;
+       while ((i = read(cmdpipe[0], tmpbuf, freesp)) > 0) {
+               freesp -= i;
+               tmpbuf += i;
+               if (freesp == 0) {
+                       // unlikely
+                       tmpbuf = realloc(*outbuf, size + 1024);
+                       if (tmpbuf == NULL)
+                               break;
+                       *outbuf = tmpbuf;
+                       tmpbuf += size;
+                       size += 1024;
+               }
        }
-       return 0;
+       *tmpbuf = '\0';
+       waitpid(pid, &status, 0);
+       close(cmdpipe[0]);
+       close(cmdpipe[1]);
+       if (WIFEXITED(status))
+               return WEXITSTATUS(status);
+       else if (WIFSIGNALED(status))
+               return WTERMSIG(status);
+       else
+               return -ECHILD;
 }
 
 /*
@@ -1253,25 +1328,23 @@
 **********************************************************************/
 void orderly_shutdown(char *outBuf)
 {
-    FILE *fpin;
     int val;
-    char buf[BUFSIZE], errMsg[BUFSIZE];
+    char buf[BUFSIZE];
+    char *errbuf;
 
     printStart(outBuf);  //print the XML header return message
-    if( (fpin = popen("/sbin/shutdown -h now 2>&1","r")) == NULL) {
+
+    val = call_command("/sbin/shutdown", "-h now", &errbuf);
+    if (val < 0) {
         snprintf(buf,BUFSIZE,
             "<error>Unable to open pipe to shutdown command</error>");
         syslog(LOG_CRIT, buf);
         strncat(outBuf, buf, AVAIL(outBuf));
-        val = -EPIPE;
-    } else {
-        fgets(errMsg, BUFSIZE, fpin);
-        val = pclose(fpin);
-        if(val != 0) {  // an error in shuting down
-            snprintf(buf, BUFSIZE, "<error>%s</error>",errMsg);
-            strncat(outBuf, errMsg, AVAIL(outBuf));
-        }
+    } else if (val > 0) { // an error in shuting down
+        snprintf(buf, BUFSIZE, "<error>%s</error>",errbuf);
+        strncat(outBuf, buf, AVAIL(outBuf));
     }
+
     snprintf(buf,BUFSIZE,"<cmdRetVal>%d</cmdRetVal>",val);
     strncat(outBuf, buf, AVAIL(outBuf));
     printEnd(outBuf);
@@ -1288,24 +1361,20 @@
 **********************************************************************/
 void forced_shutdown(char *outBuf)
 {
-    FILE *fpin;
     int val;
-    char buf[BUFSIZE], errMsg[BUFSIZE];
+    char buf[BUFSIZE];
+    char *errbuf;
 
     printStart(outBuf);  //print the XML header return message
-    if( (fpin = popen("/sbin/init 0 2>&1","r")) == NULL) {
-        snprintf(buf,BUFSIZE, 
+    val = call_command("/sbin/init", "0", &errbuf);
+    if (val < 0) {
+        snprintf(buf,BUFSIZE,
             "<error>Unable to open pipe to shutdown command</error>");
         syslog(LOG_CRIT, buf);
         strncat(outBuf, buf, AVAIL(outBuf));
-        val = -EPIPE;
-    } else {
-        fgets(errMsg, BUFSIZE, fpin);
-        val = pclose(fpin);
-        if(val != 0) {  // an error in shuting down
-            snprintf(buf, BUFSIZE, "<error>%s</error>",errMsg);
-            strncat(outBuf, errMsg, AVAIL(outBuf));
-        }
+    } else if (val > 0) { // an error in shuting down
+        snprintf(buf, BUFSIZE, "<error>%s</error>",errbuf);
+        strncat(outBuf, buf, AVAIL(outBuf));
     }
     snprintf(buf,BUFSIZE,"<cmdRetVal>%d</cmdRetVal>",val);
     strncat(outBuf, buf, AVAIL(outBuf));
@@ -1323,24 +1392,20 @@
 **********************************************************************/
 void reboot(char *outBuf)
 {
-    FILE *fpin;
     int val;
-    char buf[BUFSIZE], errMsg[BUFSIZE];
+    char buf[BUFSIZE];
+    char *errbuf;
 
     printStart(outBuf);  //print the XML header return message
-    if( (fpin = popen("/sbin/reboot 2>&1","r")) == NULL) {
-        snprintf(buf,BUFSIZE, 
+    val = call_command("/sbin/reboot", NULL, &errbuf);
+    if (val < 0) {
+        snprintf(buf,BUFSIZE,
             "<error>Unable to open pipe to shutdown command</error>");
         syslog(LOG_CRIT, buf);
-        strncat(outBuf, buf, AVAIL(buf));
-        val = -EPIPE;
-    } else {
-        fgets(errMsg, BUFSIZE, fpin);
-        val = pclose(fpin);
-        if(val != 0) {  // an error in shuting down
-            snprintf(buf, BUFSIZE, "<error>%s</error>",errMsg);
-            strncat(outBuf, errMsg, AVAIL(outBuf));
-        }
+        strncat(outBuf, buf, AVAIL(outBuf));
+    } else if (val > 0) { // an error in shuting down
+        snprintf(buf, BUFSIZE, "<error>%s</error>",errbuf);
+        strncat(outBuf, buf, AVAIL(outBuf));
     }
     snprintf(buf,BUFSIZE,"<cmdRetVal>%d</cmdRetVal>",val);
     strncat(outBuf, buf, AVAIL(outBuf));
@@ -1358,24 +1423,20 @@
 **********************************************************************/
 void forced_reboot(char *outBuf)
 {
-    FILE *fpin;
     int val;
-    char buf[BUFSIZE], errMsg[BUFSIZE];
+    char buf[BUFSIZE];
+    char *errbuf;
 
     printStart(outBuf);  //print the XML header return message
-    if( (fpin = popen("/sbin/reboot -f 2>&1","r")) == NULL) {
+    val = call_command("/sbin/reboot", "-f", &errbuf);
+    if (val < 0) {
         snprintf(buf,BUFSIZE,
             "<error>Unable to open pipe to shutdown command</error>");
         syslog(LOG_CRIT, buf);
         strncat(outBuf, buf, AVAIL(outBuf));
-        val = -EPIPE;
-    } else {
-        fgets(buf, BUFSIZE, fpin);
-        val = pclose(fpin);
-        if(val != 0) {  // an error in shuting down
-            snprintf(buf, BUFSIZE, "<error>%s</error>",errMsg);
-            strncat(outBuf, errMsg, AVAIL(outBuf));
-        }
+    } else if (val > 0) { // an error in shuting down
+        snprintf(buf, BUFSIZE, "<error>%s</error>",errbuf);
+        strncat(outBuf, buf, AVAIL(outBuf));
     }
     snprintf(buf,BUFSIZE,"<cmdRetVal>%d</cmdRetVal>",val);
     strncat(outBuf, buf, AVAIL(outBuf));
@@ -1480,8 +1541,11 @@
     snprintf(command,BUFSIZE,"<cmdRetVal>%d</cmdRetVal>\n",val);
     strncat(outBuf, command, AVAIL(outBuf));
 
-    if (val != 0) {
-        printLog(outBuf, errbuf); //print the XML error log for return msg
+    if (errbuf != NULL) {
+       if (val != 0) {
+           printLog(outBuf, errbuf); //print the XML error log for return msg
+       }
+       free(errbuf);
     }
     printEnd(outBuf);   //print the XML trailer for return message
     return;
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/nps/poci/nws_poci.c?r1=1.13&r2=1.14&f=u

_______________________________________________
pld-cvs-commit mailing list
pld-cvs-commit@lists.pld-linux.org
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to