Simpler. ok?
-- Scott Cheloha Index: bin/dd/misc.c =================================================================== RCS file: /cvs/src/bin/dd/misc.c,v retrieving revision 1.22 diff -u -p -r1.22 misc.c --- bin/dd/misc.c 24 Oct 2017 14:21:10 -0000 1.22 +++ bin/dd/misc.c 31 Mar 2018 17:49:42 -0000 @@ -36,13 +36,9 @@ #include <sys/types.h> #include <sys/time.h> -#include <sys/uio.h> -#include <err.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> #include <errno.h> +#include <stdio.h> #include <time.h> #include <unistd.h> @@ -53,10 +49,7 @@ void summary(void) { struct timespec elapsed, now; - char buf[4][100]; - struct iovec iov[4]; double nanosecs; - int i = 0; if (ddflags & C_NOINFO) return; @@ -67,38 +60,25 @@ summary(void) if (nanosecs == 0) nanosecs = 1; - /* Use snprintf(3) so that we don't reenter stdio(3). */ - (void)snprintf(buf[0], sizeof(buf[0]), - "%zu+%zu records in\n%zu+%zu records out\n", + /* Be async safe: use dprintf(3). */ + dprintf(STDERR_FILENO, "%zu+%zu records in\n%zu+%zu records out\n", st.in_full, st.in_part, st.out_full, st.out_part); - iov[i].iov_base = buf[0]; - iov[i++].iov_len = strlen(buf[0]); if (st.swab) { - (void)snprintf(buf[1], sizeof(buf[1]), - "%zu odd length swab %s\n", - st.swab, (st.swab == 1) ? "block" : "blocks"); - iov[i].iov_base = buf[1]; - iov[i++].iov_len = strlen(buf[1]); + dprintf(STDERR_FILENO, "%zu odd length swab %s\n", + st.swab, (st.swab == 1) ? "block" : "blocks"); } if (st.trunc) { - (void)snprintf(buf[2], sizeof(buf[2]), - "%zu truncated %s\n", - st.trunc, (st.trunc == 1) ? "block" : "blocks"); - iov[i].iov_base = buf[2]; - iov[i++].iov_len = strlen(buf[2]); + dprintf(STDERR_FILENO, "%zu truncated %s\n", + st.trunc, (st.trunc == 1) ? "block" : "blocks"); } if (!(ddflags & C_NOXFER)) { - (void)snprintf(buf[3], sizeof(buf[3]), + dprintf(STDERR_FILENO, "%lld bytes transferred in %lld.%03ld secs " "(%0.0f bytes/sec)\n", (long long)st.bytes, (long long)elapsed.tv_sec, elapsed.tv_nsec / 1000000, ((double)st.bytes * 1000000000) / nanosecs); - iov[i].iov_base = buf[3]; - iov[i++].iov_len = strlen(buf[3]); } - - (void)writev(STDERR_FILENO, iov, i); } void