Code

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