}
#endif
+/*
+ * rrd_tool.h includes config.h, but at least on Ubuntu Breezy Badger
+ * 5.10 with gcc 4.0.2, the C preprocessor picks up Perl's config.h
+ * which is included from the Perl includes and never reads rrdtool's
+ * config.h. Without including rrdtool's config.h, this module does
+ * not compile, so include it here with an explicit path.
+ *
+ * Because rrdtool's config.h redefines VERSION which is originally
+ * set via Perl's Makefile.PL and passed down to the C compiler's
+ * command line, save the original value and reset it after the
+ * includes.
+ */
+#define VERSION_SAVED VERSION
+#undef VERSION
+#include "../../rrd_config.h"
#include "../../src/rrd_tool.h"
+#undef VERSION
+#define VERSION VERSION_SAVED
+#undef VERSION_SAVED
/* perl 5.004 compatibility */
#if PERLPATCHLEVEL < 5
argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \
strcpy(argv[i+1],handle); \
} \
- optind=0; opterr=0; \
rrd_clear_error();\
RETVAL=name(items+1,argv); \
for (i=0; i < items; i++) {\
\
if (rrd_test_error()) XSRETURN_UNDEF;
+#define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0)
+
+#define rrdinfocode(name) \
+ /* prepare argument list */ \
+ 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=name(items+1, argv); \
+ for (i=0; i < items; i++) { \
+ free(argv[i+1]); \
+ } \
+ free(argv); \
+ if (rrd_test_error()) XSRETURN_UNDEF; \
+ hash = newHV(); \
+ while (data) { \
+ save=data; \
+ /* the newSV will get copied by hv so we create it as a mortal \
+ to make sure it does not keep hanging round after the fact */ \
+ switch (data->type) { \
+ case RD_I_VAL: \
+ if (isnan(data->value.u_val)) \
+ hvs(&PL_sv_undef); \
+ else \
+ hvs(newSVnv(data->value.u_val)); \
+ break; \
+ case RD_I_INT: \
+ hvs(newSViv(data->value.u_int)); \
+ break; \
+ case RD_I_CNT: \
+ hvs(newSViv(data->value.u_cnt)); \
+ break; \
+ case RD_I_STR: \
+ hvs(newSVpv(data->value.u_str,0)); \
+ rrd_freemem(data->value.u_str); \
+ break; \
+ } \
+ rrd_freemem(data->key); \
+ data = data->next; \
+ rrd_freemem(save); \
+ } \
+ rrd_freemem(data); \
+ RETVAL = newRV_noinc((SV*)hash);
+
/*
* should not be needed if libc is linked (see ntmake.pl)
#ifdef WIN32
OUTPUT:
RETVAL
+int
+rrd_first(...)
+ PROTOTYPE: @
+ PREINIT:
+ int i;
+ char **argv;
+ CODE:
+ rrdcode(rrd_first);
+ OUTPUT:
+ RETVAL
+
int
rrd_create(...)
rrd_graph(...)
PROTOTYPE: @
PREINIT:
- char **calcpr;
+ char **calcpr=NULL;
int i,xsize,ysize;
+ double ymin,ymax;
char **argv;
AV *retar;
PPCODE:
argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
strcpy(argv[i+1],handle);
}
- optind=0; opterr=0;
rrd_clear_error();
- rrd_graph(items+1,argv,&calcpr,&xsize,&ysize);
+ rrd_graph(items+1,argv,&calcpr,&xsize,&ysize,NULL,&ymin,&ymax);
for (i=0; i < items; i++) {
free(argv[i+1]);
}
argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
strcpy(argv[i+1],handle);
}
- optind=0; opterr=0;
rrd_clear_error();
rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data);
for (i=0; i < items; i++) {
PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
+void
+rrd_times(start, end)
+ char *start
+ char *end
+ PREINIT:
+ struct rrd_time_value start_tv, end_tv;
+ char *parsetime_error = NULL;
+ time_t start_tmp, end_tmp;
+ PPCODE:
+ rrd_clear_error();
+ if( (parsetime_error = parsetime( start, &start_tv))) {
+ rrd_set_error( "start time: %s", parsetime_error);
+ XSRETURN_UNDEF;
+ }
+ if( (parsetime_error = parsetime( end, &end_tv))) {
+ rrd_set_error( "end time: %s", parsetime_error);
+ XSRETURN_UNDEF;
+ }
+ if( proc_start_end( &start_tv, &end_tv, &start_tmp, &end_tmp) == -1) {
+ XSRETURN_UNDEF;
+ }
+ EXTEND(sp,2);
+ PUSHs(sv_2mortal(newSVuv(start_tmp)));
+ PUSHs(sv_2mortal(newSVuv(end_tmp)));
int
rrd_xport(...)
argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
strcpy(argv[i+1],handle);
}
- optind=0; opterr=0;
rrd_clear_error();
rrd_xport(items+1,argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data);
for (i=0; i < items; i++) {
char **argv;
HV *hash;
CODE:
- /* prepare argument list */
- 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);
- }
- optind=0; opterr=0;
- rrd_clear_error();
- data=rrd_info(items+1, argv);
- for (i=0; i < items; i++) {
- free(argv[i+1]);
- }
- free(argv);
- if (rrd_test_error()) XSRETURN_UNDEF;
- hash = newHV();
- while (data) {
- save=data;
- /* the newSV will get copied by hv so we create it as a mortal to make sure
- it does not keep hanging round after the fact */
-#define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0)
- switch (data->type) {
- case RD_I_VAL:
- if (isnan(data->value.u_val))
- hvs(&PL_sv_undef);
- else
- hvs(newSVnv(data->value.u_val));
- break;
- case RD_I_CNT:
- hvs(newSViv(data->value.u_cnt));
- break;
- case RD_I_STR:
- hvs(newSVpv(data->value.u_str,0));
- rrd_freemem(data->value.u_str);
- break;
- }
-#undefine hvs
- rrd_freemem(data->key);
- data = data->next;
- rrd_freemem(save);
- }
- rrd_freemem(data);
- RETVAL = newRV_noinc((SV*)hash);
+ rrdinfocode(rrd_info);
+ OUTPUT:
+ RETVAL
+
+SV*
+rrd_updatev(...)
+ PROTOTYPE: @
+ PREINIT:
+ info_t *data,*save;
+ int i;
+ char **argv;
+ HV *hash;
+ CODE:
+ rrdinfocode(rrd_update_v);
+ OUTPUT:
+ RETVAL
+
+int
+rrd_dump(...)
+ PROTOTYPE: @
+ PREINIT:
+ int i;
+ char **argv;
+ CODE:
+ rrdcode(rrd_dump);
+ RETVAL = 1;
OUTPUT:
- RETVAL
+ RETVAL
+int
+rrd_restore(...)
+ PROTOTYPE: @
+ PREINIT:
+ int i;
+ char **argv;
+ CODE:
+ rrdcode(rrd_restore);
+ RETVAL = 1;
+ OUTPUT:
+ RETVAL