Merge branch 'master' into ff/rrdd
[rrdtool.git] / src / rrd_update.c
index 2602a82..b4466e1 100644 (file)
@@ -1,6 +1,6 @@
 
 /*****************************************************************************
- * RRDtool 1.3.0  Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.3.1  Copyright by Tobi Oetiker, 1997-2008
  *                Copyright by Florian Forster, 2008
  *****************************************************************************
  * rrd_update.c  RRD Update Function
@@ -384,7 +384,7 @@ int rrd_update(
     int       opt;
     char     *tmplt = NULL;
     int       rc = -1;
-    char     *daemon = NULL;
+    char     *opt_daemon = NULL;
 
     optind = 0;
     opterr = 0;         /* initialize getopt */
@@ -401,10 +401,10 @@ int rrd_update(
             break;
 
         case 'd':
-            if (daemon != NULL)
-                free (daemon);
-            daemon = strdup (optarg);
-            if (daemon == NULL)
+            if (opt_daemon != NULL)
+                free (opt_daemon);
+            opt_daemon = strdup (optarg);
+            if (opt_daemon == NULL)
             {
                 rrd_set_error("strdup failed.");
                 goto out;
@@ -423,21 +423,37 @@ int rrd_update(
         goto out;
     }
 
-    if ((tmplt != NULL) && (daemon != NULL))
+    if ((tmplt != NULL) && (opt_daemon != NULL))
     {
-        rrd_set_error("The caching daemon cannot be used together with "
+        rrd_set_error("The caching opt_daemon cannot be used together with "
                 "templates yet.");
         goto out;
     }
 
-    if (daemon != NULL)
+    if ((tmplt == NULL) && (opt_daemon == NULL))
+    {
+        char *temp;
+
+        temp = getenv (ENV_RRDCACHED_ADDRESS);
+        if (temp != NULL)
+        {
+            opt_daemon = strdup (temp);
+            if (opt_daemon == NULL)
+            {
+                rrd_set_error("strdup failed.");
+                goto out;
+            }
+        }
+    }
+
+    if (opt_daemon != NULL)
     {
         int status;
 
-        status = rrdc_connect (daemon);
+        status = rrdc_connect (opt_daemon);
         if (status != 0)
         {
-            rrd_set_error("Unable to connect to daemon: %s",
+            rrd_set_error("Unable to connect to opt_daemon: %s",
                     (status < 0)
                     ? "Internal error"
                     : rrd_strerror (status));
@@ -449,15 +465,19 @@ int rrd_update(
                 /* values = */ (void *) (argv + optind + 1));
         if (status != 0)
         {
-            rrd_set_error("Failed sending the values to the daemon: %s",
+            rrd_set_error("Failed sending the values to the opt_daemon: %s",
                     (status < 0)
                     ? "Internal error"
                     : rrd_strerror (status));
         }
+        else
+        {
+            rc = 0;
+        }
 
         rrdc_disconnect ();
         goto out;
-    } /* if (daemon != NULL) */
+    } /* if (opt_daemon != NULL) */
 
     rc = rrd_update_r(argv[optind], tmplt,
                       argc - optind - 1, (const char **) (argv + optind + 1));
@@ -467,10 +487,10 @@ int rrd_update(
         free(tmplt);
         tmplt = NULL;
     }
-    if (daemon != NULL)
+    if (opt_daemon != NULL)
     {
-        free (daemon);
-        daemon = NULL;
+        free (opt_daemon);
+        opt_daemon = NULL;
     }
     return rc;
 }
@@ -563,6 +583,15 @@ int _rrd_update(
                         rra_step_cnt, updvals, tmpl_idx, tmpl_cnt,
                         &pcdp_summary, version, skip_update,
                         &schedule_smooth) == -1) {
+            if (rrd_test_error()) { /* Should have error string always here */
+                char     *save_error;
+
+                /* Prepend file name to error message */
+                if ((save_error = strdup(rrd_get_error())) != NULL) {
+                    rrd_set_error("%s: %s", filename, save_error);
+                    free(save_error);
+                }
+            }
             free(arg_copy);
             break;
         }