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