ssize_t rd = 0; size_t sofar = 0; while (rd = read( fd, buf + sofar, BUFSIZE - sofar)) { switch (rd) { case -1: switch (errno) { case EAGAIN : case EINTR : continue; default : /* unrecoverable */ abort(); } default: sofar += rd; } }