Author: baggins                      Date: Tue Sep 13 16:45:39 2005 GMT
Module: nps                           Tag: HEAD
---- Log message:
- switched all calls to iproute2 from system(3) to fork/exec
- fixed memory allocation logic in call_iproute2

---- Files affected:
nps/poci:
   nws_poci.c (1.11 -> 1.12) 

---- Diffs:

================================================================
Index: nps/poci/nws_poci.c
diff -u nps/poci/nws_poci.c:1.11 nps/poci/nws_poci.c:1.12
--- nps/poci/nws_poci.c:1.11    Tue Sep 13 18:05:57 2005
+++ nps/poci/nws_poci.c Tue Sep 13 18:45:33 2005
@@ -373,26 +373,11 @@
 Purpose:    To output the contents of the error log to the user through
 the socket.
 **********************************************/
-void printLog(char *outBuf, char *logFileName) {
-    FILE *outFile;
-    char buf[BUFSIZE];
-
+void printLog(char *outBuf, char *errlog)
+{
     strncat(outBuf, "<error>", AVAIL(outBuf));
-
-    if((outFile=fopen(logFileName,"r"))!=NULL) {
-        while(!feof(outFile)) {
-            if( fscanf(outFile,"%255s",buf) != 1) {
-                break;
-            }
-            strncat(outBuf, buf, AVAIL(outBuf));
-            strncat(outBuf, " ", AVAIL(outBuf));
-
-        }
-        fclose(outFile);
-        if( remove(logFileName) != 0) {
-            syslog(LOG_INFO, "unable to remove log file\n");
-        }
-    }
+    if (errlog != NULL)
+       strncat(outBuf, errlog, AVAIL(outBuf));
     strncat(outBuf, "</error> ", AVAIL(outBuf));
 
     return;
@@ -404,7 +389,7 @@
        char *argv[16];
        char ip_pref[32];
        pid_t pid;
-       int status, i, size, ippipe[2];
+       int status, i, size, freesp, ippipe[2];
        static char program[] = "/sbin/ip";
        static char comm_addr[] = "address";
        static char comm_show[] = "show";
@@ -463,7 +448,7 @@
        if (outbuf != NULL) {
                *outbuf = malloc(1024);
                if (*outbuf == NULL)
-                       return -1;
+                       outbuf = NULL;
        }
        if (pipe (ippipe) == -1) {
                fprintf(stderr, "pipe sie nie udal\n");
@@ -492,15 +477,18 @@
        } else {
                if (outbuf != NULL) {
                        size = 1024;
+                       freesp = 1024;
                        tmpbuf = *outbuf;
-                       while ((i = read(ippipe[0], tmpbuf, size/2)) > 0) {
+                       while ((i = read(ippipe[0], tmpbuf, freesp)) > 0) {
+                               freesp -= i;
                                tmpbuf += i;
-                               if ((tmpbuf - *outbuf) == size) {
+                               if (freesp == 0) {
                                        // unlikely
-                                       *outbuf = realloc(*outbuf, size + 1024);
-                                       if (*outbuf == NULL)
+                                       tmpbuf = realloc(*outbuf, size + 1024);
+                                       if (tmpbuf == NULL)
                                                break;
-                                       tmpbuf = *outbuf + size;
+                                       *outbuf = tmpbuf;
+                                       tmpbuf += size;
                                        size += 1024;
                                }
                        }
@@ -1033,7 +1021,6 @@
     char pl_addr[16], sp_addr[16];
     unsigned long platIp, spIp;
     char *drivername = JNET_DRIVERNAME;
-    char command[BUFSIZE]; 
     char errMsg[BUFSIZE];
 
     //now call jnet, and tell it.
@@ -1063,10 +1050,10 @@
     sp_ip.s_addr = ntohl(spIp);
     strncpy(pl_addr, inet_ntoa(pl_ip), 16);
     strncpy(sp_addr, inet_ntoa(sp_ip), 16);
-    snprintf(command,BUFSIZE,"/sbin/ip address flush jnet0 ; /sbin/ip address 
add %s peer %s dev jnet0", pl_addr, sp_addr);
-fprintf(stderr, "%s\n", command);
     // we can ignore exit status of 'ip address flush jnet0'
+    // /sbin/ip address flush jnet0
     call_iproute2(IP_A_FLUSH, "jnet0", NULL, NULL, -1, NULL);
+    // /sbin/ip address add 'pl_addr' peer 'sp_addr' dev jnet0
     rc = call_iproute2(IP_A_ADD, "jnet0", pl_addr, sp_addr, -1, NULL);
 
     if(rc != 0) {
@@ -1413,6 +1400,7 @@
     char tokensep[] =" \t,";
     char command[BUFSIZE];
     char logFileName[BUFSIZE] = ERROR_FILE_TEMPLATE;
+    char *errbuf;
 
     printStart(outBuf);  //print the XML header return message
     //initialize params
@@ -1461,39 +1449,38 @@
     //the appropriate fields
     switch(i) {
     case 2:
-       snprintf(command,BUFSIZE,
-                       "/sbin/ip address add %s dev %s 2>%s",
-                       param[2],param[1], logFileName);
-fprintf(stderr, "2: %s\n", command);
-        break;
+           cleanse(param[1]);
+           cleanse(param[2]);
+           // /sbin/ip address add 'param[2]' dev 'param[1]' 2>%s
+           val = call_iproute2(IP_A_ADD, param[1], param[2], NULL, -1, 
&errbuf);
+           break;
     case 3:
-       pref = netmask_to_prefix(param[3]);
-       snprintf(command,BUFSIZE,
-                       "/sbin/ip address add %s/%d dev %s 2>%s",
-                       param[2],pref,param[1], logFileName);
-fprintf(stderr, "3: %s\n", command);
+           cleanse(param[1]);
+           cleanse(param[2]);
+           cleanse(param[3]);
+           pref = netmask_to_prefix(param[3]);
+           // /sbin/ip address add 'param[2]/pref' dev 'param[1]' 2>%s",
+           val = call_iproute2(IP_A_ADD, param[1], param[2], NULL, pref, 
&errbuf);
         break;
     case 4:
-       pref = netmask_to_prefix(param[3]);
-       snprintf(command,BUFSIZE,
-                       "/sbin/ip address add %s/%d dev %s 2>%s",
-                       param[2],pref,param[1], logFileName);
-fprintf(stderr, "4: %s\n", command);
+           cleanse(param[1]);
+           cleanse(param[2]);
+           cleanse(param[3]);
+           pref = netmask_to_prefix(param[3]);
+           // /sbin/ip address add 'param[2],pref' dev 'param[1]' 2>%s",
+           val = call_iproute2(IP_A_ADD, param[1], param[2], NULL, pref, 
&errbuf);
         break;
     default:
-       snprintf(command,BUFSIZE,
-                       "/sbin/ip address show %s 2>%s",
-                       param[0], logFileName);
-fprintf(stderr, "def: %s\n", command);
+           cleanse(param[0]);
+           // /sbin/ip address show 'param[0]' 2>%s
+           val = call_iproute2(IP_A_SHOW, param[0], NULL, NULL, -1, &errbuf);
         break;
     }
-    cleanse(command);   //remove non alpha-numeric text
-    val=system(command);  //now execute the command
     snprintf(command,BUFSIZE,"<cmdRetVal>%d</cmdRetVal>\n",val);
     strncat(outBuf, command, AVAIL(outBuf));
 
-    if(val != 0) {
-        printLog(outBuf, logFileName); //print the XML error log for return msg
+    if (val != 0) {
+        printLog(outBuf, errbuf); //print the XML error log for return msg
     }
     printEnd(outBuf);   //print the XML trailer for return message
     return;
@@ -1787,7 +1774,7 @@
     unsigned char *platIp, *spIp;
     char command[BUFSIZE], errMsg[BUFSIZE];
     int jnetChanged = FALSE;
-    int fd, fd1;
+    int fd, fd1, rc;
     uint32_t pip;
     struct in_addr inp;
 
@@ -1848,11 +1835,11 @@
        close(fd1);
 
         //now bring restart the network at this new address.
-       snprintf(command,BUFSIZE,"/sbin/ip address flush jnet0 ;"
-                                "/sbin/ip address add %s peer %s dev jnet0",
-                                platIp, spIp);
-fprintf(stderr, "set: %s\n", command);
-        if( system(command) != 0) {
+       //      /sbin/ip address flush jnet0
+       call_iproute2(IP_A_FLUSH, "jnet0", NULL, NULL, -1, NULL);
+       //      /sbin/ip address add 'platIp' peer 'spIp' dev jnet0
+       rc = call_iproute2(IP_A_ADD, "jnet0", platIp, spIp, -1, NULL);
+        if(rc != 0) {
             syslog(LOG_CRIT, "Jnet set ip failed\n");
             //Even though the change may have failed, we will return
             //that it succeeded so the parent loop will re-establish
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/nps/poci/nws_poci.c?r1=1.11&r2=1.12&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