X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_lastupdate.c;h=1546f6a148237abfe28ee3af68df3bd02f72b955;hp=af0b4a46b82d19dd2a7b93f6f4dc45c0094f721f;hb=75b8cf7a1eff3d24a8567f3209aa023ad4473e95;hpb=fbe390e15d3484315efe5802577249c8959e3556 diff --git a/src/rrd_lastupdate.c b/src/rrd_lastupdate.c index af0b4a4..1546f6a 100644 --- a/src/rrd_lastupdate.c +++ b/src/rrd_lastupdate.c @@ -1,54 +1,167 @@ /***************************************************************************** - * RRDtool 1.2.21 Copyright by Tobi Oetiker, 1997-2007 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 + * Copyright by Florian Forster, 2008 ***************************************************************************** * rrd_lastupdate Get the last datum entered for each DS *****************************************************************************/ #include "rrd_tool.h" #include "rrd_rpncalc.h" +#include "rrd_client.h" #include -int -rrd_lastupdate(int argc, char **argv, time_t *last_update, - unsigned long *ds_cnt, char ***ds_namv, char ***last_ds) { - unsigned long i=0; - char *filename; - FILE *in_file; - rrd_t rrd; - - if(argc < 2){ - rrd_set_error("please specify an rrd"); - return -1; +int rrd_lastupdate (int argc, char **argv) +{ + time_t last_update; + char **ds_names; + char **last_ds; + unsigned long ds_count, i; + int status; + + char *opt_daemon = NULL; + + optind = 0; + opterr = 0; /* initialize getopt */ + + while (42) { + int opt; + int option_index = 0; + static struct option long_options[] = { + {"daemon", required_argument, 0, 'd'}, + {0, 0, 0, 0} + }; + + opt = getopt_long (argc, argv, "d:", long_options, &option_index); + + if (opt == EOF) + break; + + switch (opt) { + case 'd': + if (opt_daemon != NULL) + free (opt_daemon); + opt_daemon = strdup (optarg); + if (opt_daemon == NULL) + { + rrd_set_error ("strdup failed."); + return (-1); + } + break; + + default: + rrd_set_error ("Usage: rrdtool %s [--daemon ] ", + argv[0]); + return (-1); + break; + } + } /* while (42) */ + + if ((argc - optind) != 1) { + rrd_set_error ("Usage: rrdtool %s [--daemon ] ", + argv[0]); + return (-1); + } + + status = rrdc_flush_if_daemon(opt_daemon, argv[optind]); + if (opt_daemon) free (opt_daemon); + if (status) return (-1); + + status = rrd_lastupdate_r (argv[optind], + &last_update, &ds_count, &ds_names, &last_ds); + if (status != 0) + return (status); + + for (i = 0; i < ds_count; i++) + printf(" %s", ds_names[i]); + printf ("\n\n"); + + printf ("%10lu:", last_update); + for (i = 0; i < ds_count; i++) { + printf(" %s", last_ds[i]); + free(last_ds[i]); + free(ds_names[i]); + } + printf("\n"); + + free(last_ds); + free(ds_names); + + return (0); +} /* int rrd_lastupdate */ + +int rrd_lastupdate_r(const char *filename, + time_t *ret_last_update, + unsigned long *ret_ds_count, + char ***ret_ds_names, + char ***ret_last_ds) +{ + unsigned long i = 0; + rrd_t rrd; + rrd_file_t *rrd_file; + + rrd_init(&rrd); + rrd_file = rrd_open(filename, &rrd, RRD_READONLY); + if (rrd_file == NULL) { + rrd_free(&rrd); + return (-1); } - filename = argv[1]; - if(rrd_open(filename,&in_file,&rrd, RRD_READONLY)==-1){ - return(-1); + *ret_last_update = rrd.live_head->last_up; + *ret_ds_count = rrd.stat_head->ds_cnt; + *ret_ds_names = (char **) malloc (rrd.stat_head->ds_cnt * sizeof(char *)); + if (*ret_ds_names == NULL) { + rrd_set_error ("malloc fetch ret_ds_names array"); + rrd_close (rrd_file); + rrd_free (&rrd); + return (-1); } - fclose(in_file); - - *last_update=rrd.live_head->last_up; - *ds_cnt = rrd.stat_head->ds_cnt; - if (((*ds_namv) = - (char **) malloc(rrd.stat_head->ds_cnt * sizeof(char*)))==NULL){ - rrd_set_error("malloc fetch ds_namv array"); - rrd_free(&rrd); - return(-1); - } - - if (((*last_ds) = - (char **) malloc(rrd.stat_head->ds_cnt * sizeof(char*)))==NULL){ - rrd_set_error("malloc fetch last_ds array"); - rrd_free(&rrd); - free(*ds_namv); - return(-1); - } - - for(i=0;ids_cnt;i++){ - (*ds_namv)[i] = sprintf_alloc("%s", rrd.ds_def[i].ds_nam); - (*last_ds)[i] = sprintf_alloc("%s", rrd.pdp_prep[i].last_ds); + memset (*ret_ds_names, 0, rrd.stat_head->ds_cnt * sizeof(char *)); + + *ret_last_ds = (char **) malloc (rrd.stat_head->ds_cnt * sizeof(char *)); + if (*ret_last_ds == NULL) { + rrd_set_error ("malloc fetch ret_last_ds array"); + free (*ret_ds_names); + *ret_ds_names = NULL; + rrd_close (rrd_file); + rrd_free (&rrd); + return (-1); + } + memset (*ret_last_ds, 0, rrd.stat_head->ds_cnt * sizeof(char *)); + + for (i = 0; i < rrd.stat_head->ds_cnt; i++) { + (*ret_ds_names)[i] = sprintf_alloc("%s", rrd.ds_def[i].ds_nam); + (*ret_last_ds)[i] = sprintf_alloc("%s", rrd.pdp_prep[i].last_ds); + + if (((*ret_ds_names)[i] == NULL) || ((*ret_last_ds)[i] == NULL)) + break; + } + + /* Check if all names and values could be copied and free everything if + * not. */ + if (i < rrd.stat_head->ds_cnt) { + rrd_set_error ("sprintf_alloc failed"); + for (i = 0; i < rrd.stat_head->ds_cnt; i++) { + if ((*ret_ds_names)[i] != NULL) + { + free ((*ret_ds_names)[i]); + (*ret_ds_names)[i] = NULL; + } + if ((*ret_last_ds)[i] != NULL) + { + free ((*ret_last_ds)[i]); + (*ret_last_ds)[i] = NULL; + } + } + free (*ret_ds_names); + *ret_ds_names = NULL; + free (*ret_last_ds); + *ret_last_ds = NULL; + rrd_close (rrd_file); + rrd_free (&rrd); + return (-1); } rrd_free(&rrd); - return(0); -} + rrd_close(rrd_file); + return (0); +} /* int rrd_lastupdate_r */