#include #include #include "libqubes-rpc-filecopy.h" #include "crc32.h" extern void notify_progress(int, int); int copy_file(int outfd, int infd, long long size, unsigned long *crc32) { char buf[4096]; long long written = 0; int ret; int count; while (written < size) { if (size - written > sizeof(buf)) count = sizeof buf; else count = size - written; ret = read(infd, buf, count); if (!ret) return COPY_FILE_READ_EOF; if (ret < 0) return COPY_FILE_READ_ERROR; /* acumulate crc32 if requested */ if (crc32) *crc32 = Crc32_ComputeBuf(*crc32, buf, ret); if (!write_all(outfd, buf, ret)) return COPY_FILE_WRITE_ERROR; notify_progress(ret, 0); written += ret; } return COPY_FILE_OK; } char * copy_file_status_to_str(int status) { switch (status) { case COPY_FILE_OK: return "OK"; case COPY_FILE_READ_EOF: return "Unexpected end of data while reading"; case COPY_FILE_READ_ERROR: return "Error reading"; case COPY_FILE_WRITE_ERROR: return "Error writing"; default: return "????????"; } }