]> git.ipfire.org Git - thirdparty/rrdtool-1.x.git/commitdiff
Perl shared bindings: Add bindings for the LIST command
authorSebastien Dugue <sebastien.dugue@bull.net>
Fri, 13 Feb 2015 09:29:36 +0000 (10:29 +0100)
committerMarek Schimara <Marek.Schimara@bull.net>
Wed, 24 Aug 2016 11:51:26 +0000 (13:51 +0200)
bindings/perl-shared/RRDs.xs

index ed5fc76a77868877a05b04e16ab446661371b635..af55fa657bbdc54af041bb89f02b1e78eb7d2a00 100644 (file)
@@ -648,3 +648,57 @@ rrd_flushcached(...)
                rrdcode(rrd_flushcached);
        OUTPUT:
                RETVAL
+
+SV*
+rrd_list(...)
+       PROTOTYPE: @
+       PREINIT:
+                char *data;
+                char *ptr, *end;
+                int i;
+                char **argv;
+               AV *list;
+       PPCODE:
+               argv = (char **) malloc((items+1)*sizeof(char *));
+               argv[0] = "dummy";
+
+               for (i = 0; i < items; i++) {
+                   STRLEN len;
+                   char *handle= SvPV(ST(i),len);
+                   /* actually copy the data to make sure possible modifications
+                      on the argv data does not backfire into perl */
+                   argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
+                   strcpy(argv[i+1],handle);
+               }
+
+                rrd_clear_error();
+
+               data = rrd_list(items+1, argv);
+
+                for (i=0; i < items; i++) {
+                   free(argv[i+1]);
+               }
+               free(argv);
+
+                if (rrd_test_error())
+                   XSRETURN_UNDEF;
+
+               list = newAV();
+
+               ptr = data;
+               end = strchr(ptr, '\n');
+
+               while (end) {
+                   *end = '\0';
+                   av_push(list, newSVpv(ptr, 0));
+                   ptr = end + 1;
+
+                   if (strlen(ptr) == 0)
+                           break;
+
+                   end = strchr(ptr, '\n');
+               }
+
+               rrd_freemem(data);
+
+               XPUSHs(sv_2mortal(newRV_noinc((SV*)list)));