X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fpopen.c;h=94ad583f78770dfac294e5ee3b91376c0b2b3fc4;hb=2ab4d8fc278413b01ff9c4e4496f892398f80a4c;hp=d4151e6142338c01933edb69548e987b2b79ed3d;hpb=de5650f28e4e43a7264913953f95a75d8afe23f0;p=nagiosplug.git diff --git a/plugins/popen.c b/plugins/popen.c index d4151e6..94ad583 100644 --- a/plugins/popen.c +++ b/plugins/popen.c @@ -16,10 +16,11 @@ int spclose(FILE *); * path passed to the exec'd program are esstially empty. (popen create a shell * and passes the environment to it). * + * $Id$ + * ******************************************************************************/ -#include -#include +#include "common.h" /* extern so plugin has pid to kill exec'd process on timeouts */ extern int timeout_interval; @@ -57,9 +58,11 @@ RETSIGTYPE popen_timeout_alarm_handler (int); #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) int open_max (void); /* {Prog openmax} */ -void err_sys (const char *, ...); +static void err_sys (const char *, ...) __attribute__((noreturn,format(printf, 1, 2))); char *rtrim (char *, const char *); +char *pname = NULL; /* caller can set this from argv[0] */ + /*int *childerr = NULL;*//* ptr to array allocated at run-time */ /*extern pid_t *childpid = NULL; *//* ptr to array allocated at run-time */ static int maxfd; /* from our open_max(), {Prog openmax} */ @@ -67,7 +70,7 @@ static int maxfd; /* from our open_max(), {Prog openmax} */ FILE * spopen (const char *cmdstring) { - char *environ[] = { NULL }; + char *env[2]; char *cmd = NULL; char **argv = NULL; char *str; @@ -84,6 +87,9 @@ spopen (const char *cmdstring) setrlimit (RLIMIT_CORE, &limit); #endif + env[0] = strdup("LC_ALL=C"); + env[1] = '\0'; + /* if no command was passed, return with no error */ if (cmdstring == NULL) return (NULL); @@ -106,6 +112,7 @@ spopen (const char *cmdstring) /* there cannot be more args than characters */ argc = strlen (cmdstring) + 1; /* add 1 for NULL termination */ argv = malloc (sizeof(char*)*argc); + if (argv == NULL) { printf ("Could not malloc argv array in popen()\n"); return NULL; @@ -117,7 +124,7 @@ spopen (const char *cmdstring) str += strspn (str, " \t\r\n"); /* trim any leading whitespace */ if (i >= argc - 2) { - printf ("You've got a big problem buddy! You need more args!!!\n"); + printf ("CRITICAL - You need more args!!!\n"); return (NULL); } @@ -148,13 +155,13 @@ spopen (const char *cmdstring) if (childpid == NULL) { /* first time through */ maxfd = open_max (); /* allocate zeroed out array for child pids */ - if ((childpid = calloc (maxfd, sizeof (pid_t))) == NULL) + if ((childpid = calloc ((size_t)maxfd, sizeof (pid_t))) == NULL) return (NULL); } if (child_stderr_array == NULL) { /* first time through */ maxfd = open_max (); /* allocate zeroed out array for child pids */ - if ((child_stderr_array = calloc (maxfd, sizeof (int))) == NULL) + if ((child_stderr_array = calloc ((size_t)maxfd, sizeof (int))) == NULL) return (NULL); } @@ -182,7 +189,7 @@ spopen (const char *cmdstring) if (childpid[i] > 0) close (i); - execve (argv[0], argv, environ); + execve (argv[0], argv, env); _exit (0); } @@ -199,7 +206,7 @@ spopen (const char *cmdstring) int spclose (FILE * fp) { - int fd, stat; + int fd, status; pid_t pid; if (childpid == NULL) @@ -213,12 +220,12 @@ spclose (FILE * fp) if (fclose (fp) == EOF) return (1); - while (waitpid (pid, &stat, 0) < 0) + while (waitpid (pid, &status, 0) < 0) if (errno != EINTR) return (1); /* error other than EINTR from waitpid() */ - if (WIFEXITED (stat)) - return (WEXITSTATUS (stat)); /* return child's termination status */ + if (WIFEXITED (status)) + return (WEXITSTATUS (status)); /* return child's termination status */ return (1); } @@ -259,34 +266,22 @@ open_max (void) } -static void err_doit (int, const char *, va_list); - -char *pname = NULL; /* caller can set this from argv[0] */ /* Fatal error related to a system call. - * Print a message and terminate. */ - -void -err_sys (const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - err_doit (1, fmt, ap); - va_end (ap); - exit (1); -} - -/* Print a message and return to caller. - * Caller specifies "errnoflag". */ + * Print a message and die. */ #define MAXLINE 2048 static void -err_doit (int errnoflag, const char *fmt, va_list ap) +err_sys (const char *fmt, ...) { + int errnoflag = 1; int errno_save; char buf[MAXLINE]; + va_list ap; + + va_start (ap, fmt); + /* err_doit (1, fmt, ap); */ errno_save = errno; /* value caller might want printed */ vsprintf (buf, fmt, ap); if (errnoflag) @@ -295,7 +290,8 @@ err_doit (int errnoflag, const char *fmt, va_list ap) fflush (stdout); /* in case stdout and stderr are the same */ fputs (buf, stderr); fflush (NULL); /* flushes all stdio output streams */ - return; + va_end (ap); + exit (1); } char * @@ -313,3 +309,4 @@ rtrim (char *str, const char *tok) } return str; } +