The gnulib/NEWS file states:
SAFE_READ_ERROR and SAFE_WRITE_ERROR are now
obsolescent; callers can just check for < 0.
* xargs/xargs.c (xargs_do_exec): Adjust error handling of safe_read
accordingly.
---
xargs/xargs.c | 110 +++++++++++++++++++++-----------------------------
1 file changed, 47 insertions(+), 63 deletions(-)
diff --git a/xargs/xargs.c b/xargs/xargs.c
index e9263cef..8abdd790 100644
--- a/xargs/xargs.c
+++ b/xargs/xargs.c
@@ -1290,7 +1290,7 @@ xargs_do_exec (struct buildcmd_control *ctl, void
*usercontext, int argc, char *
pid_t child;
int fd[2];
int buf;
- size_t r;
+ ptrdiff_t r;
(void) ctl;
(void) argc;
@@ -1386,70 +1386,54 @@ xargs_do_exec (struct buildcmd_control *ctl, void
*usercontext, int argc, char *
/* We use safe_read here in order to avoid an error if
SIGUSR[12] is handled during the read system call. */
- switch (r = safe_read (fd[0], &buf, sizeof (int)))
- {
- case SAFE_READ_ERROR:
- {
- close (fd[0]);
- error (0, errno,
- _("errno-buffer safe_read failed in xargs_do_exec "
- "(this is probably a bug, please report it)"));
- break;
- }
-
- case sizeof (int):
- {
- /* Failure */
- int childstatus;
-
- close (fd[0]);
-
- /* we know the child is about to exit, so wait for that.
- * We have to do this so that wait_for_proc () does not
- * change the value of child_error on the basis of the
- * return value -- since in this case we did not launch
- * the utility.
- *
- * We do the wait before deciding if we failed in order to
- * avoid creating a zombie, even briefly.
- */
- waitpid (child, &childstatus, 0);
-
+ r = safe_read (fd[0], &buf, sizeof (int));
+ close (fd[0]);
- if (E2BIG == buf)
- {
- return 0; /* Failure; caller should pass fewer args */
- }
- else if (ENOENT == buf)
- {
- exit (XARGS_EXIT_COMMAND_NOT_FOUND); /* command cannot be
found */
- }
- else
- {
- exit (XARGS_EXIT_COMMAND_CANNOT_BE_RUN); /* command cannot be
run */
- }
- break;
- }
+ if (r < 0)
+ {
+ error (0, errno,
+ _("errno-buffer safe_read failed in xargs_do_exec "
+ "(this is probably a bug, please report it)"));
+ }
+ else if (0 < r)
+ {
+ /* Failure - the child passed the error via BUF. */
+ int childstatus;
+
+ /* we know the child is about to exit, so wait for that.
+ * We have to do this so that wait_for_proc () does not
+ * change the value of child_error on the basis of the
+ * return value -- since in this case we did not launch
+ * the utility.
+ *
+ * We do the wait before deciding if we failed in order to
+ * avoid creating a zombie, even briefly.
+ */
+ waitpid (child, &childstatus, 0);
- case 0:
- {
- /* Failed to read data from pipe; the exec must have
- * succeeded. We call add_proc only in this case,
- * because it increments procs_executing, and we only
- * want to do that if we didn't already wait for the
- * child.
- */
- add_proc (child);
- break;
- }
- default:
- {
- error (EXIT_FAILURE, errno,
- _("read returned unexpected value %"PRIuMAX"; "
- "this is probably a bug, please report it"), r);
- }
- } /* switch on bytes read */
- close (fd[0]);
+ if (E2BIG == buf)
+ {
+ return 0; /* Failure; caller should pass fewer args */
+ }
+ else if (ENOENT == buf)
+ {
+ exit (XARGS_EXIT_COMMAND_NOT_FOUND); /* command cannot be found
*/
+ }
+ else
+ {
+ exit (XARGS_EXIT_COMMAND_CANNOT_BE_RUN); /* command cannot be
run */
+ }
+ }
+ else /* 0 == r => success */
+ {
+ /* Failed to read data from pipe; the exec must have
+ * succeeded. We call add_proc only in this case,
+ * because it increments procs_executing, and we only
+ * want to do that if we didn't already wait for the
+ * child.
+ */
+ add_proc (child);
+ }
}
return 1; /* Success */
}
--
2.47.1