fix crash reported by Bernard Li - connection_thread_main: avoid double calls to...
[rrdtool.git] / src / rrd_dump.c
index 8bdd6ff..3f79a96 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.3rc3  Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.3.2  Copyright by Tobi Oetiker, 1997-2008
  *****************************************************************************
  * rrd_dump  Display a RRD
  *****************************************************************************
  *****************************************************************************/
 #include "rrd_tool.h"
 #include "rrd_rpncalc.h"
+#include "rrd_client.h"
 
 #if !(defined(NETWARE) || defined(WIN32))
 extern char *tzname[2];
 #endif
 
-
-int rrd_dump_opt_r(
+static int rrd_dump_opt_r(
     const char *filename,
     char *outname,
-    int  opt_noheader
-)
+    int opt_noheader)
 {
     unsigned int i, ii, ix, iii = 0;
     time_t    now;
@@ -81,11 +80,11 @@ int rrd_dump_opt_r(
         out_file = stdout;
     }
 
-    if (!opt_noheader){
-      fputs("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", out_file);
-      fputs
-        ("<!DOCTYPE rrd SYSTEM \"http://oss.oetiker.ch/rrdtool/rrdtool.dtd\">\n",
-         out_file);
+    if (!opt_noheader) {
+        fputs("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", out_file);
+        fputs
+            ("<!DOCTYPE rrd SYSTEM \"http://oss.oetiker.ch/rrdtool/rrdtool.dtd\">\n",
+             out_file);
     }
     fputs("<!-- Round Robin Database Dump -->", out_file);
     fputs("<rrd>", out_file);
@@ -433,7 +432,7 @@ int rrd_dump_r(
     const char *filename,
     char *outname)
 {
-    return rrd_dump_opt_r(filename,outname,0);    
+    return rrd_dump_opt_r(filename, outname, 0);
 }
 
 int rrd_dump(
@@ -442,32 +441,46 @@ int rrd_dump(
 {
     int       rc;
     int       opt_noheader = 0;
+    char     *opt_daemon = NULL;
+
     /* init rrd clean */
 
     optind = 0;
     opterr = 0;         /* initialize getopt */
-    
+
     while (42) {
-        int       opt;  
+        int       opt;
         int       option_index = 0;
         static struct option long_options[] = {
+            {"daemon", required_argument, 0, 'd'},
             {"no-header", no_argument, 0, 'n'},
             {0, 0, 0, 0}
         };
 
-        opt = getopt_long(argc, argv, "n", long_options, &option_index);
+        opt = getopt_long(argc, argv, "d:n", long_options, &option_index);
 
         if (opt == EOF)
             break;
 
         switch (opt) {
+        case 'd':
+            if (opt_daemon != NULL)
+                    free (opt_daemon);
+            opt_daemon = strdup (optarg);
+            if (opt_daemon == NULL)
+            {
+                rrd_set_error ("strdup failed.");
+                return (-1);
+            }
+            break;
+
         case 'n':
             opt_noheader = 1;
             break;
 
-        default: 
+        default:
             rrd_set_error("usage rrdtool %s [--no-header|-n] "
-                      "file.rrd [file.xml]", argv[0]);
+                          "file.rrd [file.xml]", argv[0]);
             return (-1);
             break;
         }
@@ -479,12 +492,15 @@ int rrd_dump(
         return (-1);
     }
 
+    rc = rrdc_flush_if_daemon(opt_daemon, argv[optind]);
+    if (opt_daemon) free(opt_daemon);
+    if (rc) return (rc);
+
     if ((argc - optind) == 2) {
-        rc = rrd_dump_opt_r(argv[optind], argv[optind+1],opt_noheader);
+        rc = rrd_dump_opt_r(argv[optind], argv[optind + 1], opt_noheader);
     } else {
-        rc = rrd_dump_opt_r(argv[optind], NULL,opt_noheader);
+        rc = rrd_dump_opt_r(argv[optind], NULL, opt_noheader);
     }
 
     return rc;
 }
-