1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #include <unistd.h>
- #include <ioall.h>
- #include "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 "????????";
- }
- }
|