X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph.c;h=a24889fb439458685b338b1cf50e4299d6f80316;hp=a0e3ddc3501ee4510f750bc21c90d2332ecd8c26;hb=a9c2a94950e57c9d8847073c579a24455e749a66;hpb=a5ff83d8178335554d8fdb6ba97afcf75dae4df4 diff --git a/src/rrd_graph.c b/src/rrd_graph.c index a0e3ddc..a24889f 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,11 +1,12 @@ /**************************************************************************** - * RRDtool 1.3rc4 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ #include +#include #ifdef WIN32 #include "strftime.h" @@ -26,6 +27,7 @@ #endif #include "rrd_graph.h" +#include "rrd_client.h" /* some constant definitions */ @@ -37,15 +39,17 @@ #endif text_prop_t text_prop[] = { - {8.0, RRD_DEFAULT_FONT} + {8.0, RRD_DEFAULT_FONT,NULL} , /* default */ - {9.0, RRD_DEFAULT_FONT} + {9.0, RRD_DEFAULT_FONT,NULL} , /* title */ - {7.0, RRD_DEFAULT_FONT} + {7.0, RRD_DEFAULT_FONT,NULL} , /* axis */ - {8.0, RRD_DEFAULT_FONT} + {8.0, RRD_DEFAULT_FONT,NULL} , /* unit */ - {8.0, RRD_DEFAULT_FONT} /* legend */ + {8.0, RRD_DEFAULT_FONT,NULL} /* legend */ + , + {5.5, RRD_DEFAULT_FONT,NULL} /* watermark */ }; xlab_t xlab[] = { @@ -288,6 +292,7 @@ enum text_prop_en text_prop_conv( conv_if(AXIS, TEXT_PROP_AXIS); conv_if(UNIT, TEXT_PROP_UNIT); conv_if(LEGEND, TEXT_PROP_LEGEND); + conv_if(WATERMARK, TEXT_PROP_WATERMARK); return -1; } @@ -302,6 +307,10 @@ int im_free( if (im == NULL) return 0; + + if (im->daemon_addr != NULL) + free(im->daemon_addr); + 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 */ @@ -330,12 +339,18 @@ int im_free( if (im->rendered_image) { free(im->rendered_image); } + + if (im->layout) { + g_object_unref (im->layout); + } + if (im->surface) cairo_surface_destroy(im->surface); + if (status) fprintf(stderr, "OOPS: Cairo has issues it can't even die: %s\n", cairo_status_to_string(status)); - + return 0; } @@ -824,6 +839,36 @@ int data_fetch( if (!skip) { unsigned long ft_step = im->gdes[i].step; /* ft_step will record what we got from fetch */ + /* Flush the file if + * - a connection to the daemon has been established + * - this is the first occurrence of that RRD file + */ + if (rrdc_is_connected(im->daemon_addr)) + { + int status; + + status = 0; + for (ii = 0; ii < i; ii++) + { + if (strcmp (im->gdes[i].rrd, im->gdes[ii].rrd) == 0) + { + status = 1; + break; + } + } + + if (status == 0) + { + status = rrdc_flush (im->gdes[i].rrd); + if (status != 0) + { + rrd_set_error ("rrdc_flush (%s) failed with status %i.", + im->gdes[i].rrd, status); + return (-1); + } + } + } /* if (rrdc_is_connected()) */ + if ((rrd_fetch_fn(im->gdes[i].rrd, im->gdes[i].cf, &im->gdes[i].start, @@ -894,7 +939,7 @@ long find_var( return -1; } -/* find the largest common denominator for all the numbers +/* find the greatest common divisor for all the numbers in the 0 terminated num array */ long lcd( long *num) @@ -1520,7 +1565,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)); @@ -1612,14 +1657,16 @@ int leg_place( int border = im->text_prop[TEXT_PROP_LEGEND].size * 2.0; int fill = 0, fill_last; int leg_c = 0; - int leg_x = border, leg_y = im->yimg; + double leg_x = border; + int leg_y = im->yimg; int leg_y_prev = im->yimg; int leg_cc; - int glue = 0; + double glue = 0; int i, ii, mark = 0; char prt_fctn; /*special printfunctions */ char default_txtalign = TXA_JUSTIFIED; /*default line orientation */ int *legspace; + char *tab; if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) { if ((legspace = malloc(im->gdes_c * sizeof(int))) == NULL) { @@ -1648,13 +1695,14 @@ int leg_place( im->gdes[i].legend[0] = '\0'; } + /* turn \\t into tab */ + while ((tab = strstr(im->gdes[i].legend, "\\t"))) { + memmove(tab, tab + 1, strlen(tab)); + tab[0] = (char) 9; + } leg_cc = strlen(im->gdes[i].legend); /* is there a controle code ant the end of the legend string ? */ - /* and it is not a tab \\t */ - if (leg_cc >= 2 - && im->gdes[i].legend[leg_cc - - 2] == '\\' - && im->gdes[i].legend[leg_cc - 1] != 't') { + if (leg_cc >= 2 && im->gdes[i].legend[leg_cc - 2] == '\\') { prt_fctn = im->gdes[i].legend[leg_cc - 1]; leg_cc -= 2; im->gdes[i].legend[leg_cc] = '\0'; @@ -1666,8 +1714,7 @@ int leg_place( prt_fctn != 'r' && prt_fctn != 'j' && prt_fctn != 'c' && - prt_fctn != 's' && - prt_fctn != 't' && prt_fctn != '\0' && prt_fctn != 'g') { + prt_fctn != 's' && prt_fctn != '\0' && prt_fctn != 'g') { free(legspace); rrd_set_error ("Unknown control code at the end of '%s\\%c'", @@ -1699,11 +1746,7 @@ int leg_place( im-> text_prop [TEXT_PROP_LEGEND]. - font, - im-> - text_prop - [TEXT_PROP_LEGEND]. - size, + font_desc, im->tabwidth, im->gdes[i].legend); leg_c++; } else { @@ -1750,12 +1793,12 @@ int leg_place( if (prt_fctn != '\0') { leg_x = border; if (leg_c >= 2 && prt_fctn == 'j') { - glue = (im->ximg - fill - 2 * border) / (leg_c - 1); + glue = (double)(im->ximg - fill - 2 * border) / (double)(leg_c - 1); } else { glue = 0; } if (prt_fctn == 'c') - leg_x = (im->ximg - fill) / 2.0; + leg_x = (double)(im->ximg - fill) / 2.0; if (prt_fctn == 'r') leg_x = im->ximg - fill - border; for (ii = mark; ii <= i; ii++) { @@ -1764,17 +1807,13 @@ int leg_place( im->gdes[ii].leg_x = leg_x; im->gdes[ii].leg_y = leg_y; leg_x += - gfx_get_text_width(im, leg_x, - im-> - text_prop - [TEXT_PROP_LEGEND]. - font, + (double)gfx_get_text_width(im, leg_x, im-> text_prop [TEXT_PROP_LEGEND]. - size, + font_desc, im->tabwidth, im->gdes[ii].legend) - + legspace[ii] + +(double)legspace[ii] + glue; } leg_y_prev = leg_y; @@ -1803,10 +1842,9 @@ int leg_place( leg_y - im->text_prop[TEXT_PROP_LEGEND].size * 1.8; } } else { - im->yimg = leg_y_prev; - /* if we did place some legends we have to add vertical space */ - if (leg_y != im->yimg) - im->yimg += im->text_prop[TEXT_PROP_LEGEND].size * 1.8; + im->yimg = + leg_y - im->text_prop[TEXT_PROP_LEGEND].size * 1.8 + + border * 0.6; } free(legspace); } @@ -1819,8 +1857,6 @@ int leg_place( /* the xaxis labels are determined from the number of seconds per pixel in the requested graph */ - - int calc_horizontal_grid( image_desc_t *im) @@ -1858,13 +1894,16 @@ int calc_horizontal_grid( if (im->ygrid_scale.gridstep == 0) /* range is one -> 0.1 is reasonable scale */ im->ygrid_scale.gridstep = 0.1; /* should have at least 5 lines but no more then 15 */ - if (range / im->ygrid_scale.gridstep < 5) + if (range / im->ygrid_scale.gridstep < 5 + && im->ygrid_scale.gridstep >= 30) im->ygrid_scale.gridstep /= 10; if (range / im->ygrid_scale.gridstep > 15) im->ygrid_scale.gridstep *= 10; if (range / im->ygrid_scale.gridstep > 5) { im->ygrid_scale.labfact = 1; - if (range / im->ygrid_scale.gridstep > 8) + if (range / im->ygrid_scale.gridstep > 8 + || im->ygrid_scale.gridstep < + 1.8 * im->text_prop[TEXT_PROP_AXIS].size) im->ygrid_scale.labfact = 2; } else { im->ygrid_scale.gridstep /= 5; @@ -1891,17 +1930,17 @@ int calc_horizontal_grid( sprintf(im->ygrid_scale.labfmt, "%%%d.0f%s", len, (im->symbol != ' ' ? " %c" : "")); } - } else { + } else { /* classic rrd grid */ for (i = 0; ylab[i].grid > 0; i++) { pixel = im->ysize / (scaledrange / ylab[i].grid); gridind = i; - if (pixel > 7) + if (pixel >= 5) break; } for (i = 0; i < 4; i++) { if (pixel * ylab[gridind].lfac[i] >= - 2.5 * im->text_prop[TEXT_PROP_AXIS].size) { + 1.8 * im->text_prop[TEXT_PROP_AXIS].size) { im->ygrid_scale.labfact = ylab[gridind].lfac[i]; break; } @@ -1988,10 +2027,8 @@ int draw_horizontal_grid( im->graph_col[GRC_FONT], im-> text_prop[TEXT_PROP_AXIS]. - font, - im-> - text_prop[TEXT_PROP_AXIS]. - size, im->tabwidth, 0.0, + font_desc, + im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, graph_label); gfx_line(im, X0 - 2, Y0, X0, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]); @@ -2169,10 +2206,8 @@ int horizontal_log_grid( im->graph_col[GRC_FONT], im-> text_prop[TEXT_PROP_AXIS]. - font, - im-> - text_prop[TEXT_PROP_AXIS]. - size, im->tabwidth, 0.0, + font_desc, + im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, graph_label); /* minor grid */ if (mid < 4 && exfrac == 1) { @@ -2440,10 +2475,8 @@ void vertical_grid( im->graph_col[GRC_FONT], im-> text_prop[TEXT_PROP_AXIS]. - font, - im-> - text_prop[TEXT_PROP_AXIS]. - size, im->tabwidth, 0.0, + font_desc, + im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_TOP, graph_label); } @@ -2521,10 +2554,8 @@ void grid_paint( im->graph_col[GRC_FONT], im-> text_prop[TEXT_PROP_AXIS]. - font, - im-> - text_prop[TEXT_PROP_AXIS]. - size, im->tabwidth, 0.0, + font_desc, + im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_CENTER, nodata); } } @@ -2537,10 +2568,8 @@ void grid_paint( im->graph_col[GRC_FONT], im-> text_prop[TEXT_PROP_UNIT]. - font, - im-> - text_prop[TEXT_PROP_UNIT]. - size, im->tabwidth, + font_desc, + im->tabwidth, RRDGRAPH_YLEGEND_ANGLE, GFX_H_CENTER, GFX_V_CENTER, im->ylegend); /* graph title */ gfx_text(im, @@ -2548,18 +2577,16 @@ void grid_paint( im->graph_col[GRC_FONT], im-> text_prop[TEXT_PROP_TITLE]. - font, - im-> - text_prop[TEXT_PROP_TITLE]. - size, im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_TOP, im->title); + font_desc, + im->tabwidth, 0.0, GFX_H_CENTER, GFX_V_TOP, im->title); /* rrdtool 'logo' */ water_color = im->graph_col[GRC_FONT]; water_color.alpha = 0.3; gfx_text(im, im->ximg - 4, 5, water_color, im-> - text_prop[TEXT_PROP_AXIS]. - font, 5.5, im->tabwidth, + text_prop[TEXT_PROP_WATERMARK]. + font_desc, im->tabwidth, -90, GFX_H_LEFT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER"); /* graph watermark */ if (im->watermark[0] != '\0') { @@ -2567,8 +2594,8 @@ void grid_paint( im->ximg / 2, im->yimg - 6, water_color, im-> - text_prop[TEXT_PROP_AXIS]. - font, 5.5, im->tabwidth, 0, + text_prop[TEXT_PROP_WATERMARK]. + font_desc, im->tabwidth, 0, GFX_H_CENTER, GFX_V_BOTTOM, im->watermark); } @@ -2584,10 +2611,7 @@ void grid_paint( im->graph_col[GRC_FONT], im-> text_prop - [TEXT_PROP_LEGEND].font, - im-> - text_prop - [TEXT_PROP_LEGEND].size, + [TEXT_PROP_LEGEND].font_desc, im->tabwidth, 0.0, GFX_H_LEFT, GFX_V_BOTTOM, im->gdes[i].legend); /* The legend for GRAPH items starts with "M " to have @@ -2601,11 +2625,8 @@ void grid_paint( im-> text_prop [TEXT_PROP_LEGEND]. - font, - im-> - text_prop - [TEXT_PROP_LEGEND]. - size, im->tabwidth, "o") * 1.2; + font_desc, + im->tabwidth, "o") * 1.2; boxV = boxH; /* shift the box up a bit */ Y0 -= boxV * 0.4; @@ -2761,11 +2782,8 @@ int graph_size_location( im-> text_prop [TEXT_PROP_AXIS]. - font, - im-> - text_prop - [TEXT_PROP_AXIS]. - size, im->tabwidth, "0") * im->unitslength; + font_desc, + im->tabwidth, "0") * im->unitslength; } } @@ -2945,12 +2963,18 @@ int graph_paint( int lazy = lazy_check(im); double areazero = 0.0; graph_desc_t *lastgdes = NULL; - infoval info; - PangoFontMap *font_map = pango_cairo_font_map_get_default(); + rrd_infoval_t info; - /* if we are lazy and there is nothing to PRINT ... quit now */ - if (lazy && im->prt_c == 0) +// PangoFontMap *font_map = pango_cairo_font_map_get_default(); + + /* if we want and can be lazy ... quit now */ + if (lazy) { + 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; @@ -2959,14 +2983,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); 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. *** @@ -3050,10 +3076,11 @@ int graph_paint( (im->surface, CAIRO_SVG_VERSION_1_1); break; }; + cairo_destroy(im->cr); im->cr = cairo_create(im->surface); cairo_set_antialias(im->cr, im->graph_antialias); cairo_scale(im->cr, im->zoom, im->zoom); - pango_cairo_font_map_set_resolution(PANGO_CAIRO_FONT_MAP(font_map), 100); +// pango_cairo_font_map_set_resolution(PANGO_CAIRO_FONT_MAP(font_map), 100); gfx_new_area(im, 0, 0, 0, im->yimg, im->ximg, im->yimg, im->graph_col[GRC_BACK]); gfx_add_point(im, im->ximg, 0); @@ -3067,6 +3094,9 @@ int graph_paint( im->yorigin - im->ysize, im->graph_col[GRC_CANVAS]); gfx_add_point(im, im->xorigin, im->yorigin - im->ysize); gfx_close_path(im); + cairo_rectangle(im->cr, im->xorigin, im->yorigin - im->ysize - 1.0, + im->xsize, im->ysize + 2.0); + cairo_clip(im->cr); if (im->minval > 0.0) areazero = im->minval; if (im->maxval < 0.0) @@ -3354,6 +3384,7 @@ int graph_paint( break; } /* switch */ } + cairo_reset_clip(im->cr); /* grid_paint also does the text */ if (!(im->extra_flags & ONLY_GRAPH)) @@ -3523,8 +3554,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) @@ -3550,6 +3581,10 @@ int rrd_graph( walker = walker->next; } walker = grinfo; + *xsize = 0; + *ysize = 0; + *ymin = 0; + *ymax = 0; while (walker) { if (strcmp(walker->key, "image_width") == 0) { *xsize = walker->value.u_int; @@ -3578,7 +3613,7 @@ int rrd_graph( /* skip anything else */ walker = walker->next; } - info_free(grinfo); + rrd_info_free(grinfo); return 0; } @@ -3589,26 +3624,24 @@ 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 */ - im.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10); - 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; @@ -3616,7 +3649,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; } @@ -3630,7 +3663,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; } @@ -3638,7 +3671,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; } @@ -3649,18 +3682,23 @@ info_t *rrd_graph_v( */ if (im.imginfo) { - infoval info; + rrd_infoval_t info; + char *path; + char *filename; + path = strdup(im.graphfile); + filename = basename(path); info.u_str = sprintf_alloc(im.imginfo, - im.graphfile, + filename, (long) (im.zoom * im.ximg), (long) (im.zoom * im.yimg)); grinfo_push(&im, sprintf_alloc("image_info"), RD_I_STR, info); free(info.u_str); + free(path); } 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; @@ -3671,11 +3709,30 @@ info_t *rrd_graph_v( return grinfo; } +static void +rrd_set_font_desc ( + image_desc_t *im,int prop,char *font, double size ){ + if (font){ + strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1); + im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0'; + im->text_prop[prop].font_desc = pango_font_description_from_string( font ); + }; + if (size > 0){ + im->text_prop[prop].size = size; + }; + if (im->text_prop[prop].font_desc && im->text_prop[prop].size ){ + pango_font_description_set_size(im->text_prop[prop].font_desc, im->text_prop[prop].size * PANGO_SCALE); + }; +} + void rrd_graph_init( image_desc_t *im) { unsigned int i; + char *deffont = getenv("RRD_DEFAULT_FONT"); + static PangoFontMap *fontmap = NULL; + PangoContext *context; #ifdef HAVE_TZSET tzset(); @@ -3687,7 +3744,7 @@ void rrd_graph_init( #endif #endif im->base = 1000; - im->cr = NULL; + im->daemon_addr = NULL; im->draw_x_grid = 1; im->draw_y_grid = 1; im->extra_flags = 0; @@ -3699,8 +3756,8 @@ 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->lazy = 0; @@ -3714,7 +3771,6 @@ void rrd_graph_init( im->rendered_image = NULL; im->slopemode = 0; im->step = 0; - im->surface = NULL; im->symbol = ' '; im->tabwidth = 40.0; im->title[0] = '\0'; @@ -3722,6 +3778,7 @@ void rrd_graph_init( im->unitslength = 6; im->viewfactor = 1.0; im->watermark[0] = '\0'; + im->with_markup = 0; im->ximg = 0; im->xlab_user.minsec = -1; im->xorigin = 0; @@ -3732,51 +3789,45 @@ void rrd_graph_init( im->yorigin = 0; im->ysize = 100; im->zoom = 1; + + im->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10); + im->cr = cairo_create(im->surface); + + for (i = 0; i < DIM(text_prop); i++) { + im->text_prop[i].size = -1; + rrd_set_font_desc(im,i, deffont ? deffont : text_prop[i].font,text_prop[i].size); + } + + if (fontmap == NULL){ + fontmap = pango_cairo_font_map_get_default(); + } + + context = pango_cairo_font_map_create_context((PangoCairoFontMap*)fontmap); + + pango_cairo_context_set_resolution(context, 100); + + pango_cairo_update_context(im->cr,context); + + im->layout = pango_layout_new(context); + +// im->layout = pango_cairo_create_layout(im->cr); + + cairo_font_options_set_hint_style (im->font_options, CAIRO_HINT_STYLE_FULL); cairo_font_options_set_hint_metrics (im->font_options, CAIRO_HINT_METRICS_ON); 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; - - deffont = getenv("RRD_DEFAULT_FONT"); - if (deffont != NULL) { - for (i = 0; i < DIM(text_prop); i++) { - strncpy(text_prop[i].font, deffont, - sizeof(text_prop[i].font) - 1); - text_prop[i].font[sizeof(text_prop[i].font) - 1] = '\0'; - } - } - } - for (i = 0; i < DIM(text_prop); i++) { - im->text_prop[i].size = text_prop[i].size; - strcpy(im->text_prop[i].font, text_prop[i].font); - } + + } + void rrd_graph_options( int argc, char *argv[], @@ -3788,141 +3839,74 @@ 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 = ""; /* defines for long options without a short equivalent. should be bytes, and may not collide with (the ASCII value of) short options */ #define LONGOPT_UNITS_SI 255 + +/* *INDENT-OFF* */ struct option long_options[] = { - { - "start", required_argument, 0, 's'}, { - "end", required_argument, 0, - 'e'}, { - "x-grid", - required_argument, 0, - 'x'}, { - "y-grid", - required_argument, - 0, 'y'}, { - "vertical-label", - required_argument, - 0, - 'v'}, { - "width", - required_argument, - 0, - 'w'}, - { - "height", required_argument, 0, 'h'}, { - "full-size-mode", no_argument, - 0, 'D'}, { - "interlaced", - no_argument, 0, - 'i'}, { - "upper-limit", - required_argument, - 0, - 'u'}, { - "lower-limit", - required_argument, - 0, - 'l'}, { - "rigid", - no_argument, - 0, - 'r'}, - { - "base", required_argument, 0, 'b'}, { - "logarithmic", no_argument, 0, - 'o'}, { - "color", - required_argument, 0, - 'c'}, { - "font", - required_argument, - 0, 'n'}, { - "title", - required_argument, - 0, 't'}, - { - "imginfo", required_argument, 0, 'f'}, { - "imgformat", - required_argument, 0, 'a'}, { - "lazy", - no_argument, - 0, - 'z'}, - { - "zoom", required_argument, 0, 'm'}, { - "no-legend", no_argument, 0, - 'g'}, { - "force-rules-legend", - no_argument, - 0, 'F'}, { - "only-graph", - no_argument, 0, - 'j'}, { - "alt-y-grid", - no_argument, - 0, 'Y'}, - { - "no-minor", no_argument, 0, 'I'}, { - "slope-mode", no_argument, 0, - 'E'}, { - "alt-autoscale", - no_argument, 0, 'A'}, { - "alt-autoscale-min", - no_argument, - 0, - 'J'}, { - "alt-autoscale-max", - no_argument, - 0, - 'M'}, { - "no-gridfit", - no_argument, - 0, - 'N'}, - { - "units-exponent", required_argument, - 0, 'X'}, { - "units-length", required_argument, - 0, 'L'}, { - "units", required_argument, 0, - LONGOPT_UNITS_SI}, { - "step", required_argument, 0, - 'S'}, { - "tabwidth", - required_argument, 0, - 'T'}, { - "font-render-mode", - required_argument, - 0, 'R'}, { - "graph-render-mode", - required_argument, - 0, - 'G'}, - { - "font-smoothing-threshold", - required_argument, 0, 'B'}, { - "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 */ - { - 0, 0, 0, 0} - }; + { "start", required_argument, 0, 's'}, + { "end", required_argument, 0, 'e'}, + { "x-grid", required_argument, 0, 'x'}, + { "y-grid", required_argument, 0, 'y'}, + { "vertical-label", required_argument, 0, 'v'}, + { "width", required_argument, 0, 'w'}, + { "height", required_argument, 0, 'h'}, + { "full-size-mode", no_argument, 0, 'D'}, + { "interlaced", no_argument, 0, 'i'}, + { "upper-limit", required_argument, 0, 'u'}, + { "lower-limit", required_argument, 0, 'l'}, + { "rigid", no_argument, 0, 'r'}, + { "base", required_argument, 0, 'b'}, + { "logarithmic", no_argument, 0, 'o'}, + { "color", required_argument, 0, 'c'}, + { "font", required_argument, 0, 'n'}, + { "title", required_argument, 0, 't'}, + { "imginfo", required_argument, 0, 'f'}, + { "imgformat", required_argument, 0, 'a'}, + { "lazy", no_argument, 0, 'z'}, + { "zoom", required_argument, 0, 'm'}, + { "no-legend", no_argument, 0, 'g'}, + { "force-rules-legend", no_argument, 0, 'F'}, + { "only-graph", no_argument, 0, 'j'}, + { "alt-y-grid", no_argument, 0, 'Y'}, + { "no-minor", no_argument, 0, 'I'}, + { "slope-mode", no_argument, 0, 'E'}, + { "alt-autoscale", no_argument, 0, 'A'}, + { "alt-autoscale-min", no_argument, 0, 'J'}, + { "alt-autoscale-max", no_argument, 0, 'M'}, + { "no-gridfit", no_argument, 0, 'N'}, + { "units-exponent", required_argument, 0, 'X'}, + { "units-length", required_argument, 0, 'L'}, + { "units", required_argument, 0, LONGOPT_UNITS_SI}, + { "step", required_argument, 0, 'S'}, + { "tabwidth", required_argument, 0, 'T'}, + { "font-render-mode", required_argument, 0, 'R'}, + { "graph-render-mode", required_argument, 0, 'G'}, + { "font-smoothing-threshold", required_argument, 0, 'B'}, + { "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; @@ -3984,14 +3968,17 @@ void rrd_graph_options( case 'N': im->gridfit = 0; break; + case 'P': + 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; } @@ -4182,20 +4169,20 @@ void rrd_graph_options( for (propidx = sindex; propidx < TEXT_PROP_LAST; propidx++) { if (size > 0) { - im->text_prop[propidx].size = size; + rrd_set_font_desc(im,propidx,NULL,size); } - if ((int) strlen(prop) > end) { - if (prop[end] == ':') { - strncpy(im->text_prop[propidx].font, - prop + end + 1, 255); - im->text_prop[propidx].font[255] = '\0'; + if ((int) strlen(optarg) > end+2) { + if (optarg[end] == ':') { + rrd_set_font_desc(im,propidx,optarg + end + 1,0); } else { rrd_set_error - ("expected after font size in '%s'", - prop); + ("expected : after font size in '%s'", + optarg); return; } } + /* only run the for loop for DEFAULT (0) for + all others, we break here. woodo programming */ if (propidx == sindex && sindex != 0) break; } @@ -4261,6 +4248,24 @@ void rrd_graph_options( strncpy(im->watermark, optarg, 100); im->watermark[99] = '\0'; break; + case 'd': + { + if (im->daemon_addr != NULL) + { + rrd_set_error ("You cannot specify --daemon " + "more than once."); + return; + } + + im->daemon_addr = strdup(optarg); + if (im->daemon_addr == NULL) + { + rrd_set_error("strdup failed"); + return; + } + + break; + } case '?': if (optopt != 0) rrd_set_error("unknown option '%c'", optopt); @@ -4268,7 +4273,17 @@ void rrd_graph_options( rrd_set_error("unknown option '%s'", argv[optind - 1]); return; } + } /* while (1) */ + + { /* try to connect to rrdcached */ + int status = rrdc_connect(im->daemon_addr); + if (status != 0) return; } + + pango_cairo_context_set_font_options(pango_layout_get_context(im->layout), im->font_options); + pango_layout_context_changed(im->layout); + + if (im->logarithmic && im->minval <= 0) { rrd_set_error @@ -4276,8 +4291,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; } @@ -4511,6 +4526,7 @@ int vdef_calc( dst = &im->gdes[gdi]; src = &im->gdes[dst->vidx]; data = src->data + src->ds; + steps = (src->end - src->start) / src->step; #if 0 printf @@ -4736,10 +4752,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; }