rrdtool: Keep time as 'long' despite 64bit time_t in musl
authorHannu Nyman <hannu.nyman@iki.fi>
Sat, 9 Oct 2021 07:15:24 +0000 (10:15 +0300)
committerHannu Nyman <hannu.nyman@iki.fi>
Sun, 10 Oct 2021 17:58:47 +0000 (20:58 +0300)
Adjust to the 64 bit time_t in musl 1.2.2 by keeping time
internally in RRD still as 'long', so that old databases
created during musl 1.1.x still work in 32 bit targets.

That also helps with several interal functions that use 'long'
for calculations and printf formatting.

* Define internal type TIME_INT as 'long', and use that
  internally in calculations
* Use time_t vs. TIME_INT casting when necessary
* Provide time_t variable pointers for functions expecting
  a time_t pointer.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
utils/rrdtool1/Makefile
utils/rrdtool1/patches/100-new-long-rrd.patch [new file with mode: 0644]

index 171c9b3f3933ac0b5d00b349fdbf59aede473611..b1c5114e021a3427b8d2c390f55c49d4cf2ef25e 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=rrdtool1
 PKG_VERSION:=1.0.50
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/rrdtool-$(PKG_VERSION)
 PKG_SOURCE:=rrdtool-$(PKG_VERSION).tar.gz
diff --git a/utils/rrdtool1/patches/100-new-long-rrd.patch b/utils/rrdtool1/patches/100-new-long-rrd.patch
new file mode 100644 (file)
index 0000000..35b4136
--- /dev/null
@@ -0,0 +1,630 @@
+--- a/src/parsetime.c
++++ b/src/parsetime.c
+@@ -715,7 +715,7 @@ day(struct rrd_time_value *ptv)
+           tlen = strlen(sc_token);
+           mon = atol(sc_token);
+             if (mon > 10*365*24*60*60) {
+-                montime = mon;
++                montime = (time_t) mon;
+                 ptv->tm=*localtime(&montime);
+               token();
+               break;
+@@ -914,8 +914,11 @@ parsetime(char *tspec, struct rrd_time_v
+ int proc_start_end (struct rrd_time_value *start_tv, 
+                   struct rrd_time_value *end_tv, 
+-                  time_t *start, 
+-                  time_t *end){
++                  TIME_INT *start,
++                  TIME_INT *end){
++
++    time_t end_t, start_t;
++
+     if (start_tv->type == RELATIVE_TO_END_TIME  && /* same as the line above */
+       end_tv->type == RELATIVE_TO_START_TIME) {
+       rrd_set_error("the start and end times cannot be specified "
+@@ -935,25 +938,27 @@ int proc_start_end (struct rrd_time_valu
+     if( start_tv->type == RELATIVE_TO_END_TIME) {
+       struct tm tmtmp;
+-      *end = mktime(&(end_tv->tm)) + end_tv->offset;    
+-      tmtmp = *localtime(end); /* reinit end including offset */
++      end_t = mktime(&(end_tv->tm)) + end_tv->offset;
++      *end = (TIME_INT) end_t;
++      tmtmp = *localtime(&end_t); /* reinit end including offset */
+       tmtmp.tm_mday += start_tv->tm.tm_mday;
+       tmtmp.tm_mon += start_tv->tm.tm_mon;
+       tmtmp.tm_year += start_tv->tm.tm_year;  
+-      *start = mktime(&tmtmp) + start_tv->offset;
++      *start = (TIME_INT) mktime(&tmtmp) + start_tv->offset;
+     } else {
+-      *start = mktime(&(start_tv->tm)) + start_tv->offset;
++      *start = (TIME_INT) mktime(&(start_tv->tm)) + start_tv->offset;
+     }
+     if (end_tv->type == RELATIVE_TO_START_TIME) {
+       struct tm tmtmp;
+-      *start = mktime(&(start_tv->tm)) + start_tv->offset;
+-      tmtmp = *localtime(start);
++      start_t = mktime(&(start_tv->tm)) + start_tv->offset;
++      *start = (TIME_INT) start_t;
++      tmtmp = *localtime(&start_t);
+       tmtmp.tm_mday += end_tv->tm.tm_mday;
+       tmtmp.tm_mon += end_tv->tm.tm_mon;
+       tmtmp.tm_year += end_tv->tm.tm_year;    
+-      *end = mktime(&tmtmp) + end_tv->offset;
++      *end = (TIME_INT) mktime(&tmtmp) + end_tv->offset;
+     } else {
+-      *end = mktime(&(end_tv->tm)) + end_tv->offset;
++      *end = (TIME_INT) mktime(&(end_tv->tm)) + end_tv->offset;
+     }    
+     return 0;
+ } /* proc_start_end */
+--- a/src/rrd_cgi.c
++++ b/src/rrd_cgi.c
+@@ -352,7 +352,7 @@ int main(int argc, char *argv[]) {
+                       time_t now;
+                       now = time(NULL);
+                       printf("Last-Modified: %s\n", http_time(&now));
+-                      now += labs(goodfor);
++                      now += (time_t) labs(goodfor);
+                       printf("Expires: %s\n", http_time(&now));
+                       if (goodfor < 0) {
+                               printf("Refresh: %ld\n", labs(goodfor));
+@@ -491,6 +491,7 @@ char* printstrftime(long argc, char **ar
+       char    formatted[MAX_STRFTIME_SIZE];
+       struct tm *the_tm;
+       time_t  start_tmp, end_tmp;
++      TIME_INT start_tmp_t, end_tmp_t;
+       /* Make sure that we were given the right number of args */
+       if( argc != 4) {
+@@ -511,15 +512,17 @@ char* printstrftime(long argc, char **ar
+               rrd_set_error( "end time: %s", parsetime_error);
+               return (char *) -1;
+       }
+-      if( proc_start_end( &start_tv, &end_tv, &start_tmp, &end_tmp) == -1) {
++      if( proc_start_end( &start_tv, &end_tv, &start_tmp_t, &end_tmp_t) == -1) {
+               return (char *) -1;
+       }
+       /* Do we do the start or end */
+       if( strcasecmp( args[0], "START") == 0) {
++              start_tmp = (time_t) start_tmp_t;
+               the_tm = localtime( &start_tmp);
+       }
+       else if( strcasecmp( args[0], "END") == 0) {
++              end_tmp = (time_t) end_tmp_t;
+               the_tm = localtime( &end_tmp);
+       }
+       else {
+@@ -726,7 +729,7 @@ char* printtimelast(long argc, char **ar
+     if (buf == NULL){ 
+       return stralloc("[ERROR: allocating strftime buffer]");
+     };
+-    last = rrd_last(argc+1, args-1); 
++    last = (time_t) rrd_last(argc+1, args-1);
+     if (rrd_test_error()) {
+       char *err = malloc((strlen(rrd_get_error())+DS_NAM_SIZE)*sizeof(char));
+       sprintf(err, "[ERROR: %s]",rrd_get_error());
+--- a/src/rrd_create.c
++++ b/src/rrd_create.c
+@@ -12,12 +12,12 @@ rrd_create(int argc, char **argv)
+ {
+     rrd_t          rrd;
+     long                i,long_tmp;
+-    time_t             last_up;
++    TIME_INT             last_up;
+     struct rrd_time_value last_up_tv;
+     char *parsetime_error = NULL;
+     /* init last_up */
+-    last_up = time(NULL)-10;
++    last_up = (TIME_INT) time(NULL)-10;
+     /* init rrd clean */
+     rrd_init(&rrd);
+     /* static header */
+@@ -74,7 +74,7 @@ rrd_create(int argc, char **argv)
+               return(-1);
+           }
+-          last_up = mktime(&last_up_tv.tm) + last_up_tv.offset;
++          last_up = (TIME_INT) mktime(&last_up_tv.tm) + last_up_tv.offset;
+           
+           if (last_up < 3600*24*365*10){
+               rrd_set_error("the first entry to the RRD should be after 1980");
+--- a/src/rrd_dump.c
++++ b/src/rrd_dump.c
+@@ -24,6 +24,7 @@ rrd_dump(int argc, char **argv)
+     long         rra_base, rra_start, rra_next;
+     FILE                  *in_file;
+     rrd_t             rrd;
++    time_t       lastup_t;
+     if(rrd_open(argv[1],&in_file,&rrd, RRD_READONLY)==-1){
+@@ -34,8 +35,9 @@ rrd_dump(int argc, char **argv)
+     printf("\t<version> %s </version>\n",rrd.stat_head->version);
+     printf("\t<step> %lu </step> <!-- Seconds -->\n",rrd.stat_head->pdp_step);
+ #if HAVE_STRFTIME
++    lastup_t = (time_t) rrd.live_head->last_up;
+     strftime(somestring,200,"%Y-%m-%d %H:%M:%S %Z",
+-           localtime(&rrd.live_head->last_up));
++           localtime(&lastup_t));
+ #else
+ # error "Need strftime"
+ #endif
+@@ -115,10 +117,10 @@ rrd_dump(int argc, char **argv)
+               fseek(in_file,rra_start,SEEK_SET);
+               ii=0; /* wrap if max row cnt is reached */
+           }
+-          now = (rrd.live_head->last_up 
++          now = (time_t) ((rrd.live_head->last_up
+                  - rrd.live_head->last_up 
+                  % (rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step)) 
+-              + (timer*rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step);
++              + (timer*rrd.rra_def[i].pdp_cnt*rrd.stat_head->pdp_step));
+           timer++;
+ #if HAVE_STRFTIME
+--- a/src/rrd_fetch.c
++++ b/src/rrd_fetch.c
+@@ -16,8 +16,8 @@
+ int
+ rrd_fetch(int argc, 
+         char **argv,
+-        time_t         *start,
+-        time_t         *end,       /* which time frame do you want ?
++        TIME_INT         *start,
++        TIME_INT         *end,       /* which time frame do you want ?
+                                     * will be changed to represent reality */
+         unsigned long  *step,      /* which stepsize do you want? 
+                                     * will be changed to represent reality */
+@@ -28,7 +28,7 @@ rrd_fetch(int argc,
+     long     step_tmp =1;
+-    time_t   start_tmp=0, end_tmp=0;
++    TIME_INT   start_tmp=0, end_tmp=0;
+     enum     cf_en cf_idx;
+     struct rrd_time_value start_tv, end_tv;
+@@ -119,8 +119,8 @@ int
+ rrd_fetch_fn(
+     char           *filename,  /* name of the rrd */
+     enum cf_en     cf_idx,         /* which consolidation function ?*/
+-    time_t         *start,
+-    time_t         *end,       /* which time frame do you want ?
++    TIME_INT         *start,
++    TIME_INT         *end,       /* which time frame do you want ?
+                               * will be changed to represent reality */
+     unsigned long  *step,      /* which stepsize do you want? 
+                               * will be changed to represent reality */
+@@ -130,7 +130,7 @@ rrd_fetch_fn(
+ {
+     long           i,ii;
+     FILE           *in_file;
+-    time_t         cal_start,cal_end, rra_start_time,rra_end_time;
++    TIME_INT         cal_start,cal_end, rra_start_time,rra_end_time;
+     long  best_full_rra=0, best_part_rra=0, chosen_rra=0, rra_pointer=0;
+     long  best_step_diff=0, tmp_step_diff=0, tmp_match=0, best_match=0;
+     long  full_match, rra_base;
+--- a/src/rrd_first.c
++++ b/src/rrd_first.c
+@@ -8,13 +8,13 @@
+ #include "rrd_tool.h"
+-time_t
++TIME_INT
+ rrd_first(int argc, char **argv)    
+ {   
+     long rra_start,
+          timer;
+     unsigned long target_rraindex=0;
+-    time_t then;
++    TIME_INT then;
+     char *endptr;
+     FILE *in_file;
+     rrd_t rrd;
+--- a/src/rrd_format.h
++++ b/src/rrd_format.h
+@@ -200,7 +200,7 @@ typedef struct rra_def_t {
+  ****************************************************************************/
+ typedef struct live_head_t {
+-    time_t           last_up;            /* when was rrd last updated */
++    TIME_INT           last_up;            /* when was rrd last updated */
+ } live_head_t;
+--- a/src/rrd_graph.c
++++ b/src/rrd_graph.c
+@@ -123,7 +123,7 @@ col_trip_t graph_col[] = { /* default co
+               * ((double)(x) - im->start)+0.5) */
+ /* initialize with xtr(im,0); */
+ int
+-xtr(image_desc_t *im,time_t mytime){
++xtr(image_desc_t *im,TIME_INT mytime){
+     static double pixie;
+     if (mytime==0){
+       pixie = (double) im->xsize / (double)(im->end - im->start);
+@@ -486,8 +486,8 @@ void
+ reduce_data(
+     enum cf_en     cf,         /* which consolidation function ?*/
+     unsigned long  cur_step,   /* step the data currently is in */
+-    time_t         *start,     /* start, end and step as requested ... */
+-    time_t         *end,       /* ... by the application will be   ... */
++    TIME_INT         *start,     /* start, end and step as requested ... */
++    TIME_INT         *end,       /* ... by the application will be   ... */
+     unsigned long  *step,      /* ... adjusted to represent reality    */
+     unsigned long  *ds_cnt,    /* number of data sources in file */
+     rrd_value_t    **data)     /* two dimensional array containing the data */
+@@ -853,18 +853,20 @@ str2rpn(image_desc_t *im,char *expr){
+    time was. Return it in seconds */
+ int
+-tzoffset( time_t now ){
++tzoffset( TIME_INT now ){
+   int gm_sec, gm_min, gm_hour, gm_yday, gm_year,
+     l_sec, l_min, l_hour, l_yday, l_year;
+   struct tm *t;
+   int off;
+-  t = gmtime(&now);
++  time_t now_t;
++  now_t = (time_t) now;
++  t = gmtime(&now_t);
+   gm_sec = t->tm_sec;
+   gm_min = t->tm_min;
+   gm_hour = t->tm_hour;
+   gm_yday = t->tm_yday;
+   gm_year = t->tm_year;
+-  t = localtime(&now);
++  t = localtime(&now_t);
+   l_sec = t->tm_sec;
+   l_min = t->tm_min;
+   l_hour = t->tm_hour;
+@@ -893,7 +895,7 @@ data_calc( image_desc_t *im){
+     int       dataidx;
+     long      *steparray;
+     int       stepcnt;
+-    time_t    now;
++    TIME_INT    now;
+     double    *stack = NULL;
+     long      dc_stacksize = 0;
+@@ -1433,14 +1435,16 @@ data_proc( image_desc_t *im ){
+ /* identify the point where the first gridline, label ... gets placed */
+-time_t
++TIME_INT
+ find_first_time(
+-    time_t   start, /* what is the initial time */
++    TIME_INT   start_t, /* what is the initial time */
+     enum tmt_en baseint,  /* what is the basic interval */
+     long     basestep /* how many if these do we jump a time */
+     )
+ {
+     struct tm tm;
++    time_t start;
++    start = (time_t) start_t;
+     tm = *localtime(&start);
+     switch(baseint){
+     case TMT_SECOND:
+@@ -1485,15 +1489,17 @@ find_first_time(
+     return mktime(&tm);
+ }
+ /* identify the point where the next gridline, label ... gets placed */
+-time_t 
++TIME_INT
+ find_next_time(
+-    time_t   current, /* what is the initial time */
++    TIME_INT   current_t, /* what is the initial time */
+     enum tmt_en baseint,  /* what is the basic interval */
+     long     basestep /* how many if these do we jump a time */
+     )
+ {
+     struct tm tm;
+-    time_t madetime;
++    time_t current;
++    current = (time_t) current_t;
++    TIME_INT madetime;
+     tm = *localtime(&current);
+     do {
+       switch(baseint){
+@@ -2143,7 +2149,8 @@ vertical_grid(
+     image_desc_t   *im )
+ {   
+     int xlab_sel;             /* which sort of label and grid ? */
+-    time_t ti, tilab;
++    TIME_INT ti, tilab;
++    time_t tilab_t;
+     long factor;
+     char graph_label[100];
+     gdPoint polyPoints[4];     /* points for filled graph and more*/
+@@ -2231,9 +2238,10 @@ vertical_grid(
+       ){
+       int gr_pos,width;
+         tilab= ti + im->xlab_user.precis/2; /* correct time for the label */
++        tilab_t = (time_t) tilab;
+ #if HAVE_STRFTIME
+-      strftime(graph_label,99,im->xlab_user.stst,localtime(&tilab));
++      strftime(graph_label,99,im->xlab_user.stst,localtime(&tilab_t));
+ #else
+ # error "your libc has no strftime I guess we'll abort the exercise here."
+ #endif
+@@ -2487,7 +2495,7 @@ int lazy_check(image_desc_t *im){
+       return 0; /* can't stat */
+     /* one pixel in the existing graph is more then what we would
+        change here ... */
+-    if (time(NULL) - gifstat.st_mtime > 
++    if ((TIME_INT) time(NULL) - gifstat.st_mtime >
+       (im->end - im->start) / im->xsize) 
+       return 0;
+     if ((fd = fopen(im->graphfile,"rb")) == NULL) 
+@@ -2881,7 +2889,7 @@ rrd_graph(int argc, char **argv, char **
+     image_desc_t   im;
+     int            i;
+     long           long_tmp;
+-    time_t       start_tmp=0,end_tmp=0;
++    TIME_INT     start_tmp=0,end_tmp=0;
+     char           scan_gtm[12],scan_mtm[12],scan_ltm[12],col_nam[12];
+     char           symname[100];
+     unsigned int            col_red,col_green,col_blue;
+--- a/src/rrd_graph.h
++++ b/src/rrd_graph.h
+@@ -90,11 +90,11 @@ typedef  struct graph_desc_t {
+     char           legend[FMT_LEG_LEN+5]; /* legend*/
+     gdPoint        legloc;     /* location of legend */   
+     double         yrule;      /* value for y rule line */
+-    time_t         xrule;      /* value for x rule line */
++    TIME_INT         xrule;      /* value for x rule line */
+     rpnp_t         *rpnp;     /* instructions for CDEF function */
+     /* description of data fetched for the graph element */
+-    time_t         start,end; /* timestaps for first and last data element */
++    TIME_INT         start,end; /* timestaps for first and last data element */
+     unsigned long  step;      /* time between samples */
+     unsigned long  ds_cnt; /* how many data sources are there in the fetch */
+     long           data_first; /* first pointer to this data */
+@@ -121,7 +121,7 @@ typedef struct image_desc_t {
+     double         ygridstep;      /* user defined step for y grid */
+     int            ylabfact;       /* every how many y grid shall a label be written ? */
+-    time_t         start,end;      /* what time does the graph cover */
++    TIME_INT         start,end;      /* what time does the graph cover */
+     unsigned long           step;           /* any preference for the default step ? */
+     rrd_value_t    minval,maxval;  /* extreme values in the data */
+     int            rigid;          /* do not expand range even with 
+@@ -160,7 +160,7 @@ typedef struct image_desc_t {
+ } image_desc_t;
+ /* Prototypes */
+-int xtr(image_desc_t *,time_t);
++int xtr(image_desc_t *,TIME_INT);
+ int ytr(image_desc_t *, double);
+ enum gf_en gf_conv(char *);
+ enum if_en if_conv(char *);
+@@ -170,16 +170,16 @@ int im_free(image_desc_t *);
+ void auto_scale( image_desc_t *,  double *, char **, double *);
+ void si_unit( image_desc_t *);
+ void expand_range(image_desc_t *);
+-void reduce_data( enum cf_en,  unsigned long,  time_t *, time_t *,  unsigned long *,  unsigned long *,  rrd_value_t **);
++void reduce_data( enum cf_en,  unsigned long,  TIME_INT *, TIME_INT *,  unsigned long *,  unsigned long *,  rrd_value_t **);
+ int data_fetch( image_desc_t *);
+ long find_var(image_desc_t *, char *);
+ long lcd(long *);
+ int data_calc( image_desc_t *);
+ int data_proc( image_desc_t *);
+-time_t find_first_time( time_t,  enum tmt_en,  long);
+-time_t find_next_time( time_t,  enum tmt_en,  long);
++TIME_INT find_first_time( TIME_INT,  enum tmt_en,  long);
++TIME_INT find_next_time( TIME_INT,  enum tmt_en,  long);
+ void gator( gdImagePtr, int, int);
+-int tzoffset(time_t);
++int tzoffset(TIME_INT);
+ int print_calc(image_desc_t *, char ***);
+ int leg_place(image_desc_t *);
+ int horizontal_grid(gdImagePtr, image_desc_t *);
+--- a/src/rrd.h
++++ b/src/rrd.h
+@@ -17,6 +17,9 @@ extern "C" {
+ #define _RRDLIB_H
+ #include <time.h>
++#include <stdint.h>
++
++#define TIME_INT long
+ /* Transplanted from rrd_format.h */
+ typedef double       rrd_value_t;         /* the data storage type is
+@@ -27,15 +30,15 @@ typedef double       rrd_value_t;
+ int    rrd_create(int, char **);
+ int    rrd_update(int, char **);
+ int    rrd_graph(int, char **, char ***, int *, int *);
+-int    rrd_fetch(int, char **, time_t *, time_t *, unsigned long *,
++int    rrd_fetch(int, char **, TIME_INT *, TIME_INT *, unsigned long *,
+                unsigned long *, char ***, rrd_value_t **);
+ int    rrd_restore(int, char **);
+ int    rrd_dump(int, char **);
+ int    rrd_tune(int, char **);
+-time_t rrd_last(int, char **);
+-time_t rrd_first(int, char **);
++TIME_INT rrd_last(int, char **);
++TIME_INT rrd_first(int, char **);
+ int    rrd_resize(int, char **);
+-int    rrd_xport(int, char **, int *, time_t *, time_t *,
++int    rrd_xport(int, char **, int *, TIME_INT *, TIME_INT *,
+                unsigned long *, unsigned long *,
+                char ***, rrd_value_t **);
+@@ -57,7 +60,7 @@ struct rrd_time_value {
+ char *parsetime(char *spec, struct rrd_time_value *ptv);
+ /* END parsetime.h */
+-int proc_start_end (struct rrd_time_value *,  struct rrd_time_value *, time_t *, time_t *);
++int proc_start_end (struct rrd_time_value *,  struct rrd_time_value *, TIME_INT *, TIME_INT *);
+ /* HELPER FUNCTIONS */
+ void rrd_set_error(char *,...);
+--- a/src/rrd_last.c
++++ b/src/rrd_last.c
+@@ -8,11 +8,11 @@
+ #include "rrd_tool.h"
+-time_t
++TIME_INT
+ rrd_last(int argc, char **argv)
+ {
+     FILE      *in_file;
+-    time_t       lastup;
++    TIME_INT       lastup;
+     rrd_t      rrd;
+--- a/src/rrd_tool.c
++++ b/src/rrd_tool.c
+@@ -343,7 +343,7 @@ int HandleInputLine(int argc, char **arg
+     else if (strcmp("update", argv[1]) == 0)
+       rrd_update(argc-1, &argv[1]);
+     else if (strcmp("fetch", argv[1]) == 0) {
+-      time_t        start,end;
++      TIME_INT        start,end;
+       unsigned long step, ds_cnt,i,ii;
+       rrd_value_t   *data,*datai;
+       char          **ds_namv;
+@@ -367,7 +367,7 @@ int HandleInputLine(int argc, char **arg
+     } else if (strcmp("xport", argv[1]) == 0) {
+       int xxsize;
+       int j;
+-      time_t        i,start,end;
++      TIME_INT        i,start,end;
+       unsigned long step, col_cnt,row_cnt;
+       rrd_value_t   *data,*ptr;
+       char          **legend_v;
+--- a/src/rrd_tool.h
++++ b/src/rrd_tool.h
+@@ -134,7 +134,7 @@ void gdImagePng(gdImagePtr im, FILE *out
+ int rrd_create_fn(char *file_name, rrd_t *rrd);
+ int rrd_fetch_fn(char *filename, enum cf_en cf_idx,
+-               time_t *start,time_t *end,
++               TIME_INT *start,TIME_INT *end,
+                unsigned long *step,
+                unsigned long *ds_cnt,
+                char        ***ds_namv,
+--- a/src/rrd_update.c
++++ b/src/rrd_update.c
+@@ -91,7 +91,7 @@ rrd_update(int argc, char **argv)
+     FILE             *rrd_file;
+     rrd_t            rrd;
+-    time_t           current_time = time(NULL);
++    TIME_INT           current_time = (TIME_INT) time(NULL);
+     char             **updvals;
+     int              wrote_to_file = 0;
+     char             *template = NULL;          
+@@ -273,7 +273,7 @@ rrd_update(int argc, char **argv)
+       
+         /* get the time from the reading ... handle N */
+       if (strcmp(updvals[0],"N")==0){
+-          current_time = time(NULL);
++          current_time = (TIME_INT) time(NULL);
+       } else {
+             errno = 0;
+           current_time = strtol(updvals[0],&endptr,10);
+--- a/src/rrd_xport.c
++++ b/src/rrd_xport.c
+@@ -15,12 +15,12 @@
+ int rrd_xport(int, char **, int *,
+-            time_t *, time_t *,
++            TIME_INT *, TIME_INT *,
+             unsigned long *, unsigned long *,
+             char ***, rrd_value_t **);
+ int rrd_xport_fn(image_desc_t *,
+-               time_t *, time_t *,
++               TIME_INT *, TIME_INT *,
+                unsigned long *, unsigned long *,
+                char ***, rrd_value_t **);
+@@ -29,8 +29,8 @@ int rrd_xport_fn(image_desc_t *,
+ /* mostly rrd_graph(), just pushed a bit here and stretched a bit there */    
+ int 
+ rrd_xport(int argc, char **argv, int *xsize,
+-        time_t         *start,
+-        time_t         *end,        /* which time frame do you want ?
++        TIME_INT         *start,
++        TIME_INT         *end,        /* which time frame do you want ?
+                                      * will be changed to represent reality */
+         unsigned long  *step,       /* which stepsize do you want? 
+                                      * will be changed to represent reality */
+@@ -42,7 +42,7 @@ rrd_xport(int argc, char **argv, int *xs
+     image_desc_t   im;
+     int            i;
+     long           long_tmp;
+-    time_t       start_tmp=0,end_tmp=0;
++    TIME_INT     start_tmp=0,end_tmp=0;
+     char           symname[100];
+     long           scancount;
+     struct rrd_time_value start_tv, end_tv;
+@@ -286,8 +286,8 @@ rrd_xport(int argc, char **argv, int *xs
+ int
+ rrd_xport_fn(image_desc_t *im,
+-           time_t         *start,
+-           time_t         *end,        /* which time frame do you want ?
++           TIME_INT         *start,
++           TIME_INT         *end,        /* which time frame do you want ?
+                                         * will be changed to represent reality */
+            unsigned long  *step,       /* which stepsize do you want? 
+                                         * will be changed to represent reality */
+@@ -307,9 +307,9 @@ rrd_xport_fn(image_desc_t *im,
+     char **legend_list;
+     int ii = 0;
+-    time_t start_tmp = 0;
+-    time_t end_tmp = 0;
+-    time_t curr_ts;
++    TIME_INT start_tmp = 0;
++    TIME_INT end_tmp = 0;
++    TIME_INT curr_ts;
+     unsigned long step_tmp = 1;
+     int dataIndex;
+--- a/contrib/trytime/trytime.c
++++ b/contrib/trytime/trytime.c
+@@ -24,7 +24,8 @@ int main ( int ac, char **av )
+   int option_index = 0;
+   int opt;
+    
+-  time_t start_tmp, end_tmp, Now = time(NULL);
++  time_t start_time, end_time, Now = time(NULL);
++  TIME_INT start_tmp, end_tmp;
+   char tim_b[200];
+   
+   struct rrd_time_value start_tv, end_tv;
+@@ -80,7 +81,8 @@ int main ( int ac, char **av )
+       exit(1);
+   }
+   
+-  strftime(tim_b,100,"%c %Z",localtime(&start_tmp));
++  start_time = (time_t) start_tmp;
++  strftime(tim_b,100,"%c %Z",localtime(&start_time));
+   if( *soption )
+       printf( "Start time was specified as: '%s',\n"
+             "for me this means: %s (or %ld sec since epoch)\n\n", 
+@@ -90,7 +92,8 @@ int main ( int ac, char **av )
+             "for me this means: %s (or %ld sec since epoch)\n\n",
+             tim_b, start_tmp );
+     
+-  strftime(tim_b,100,"%c %Z",localtime(&end_tmp));
++  end_time = (time_t) end_tmp;
++  strftime(tim_b,100,"%c %Z",localtime(&end_time));
+   if( *eoption )
+       printf( "End time was specified as: '%s',\n"
+             "for me this means: %s (or %ld sec since epoch)\n",