X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/6d2d327ca57fefaddceba10eb323451f8150e95d..62234e45d5fe22235409af5fdf7dfd74f864692c:/server/normalize.c diff --git a/server/normalize.c b/server/normalize.c index 7e5fbe8..ddbd725 100644 --- a/server/normalize.c +++ b/server/normalize.c @@ -47,26 +47,27 @@ * @param n Number of bytes to copy */ static void copy(int infd, int outfd, size_t n) { - char buffer[4096], *ptr; - int r, w; + char buffer[4096]; + ssize_t written; while(n > 0) { - r = read(infd, buffer, sizeof buffer); - if(r < 0) { + const ssize_t readden = read(infd, buffer, + n > sizeof buffer ? sizeof buffer : n); + if(readden < 0) { if(errno == EINTR) continue; else fatal(errno, "read error"); } - if(r == 0) + if(readden == 0) fatal(0, "unexpected EOF"); - n -= r; - ptr = buffer; - while(r > 0) { - w = write(outfd, ptr, r - (ptr - buffer)); + n -= readden; + written = 0; + while(written < readden) { + const ssize_t w = write(outfd, buffer + written, readden - written); if(w < 0) fatal(errno, "write error"); - ptr += w; + written += w; } } }