On Mon, Sep 18, 2017 at 04:50:41PM +0200, Ingo Schwarze wrote:
> Hi Marc,
> 
> Marc Espie wrote on Sun, Sep 17, 2017 at 11:53:39AM +0200:
> > On Sat, Sep 16, 2017 at 10:25:19PM -0500, Scott Cheloha wrote:
> 
> >> The second example in the write(2) CAVEATS section is identical to
> >> the corresponding example in the read(2) page:
> >> 
> >>    while ((nr = write(fd, buf, sizeof(buf))) != -1 && nr != 0)
> 
> > I'm for either scraping the example altogether
> 
> Indeed, the above code is nonsensical.
> It will write the same bytes repeatedly in case of partial writes.
> 
> > or writing a proper one, which would mean embedding any version
> > of safe_write in the man page.
> 
> Here you are.
>   Ingo
> 
> 
> Index: write.2
> ===================================================================
> RCS file: /cvs/src/lib/libc/sys/write.2,v
> retrieving revision 1.39
> diff -u -p -r1.39 write.2
> --- write.2   5 Feb 2015 02:33:09 -0000       1.39
> +++ write.2   18 Sep 2017 14:43:41 -0000
> @@ -155,6 +155,18 @@ is returned.
>  Otherwise, a \-1 is returned and the global variable
>  .Va errno
>  is set to indicate the error.
> +.Sh EXAMPLES
> +The typical loop allowing partial writes looks like this:
> +.Bd -literal
> +const char *buf;
> +size_t bsz, off;
> +ssize_t nw;
> +int d;
> +
> +for (off = 0; off < bsz; off += nw)
> +     if ((nw = write(d, buf + off, bsz - off)) == 0 || nw == -1)
> +             err(1, "write");
> +.Ed
>  .Sh ERRORS
>  .Fn write ,
>  .Fn pwrite ,
> @@ -309,21 +321,11 @@ function call appeared in
>  .At v2 .
>  .Sh CAVEATS
>  Error checks should explicitly test for \-1.
> -Code such as
> -.Bd -literal -offset indent
> -while ((nr = write(fd, buf, sizeof(buf))) > 0)
> -.Ed
> -.Pp
> -is not maximally portable, as some platforms allow for
> +On some platforms, if
>  .Fa nbytes
> -to range between
> +is larger than
>  .Dv SSIZE_MAX
> -and
> +but smaller than
>  .Dv SIZE_MAX
> -\- 2, in which case the return value of an error-free
> -.Fn write
> +\- 2, the return value of an error-free call 
>  may appear as a negative number distinct from \-1.
> -Proper loops should use
> -.Bd -literal -offset indent
> -while ((nr = write(fd, buf, sizeof(buf))) != -1 && nr != 0)
> -.Ed
Looks much better than what we had, okay espie@

Reply via email to