]> git.ipfire.org Git - thirdparty/shadow.git/commit
libmisc/write_full.c: Improve write_full()
authorAlejandro Colomar <alx@kernel.org>
Fri, 4 Aug 2023 23:04:04 +0000 (01:04 +0200)
committerSerge Hallyn <serge@hallyn.com>
Sat, 19 Aug 2023 01:35:15 +0000 (20:35 -0500)
commitf45498a6c2867c26ecfd388e15cadf73d12b98eb
treee91db4003e5745d80f7b520cb7fb7f4a8387b012
parent890f911e17169e44b43fe98742540267093559ea
libmisc/write_full.c: Improve write_full()

Documentation:

-  Correct the comment documenting the function:

   write_full() doesn't write "up to" count bytes (which is write(2)'s
   behavior, and exactly what this function is designed to avoid), but
   rather exactly count bytes (on success).

-  While fixing the documentation, take the time to add a man-page-like
   comment as in other APIs.  Especially, since we'll have to document
   a few other changes from this patch, such as the modified return
   values.

-  Partial writes are still possible on error.  It's the caller's
   responsibility to handle that possibility.

API:

-  In write(2), it's useful to know how many bytes were transferred,
   since it can have short writes.  In this API, since it either writes
   it all or fails, that value is useless, and callers only want to know
   if it succeeded or not.  Thus, just return 0 or -1.

Implementation:

-  Use `== -1` instead of `< 0` to check for write(2) syscall errors.
   This is wisdom from Michael Kerrisk.  This convention is useful
   because it more explicitly tells maintainers that the only value
   which can lead to that path is -1.  Otherwise, a maintainer of the
   code might be confused to think that other negative values are
   possible.  Keep it simple.

-  The path under `if (res == 0)` was unreachable, since the loop
   condition `while (count > 0)` precludes that possibility.  Remove the
   dead code.

-  Use a temporary variable of type `const char *` to avoid a cast.

-  Rename `res`, which just holds the result from write(2), to `w`,
   which more clearly shows that it's just a very-short-lived variable
   (by it's one-letter name), and also relates itself more to write(2).
   I find it more readable.

-  Move the definition of `w` to the top of the function.  Now that the
   function is significantly shorter, the lifetime of the variable is
   clearer, and I find it more readable this way.

Use:

-  Also use `== -1` to check errors.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
12 files changed:
lib/commonio.c
lib/prototypes.h
lib/write_full.c
libmisc/copydir.c
libmisc/failure.c
libmisc/idmapping.c
libmisc/log.c
libmisc/utmp.c
src/login.c
src/su.c
src/useradd.c
src/usermod.c