#include "cache.h" | |
int copy_fd(int ifd, int ofd) | |
{ | |
while (1) { | |
int len; | |
char buffer[8192]; | |
char *buf = buffer; | |
len = xread(ifd, buffer, sizeof(buffer)); | |
if (!len) | |
break; | |
if (len < 0) { | |
int read_error; | |
read_error = errno; | |
close(ifd); | |
return error("copy-fd: read returned %s", | |
strerror(read_error)); | |
} | |
while (len) { | |
int written = xwrite(ofd, buf, len); | |
if (written > 0) { | |
buf += written; | |
len -= written; | |
} | |
else if (!written) { | |
close(ifd); | |
return error("copy-fd: write returned 0"); | |
} else { | |
close(ifd); | |
return error("copy-fd: write returned %s", | |
strerror(errno)); | |
} | |
} | |
} | |
close(ifd); | |
return 0; | |
} | |