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