[Libvir] take 2 [Re: write(2) may write less than the total requested
Jim Meyering
jim at meyering.net
Wed Feb 20 18:15:45 UTC 2008
Jim Paris <jim at jtan.com> wrote:
> Jim Meyering wrote:
...
Hi Jim,
>> -retry:
>> - ret = write(pollInfos[nr].fd, (char *) req, req->len);
>> + ret = safewrite(pollInfos[nr].fd, (char *) req, req->len);
>> if (ret < 0) {
>
> Should this check (ret == req->len) instead? safewrite() will return
> an error if write() returns an error, regardless of how many bytes are
> written,
It *could* perform that test, but I think it is slightly more
maintainable (no duplication of that potentially nontrivial expression)
and just as correct to check only "ret < 0".
That's why I made changes like this, too:
- if (write(fd, TEST_SAVE_MAGIC, sizeof(TEST_SAVE_MAGIC)) != sizeof(TEST_SAVE_MAGIC)) {
+ if (safewrite(fd, TEST_SAVE_MAGIC, sizeof(TEST_SAVE_MAGIC)) < 0) {
Not only that, but the duplication removal makes it more readable because
the reader no longer has to visually ensure that the 3rd arg and the RHS
of the != comparison are the same. As a bonus, that particular change
brings the line length below the 80-col threshold.
> but it's still possible for it to return less than requested
> if write() returns 0 (eof?).
Really? How? EOF is relevant to read, but not to write(2).
As I see it, calling safewrite can have only two outcomes:
- return -1 to indicate failure
- return the requested byte count (arg #3, count, which is non-negative)
The only way safewrite can return 0 is if its "count" argument is also 0,
and that's not a failure. This is because write itself can return 0 only
if its count is also 0.
More information about the libvir-list
mailing list