1 /*****************************************************************************
2 * RRDtool 1.3.0 Copyright by Tobi Oetiker, 1997-2008
3 *****************************************************************************
4 * rrd_first Return
5 *****************************************************************************
6 * Initial version by Burton Strauss, ntopSupport.com - 3/2005
7 *****************************************************************************/
9 #include "rrd_tool.h"
12 time_t rrd_first(
13 int argc,
14 char **argv)
15 {
16 int target_rraindex = 0;
17 char *endptr;
18 struct option long_options[] = {
19 {"rraindex", required_argument, 0, 129},
20 {0, 0, 0, 0}
21 };
23 optind = 0;
24 opterr = 0; /* initialize getopt */
26 while (1) {
27 int option_index = 0;
28 int opt;
30 opt = getopt_long(argc, argv, "", long_options, &option_index);
32 if (opt == EOF)
33 break;
35 switch (opt) {
36 case 129:
37 target_rraindex = strtol(optarg, &endptr, 0);
38 if (target_rraindex < 0) {
39 rrd_set_error("invalid rraindex number");
40 return (-1);
41 }
42 break;
43 default:
44 rrd_set_error("usage rrdtool %s [--rraindex number] file.rrd",
45 argv[0]);
46 return (-1);
47 }
48 }
50 if (optind >= argc) {
51 rrd_set_error("not enough arguments");
52 return -1;
53 }
55 return (rrd_first_r(argv[optind], target_rraindex));
56 }
59 time_t rrd_first_r(
60 const char *filename,
61 const int rraindex)
62 {
63 off_t rra_start, timer;
64 time_t then = -1;
65 rrd_t rrd;
66 rrd_file_t *rrd_file;
68 rrd_file = rrd_open(filename, &rrd, RRD_READONLY);
69 if (rrd_file == NULL) {
70 goto err_free;
71 }
73 if ((rraindex < 0) || (rraindex >= (int) rrd.stat_head->rra_cnt)) {
74 rrd_set_error("invalid rraindex number");
75 goto err_close;
76 }
78 rra_start = rrd_file->header_len;
79 rrd_seek(rrd_file,
80 (rra_start +
81 (rrd.rra_ptr[rraindex].cur_row + 1) *
82 rrd.stat_head->ds_cnt * sizeof(rrd_value_t)), SEEK_SET);
83 timer = -(rrd.rra_def[rraindex].row_cnt - 1);
84 if (rrd.rra_ptr[rraindex].cur_row + 1 > rrd.rra_def[rraindex].row_cnt) {
85 rrd_seek(rrd_file, rra_start, SEEK_SET);
86 }
87 then = (rrd.live_head->last_up -
88 rrd.live_head->last_up %
89 (rrd.rra_def[rraindex].pdp_cnt * rrd.stat_head->pdp_step)) +
90 (timer * rrd.rra_def[rraindex].pdp_cnt * rrd.stat_head->pdp_step);
91 err_close:
92 rrd_close(rrd_file);
93 err_free:
94 rrd_free(&rrd);
95 return (then);
96 }