Code

Fixed problem with popen.c not parsing --longopt='foo bar' correctly (Daniel Bimschas...
[nagiosplug.git] / plugins / popen.c
index 5da12a02fb46a22d7af22bc7fabe9adddc41e7ce..a7e6f9b2f238c202297c95256f5287f530e47059 100644 (file)
@@ -1,13 +1,21 @@
-/******************************************************************************
- * popen.c
+/****************************************************************************
+ *
+ * Nagios plugins popen
+ *
+ * License: GPL
+ * Copyright (c) 2005 nagios-plugins team
+ *
+ * Last Modified: $Date$
+ *
+ * Description:
  *
  * A safe alternative to popen
  * 
  * Provides spopen and spclose
-
-FILE * spopen(const char *);
-int spclose(FILE *);
-
+ *
+ * FILE * spopen(const char *);
+ * int spclose(FILE *);
+ *
  *
  * Code taken with liitle modification from "Advanced Programming for the Unix
  * Environment" by W. Richard Stevens
@@ -16,6 +24,22 @@ int spclose(FILE *);
  * path passed to the exec'd program are esstially empty. (popen create a shell
  * and passes the environment to it).
  *
+ * License Information:
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
+ *
  * $Id$
  *
  ******************************************************************************/
@@ -80,7 +104,7 @@ spopen (const char *cmdstring)
        char *env[2];
        char *cmd = NULL;
        char **argv = NULL;
-       char *str;
+       char *str, *tmp;
        int argc;
 
        int i = 0, pfd[2], pfderr[2];
@@ -121,7 +145,7 @@ spopen (const char *cmdstring)
        argv = malloc (sizeof(char*)*argc);
        
        if (argv == NULL) {
-               printf (_("Could not malloc argv array in popen()\n"));
+               printf ("%s\n", _("Could not malloc argv array in popen()"));
                return NULL;
        }
 
@@ -131,7 +155,7 @@ spopen (const char *cmdstring)
                str += strspn (str, " \t\r\n"); /* trim any leading whitespace */
 
                if (i >= argc - 2) {
-                       printf (_("CRITICAL - You need more args!!!\n"));
+                       printf ("%s\n",_("CRITICAL - You need more args!!!"));
                        return (NULL);
                }
 
@@ -142,7 +166,15 @@ spopen (const char *cmdstring)
                        cmd = 1 + strstr (str, "'");
                        str[strcspn (str, "'")] = 0;
                }
-               else {
+               else if (strcspn(str,"'") < strcspn (str, " \t\r\n")) {
+                                                                               /* handle --option='foo bar' strings */
+                       tmp = str + strcspn(str, "'") + 1; 
+                       if (!strstr (tmp, "'"))
+                               return NULL;                                            /* balanced? */
+                       tmp += strcspn(tmp,"'") + 1;
+                       *tmp = 0;
+                       cmd = tmp + 1;
+               } else {
                        if (strpbrk (str, " \t\r\n")) {
                                cmd = 1 + strpbrk (str, " \t\r\n");
                                str[strcspn (str, " \t\r\n")] = 0;
@@ -156,6 +188,7 @@ spopen (const char *cmdstring)
                        cmd = NULL;
 
                argv[i++] = str;
+               printf("arg no.%i: %s\n",i,str);
 
        }
        argv[i] = NULL;
@@ -278,7 +311,7 @@ popen_timeout_alarm_handler (int signo)
                        printf (_("CRITICAL - Plugin timed out after %d seconds\n"),
                                                timeout_interval);
                } else {
-                       printf (_("CRITICAL - popen timeout received, but no child process\n"));
+                       printf ("%s\n", _("CRITICAL - popen timeout received, but no child process"));
                }
                exit (STATE_CRITICAL);
        }