#include #include #include #include #include #define RW_MAX_SIZE 0x7ffff000 ssize_t read_from_buffer(char *fname, int fd, char *buffer, uint64_t size, uint64_t base) { ssize_t rc; char *buf = buffer; off_t offset = base; size_t count = 0; int loop = 0; while (count < size) { uint64_t bytes = size - count; if (bytes > RW_MAX_SIZE) { bytes = RW_MAX_SIZE; } if (offset) { rc = lseek(fd, offset, SEEK_SET); if (rc != offset) { fprintf(stderr, "%s, seek off 0x%lx != 0x%lx\n", fname, rc, offset); perror("seek file"); return -EIO; } } /* Read data from file into buffer */ rc = read(fd, buf, bytes); if (rc < 0) { fprintf(stderr, "%s, read failed\n", fname); perror("read file"); return -EIO; } count += rc; if (rc != bytes) { fprintf(stderr, "%s, read failed, rc=%ld, bytes=%ld\n", fname, rc, bytes); break; } buf += bytes; offset += bytes; loop++; } if (count != size && loop) { fprintf(stderr, "%s, read failed, count=%ld, size=%ld\n", fname, count, size); return -EIO; } return count; } ssize_t write_to_buffer(char *fname, int fd, char *buffer, uint64_t size, uint64_t base) { ssize_t rc; char *buf = buffer; off_t offset = base; size_t count = 0; int loop = 0; while (count < size) { uint64_t bytes = size - count; if (bytes > RW_MAX_SIZE) { bytes = RW_MAX_SIZE; } if (offset) { rc = lseek(fd, offset, SEEK_SET); if (rc != offset) { fprintf(stderr, "%s, seek off 0x%lx != 0x%lx\n", fname, rc, offset); perror("seek file"); return -EIO; } } /* Write data from buffer into file */ rc = write(fd, buf, bytes); if (rc < 0) { fprintf(stderr, "%s,write 0x%lx @ 0x%lx @ 0x%lx failed %ld.\n", fname, bytes, offset, rc); perror("write file"); return -EIO; } count += rc; printf("count = %ld, bytes = %ld\n", count, size); if (rc != bytes) { fprintf(stderr, "%s, write underflow 0x%lx/0x%lx @ 0x%lx.\n", fname, rc, bytes, offset); break; } buf += bytes; offset += bytes; loop++; } if (count != size && loop) { fprintf(stderr, "%s, write underflow, 0x%lx/0x%lx.\n", fname, count, size); return -EIO; } return count; }