Patch for read only access for i386 on x86_64 and x86_64 on i386

Camilo Viecco <[email protected]>
Newsgroups gmane.comp.db.rrdtool.devel
Message-ID <[email protected]>
Hello list

At work we have a large archive rrdfiles crerated on i386 and we need to
use x86_64 on some newer machines. Long story short  I needed to access
both 64 bit data from 32 bit hosts and vice versa. Since the common data
format is still pending I created this patches to solve my problem. I am
posting to the list with the hope thay are useful.

these are intel specific patches I know they are of limited use. Next
step is to have updates working correctly on both architectures.


Camilo Viecco

_______________________________________________
rrd-developers mailing list
[email protected]
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
multifile.diff (text/x-diff, 31.5 KB)
Only in rrdtool-1.4.2/bindings/lua: .deps
Only in rrdtool-1.4.2/bindings/lua: Makefile
Only in rrdtool-1.4.2/bindings: Makefile
Only in rrdtool-1.4.2/bindings/perl-piped: Makefile.old
Only in rrdtool-1.4.2/bindings/perl-shared: Makefile.old
Only in rrdtool-1.4.2/bindings/ruby: mkmf.log
Only in rrdtool-1.4.2/bindings/tcl: ifOctets.tcl
Only in rrdtool-1.4.2/bindings/tcl: Makefile
Only in rrdtool-1.4.2/bindings/tcl: pkgIndex.tcl
Only in rrdtool-1.4.2/bindings/tcl: tclrrd1.4.2.so
Only in rrdtool-1.4.2: config.h
Only in rrdtool-1.4.2: config.log
Only in rrdtool-1.4.2: config.status
Only in rrdtool-1.4.2/doc: Makefile
Only in rrdtool-1.4.2/doc: pod2htmd.tmp
Only in rrdtool-1.4.2/doc: pod2htmi.tmp
Only in rrdtool-1.4.2/doc: RRDp.pod
Only in rrdtool-1.4.2/doc: RRDs.pod
Only in rrdtool-1.4.2/examples: 4charts.pl
Only in rrdtool-1.4.2/examples: bigtops.pl
Only in rrdtool-1.4.2/examples: cgi-demo.cgi
Only in rrdtool-1.4.2/examples: Makefile
Only in rrdtool-1.4.2/examples: minmax.pl
Only in rrdtool-1.4.2/examples: perftest.pl
Only in rrdtool-1.4.2/examples: piped-demo.pl
Only in rrdtool-1.4.2/examples/rrdcached: Makefile
Only in rrdtool-1.4.2/examples: shared-demo.pl
Only in rrdtool-1.4.2/examples: stripes.pl
Only in rrdtool-1.4.2/intl: Makefile
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/libtool rrdtool-1.4.2/libtool
--- rrdtool-1.4.2-orig/libtool	2009-11-15 11:55:33.000000000 +0000
+++ rrdtool-1.4.2/libtool	2010-03-01 16:32:52.000000000 +0000
@@ -1,8 +1,8 @@
-#! /bin/bash
+#! /bin/sh
 
 # libtool - Provide generalized library-building support services.
 # Generated automatically by config.status (rrdtool) 1.4.2
-# Libtool was configured on host froburg:
+# Libtool was configured on host gmoc-dev.grnoc.iu.edu:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 #
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
@@ -56,12 +56,12 @@
 
 # The host system.
 host_alias=
-host=x86_64-unknown-linux-gnu
+host=i686-pc-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=x86_64-unknown-linux-gnu
+build=i686-pc-linux-gnu
 build_os=linux-gnu
 
 # A sed program that does not truncate output.
@@ -86,7 +86,7 @@
 LN_S="ln -s"
 
 # What is the maximum length of a command?
-max_cmd_len=1572864
+max_cmd_len=98304
 
 # Object file suffix (normally "o").
 objext=o
@@ -150,7 +150,7 @@
 objdir=.libs
 
 # Shell to use when invoking shell scripts.
-SHELL="/bin/bash"
+SHELL="/bin/sh"
 
 # An echo program that does not interpret backslashes.
 ECHO="echo"
@@ -234,10 +234,10 @@
 hardcode_into_libs=yes
 
 # Compile-time system search path for libraries.
-sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.3.3 /usr/lib /lib"
+sys_lib_search_path_spec="/usr/lib/gcc/i386-redhat-linux/4.1.2 /usr/lib /lib"
 
 # Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib32/alsa-lib /usr/lib/alsa-lib /usr/local/lib /opt/SUNWut/lib /usr/pack/srss-4.1-mo/usr/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/qt-3.3/lib "
 
 # Whether dlopen is supported.
 dlopen_support=unknown
@@ -254,7 +254,7 @@
 
 
 # The linker used to build libraries.
-LD="/usr/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
 
 # Commands used to build an old-style archive.
 old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib"
Only in rrdtool-1.4.2: Makefile
Only in rrdtool-1.4.2: mmaptestAfHpZh
Only in rrdtool-1.4.2/po: Makefile
Only in rrdtool-1.4.2/po: Makefile.in
Only in rrdtool-1.4.2/po: POTFILES
Only in rrdtool-1.4.2/po: remove-potcdate.sed
Only in rrdtool-1.4.2: rrd_config.h
Only in rrdtool-1.4.2/src: .deps
Only in rrdtool-1.4.2/src: librrd.pc
Only in rrdtool-1.4.2/src: librrd.sym
Only in rrdtool-1.4.2/src: librrd.sym.in
Only in rrdtool-1.4.2/src: Makefile
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/src/rrd_format.h rrdtool-1.4.2/src/rrd_format.h
--- rrdtool-1.4.2-orig/src/rrd_format.h	2009-11-15 11:54:23.000000000 +0000
+++ rrdtool-1.4.2/src/rrd_format.h	2010-03-01 15:44:53.000000000 +0000
@@ -20,6 +20,7 @@
 #endif
 
 #include "rrd.h"
+#include <stdint.h>
 
 /*****************************************************************************
  * put this in your /usr/lib/magic file (/etc/magic on HPUX)
@@ -37,11 +38,21 @@
 #define RRD_VERSION3  "0003"
 #define FLOAT_COOKIE  8.642135E130
 
+#define MULTI_FORMAT
+
 typedef union unival {
-    unsigned long u_cnt;
+    uint64_t u_cnt_64;
+    uint32_t u_cnt_32;
+    unsigned long u_cnt;   
     rrd_value_t u_val;
 } unival;
 
+typedef enum format_compat_t { FILE_NATIVE = 0,  /* data source types available */
+    FILE_i386,
+    FILE_x86_64,
+    FILE_UNKNOWN
+}format_compat_t;
+
 
 /****************************************************************************
  * The RRD Database Structure
@@ -130,6 +141,51 @@
 } stat_head_t;
 
 
+typedef struct stat_head_32_t {
+
+    /* Data Base Identification Section ** */
+    char      cookie[4];    /* RRD */
+    char      version[8];   /* version of the format */
+    double    float_cookie __attribute((packed)) ; /* is it the correct double
+                             * representation ?  */
+
+    /* Data Base Structure Definition **** */
+    uint32_t ds_cnt __attribute((packed));
+                             /* how many different ds provide
+                             * input to the rrd */
+    uint32_t rra_cnt __attribute((packed));
+                              /* how many rras will be maintained
+                             * in the rrd */
+    uint32_t  pdp_step __attribute((packed)) ;
+                             /* pdp interval in seconds */
+
+    unival    par[10] __attribute((packed));  /* global parameters ... unused
+                           at the moment */
+} stat_head_32_t;
+
+typedef struct stat_head_64_t {
+
+    /* Data Base Identification Section ** */
+    char      cookie[4];    /* RRD */
+    char      version[12];   /* version of the format */
+    double    float_cookie __attribute((packed)) ; /* is it the correct double
+                             * representation ?  */
+
+    /* Data Base Structure Definition **** */
+    uint64_t ds_cnt __attribute((packed));
+                             /* how many different ds provide
+                             * input to the rrd */
+    uint64_t rra_cnt __attribute((packed));
+                              /* how many rras will be maintained
+                             * in the rrd */
+    uint64_t  pdp_step __attribute((packed)) ;
+                             /* pdp interval in seconds */
+
+    unival    par[10] __attribute((packed));  /* global parameters ... unused
+                           at the moment */
+} stat_head_64_t;
+
+
 /****************************************************************************
  * POS 2: ds_def_t  (* ds_cnt)                        Data Source definitions
  ****************************************************************************/
@@ -266,6 +322,27 @@
 
 } rra_def_t;
 
+typedef struct rra_def_32_t {
+    char      cf_nam[CF_NAM_SIZE] ;  /* consolidation function (null term) */
+    uint32_t row_cnt __attribute((packed))  ;  /* number of entries in the store */
+    uint32_t pdp_cnt __attribute((packed))  ;  /* how many primary data points are
+                             * required for a consolidated data
+                             * point?*/
+    unival    par[MAX_RRA_PAR_EN] __attribute((packed)) ;  /* index see rra_param_en */
+
+} rra_def_32_t;
+
+typedef struct rra_def_64_t {
+    char      cf_nam[CF_NAM_SIZE] ;  /* consolidation function (null term) */
+    uint8_t   align[4];
+    uint64_t row_cnt __attribute((packed))  ;  /* number of entries in the store */
+    uint64_t pdp_cnt __attribute((packed))  ;  /* how many primary data points are
+                             * required for a consolidated data
+                             * point?*/
+    unival    par[MAX_RRA_PAR_EN] __attribute((packed)) ;  /* index see rra_param_en */
+
+} rra_def_64_t;
+
 
 /****************************************************************************
  ****************************************************************************
@@ -285,6 +362,22 @@
 } live_head_t;
 
 
+
+typedef struct live_head_32_t {
+    uint32_t    last_up __attribute((packed)) ;  /* when was rrd last updated */
+    uint32_t      last_up_usec __attribute((packed)); /* micro seconds part of the
+                               update timestamp. Always >= 0 */
+} live_head_32_t;
+
+
+typedef struct live_head_64_t {
+    uint64_t    last_up __attribute((packed)) ;  /* when was rrd last updated */
+    uint64_t      last_up_usec __attribute((packed)); /* micro seconds part of the
+                               update timestamp. Always >= 0 */
+} live_head_64_t;
+
+
+
 /****************************************************************************
  * POS 5: pdp_prep_t  (* ds_cnt)                     here we prepare the pdps 
  ****************************************************************************/
@@ -385,6 +478,14 @@
     unsigned long cur_row;  /* current row in the rra */
 } rra_ptr_t;
 
+typedef struct rra_ptr_32_t {
+    uint32_t cur_row;  /* current row in the rra */
+} rra_ptr_32_t;
+
+typedef struct rra_ptr_64_t {
+    uint64_t cur_row;  /* current row in the rra */
+} rra_ptr_64_t;
+
 
 /****************************************************************************
  ****************************************************************************
@@ -392,6 +493,7 @@
  ****************************************************************************
  ****************************************************************************/
 typedef struct rrd_t {
+    format_compat_t compat; /* the on disk representation*/
     stat_head_t *stat_head; /* the static header */
     ds_def_t *ds_def;   /* list of data source definitions */
     rra_def_t *rra_def; /* list of round robin archive def */
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/src/rrd_open.c rrdtool-1.4.2/src/rrd_open.c
--- rrdtool-1.4.2-orig/src/rrd_open.c	2009-11-15 11:54:23.000000000 +0000
+++ rrdtool-1.4.2/src/rrd_open.c	2010-03-01 16:12:31.000000000 +0000
@@ -80,6 +80,8 @@
 #endif
 #endif
 
+
+
 /* Open a database file, return its header and an open filehandle,
  * positioned to the first cdp in the first rra.
  * In the error path of rrd_open, only rrd_free(&rrd) has to be called
@@ -99,6 +101,22 @@
     int       flags = 0;
     int       version;
 
+
+    format_compat_t file_format=FILE_NATIVE;
+    stat_head_64_t *stat_head_64;
+    stat_head_32_t *stat_head_32;
+    rra_def_32_t   *rra_def_32;
+    rra_def_64_t   *rra_def_64;
+    live_head_32_t *live_head_32;
+    live_head_64_t *live_head_64;
+    rra_ptr_32_t   *rra_ptr_32;
+    rra_ptr_64_t   *rra_ptr_64;
+ 
+#define TRANS_BUF_SIZE 12288
+    char trans_buf[TRANS_BUF_SIZE];
+
+
+
 #ifdef HAVE_MMAP
     ssize_t   _page_size = sysconf(_SC_PAGESIZE);
     char     *data = MAP_FAILED;
@@ -273,6 +291,115 @@
     }
 #endif
 
+#ifdef MULTI_FORMAT
+    if (RRD_READONLY == (rdwr & RRD_READONLY) || 1==1 ){
+        /*try native first*/
+#ifdef DEBUG_MF
+        fprintf(stderr,"trying multi-format\n");
+#endif
+        
+        __rrd_read(rrd->stat_head, stat_head_t,
+               1);
+
+        /* lets do some test if we are on track ... */
+        if (memcmp(rrd->stat_head->cookie, RRD_COOKIE, sizeof(RRD_COOKIE)) != 0) {
+            rrd_set_error("'%s' is not an RRD file", file_name);
+            goto out_nullify_head;
+        }
+        file_format=FILE_NATIVE;
+        rrd->compat=FILE_NATIVE;
+        if (rrd->stat_head->float_cookie != FLOAT_COOKIE) {
+            //fprintf(stderr,"file=%f cookie=%f\n",rrd->stat_head->float_cookie,FLOAT_COOKIE);
+            //fprintf(stderr,"file(inhex)=%u\n",(unsigned long ) rrd->stat_head->float_cookie);
+//rrd_set_error("This RRD was created on another architecture");
+            //rrd_set_error("This RRD was created on another architecture");
+#ifndef HAVE_MMAP
+            lseek(rrd_file->fd,0,SEEK_SET);
+            offset=0;
+#endif
+            offset=0;
+            /*try 32bit arch*/
+            rrd->stat_head=malloc(sizeof(stat_head_64_t));
+            if(NULL==rrd->stat_head){
+                goto out_nullify_head;
+            }
+            stat_head_32=(stat_head_32_t *)trans_buf;
+            stat_head_64=(stat_head_64_t *)trans_buf;
+            __rrd_read(stat_head_32, stat_head_32_t,
+               1);
+
+            //convert to native(32)
+            memcpy(rrd->stat_head->cookie,stat_head_32->cookie,4);
+            memcpy(rrd->stat_head->version,stat_head_32->version,5);
+            rrd->stat_head->float_cookie=stat_head_32->float_cookie;
+            rrd->stat_head->ds_cnt=stat_head_32->ds_cnt;
+            rrd->stat_head->rra_cnt=stat_head_32->rra_cnt;
+            rrd->stat_head->pdp_step=stat_head_32->pdp_step;
+            memcpy( rrd->stat_head->par, stat_head_32->par, sizeof(unival)*10);
+                        
+
+            if (rrd->stat_head->float_cookie == FLOAT_COOKIE) {
+                file_format=FILE_i386;
+                rrd->compat=FILE_i386;
+                //fprintf(stderr,"is 32!\n"); 
+
+            }
+            else{
+                //try 64
+#ifndef HAVE_MMAP
+                lseek(rrd_file->fd,0,SEEK_SET);
+                offset=0;
+#endif
+                offset=0;
+
+
+                __rrd_read(stat_head_64, stat_head_64_t,
+                1);
+                rrd->stat_head->float_cookie=stat_head_64->float_cookie;
+                rrd->stat_head->ds_cnt=stat_head_64->ds_cnt;
+                rrd->stat_head->rra_cnt=stat_head_64->rra_cnt;
+                rrd->stat_head->pdp_step=stat_head_64->pdp_step;
+                memcpy( rrd->stat_head->par, stat_head_64->par, sizeof(unival)*10);
+                if (rrd->stat_head->float_cookie == FLOAT_COOKIE) {
+                     file_format=FILE_x86_64;
+                     rrd->compat=FILE_x86_64;
+
+                }
+                else{
+
+                    rrd_set_error("This RRD was created with an incompatible architecture/compiler");
+                    goto out_nullify_head;
+
+
+                }              
+ 
+            }
+        }
+
+    }
+    else{
+       /*do native the native branch*/
+
+        __rrd_read(rrd->stat_head, stat_head_t,
+               1);
+
+        /* lets do some test if we are on track ... */
+        if (memcmp(rrd->stat_head->cookie, RRD_COOKIE, sizeof(RRD_COOKIE)) != 0) {
+            rrd_set_error("'%s' is not an RRD file", file_name);
+            goto out_nullify_head;
+        }
+
+        if (rrd->stat_head->float_cookie != FLOAT_COOKIE) {
+            //fprintf(stderr,"file=%f cookie=%f\n",rrd->stat_head->float_cookie,FLOAT_COOKIE);
+            //fprintf(stderr,"file(inhex)=%u\n",(unsigned long ) rrd->stat_head->float_cookie);
+
+            rrd_set_error("This RRD was created on another architecture");
+            goto out_nullify_head;
+        }
+
+    }
+#else
+
     __rrd_read(rrd->stat_head, stat_head_t,
                1);
 
@@ -283,10 +410,20 @@
     }
 
     if (rrd->stat_head->float_cookie != FLOAT_COOKIE) {
+        fprintf(stderr,"file=%f cookie=%f\n",rrd->stat_head->float_cookie,FLOAT_COOKIE);
+        fprintf(stderr,"file(inhex)=%u\n",(unsigned long ) rrd->stat_head->float_cookie);
+        
         rrd_set_error("This RRD was created on another architecture");
         goto out_nullify_head;
     }
 
+#endif
+
+    //cviecco
+    //fprintf(stderr, "ds_cnt=%u \n", rrd->stat_head->ds_cnt);
+    //fprintf(stderr, "rra_cnt=%u \n", rrd->stat_head->rra_cnt);
+    //fprintf(stderr, "pdp_step=%u \n", rrd->stat_head->pdp_step);
+
     version = atoi(rrd->stat_head->version);
 
     if (version > atoi(RRD_VERSION)) {
@@ -299,6 +436,8 @@
     madvise(data + PAGE_START(offset),
             sizeof(ds_def_t) * rrd->stat_head->ds_cnt, MADV_WILLNEED);
 #endif
+     
+    //wow this one if platform independent! 
     __rrd_read(rrd->ds_def, ds_def_t,
                rrd->stat_head->ds_cnt);
 
@@ -307,11 +446,67 @@
     madvise(data + PAGE_START(offset),
             sizeof(rra_def_t) * rrd->stat_head->rra_cnt, MADV_WILLNEED);
 #endif
-    __rrd_read(rrd->rra_def, rra_def_t,
-               rrd->stat_head->rra_cnt);
 
+    switch(file_format){
+        case FILE_NATIVE:
+            __rrd_read(rrd->rra_def, rra_def_t,
+                       rrd->stat_head->rra_cnt);
+            break;
+        case FILE_i386:
+              rra_def_32=(rra_def_32_t *) trans_buf;
+              rrd->rra_def=malloc(sizeof(rra_def_t)*rrd->stat_head->rra_cnt);
+              if(NULL==rrd->rra_def){
+                  goto out_nullify_head;
+              }
+              __rrd_read(rra_def_32, rra_def_32_t,
+                       rrd->stat_head->rra_cnt);
+              //now convert to native
+              {
+                  uint32_t i;
+                  for(i=0;i<rrd->stat_head->rra_cnt;i++){
+                     memcpy(rrd->rra_def[i].cf_nam,rra_def_32[i].cf_nam,
+                            CF_NAM_SIZE);
+                     rrd->rra_def[i].row_cnt=rra_def_32[i].row_cnt;
+                     rrd->rra_def[i].pdp_cnt=rra_def_32[i].pdp_cnt;
+                     memcpy(rrd->rra_def[i].par,rra_def_32[i].par,sizeof(unival)*MAX_RRA_PAR_EN);
+                  }
+              }
+              break;
+
+        case FILE_x86_64:
+              rra_def_64=(rra_def_64_t *) trans_buf;
+              rrd->rra_def=malloc(sizeof(rra_def_t)*rrd->stat_head->rra_cnt);
+              if(NULL==rrd->rra_def){
+                  goto out_nullify_head;
+              }
+              __rrd_read(rra_def_64, rra_def_64_t,
+                       rrd->stat_head->rra_cnt);
+              //now convert to native
+              {
+                  uint32_t i;
+                  for(i=0;i<rrd->stat_head->rra_cnt;i++){
+                     memcpy(rrd->rra_def[i].cf_nam,rra_def_64[i].cf_nam,
+                            CF_NAM_SIZE);
+                     rrd->rra_def[i].row_cnt=rra_def_64[i].row_cnt;
+                     rrd->rra_def[i].pdp_cnt=rra_def_64[i].pdp_cnt;
+                     //cviecco
+                     //fprintf(stderr,"rra[%i] '%s' num_rows=%lu pdp_cnt%lu\n",i,rrd->rra_def[i].cf_nam,rrd->rra_def[i].row_cnt,rrd->rra_def[i].pdp_cnt);
+                     //fprintf(stderr,"read rra[%i] '%s' num_rows=%llx pdp_cnt%llx\n",i,rra_def_64[i].cf_nam,rra_def_64[i].row_cnt,rra_def_64[i].pdp_cnt);
+
+                     memcpy(rrd->rra_def[i].par,rra_def_64[i].par,sizeof(unival)*MAX_RRA_PAR_EN);
+                  }
+              }
+              break;
+        default:
+               fprintf(stderr,"cannot handle file!\n");
+               goto out_nullify_head;
+    }
     /* handle different format for the live_head */
     if (version < 3) {
+        if(file_format!=FILE_NATIVE){
+             fprintf(stderr,"cannot handle file!, non native low version\n");
+                 goto out_nullify_head;
+        }
         rrd->live_head = (live_head_t *) malloc(sizeof(live_head_t));
         if (rrd->live_head == NULL) {
             rrd_set_error("live_head_t malloc");
@@ -332,15 +527,97 @@
         madvise(data + PAGE_START(offset),
                 sizeof(live_head_t), MADV_WILLNEED);
 #endif
-        __rrd_read(rrd->live_head, live_head_t,
-                   1);
+        switch(file_format){
+            case FILE_NATIVE:
+                __rrd_read(rrd->live_head, live_head_t,
+                           1);
+                break;
+            case FILE_i386:
+                rrd->live_head = (live_head_t *) malloc(sizeof(live_head_t));
+                if (rrd->live_head == NULL) {
+                   rrd_set_error("live_head_t malloc");
+                   goto out_close;
+                }
+                live_head_32=(live_head_32_t *) trans_buf;
+                __rrd_read(live_head_32, live_head_32_t,
+                           1);
+                //convert
+                rrd->live_head->last_up=live_head_32->last_up;
+                rrd->live_head->last_up_usec=live_head_32->last_up_usec;
+                break;
+
+            case FILE_x86_64:
+                rrd->live_head = (live_head_t *) malloc(sizeof(live_head_t));
+                if (rrd->live_head == NULL) {
+                   rrd_set_error("live_head_t malloc");
+                   goto out_close;
+                }
+                live_head_64=(live_head_64_t *) trans_buf;
+                __rrd_read(live_head_64, live_head_64_t,
+                           1);
+                //convert
+                rrd->live_head->last_up=(time_t)live_head_64->last_up;
+                rrd->live_head->last_up_usec= (long) live_head_64->last_up_usec;
+                break;
+
+            default:
+                 rrd_set_error("internal error (incompatible file format)");
+                 goto out_close;
+        }
     }
+    //These two require no conversion!
     __rrd_read(rrd->pdp_prep, pdp_prep_t,
                rrd->stat_head->ds_cnt);
     __rrd_read(rrd->cdp_prep, cdp_prep_t,
                rrd->stat_head->rra_cnt * rrd->stat_head->ds_cnt);
-    __rrd_read(rrd->rra_ptr, rra_ptr_t,
-               rrd->stat_head->rra_cnt);
+
+     
+    switch(file_format){
+        case FILE_NATIVE: 
+            __rrd_read(rrd->rra_ptr, rra_ptr_t,
+                       rrd->stat_head->rra_cnt);
+            break;  
+        case FILE_i386:
+            rrd->rra_ptr = (rra_ptr_t *) 
+                      malloc(sizeof(rra_ptr_t) *  rrd->stat_head->rra_cnt);
+            if (rrd->rra_ptr == NULL) {
+                   rrd_set_error("rra_ptr_t malloc");
+                   goto out_close;
+            }
+            rra_ptr_32=(rra_ptr_32_t *) trans_buf;
+            __rrd_read(rra_ptr_32, rra_ptr_32_t,
+                       rrd->stat_head->rra_cnt);
+            {
+                uint32_t i;
+                for(i=0;i<rrd->stat_head->rra_cnt;i++){
+                    rrd->rra_ptr[i].cur_row=rra_ptr_32[i].cur_row;   
+                }    
+            }
+            break;
+
+
+        case FILE_x86_64:
+            rrd->rra_ptr = (rra_ptr_t *)
+                      malloc(sizeof(rra_ptr_t) *  rrd->stat_head->rra_cnt);
+            if (rrd->rra_ptr == NULL) {
+                   rrd_set_error("rra_ptr_t malloc");
+                   goto out_close;
+            }
+            rra_ptr_64=(rra_ptr_64_t *) trans_buf;
+            __rrd_read(rra_ptr_64, rra_ptr_64_t,
+                       rrd->stat_head->rra_cnt);
+            {
+                uint32_t i;
+                for(i=0;i<rrd->stat_head->rra_cnt;i++){
+                    rrd->rra_ptr[i].cur_row=rra_ptr_64[i].cur_row;
+                }
+            }
+            break;
+    }
+
+    //cviecco
+    //fprintf(stderr,"last_up=%u\n", rrd->live_head->last_up);
+    //fprintf(stderr,"last_up_usec=%u\n", rrd->live_head->last_up_usec);
 
     rrd_file->header_len = offset;
     rrd_file->pos = offset;
@@ -358,6 +635,10 @@
       {
         rrd_set_error("'%s' is too small (should be %ld bytes)",
                       file_name, (long long) correct_len);
+        //cviecco
+        fprintf(stderr,"real_len=%u\n", rrd_file->file_len); 
+        fprintf(stderr,"header_len=%u\n", rrd_file->header_len);      
+
         goto out_nullify_head;
       }
     }
@@ -706,18 +987,15 @@
 
 /* free RRD header data.  */
 
-#ifdef HAVE_MMAP
 void rrd_free(
     rrd_t *rrd)
 {
+#ifdef HAVE_MMAP
     if (rrd->legacy_last_up) {  /* this gets set for version < 3 only */
         free(rrd->live_head);
     }
-}
+
 #else
-void rrd_free(
-    rrd_t *rrd)
-{
     free(rrd->live_head);
     free(rrd->stat_head);
     free(rrd->ds_def);
@@ -726,8 +1004,9 @@
     free(rrd->pdp_prep);
     free(rrd->cdp_prep);
     free(rrd->rrd_value);
-}
 #endif
+}
+
 
 
 /* routine used by external libraries to free memory allocated by
Only in rrdtool-1.4.2/src: rrd_open.c.orig
Only in rrdtool-1.4.2/src: rrd_open.c.rej
Only in rrdtool-1.4.2/src: .rrd_open.c.rej.swp
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/src/rrd_update.c rrdtool-1.4.2/src/rrd_update.c
--- rrdtool-1.4.2-orig/src/rrd_update.c	2009-11-15 11:54:23.000000000 +0000
+++ rrdtool-1.4.2/src/rrd_update.c	2010-01-28 16:04:10.000000000 +0000
@@ -271,12 +271,11 @@
     rrd_file_t *rrd_file,
     unsigned long rra_begin);
 
-#ifndef HAVE_MMAP
+
 static int write_changes_to_disk(
     rrd_t *rrd,
     rrd_file_t *rrd_file,
     int version);
-#endif
 
 /*
  * normalize time as returned by gettimeofday. usec part must
@@ -577,11 +576,11 @@
     if (rrd_test_error()) {
         goto err_free_structures;
     }
-#ifndef HAVE_MMAP
+
     if (write_changes_to_disk(&rrd, rrd_file, version) == -1) {
         goto err_free_structures;
     }
-#endif
+
 
     /* calling the smoothing code here guarantees at most one smoothing
      * operation per rrd_update call. Unfortunately, it is possible with bulk
@@ -2024,7 +2023,7 @@
     return 0;
 }
 
-#ifndef HAVE_MMAP
+
 /*
  * Flush changes to disk (unless we're using mmap)
  *
@@ -2035,52 +2034,138 @@
     rrd_file_t *rrd_file,
     int version)
 {
-    /* we just need to write back the live header portion now */
-    if (rrd_seek(rrd_file, (sizeof(stat_head_t)
-                            + sizeof(ds_def_t) * rrd->stat_head->ds_cnt
-                            + sizeof(rra_def_t) * rrd->stat_head->rra_cnt),
-                 SEEK_SET) != 0) {
-        rrd_set_error("seek rrd for live header writeback");
-        return -1;
+    live_head_32_t live_head_32;
+    live_head_64_t live_head_64;
+    rra_ptr_32_t *rra_ptr_32;
+    rra_ptr_64_t *rra_ptr_64;
+    int i;
+
+#ifdef HAVE_MMAP
+    if (FILE_NATIVE==rrd->compat){
+       return 0;
     }
-    if (version >= 3) {
-        if (rrd_write(rrd_file, rrd->live_head,
-                      sizeof(live_head_t) * 1) != sizeof(live_head_t) * 1) {
-            rrd_set_error("rrd_write live_head to rrd");
-            return -1;
-        }
-    } else {
-        if (rrd_write(rrd_file, rrd->legacy_last_up,
+#endif
+
+
+    switch(rrd->compat) {
+      
+        case FILE_NATIVE:
+
+
+
+            /* we just need to write back the live header portion now */
+            if (rrd_seek(rrd_file, (sizeof(stat_head_t)
+                                    + sizeof(ds_def_t) * rrd->stat_head->ds_cnt
+                                    + sizeof(rra_def_t) * rrd->stat_head->rra_cnt),
+                         SEEK_SET) != 0) {
+                rrd_set_error("seek rrd for live header writeback");
+                return -1;
+            }
+            if (version >= 3) {
+                 if (rrd_write(rrd_file, rrd->live_head,
+                           sizeof(live_head_t) * 1) != sizeof(live_head_t) * 1) {
+                 rrd_set_error("rrd_write live_head to rrd");
+                 return -1;
+                 }
+            } else {
+                  if (rrd_write(rrd_file, rrd->legacy_last_up,
                       sizeof(time_t) * 1) != sizeof(time_t) * 1) {
-            rrd_set_error("rrd_write live_head to rrd");
-            return -1;
-        }
-    }
+                    rrd_set_error("rrd_write live_head to rrd");
+                     return -1;
+                  }
+            }
 
 
-    if (rrd_write(rrd_file, rrd->pdp_prep,
+            if (rrd_write(rrd_file, rrd->pdp_prep,
                   sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)
-        != (ssize_t) (sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)) {
-        rrd_set_error("rrd_write pdp_prep to rrd");
-        return -1;
-    }
+                != (ssize_t) (sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)) {
+                rrd_set_error("rrd_write pdp_prep to rrd");
+                return -1;
+            }
+ 
+            if (rrd_write(rrd_file, rrd->cdp_prep,
+                          sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+                          rrd->stat_head->ds_cnt)
+                != (ssize_t) (sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+                rrd->stat_head->ds_cnt)) {
 
-    if (rrd_write(rrd_file, rrd->cdp_prep,
-                  sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
-                  rrd->stat_head->ds_cnt)
-        != (ssize_t) (sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
-                      rrd->stat_head->ds_cnt)) {
+                rrd_set_error("rrd_write cdp_prep to rrd");
+                return -1;
+            }
 
-        rrd_set_error("rrd_write cdp_prep to rrd");
-        return -1;
-    }
+            if (rrd_write(rrd_file, rrd->rra_ptr,
+                          sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)
+                != (ssize_t) (sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)) {
+                rrd_set_error("rrd_write rra_ptr to rrd");
+                return -1;
+            }
+            return 0;
 
-    if (rrd_write(rrd_file, rrd->rra_ptr,
-                  sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)
-        != (ssize_t) (sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)) {
-        rrd_set_error("rrd_write rra_ptr to rrd");
-        return -1;
+            break;
+        case FILE_i386:
+            ///we need to do some conversions and some mallocs too!
+            //step1 seek to the live head
+             if (rrd_seek(rrd_file, (sizeof(stat_head_32_t)
+                                    + sizeof(ds_def_t) * rrd->stat_head->ds_cnt
+                                    + sizeof(rra_def_32_t) * rrd->stat_head->rra_cnt),
+                         SEEK_SET) != 0) {
+                rrd_set_error("seek rrd for live header writeback");
+                return -1;
+            }
+            //step2 write the live head!
+            if(version<=2){
+                rrd_set_error("incompatible rrd version for arch");  
+                return -1;
+            }
+            live_head_32.last_up=rrd->live_head->last_up;
+            live_head_32.last_up_usec=rrd->live_head->last_up_usec;
+            if (rrd_write(rrd_file, &live_head_32,
+                           sizeof(live_head_32_t) * 1) != sizeof(live_head_32_t) * 1) {
+                 rrd_set_error("rrd_write live_head to rrd");
+                 return -1;
+            }
+            //step3 write the pdp_preps
+            if (rrd_write(rrd_file, rrd->pdp_prep,
+                  sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)
+                != (ssize_t) (sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)) {
+                rrd_set_error("rrd_write pdp_prep to rrd");
+                return -1;
+            }
+            //step4 write the cdp preps
+            if (rrd_write(rrd_file, rrd->cdp_prep,
+                          sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+                          rrd->stat_head->ds_cnt)
+                != (ssize_t) (sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+                rrd->stat_head->ds_cnt)) {
+
+                rrd_set_error("rrd_write cdp_prep to rrd");
+                return -1;
+            }
+            //step5 write the pointers!
+            rra_ptr_32 = (rra_ptr_32_t *)
+                      malloc(sizeof(rra_ptr_32_t) *  rrd->stat_head->rra_cnt);
+            if(NULL== rra_ptr_32){
+                rrd_set_error("cannot allocate rrd ptr");
+                return -1;
+            }         
+            for(i=0;i<rrd->stat_head->rra_cnt;i++){
+               rra_ptr_32[i].cur_row=rrd->rra_ptr[i].cur_row;
+            }
+ 
+               
+            if (rrd_write(rrd_file, rra_ptr_32,
+                          sizeof(rra_ptr_32_t) * rrd->stat_head->rra_cnt)
+                != (ssize_t) (sizeof(rra_ptr_32_t) * rrd->stat_head->rra_cnt)) {
+                rrd_set_error("rrd_write rra_ptr to rrd");
+                return -1;
+            }
+            free(rra_ptr_32);
+            return 0;
+            
+        default:
+            fprintf(stderr,"something went bad");
+            return -1;
+            break;  //just in case
     }
-    return 0;
 }
-#endif
+
Only in rrdtool-1.4.2/src: rrd_update.c.orig
Only in rrdtool-1.4.2: stamp-h1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.