X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fpopen.c;h=062cf274a476fe8a775c2c562c777747a046f9f3;hb=9ea5f808f64b044e76473795cd80c11edbf3eb17;hp=cde3c7647465ca26e7effd9cae8617a27bf86780;hpb=44a321cb8a42d6c0ea2d96a1086a17f2134c89cc;p=nagiosplug.git diff --git a/plugins/popen.c b/plugins/popen.c index cde3c76..062cf27 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,8 +112,9 @@ 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"); + 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,28 +206,28 @@ spopen (const char *cmdstring) int spclose (FILE * fp) { - int fd, stat; + int fd, status; pid_t pid; if (childpid == NULL) - return (-1); /* popen() has never been called */ + return (1); /* popen() has never been called */ fd = fileno (fp); if ((pid = childpid[fd]) == 0) - return (-1); /* fp wasn't opened by popen() */ + return (1); /* fp wasn't opened by popen() */ childpid[fd] = 0; if (fclose (fp) == EOF) - return (-1); + 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() */ + 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 (STATE_UNKNOWN); + return (1); } #ifdef OPEN_MAX @@ -232,17 +239,23 @@ static int openmax = 0; #define OPEN_MAX_GUESS 256 /* if OPEN_MAX is indeterminate */ /* no guarantee this is adequate */ + void popen_timeout_alarm_handler (int signo) { + int fh; if (signo == SIGALRM) { - kill (childpid[fileno (child_process)], SIGKILL); - printf ("CRITICAL - Plugin timed out after %d seconds\n", + fh=fileno (child_process); + if(fh >= 0){ + kill (childpid[fh], SIGKILL); + } + printf (_("CRITICAL - Plugin timed out after %d seconds\n"), timeout_interval); exit (STATE_CRITICAL); } } + int open_max (void) { @@ -252,41 +265,28 @@ open_max (void) if (errno == 0) openmax = OPEN_MAX_GUESS; /* it's indeterminate */ else - err_sys ("sysconf error for _SC_OPEN_MAX"); + err_sys (_("sysconf error for _SC_OPEN_MAX")); } } return (openmax); } -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,15 +295,17 @@ 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 * rtrim (char *str, const char *tok) { int i = 0; + int j = sizeof (str); - while (str != NULL) { + while (str != NULL && i < j) { if (*(str + i) == *tok) { sprintf (str + i, "%s", "\0"); return str;