661c5c22daf34e2af45559befea5cc9ddae66a25
1 /*****************************************************************************
2 * RRDtool 1.3.8 Copyright by Tobi Oetiker, 1997-2009
3 *****************************************************************************
4 * rrd_lastupdate Get the last datum entered for each DS
5 *****************************************************************************/
7 #include "rrd_tool.h"
8 #include "rrd_rpncalc.h"
9 #include <stdarg.h>
11 #ifdef WIN32
12 #include <stdlib.h>
13 #endif
15 int rrd_lastupdate(
16 int argc,
17 char **argv,
18 time_t *last_update,
19 unsigned long *ds_cnt,
20 char ***ds_namv,
21 char ***last_ds)
22 {
23 unsigned long i = 0;
24 char *filename;
25 rrd_t rrd;
26 rrd_file_t *rrd_file;
28 if (argc < 2) {
29 rrd_set_error("please specify an rrd");
30 goto err_out;
31 }
32 filename = argv[1];
34 rrd_file = rrd_open(filename, &rrd, RRD_READONLY);
35 if (rrd_file == NULL)
36 goto err_free;
38 *last_update = rrd.live_head->last_up;
39 *ds_cnt = rrd.stat_head->ds_cnt;
40 if (((*ds_namv) =
41 (char **) malloc(rrd.stat_head->ds_cnt * sizeof(char *))) == NULL) {
42 rrd_set_error("malloc fetch ds_namv array");
43 goto err_close;
44 }
46 if (((*last_ds) =
47 (char **) malloc(rrd.stat_head->ds_cnt * sizeof(char *))) == NULL) {
48 rrd_set_error("malloc fetch last_ds array");
49 goto err_free_ds_namv;
50 }
52 for (i = 0; i < rrd.stat_head->ds_cnt; i++) {
53 (*ds_namv)[i] = sprintf_alloc("%s", rrd.ds_def[i].ds_nam);
54 (*last_ds)[i] = sprintf_alloc("%s", rrd.pdp_prep[i].last_ds);
55 }
57 rrd_free(&rrd);
58 rrd_close(rrd_file);
59 return (0);
61 err_free_ds_namv:
62 free(*ds_namv);
63 err_close:
64 rrd_close(rrd_file);
65 err_free:
66 rrd_free(&rrd);
67 err_out:
68 return (-1);
69 }