Re: take 2 [Re: write(2) may write less than the total requested

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jim Paris <jim@xxxxxxxx> 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.

--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]