Code

"rrd_parsetime" uses (many) global variables and is thus not
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 29 Apr 2010 05:44:24 +0000 (05:44 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 29 Apr 2010 05:44:24 +0000 (05:44 +0000)
thread-safe. Using it in the FETCH command reproducably segfaults the
caching daemon.

This replacement will only work with "simple" integers, i. e. times
specified as "1272470594" (sometime on April 28th) or "-3600" (one hour
ago). -- Florian Forster

git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk@2074 a5681a0c-68f1-0310-ab6d-d61299d08faa

program/src/rrd_daemon.c

index 6fda921be36cb754261ac7b06b88d9e21f8d9fd0..25675a1c9725ac3f61c1227d43a343e7c878da46 100644 (file)
@@ -1481,8 +1481,6 @@ static int handle_request_fetch (HANDLER_PROTO) /* {{{ */
 
   char *start_str;
   char *end_str;
-  rrd_time_value_t start_tv;
-  rrd_time_value_t end_tv;
   time_t start_tm;
   time_t end_tm;
 
@@ -1537,38 +1535,55 @@ static int handle_request_fetch (HANDLER_PROTO) /* {{{ */
     return (send_response (sock, RESP_ERR,
           "flush_file (%s) failed with status %i.\n", file, status));
 
+  t = time (NULL); /* "now" */
+
   /* Parse start time */
   if (start_str != NULL)
   {
-    const char *errmsg;
+    char *endptr;
+    long value;
 
-    errmsg = rrd_parsetime (start_str, &start_tv);
-    if (errmsg != NULL)
+    endptr = NULL;
+    errno = 0;
+    value = strtol (start_str, &endptr, /* base = */ 0);
+    if ((endptr == start_str) || (errno != 0))
       return (send_response(sock, RESP_ERR,
-            "Cannot parse start time `%s': %s\n", start_str, errmsg));
+            "Cannot parse start time `%s': Only simple integers are allowed.\n",
+            start_str));
+
+    if (value > 0)
+      start_tm = (time_t) value;
+    else
+      start_tm = (time_t) (t + value);
   }
   else
-    rrd_parsetime ("-86400", &start_tv);
+  {
+    start_tm = t - 86400;
+  }
 
   /* Parse end time */
   if (end_str != NULL)
   {
-    const char *errmsg;
+    char *endptr;
+    long value;
 
-    errmsg = rrd_parsetime (end_str, &end_tv);
-    if (errmsg != NULL)
+    endptr = NULL;
+    errno = 0;
+    value = strtol (end_str, &endptr, /* base = */ 0);
+    if ((endptr == end_str) || (errno != 0))
       return (send_response(sock, RESP_ERR,
-            "Cannot parse end time `%s': %s\n", end_str, errmsg));
+            "Cannot parse start time `%s': Only simple integers are allowed.\n",
+            end_str));
+
+    if (value > 0)
+      end_tm = (time_t) value;
+    else
+      end_tm = (time_t) (t + value);
   }
   else
-    rrd_parsetime ("now", &end_tv);
-
-  start_tm = 0;
-  end_tm = 0;
-  status = rrd_proc_start_end (&start_tv, &end_tv, &start_tm, &end_tm);
-  if (status != 0)
-    return (send_response(sock, RESP_ERR,
-          "rrd_proc_start_end failed: %s\n", rrd_get_error ()));
+  {
+    end_tm = t;
+  }
 
   step = -1;
   ds_cnt = 0;