it seems that strcasecmp and strcasencmp have issues on windows replace
[rrdtool.git] / src / rrd_cgi.c
index b535541..1ffe8fd 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.3.2  Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.4.3  Copyright by Tobi Oetiker, 1997-2010
  *****************************************************************************
  * rrd_cgi.c  RRD Web Page Generator
  *****************************************************************************/
@@ -9,6 +9,11 @@
 #include <stdlib.h>
 #endif
 
+#ifdef WIN32
+   #define strcasecmp stricmp
+   #define strcasencmp strnicmp
+#endif
+
 #define MEMBLK 1024
 /*#define DEBUG_PARSER
 #define DEBUG_VARS*/
@@ -374,6 +379,7 @@ static void calfree(
         if (calcpr) {
             free(calcpr);
         }
+        calcpr = NULL;
     }
 }
 
@@ -953,7 +959,6 @@ char     *drawgraph(
                         DS_NAM_SIZE) * sizeof(char));
             sprintf(err, "[ERROR: %s]", rrd_get_error());
             rrd_clear_error();
-            calfree();
             return err;
         }
     }
@@ -988,7 +993,10 @@ char     *printtimelast(
         if (buf == NULL) {
             return stralloc("[ERROR: allocating strftime buffer]");
         };
-        last = rrd_last(argc + 1, (char **) args - 1);
+        /* not raising argc in step with args - 1 since the last argument
+           will be used below for strftime  */
+
+        last = rrd_last(argc, (char **) args - 1);
         if (rrd_test_error()) {
             char     *err =
                 malloc((strlen(rrd_get_error()) +
@@ -1001,10 +1009,7 @@ char     *printtimelast(
         strftime(buf, 254, args[1], &tm_last);
         return buf;
     }
-    if (argc < 2) {
-        return stralloc("[ERROR: too few arguments for RRD::TIME::LAST]");
-    }
-    return stralloc("[ERROR: not enough arguments for RRD::TIME::LAST]");
+    return stralloc("[ERROR: expected <RRD::TIME::LAST file.rrd strftime-format>]");
 }
 
 char     *printtimenow(
@@ -1053,7 +1058,7 @@ char     *scanargs(
     int       curarg_contains_rrd_directives;
 
     /* local array of arguments while parsing */
-    int       argc = 0;
+    int       argc = 1;
     char    **argv;
 
 #ifdef DEBUG_PARSER
@@ -1069,6 +1074,7 @@ char     *scanargs(
     if (!argv) {
         return NULL;
     }
+    argv[0] = "rrdcgi";
 
     /* skip leading blanks */
     while (isspace((int) *line)) {
@@ -1172,7 +1178,7 @@ char     *scanargs(
         argv[argc - 1] = rrd_expand_vars(stralloc(argv[argc - 1]));
     }
 #ifdef DEBUG_PARSER
-    if (argc > 0) {
+    if (argc > 1) {
         int       n;
 
         printf("<-- arguments found [%d]\n", argc);
@@ -1186,8 +1192,17 @@ char     *scanargs(
 #endif
 
     /* update caller's notion of the argument array and it's size */
-    *arguments = argv;
-    *argument_count = argc;
+
+    /* note this is a bit of a hack since the rrd_cgi code used to just put
+       its arguments into a normal array starting at 0 ... since the rrd_*
+       commands expect and argc/argv array we used to just shift everything
+       by -1 ... this in turn exploded when a rrd_* function tried to print
+       argv[0] ... hence we are now doing everything in argv style but hand
+       over seemingly the old array ... but doing argv-1 will actually end
+       up in a 'good' place now. */
+
+    *arguments = argv+1;
+    *argument_count = argc-1;
 
     if (Quote) {
         return NULL;
@@ -1241,7 +1256,7 @@ int parse(
     if (end) {
         /* got arguments, call function for 'tag' with arguments */
         val = func(argc, (const char **) args);
-        free(args);
+        free(args-1);
     } else {
         /* unable to parse arguments, undo 0-termination by scanargs */
         for (; argc > 0; argc--) {
@@ -1387,7 +1402,8 @@ s_var   **rrdcgiReadVariables(
             length = atoi(ip);
             if ((line = (char *) malloc(length + 2)) == NULL)
                 return NULL;
-            fgets(line, length + 1, stdin);
+            if (fgets(line, length + 1, stdin) == NULL)
+                return NULL;
         } else
             return NULL;
     } else if (cp && !strcmp(cp, "GET")) {