Module Name:    src
Committed By:   christos
Date:           Tue Nov  8 20:25:14 UTC 2011

Modified Files:
        src/external/bsd/atf/dist/atf-c: tc.c

Log Message:
use writev(2) instead of dprintf(3) for portability. Suggested by joerg@


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/external/bsd/atf/dist/atf-c/tc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/atf/dist/atf-c/tc.c
diff -u src/external/bsd/atf/dist/atf-c/tc.c:1.9 src/external/bsd/atf/dist/atf-c/tc.c:1.10
--- src/external/bsd/atf/dist/atf-c/tc.c:1.9	Sun Nov  6 13:18:16 2011
+++ src/external/bsd/atf/dist/atf-c/tc.c	Tue Nov  8 15:25:14 2011
@@ -29,6 +29,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/uio.h>
 
 #include <errno.h>
 #include <fcntl.h>
@@ -156,24 +157,40 @@ static atf_error_t
 write_resfile(const int fd, const char *result, const int arg,
               const atf_dynstr_t *reason)
 {
-    if (arg == -1 && reason == NULL) {
-        if (dprintf(fd, "%s\n", result) <= 0)
-            goto err;
-    } else if (arg == -1 && reason != NULL) {
-        if (dprintf(fd, "%s: %s\n", result,
-                     atf_dynstr_cstring(reason)) < 0)
-            goto err;
-    } else if (arg != -1 && reason != NULL) {
-        if (dprintf(fd, "%s(%d): %s\n", result,
-                     arg, atf_dynstr_cstring(reason)) < 0)
-            goto err;
-    } else {
-        UNREACHABLE;
+    static char NL[] = "\n", CS[] = ": ";
+    char buf[64];
+    const char *r;
+    struct iovec iov[5];
+    ssize_t ret;
+    int count = 0;
+
+    INV(arg == -1 && reason != NULL);
+
+    iov[count].iov_base = __UNCONST(result);
+    iov[count++].iov_len = strlen(result);
+
+    if (reason != NULL) {
+	if (arg != -1) {
+	    iov[count].iov_base = buf;
+	    iov[count++].iov_len = snprintf(buf, sizeof(buf), "(%d)", arg);
+	}
+
+	iov[count].iov_base = CS;
+	iov[count++].iov_len = sizeof(CS) - 1;
+
+	r = atf_dynstr_cstring(reason);
+	iov[count].iov_base = __UNCONST(r);
+	iov[count++].iov_len = strlen(r);
     }
 
-    return atf_no_error();
+    iov[count].iov_base = NL;
+    iov[count++].iov_len = sizeof(NL) - 1;
+
+    while ((ret = writev(fd, iov, count)) == -1 && errno == EINTR)
+        continue; /* Retry. */
+    if (ret != -1)
+        return atf_no_error();
 
-err:
     return atf_libc_error(
         errno, "Failed to write results file; result %s, reason %s", result,
         reason == NULL ? "null" : atf_dynstr_cstring(reason));

Reply via email to