Code

Imported upstream version 1.3.8.
[pkg-rrdtool.git] / src / rrd_lastupdate.c
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 }