Ooops! That was the problem, thank you! I nonsensely think that rrd_info() accepts the same array as rrd_update() - it's bad :-)
I replaced the call rrd_info(i, argv) by rrd_info(i, argv + 1) and it works without calling of rrd_clear_error() before each rrd_*() call. That's fine and it was my stupid mistake. I've also tried to replace it by rrd_info(i, argv[1]), but this leads to gcc warning and SIGSEGV. Are there any man pages about library API functions? I think about some like "man 2 stat" for example. I see none in source dir ./doc, the only manual with "rrd_info" is rrdthreads.1. There is also written, that "Always call "rrd_error_clear()" before any call to the library" so I've tried it in my program and it worked for me. I also think, that rrd_clear_error() could be called from inside of every rrd_*() function or not? And also prototypes in /usr/include/rrd.h could be a little bit more verbose, instead of "rrd_info(int, char *)" could be "rrd_info(int argc, char *filename)" or something. What do you think about it? But that's rather a question on Tobi... Best regards and thank you for help, Tomas On Wed, 02 Jun 2010 01:54:07 +0200, kevin brintnall <[email protected]> wrote: > Hi Tomas, > > I've discovered the problem... it's not coming from your call to > rrd_update > at all, but rather from your call to rrd_info. Without your test case it > would have been very difficult to find. > > Prior to r1504, rrd_info only accepted filenames as arguments. It simply > checked argc to ensure that it was large enough and then iterated over > the > argv array. In this case, you are passing arguments to it (--template) > that it does not understand. Thus, the error. The error message is > misleading because it uses argv[0], which you are passing as "update"... > Remove --template,etc and it will work just fine. > > The call to rrd_update returns -1 because rrd_test_error() fails due to > the > error message set by rrd_info. It's prudent to either handle or clear > the > RRD error after each call. > > A couple questions for Tobi... > > (1) should rrd_update_r() call rrd_clear_error() at the top? Its return > call depends on rrd_test_error(). Would it make sense to > save/clear/reset > the error? Not sure on this. > > (2) Should we expose rrd_info_r ? > > -kb > > On Tue, Jun 1, 2010 at 7:42 AM, Tomáš Macek <[email protected]> wrote: > >> 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 <[email protected]> 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 <[email protected]> >> 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 >> >> [email protected] >> >> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers >> > >> > _______________________________________________ >> > rrd-developers mailing list >> > [email protected] >> > https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers >> >> _______________________________________________ >> rrd-developers mailing list >> [email protected] >> https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers >> > > > _______________________________________________ rrd-developers mailing list [email protected] https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
