]> git.ipfire.org Git - thirdparty/rrdtool-1.x.git/commitdiff
support --sources (aka -r) in rrd daemon
authorPeter Stamfest <peter@stamfest.at>
Tue, 2 Sep 2014 19:27:15 +0000 (21:27 +0200)
committerPeter Stamfest <peter@stamfest.at>
Tue, 2 Sep 2014 19:27:15 +0000 (21:27 +0200)
src/rrd_daemon.c

index b8ba158953429ee8b750adbd048b91d740ac0fcf..3fefd406c97a72f9bd1a6e0030035ae4b402bb8f 100644 (file)
@@ -1903,32 +1903,41 @@ static int handle_request_last (HANDLER_PROTO) /* {{{ */
   return send_response(sock, RESP_OK, "%lu\n",(unsigned)t);
 } /* }}} static int handle_request_last  */
 
+#ifdef __GNUC__
+#define return _Pragma("message \"Do not use 'return': 'goto done' instead\"")
+#endif
 static int handle_request_create (HANDLER_PROTO) /* {{{ */
 {
   char *file, file_tmp[PATH_MAX];
-  char *file_copy, *dir, dir_tmp[PATH_MAX];
+  char *file_copy = NULL, *dir, dir_tmp[PATH_MAX];
   char *tok;
   int ac = 0;
   char *av[128];
+  char **sources = NULL;
+  int sources_length = 0;
   int status;
   unsigned long step = 300;
   time_t last_up = time(NULL)-10;
   int no_overwrite = opt_no_overwrite;
-
+  int rc = -1;
 
   /* obtain filename */
   status = buffer_get_field(&buffer, &buffer_size, &file);
-  if (status != 0)
-    return syntax_error(sock,cmd);
+  if (status != 0) {
+    rc = syntax_error(sock,cmd);
+    goto done;
+  }
   /* get full pathname */
   get_abs_path(&file, file_tmp);
 
   file_copy = strdup(file);
   if (file_copy == NULL) {
-    return send_response(sock, RESP_ERR, "Cannot create: empty argument.\n");
+    rc = send_response(sock, RESP_ERR, "Cannot create: empty argument.\n");
+    goto done;
   }
   if (!check_file_access(file, sock)) {
-    return send_response(sock, RESP_ERR, "Cannot read: %s\n", file);
+    rc = send_response(sock, RESP_ERR, "Cannot read: %s\n", file);
+    goto done;
   }
   RRDD_LOG(LOG_INFO, "rrdcreate request for %s",file);
 
@@ -1936,54 +1945,91 @@ static int handle_request_create (HANDLER_PROTO) /* {{{ */
   dir = dirname(file_copy);
   if (realpath(dir, dir_tmp) == NULL && errno == ENOENT) {
     if (!config_allow_recursive_mkdir) {
-        return send_response(sock, RESP_ERR,
+        rc = send_response(sock, RESP_ERR,
             "No permission to recursively create: %s\nDid you pass -R to the daemon?\n",
             dir);
+        goto done;
     }
     if (rrd_mkdir_p(dir, 0755) != 0) {
-        return send_response(sock, RESP_ERR, "Cannot create: %s\n", dir);
+        rc = send_response(sock, RESP_ERR, "Cannot create: %s\n", dir);
+        goto done;
     }
   }
   pthread_mutex_unlock(&rrdfilecreate_lock);
-  free(file_copy);
 
   while ((status = buffer_get_field(&buffer, &buffer_size, &tok)) == 0 && tok) {
     if( ! strncmp(tok,"-b",2) ) {
       status = buffer_get_field(&buffer, &buffer_size, &tok );
-      if (status != 0) return syntax_error(sock,cmd);
+      if (status != 0) {
+          rc = syntax_error(sock,cmd);
+          goto done;
+      }
       last_up = (time_t) atol(tok);
       continue;
     }
     if( ! strncmp(tok,"-s",2) ) {
       status = buffer_get_field(&buffer, &buffer_size, &tok );
-      if (status != 0) return syntax_error(sock,cmd);
+      if (status != 0) { 
+          rc = syntax_error(sock,cmd);
+          goto done;
+      }
       step = atol(tok);
       continue;
     }
+    if( ! strncmp(tok,"-r",2) ) {
+      status = buffer_get_field(&buffer, &buffer_size, &tok );
+      if (status != 0) {
+          rc = syntax_error(sock,cmd);
+          goto done;
+      }
+      sources = realloc(sources, sizeof(char*) * (sources_length + 2));
+      if (sources == NULL) {
+          rc = send_response(sock, RESP_ERR, "Cannot allocate memory\n");
+          goto done;
+      }
+      sources[sources_length++] = tok;
+      sources[sources_length + 1] = NULL;
+      continue;
+    }
     if( ! strncmp(tok,"-O",2) ) {
       no_overwrite = 1;
       continue;
     }
     if( ! strncmp(tok,"DS:",3) ) { av[ac++]=tok; continue; }
     if( ! strncmp(tok,"RRA:",4) ) { av[ac++]=tok; continue; }
-    return syntax_error(sock,cmd);
+    rc = syntax_error(sock,cmd);
+    goto done;
   }
   if(step<1) {
-    return send_response(sock, RESP_ERR, "The step size cannot be less than 1 second.\n");
+    rc = send_response(sock, RESP_ERR, "The step size cannot be less than 1 second.\n");
+    goto done;
   }
   if (last_up < 3600 * 24 * 365 * 10) {
-    return send_response(sock, RESP_ERR, "The first entry must be after 1980.\n");
+    rc = send_response(sock, RESP_ERR, "The first entry must be after 1980.\n");
+    goto done;
   }
 
   rrd_clear_error ();
   pthread_mutex_lock(&rrdfilecreate_lock);
-  status = rrd_create_r2(file,step,last_up,no_overwrite,NULL, ac,(const char **)av);
+  status = rrd_create_r2(file,step,last_up,no_overwrite, (const char**) sources, ac,(const char **)av);
   pthread_mutex_unlock(&rrdfilecreate_lock);
 
   if(!status) {
-    return send_response(sock, RESP_OK, "RRD created OK\n");
+    rc = send_response(sock, RESP_OK, "RRD created OK\n");
+    goto done;
+  }
+  rc = send_response(sock, RESP_ERR, "RRD Error: %s\n", rrd_get_error());
+done:
+  if (sources) {
+      free(sources);
   }
-  return send_response(sock, RESP_ERR, "RRD Error: %s\n", rrd_get_error());
+  if (file_copy) {
+      free(file_copy);
+  }
+#ifdef __GNUC__
+#undef return
+#endif
+  return rc;
 } /* }}} static int handle_request_create  */
 
 /* start "BATCH" processing */