[Nut-upsdev] [nut-commits] svn commit r1549 - in trunk: . drivers
Arjen de Korte
nut+devel at de-korte.org
Thu Nov 6 21:21:43 UTC 2008
Citeren Arjen de Korte <adkorte-guest at alioth.debian.org>:
> Author: adkorte-guest
> Date: Wed Nov 5 07:56:47 2008
> New Revision: 1549
>
> Log:
> Fix problem with reading replies on slow systems.
>
> The ser_get_line() function is unreliable when reading multi-line
> replies from the UPS. See
> docs/new-drivers.txt for an explanation why. Basically this will
> only work if the driver is able
> to keep up with the flow of data from the UPS and the select_read()
> function in ser_get_line()
> reads one character at a time. In that case, switching to
> ser_get_char() is more reliable,
> since that is not prone to losing data after reading ENDCHAR.
What was I thinking? I completely missed the fact that the UPScode II
driver sets the communication parameters to ICANON (Canonical Mode
Input Processing), so the above is not an issue at all. There is a
(slightly) better way to do this however, by using select_read()
instead and let the input processing ignore the <CR> character. For
any length of input, this guarantees that there is exactly one
select() and one read() operation, which helps interpretation of
'strace' output.
> Another problem is that the driver seems to expect that on
> errors/timeout, the length of the
> returned string is 0 (strlen(buf) == 0). This is not guaranteed to
> be the case (ser_get_char()
> will return truncated replies on timeout for instance).
Not at all, this buffer will be empty on timeouts or errors if you use
ser_get_line(), provided the ENDCHAR is <NL> and the above
communication parameters are used.
> Last but not least if the length of the returned string is 0, this
> doesn't mean that there is no
> more data left in the input buffer. So flushing the input buffers
> was not guaranteed to work.
This still holds true, a zero length reply doesn't mean there is
nothing more in the input buffer (this might be an empty line with
only a <NL> in it), so we'd better use ser_flush_in() or
ser_flush_io() instead.
Best regards, Arjen
--
Please keep list traffic on the list
More information about the Nut-upsdev
mailing list