X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=dbca1574d88fd27e84f96f7c862530c1a998ace9;hb=e7ed2184c07c7fd2d758bca6acd6e6d580c84589;hp=a503ca3c6fefa34e8086c68da824a695b6ac384b;hpb=87ecb352dda7597a61ee73ada82cf97d751817c3;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index a503ca3..dbca157 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.3rc7 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.3.0 Copyright by Tobi Oetiker, 1997-2008 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -26,6 +26,7 @@ #endif #include "rrd_graph.h" +#include "rrd_client.h" /* some constant definitions */ @@ -302,6 +303,13 @@ int im_free( if (im == NULL) return 0; + + if (im->use_rrdcached) + { + rrdc_disconnect (); + im->use_rrdcached = 0; + } + for (i = 0; i < (unsigned) im->gdes_c; i++) { if (im->gdes[i].data_first) { /* careful here, because a single pointer can occur several times */ @@ -829,6 +837,7 @@ int data_fetch( &im->gdes[i].start, &im->gdes[i].end, &ft_step, + im->use_rrdcached ? 1 : 0, &im->gdes[i].ds_cnt, &im->gdes[i].ds_namv, &im->gdes[i].data)) == -1) { @@ -1520,7 +1529,7 @@ int print_calc( } if (im->gdes[i].gf == GF_PRINT) { - infoval prline; + rrd_infoval_t prline; if (im->gdes[i].strftm) { prline.u_str = malloc((FMT_LEG_LEN + 2) * sizeof(char)); @@ -2947,12 +2956,17 @@ int graph_paint( int lazy = lazy_check(im); double areazero = 0.0; graph_desc_t *lastgdes = NULL; - infoval info; + rrd_infoval_t info; PangoFontMap *font_map = pango_cairo_font_map_get_default(); /* if we are lazy and there is nothing to PRINT ... quit now */ - if (lazy && im->prt_c == 0) + if (lazy && im->prt_c == 0) { + info.u_cnt = im->ximg; + grinfo_push(im, sprintf_alloc("image_width"), RD_I_CNT, info); + info.u_cnt = im->yimg; + grinfo_push(im, sprintf_alloc("image_height"), RD_I_CNT, info); return 0; + } /* pull the data from the rrd files ... */ if (data_fetch(im) == -1) return -1; @@ -2961,14 +2975,16 @@ int graph_paint( return -1; /* calculate and PRINT and GPRINT definitions. We have to do it at * this point because it will affect the length of the legends - * if there are no graph elements we stop here ... + * if there are no graph elements (i==0) we stop here ... * if we are lazy, try to quit ... */ - i = print_calc(im); + i = print_calc(im); if (i < 0) return -1; + if ((i == 0) || lazy) return 0; + /************************************************************** *** Calculating sizes and locations became a bit confusing *** *** so I moved this into a separate function. *** @@ -3529,8 +3545,8 @@ int rrd_graph( double *ymax) { int prlines = 0; - info_t *grinfo = NULL; - info_t *walker; + rrd_info_t *grinfo = NULL; + rrd_info_t *walker; grinfo = rrd_graph_v(argc, argv); if (grinfo == NULL) @@ -3556,7 +3572,11 @@ int rrd_graph( walker = walker->next; } walker = grinfo; - while (walker) { + *xsize = 0; + *ysize = 0; + *ymin = 0; + *ymax = 0; + while (walker) { if (strcmp(walker->key, "image_width") == 0) { *xsize = walker->value.u_int; } else if (strcmp(walker->key, "image_height") == 0) { @@ -3584,7 +3604,7 @@ int rrd_graph( /* skip anything else */ walker = walker->next; } - info_free(grinfo); + rrd_info_free(grinfo); return 0; } @@ -3595,12 +3615,12 @@ int rrd_graph( ** - options parsing now in rrd_graph_options() ** - script parsing now in rrd_graph_script() */ -info_t *rrd_graph_v( +rrd_info_t *rrd_graph_v( int argc, char **argv) { image_desc_t im; - info_t *grinfo; + rrd_info_t *grinfo; rrd_graph_init(&im); /* a dummy surface so that we can measure text sizes for placements */ @@ -3608,13 +3628,13 @@ info_t *rrd_graph_v( im.cr = cairo_create(im.surface); rrd_graph_options(argc, argv, &im); if (rrd_test_error()) { - info_free(im.grinfo); + rrd_info_free(im.grinfo); im_free(&im); return NULL; } if (optind >= argc) { - info_free(im.grinfo); + rrd_info_free(im.grinfo); im_free(&im); rrd_set_error("missing filename"); return NULL; @@ -3622,7 +3642,7 @@ info_t *rrd_graph_v( if (strlen(argv[optind]) >= MAXPATH) { rrd_set_error("filename (including path) too long"); - info_free(im.grinfo); + rrd_info_free(im.grinfo); im_free(&im); return NULL; } @@ -3636,7 +3656,7 @@ info_t *rrd_graph_v( rrd_graph_script(argc, argv, &im, 1); if (rrd_test_error()) { - info_free(im.grinfo); + rrd_info_free(im.grinfo); im_free(&im); return NULL; } @@ -3644,7 +3664,7 @@ info_t *rrd_graph_v( /* Everything is now read and the actual work can start */ if (graph_paint(&im) == -1) { - info_free(im.grinfo); + rrd_info_free(im.grinfo); im_free(&im); return NULL; } @@ -3655,7 +3675,7 @@ info_t *rrd_graph_v( */ if (im.imginfo) { - infoval info; + rrd_infoval_t info; info.u_str = sprintf_alloc(im.imginfo, @@ -3666,7 +3686,7 @@ info_t *rrd_graph_v( free(info.u_str); } if (im.rendered_image) { - infoval img; + rrd_infoval_t img; img.u_blo.size = im.rendered_image_size; img.u_blo.ptr = im.rendered_image; @@ -3705,10 +3725,11 @@ void rrd_graph_init( im->grid_dash_off = 1; im->grid_dash_on = 1; im->gridfit = 1; - im->grinfo = (info_t *) NULL; - im->grinfo_current = (info_t *) NULL; + im->grinfo = (rrd_info_t *) NULL; + im->grinfo_current = (rrd_info_t *) NULL; im->imgformat = IF_PNG; im->imginfo = NULL; + im->use_rrdcached = 0; im->lazy = 0; im->logarithmic = 0; im->maxval = DNAN; @@ -3746,26 +3767,6 @@ void rrd_graph_init( cairo_font_options_set_antialias(im->font_options, CAIRO_ANTIALIAS_GRAY); for (i = 0; i < DIM(graph_col); i++) im->graph_col[i] = graph_col[i]; -#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) - { - char *windir; - char rrd_win_default_font[1000]; - - windir = getenv("windir"); - /* %windir% is something like D:\windows or C:\winnt */ - if (windir != NULL) { - strncpy(rrd_win_default_font, windir, 500); - rrd_win_default_font[500] = '\0'; - strcat(rrd_win_default_font, "\\fonts\\"); - strcat(rrd_win_default_font, RRD_DEFAULT_FONT); - for (i = 0; i < DIM(text_prop); i++) { - strncpy(text_prop[i].font, - rrd_win_default_font, sizeof(text_prop[i].font) - 1); - text_prop[i].font[sizeof(text_prop[i].font) - 1] = '\0'; - } - } - } -#endif { char *deffont; @@ -3795,7 +3796,7 @@ void rrd_graph_options( char scan_gtm[12], scan_mtm[12], scan_ltm[12], col_nam[12]; time_t start_tmp = 0, end_tmp = 0; long long_tmp; - struct rrd_time_value start_tv, end_tv; + rrd_time_value_t start_tv, end_tv; long unsigned int color; char *old_locale = ""; @@ -3847,21 +3848,22 @@ void rrd_graph_options( { "watermark", required_argument, 0, 'W'}, { "alt-y-mrtg", no_argument, 0, 1000}, /* this has no effect it is just here to save old apps from crashing when they use it */ { "pango-markup", no_argument, 0, 'P'}, + { "daemon", required_argument, 0, 'd'}, { 0, 0, 0, 0} }; /* *INDENT-ON* */ optind = 0; opterr = 0; /* initialize getopt */ - parsetime("end-24h", &start_tv); - parsetime("now", &end_tv); + rrd_parsetime("end-24h", &start_tv); + rrd_parsetime("now", &end_tv); while (1) { int option_index = 0; int opt; int col_start, col_end; opt = getopt_long(argc, argv, - "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:k", + "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:kPd:", long_options, &option_index); if (opt == EOF) break; @@ -3927,13 +3929,13 @@ void rrd_graph_options( im->with_markup = 1; break; case 's': - if ((parsetime_error = parsetime(optarg, &start_tv))) { + if ((parsetime_error = rrd_parsetime(optarg, &start_tv))) { rrd_set_error("start time: %s", parsetime_error); return; } break; case 'e': - if ((parsetime_error = parsetime(optarg, &end_tv))) { + if ((parsetime_error = rrd_parsetime(optarg, &end_tv))) { rrd_set_error("end time: %s", parsetime_error); return; } @@ -4205,6 +4207,25 @@ void rrd_graph_options( strncpy(im->watermark, optarg, 100); im->watermark[99] = '\0'; break; + case 'd': + { + int status; + if (im->use_rrdcached) + { + rrd_set_error ("You cannot specify --daemon " + "more than once."); + return; + } + status = rrdc_connect (optarg); + if (status != 0) + { + rrd_set_error ("rrdc_connect(%s) failed with status %i.", + optarg, status); + return; + } + im->use_rrdcached = 1; + break; + } case '?': if (optopt != 0) rrd_set_error("unknown option '%c'", optopt); @@ -4212,6 +4233,26 @@ void rrd_graph_options( rrd_set_error("unknown option '%s'", argv[optind - 1]); return; } + } /* while (1) */ + + if (im->use_rrdcached == 0) + { + char *temp; + + temp = getenv (ENV_RRDCACHED_ADDRESS); + if (temp != NULL) + { + int status; + + status = rrdc_connect (temp); + if (status != 0) + { + rrd_set_error ("rrdc_connect(%s) failed with status %i.", + temp, status); + return; + } + im->use_rrdcached = 1; + } } if (im->logarithmic && im->minval <= 0) { @@ -4220,8 +4261,8 @@ void rrd_graph_options( return; } - if (proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { - /* error string is set in parsetime.c */ + if (rrd_proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { + /* error string is set in rrd_parsetime.c */ return; } @@ -4457,9 +4498,9 @@ int vdef_calc( src = &im->gdes[dst->vidx]; data = src->data + src->ds; end = - src->end_orig % src->step == - 0 ? src->end_orig : (src->end_orig + src->step - - src->end_orig % src->step); + src->end_orig % (long)src->step == + 0 ? src->end_orig : (src->end_orig + (long)src->step - + src->end_orig % (long)src->step); steps = (end - src->start) / src->step; #if 0 @@ -4686,10 +4727,10 @@ int vdef_percent_compar( void grinfo_push( image_desc_t *im, char *key, - enum info_type type, - infoval value) + rrd_info_type_t type, + rrd_infoval_t value) { - im->grinfo_current = info_push(im->grinfo_current, key, type, value); + im->grinfo_current = rrd_info_push(im->grinfo_current, key, type, value); if (im->grinfo == NULL) { im->grinfo = im->grinfo_current; }