<br><br><div class="gmail_quote">On Wed, Jun 2, 2010 at 12:18 AM, Tobias Oetiker <span dir="ltr">&lt;<a href="mailto:tobi@oetiker.ch">tobi@oetiker.ch</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

Hi Kevin,<br>
<div class="im"><br>
Yesterday kevin brintnall wrote:<br>
<br>
&gt; A couple questions for Tobi...<br>
&gt;<br>
&gt; (1) should rrd_update_r() call rrd_clear_error() at the top?  Its return<br>
&gt; call depends on rrd_test_error().  Would it make sense to save/clear/reset<br>
&gt; the error?  Not sure on this.<br>
<br>
</div>well, the way the error flag is handled until now (theoretically)<br>
is, that whoever calls rrd_* functions has to rrd_clear_error prior to<br>
calling the function, and after calling the function the should<br>
check for errors ...<br>
<br>
this is modeled after errno(3) </blockquote><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
  For some system calls and library functions (e.g.,<br>
  getpriority(2)), -1 is a valid return on success.  In such cases,<br>
  a successful return can be distinguished from an error return by<br>
  setting errno to zero before the call, and then, if the call<br>
  returns a status that indicates that an error may have occurred,<br>
  checking to see if errno has a non-zero value.<br>
<br>
I did a quick grep for this in program/src and find that it is<br>
mostly true except for a few cases. So the behaviour is quite<br>
consistant but only just ...<br>
<br>
as for rrd_update (and some others) doing stuff with rrd_test_error<br>
internally, I guess this is the real culprit as this is not in line<br>
with the behaviour you get from errno ...<br>
<br>
so I guess the parts of code that do use rrd_test_error internally<br>
should &#39;push&#39; the prior state of rrd_error when they start working<br>
and at the very end &#39;pop&#39; it if no error has been set. <br></blockquote><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
does this make sense ?<br></blockquote><div><br>I understand what you&#39;re saying, but save/restore or push/pop would likely complicate the code.  As long as users of the API can think of it in terms of errno, it&#39;s probably best to leave it as-is?<br>

 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im"><br>
&gt; (2) Should we expose rrd_info_r ?<br>
<br>
</div>aehm ... this is already exposed I think.<br>
</blockquote><div><br><br>Quite right.. my mistake.<br><br>-kb<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">cheers<br>
tobi<br>
<div><div></div><div class="h5">&gt;<br>
&gt; -kb<br>
&gt;<br>
&gt; On Tue, Jun 1, 2010 at 7:42 AM, Tomáš Macek &lt;<a href="mailto:maca02@atlas.cz">maca02@atlas.cz</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; Hm, so rrd_clear_error() did the job. I inserted call of rrd_clear_error()<br>
&gt; &gt; before each rrd_*() calling and program works (see the line with<br>
&gt; &gt; &quot;attention&quot; comment). I&#39;ve tried to simplify things as possible and here<br>
&gt; &gt; it is, maybe this will help to anyone else to solve his problems... Am I<br>
&gt; &gt; doing everything right now?<br>
&gt; &gt;<br>
&gt; &gt; Tomas<br>
&gt; &gt;<br>
&gt; &gt; -------------------------<br>
&gt; &gt;<br>
&gt; &gt; #include &lt;stdio.h&gt;<br>
&gt; &gt; #include &lt;sys/types.h&gt;<br>
&gt; &gt; #include &lt;unistd.h&gt;<br>
&gt; &gt; #include &lt;stdlib.h&gt;<br>
&gt; &gt; #include &lt;stdarg.h&gt;<br>
&gt; &gt; #include &lt;rrd.h&gt;<br>
&gt; &gt;<br>
&gt; &gt; void rrd_cmd(char *cmdstr) {<br>
&gt; &gt;     char *strptr = NULL, *str = NULL;<br>
&gt; &gt;     char *argv[64];<br>
&gt; &gt;     int error = 0, i = 0;<br>
&gt; &gt;     rrd_info_t *it = NULL;<br>
&gt; &gt;     char rrdcmd[2048] = &quot;&quot;;<br>
&gt; &gt;<br>
&gt; &gt;     snprintf(rrdcmd, 2048, &quot;%s&quot;, cmdstr);<br>
&gt; &gt;<br>
&gt; &gt;     i = 0;<br>
&gt; &gt;<br>
&gt; &gt;     /* memset update, create *argv[] */<br>
&gt; &gt;     memset(argv, 0, 64 * sizeof(char *));<br>
&gt; &gt;<br>
&gt; &gt;     for (strptr = rrdcmd; strptr != NULL;) {<br>
&gt; &gt;         while ((str = strsep(&amp;strptr, &quot; &quot;)) != NULL &amp;&amp; str != &#39;\0&#39;) {<br>
&gt; &gt;            argv[i] = str;<br>
&gt; &gt;            i++;<br>
&gt; &gt;         }<br>
&gt; &gt;     }<br>
&gt; &gt;<br>
&gt; &gt;     rrd_clear_error(); /* attention!!! */<br>
&gt; &gt;     it = rrd_info(i, argv);<br>
&gt; &gt;     rrd_info_free(it);<br>
&gt; &gt;     rrd_clear_error();  /* attention!!! */<br>
&gt; &gt;      error = rrd_update(i, argv);<br>
&gt; &gt;      if (error == -1) {<br>
&gt; &gt;         printf(&quot;Error: RRD_UPDATE command: %s\n&quot;, rrd_get_error());<br>
&gt; &gt;         rrd_clear_error();<br>
&gt; &gt;     }<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; int update_rrd_cmd(char *rrd_name, char *ds_string, char *n_value_string,<br>
&gt; &gt; char *buff, int n) {<br>
&gt; &gt;     memset(buff, 0, n);<br>
&gt; &gt;     snprintf(buff, n, &quot;update %s --template %s %s&quot;, rrd_name, ds_string,<br>
&gt; &gt; n_value_string);<br>
&gt; &gt;     printf(&quot;%s: buff = %s\n&quot;, __FUNCTION__, buff);<br>
&gt; &gt;     return 0;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; int main(void) {<br>
&gt; &gt;     char buff[2048] = &quot;&quot;;<br>
&gt; &gt;     update_rrd_cmd(&quot;./testfile.rrd&quot;, &quot;ds0:ds1&quot;, &quot;N:123:456&quot;, buff, 2048);<br>
&gt; &gt;     rrd_cmd(buff);<br>
&gt; &gt;     return 0;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; On Tue, 01 Jun 2010 08:20:18 +0200, Tomáš Macek &lt;<a href="mailto:maca02@atlas.cz">maca02@atlas.cz</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; &gt; Hello again,<br>
&gt; &gt; &gt; this problem is present since 1.4.0. I know it, because I&#39;ve tried every<br>
&gt; &gt; &gt; version since 1.3.8 (works), through 1.3.9 (works), 1.4.0 - 1.4.3 does<br>
&gt; &gt; &gt; not<br>
&gt; &gt; &gt; work at all with syntax error as described below. Everytime I compiled<br>
&gt; &gt; &gt; and<br>
&gt; &gt; &gt; tried the same source code and linked with the proper library version.<br>
&gt; &gt; &gt; What has changed in the API of rrd_update() in 1.4.0? I really don&#39;t<br>
&gt; &gt; &gt; understand what I&#39;m doing wrong. Any hints/help appreciated, looking at<br>
&gt; &gt; &gt; the CHANGES file did not helped me.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Tomas<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; On Thu, 20 May 2010 12:28:25 +0200, Tomáš Macek &lt;<a href="mailto:maca02@atlas.cz">maca02@atlas.cz</a>&gt; wrote:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;&gt; Hi, I have RHEL 5.5 with rrdtool 1.4.3 and I&#39;m using it&#39;s API for<br>
&gt; &gt; &gt;&gt; updating<br>
&gt; &gt; &gt;&gt; rrd files. The problem is that when I pass arguments to the rrd_update()<br>
&gt; &gt; &gt;&gt; function, it always returns error saying &quot;Usage: rrdtool update<br>
&gt; &gt; &gt;&gt; [--daemon<br>
&gt; &gt; &gt;&gt; &lt;addr&gt;] &lt;file&gt;&quot;. The same code worked really fine on 1.3.8. I looked at<br>
&gt; &gt; &gt;&gt; the CHANGELOG file and there was some line saying, that something has<br>
&gt; &gt; &gt;&gt; changed on checking optarg parameters.<br>
&gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt;&gt; This is from gdb just before I pass the array into rrd_update()<br>
&gt; &gt; &gt;&gt; function:<br>
&gt; &gt; &gt;&gt; -----------<br>
&gt; &gt; &gt;&gt; Breakpoint 2, rrd_cmd (rrdcmd=0x634dc0 &quot;update&quot;, cmd=1, di_cnt=2) at<br>
&gt; &gt; &gt;&gt; rrd_op.c:215<br>
&gt; &gt; &gt;&gt; 215                 error = rrd_update(i, argv);<br>
&gt; &gt; &gt;&gt; (gdb) p argv<br>
&gt; &gt; &gt;&gt; $26 = {0x634dc0 &quot;update&quot;, 0x634dc7 &quot;cac_ap2aeth.rrd&quot;,<br>
&gt; &gt; &gt;&gt;    0x634e06 &quot;--template&quot;, 0x634e11 &quot;ds0:ds1&quot;, 0x634e19<br>
&gt; &gt; &gt;&gt; &quot;N:2325779922:3582706806&quot;, 0x0 &lt;repeats 59 times&gt;}<br>
&gt; &gt; &gt;&gt; -----------<br>
&gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt;&gt; and after program goes thourgh rrd_update(), the argv array looks like<br>
&gt; &gt; &gt;&gt; this:<br>
&gt; &gt; &gt;&gt; -----------<br>
&gt; &gt; &gt;&gt; 216                 if (error == -1) {<br>
&gt; &gt; &gt;&gt; (gdb) p argv<br>
&gt; &gt; &gt;&gt; $28 = {0x634dc0 &quot;update&quot;, 0x634e06 &quot;--template&quot;, 0x634e11 &quot;ds0:ds1&quot;,<br>
&gt; &gt; &gt;&gt;    0x634dc7 &quot;cac_ap2aeth.rrd&quot;, 0x634e19 &quot;N:2325779922:3582706806&quot;,<br>
&gt; &gt; &gt;&gt;    0x0 &lt;repeats 59 times&gt;}<br>
&gt; &gt; &gt;&gt; -----------<br>
&gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt;&gt; Please, notice the replaced arguments after rrd_update()... I don&#39;t<br>
&gt; &gt; &gt;&gt; know,<br>
&gt; &gt; &gt;&gt; what I&#39;m doing wrong, the code under 1.3.8 library worked just fine and<br>
&gt; &gt; &gt;&gt; according to the man rrdupdate the arguments are fine. Hope I&#39;m not<br>
&gt; &gt; &gt;&gt; missing something stupid, but I was not able to find anything strange in<br>
&gt; &gt; &gt;&gt; rrd_update() function in the rrd_update.c.<br>
&gt; &gt; &gt;&gt; Let me know, if you need something more from me, thank you<br>
&gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt;&gt; Regards, Tomas<br>
&gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt;&gt; _______________________________________________<br>
&gt; &gt; &gt;&gt; rrd-developers mailing list<br>
&gt; &gt; &gt;&gt; <a href="mailto:rrd-developers@lists.oetiker.ch">rrd-developers@lists.oetiker.ch</a><br>
&gt; &gt; &gt;&gt; <a href="https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers" target="_blank">https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers</a><br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; rrd-developers mailing list<br>
&gt; &gt; &gt; <a href="mailto:rrd-developers@lists.oetiker.ch">rrd-developers@lists.oetiker.ch</a><br>
&gt; &gt; &gt; <a href="https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers" target="_blank">https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers</a><br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; rrd-developers mailing list<br>
&gt; &gt; <a href="mailto:rrd-developers@lists.oetiker.ch">rrd-developers@lists.oetiker.ch</a><br>
&gt; &gt; <a href="https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers" target="_blank">https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers</a><br>
&gt; &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
--<br>
</div></div>Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland<br>
<a href="http://it.oetiker.ch" target="_blank">http://it.oetiker.ch</a> <a href="mailto:tobi@oetiker.ch">tobi@oetiker.ch</a> ++41 62 775 9902 / sb: -9900</blockquote></div><br><br clear="all"><br>-- <br> kevin brintnall =~ /<a href="http://kbrint@rufus.net/">kbrint@rufus.net/</a><br>

<br>