From 592b480746bd2ac2140980d298a50563d484733d Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 31 Jan 2013 07:49:33 -0800 Subject: [PATCH] cmd/ld: retry short writes, to get error detail Fixes #3802. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/7228066 --- src/cmd/ld/lib.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index 152cd052c5..2c59fb8de2 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -1447,6 +1447,23 @@ Yconv(Fmt *fp) vlong coutpos; +static void +dowrite(int fd, char *p, int n) +{ + int m; + + while(n > 0) { + m = write(fd, p, n); + if(m <= 0) { + cursym = S; + diag("write error: %r"); + errorexit(); + } + n -= m; + p += m; + } +} + void cflush(void) { @@ -1455,13 +1472,8 @@ cflush(void) if(cbpmax < cbp) cbpmax = cbp; n = cbpmax - buf.cbuf; - if(n) { - if(write(cout, buf.cbuf, n) != n) { - diag("write error: %r"); - errorexit(); - } - coutpos += n; - } + dowrite(cout, buf.cbuf, n); + coutpos += n; cbp = buf.cbuf; cbc = sizeof(buf.cbuf); cbpmax = cbp; @@ -1502,10 +1514,7 @@ cwrite(void *buf, int n) cflush(); if(n <= 0) return; - if(write(cout, buf, n) != n) { - diag("write error: %r"); - errorexit(); - } + dowrite(cout, buf, n); coutpos += n; }