[rrd-developers] problems with rrd_update() when updating rrd file

Tomáš Macek maca02 at atlas.cz
Tue Jun 1 14:42:48 CEST 2010


Hm, so rrd_clear_error() did the job. I inserted call of rrd_clear_error()  
before each rrd_*() calling and program works (see the line with  
"attention" comment). I've tried to simplify things as possible and here  
it is, maybe this will help to anyone else to solve his problems... Am I  
doing everything right now?

Tomas

-------------------------

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
#include <rrd.h>

void rrd_cmd(char *cmdstr) {
     char *strptr = NULL, *str = NULL;
     char *argv[64];
     int error = 0, i = 0;
     rrd_info_t *it = NULL;
     char rrdcmd[2048] = "";

     snprintf(rrdcmd, 2048, "%s", cmdstr);

     i = 0;

     /* memset update, create *argv[] */
     memset(argv, 0, 64 * sizeof(char *));

     for (strptr = rrdcmd; strptr != NULL;) {
         while ((str = strsep(&strptr, " ")) != NULL && str != '\0') {
            argv[i] = str;
            i++;
         }
     }

     rrd_clear_error(); /* attention!!! */
     it = rrd_info(i, argv);
     rrd_info_free(it);
     rrd_clear_error();  /* attention!!! */
     error = rrd_update(i, argv);
     if (error == -1) {
         printf("Error: RRD_UPDATE command: %s\n", rrd_get_error());
         rrd_clear_error();
     }
}

int update_rrd_cmd(char *rrd_name, char *ds_string, char *n_value_string,  
char *buff, int n) {
     memset(buff, 0, n);
     snprintf(buff, n, "update %s --template %s %s", rrd_name, ds_string,  
n_value_string);
     printf("%s: buff = %s\n", __FUNCTION__, buff);
     return 0;
}

int main(void) {
     char buff[2048] = "";
     update_rrd_cmd("./testfile.rrd", "ds0:ds1", "N:123:456", buff, 2048);
     rrd_cmd(buff);
     return 0;
}


On Tue, 01 Jun 2010 08:20:18 +0200, Tomáš Macek <maca02 at atlas.cz> wrote:

> Hello again,
> this problem is present since 1.4.0. I know it, because I've tried every
> version since 1.3.8 (works), through 1.3.9 (works), 1.4.0 - 1.4.3 does  
> not
> work at all with syntax error as described below. Everytime I compiled  
> and
> tried the same source code and linked with the proper library version.
> What has changed in the API of rrd_update() in 1.4.0? I really don't
> understand what I'm doing wrong. Any hints/help appreciated, looking at
> the CHANGES file did not helped me.
>
> Tomas
>
>
> On Thu, 20 May 2010 12:28:25 +0200, Tomáš Macek <maca02 at atlas.cz> wrote:
>
>> Hi, I have RHEL 5.5 with rrdtool 1.4.3 and I'm using it's API for
>> updating
>> rrd files. The problem is that when I pass arguments to the rrd_update()
>> function, it always returns error saying "Usage: rrdtool update  
>> [--daemon
>> <addr>] <file>". The same code worked really fine on 1.3.8. I looked at
>> the CHANGELOG file and there was some line saying, that something has
>> changed on checking optarg parameters.
>>
>> This is from gdb just before I pass the array into rrd_update()  
>> function:
>> -----------
>> Breakpoint 2, rrd_cmd (rrdcmd=0x634dc0 "update", cmd=1, di_cnt=2) at
>> rrd_op.c:215
>> 215                 error = rrd_update(i, argv);
>> (gdb) p argv
>> $26 = {0x634dc0 "update", 0x634dc7 "cac_ap2aeth.rrd",
>>    0x634e06 "--template", 0x634e11 "ds0:ds1", 0x634e19
>> "N:2325779922:3582706806", 0x0 <repeats 59 times>}
>> -----------
>>
>> and after program goes thourgh rrd_update(), the argv array looks like
>> this:
>> -----------
>> 216                 if (error == -1) {
>> (gdb) p argv
>> $28 = {0x634dc0 "update", 0x634e06 "--template", 0x634e11 "ds0:ds1",
>>    0x634dc7 "cac_ap2aeth.rrd", 0x634e19 "N:2325779922:3582706806",
>>    0x0 <repeats 59 times>}
>> -----------
>>
>> Please, notice the replaced arguments after rrd_update()... I don't  
>> know,
>> what I'm doing wrong, the code under 1.3.8 library worked just fine and
>> according to the man rrdupdate the arguments are fine. Hope I'm not
>> missing something stupid, but I was not able to find anything strange in
>> rrd_update() function in the rrd_update.c.
>> Let me know, if you need something more from me, thank you
>>
>> Regards, Tomas
>>
>> _______________________________________________
>> rrd-developers mailing list
>> rrd-developers at lists.oetiker.ch
>> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
>
> _______________________________________________
> rrd-developers mailing list
> rrd-developers at lists.oetiker.ch
> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers



More information about the rrd-developers mailing list