From d379f6d7f04f56c2f7fa475e9aba0939b73742eb Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 6 Nov 2023 00:24:57 -0800 Subject: [PATCH 1/3] add destructor to close fd to open device one time, and make dir be const char* type --- include/rawdisk.h | 43 +++++++++++-------------------------------- test/layer0.cpp | 7 +------ 2 files changed, 12 insertions(+), 38 deletions(-) diff --git a/include/rawdisk.h b/include/rawdisk.h index 62074df..ffc7f1c 100644 --- a/include/rawdisk.h +++ b/include/rawdisk.h @@ -8,21 +8,20 @@ class RawDisk{ - char* dir; + int fd; + const char* dir; off_t numSectors; off_t diskSize; public: - RawDisk(char *directory){ + RawDisk(const char *directory){ dir = directory; /*dir = strdup("/dev/vdc"); numSectors = 62914560; diskSize = 32212254720;*/ - int fd; - // Open the block device (replace /dev/sdX with the actual device) - fd = open(dir, O_RDONLY); + fd = open(dir, O_RDWR); // Allow read and write if (fd == -1) { perror("Error opening device"); exit(1); @@ -41,58 +40,41 @@ public: printf("====Initializing RawDisk====\n"); printf("Number of sectors: %llu\n", numSectors); printf("Disk size (in bytes): %llu\n", diskSize); + } - close(fd); + ~RawDisk() { + if (fd != -1) { + close(fd); + } } int rawdisk_read(off_t blockNumber, char *buffer){ - int fd; - - fd = open(dir, O_RDONLY); - if (fd == -1) { - perror("Error opening device"); - return -1; - } - // Calculate the offset in bytes off_t offset = blockNumber * 512; // Move the file pointer to the desired block if (lseek(fd, offset, SEEK_SET) == -1) { perror("Error seeking to block"); - close(fd); return -1; } - // Read a block of data + // Read a 512 byte-size block of data ssize_t bytesRead = read(fd, buffer, 512); if (bytesRead == -1) { perror("Error reading from device"); - close(fd); return -1; } - // Process the data (e.g., data recovery or analysis) - close(fd); - + return 0; } int rawdisk_write(off_t blockNumber, char *buffer){ - int fd; - - fd = open(dir, O_WRONLY); - if (fd == -1) { - perror("Error opening device"); - return -1; - } - // Calculate the offset in bytes off_t offset = blockNumber * 512; // Move the file pointer to the desired block if (lseek(fd, offset, SEEK_SET) == -1) { perror("Error seeking to block"); - close(fd); return -1; } @@ -100,12 +82,9 @@ public: ssize_t bytesWrite = write(fd, buffer, 512); if (bytesWrite == -1) { perror("Error writing from device"); - close(fd); return -1; } - // Process the data (e.g., data recovery or analysis) - close(fd); return 0; } diff --git a/test/layer0.cpp b/test/layer0.cpp index 1b8faeb..3a73b0b 100644 --- a/test/layer0.cpp +++ b/test/layer0.cpp @@ -4,12 +4,7 @@ #include "rawdisk.h" int main(int argc, char *argv[]) { - char *d = NULL; - if(argc < 2){ - d = strdup("/dev/vdc"); - }else{ - d = argv[1]; - } + const char* d = (argc < 2) ? "/dev/vdc" : argv[1]; RawDisk *H = new RawDisk(d); From b25f0f167da0f74db53d259cd5517d4cb7cb0ab1 Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 6 Nov 2023 14:00:14 -0800 Subject: [PATCH 2/3] revise rawdisk R/W API to set with offset and length --- include/rawdisk.h | 33 ++++++++++++--------------------- test/layer0.cpp | 4 ++-- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/include/rawdisk.h b/include/rawdisk.h index ffc7f1c..efd45ed 100644 --- a/include/rawdisk.h +++ b/include/rawdisk.h @@ -14,7 +14,7 @@ class RawDisk{ off_t diskSize; public: - RawDisk(const char *directory){ + RawDisk(const char *directory) : fd(-1), dir(nullptr), numSectors(0), diskSize(0) { dir = directory; /*dir = strdup("/dev/vdc"); numSectors = 62914560; @@ -48,18 +48,13 @@ public: } } - int rawdisk_read(off_t blockNumber, char *buffer){ - // Calculate the offset in bytes - off_t offset = blockNumber * 512; - - // Move the file pointer to the desired block - if (lseek(fd, offset, SEEK_SET) == -1) { - perror("Error seeking to block"); + int rawdisk_read(off_t offset, char *buffer, size_t length) { + if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { + perror("Error seeking to offset"); return -1; } - // Read a 512 byte-size block of data - ssize_t bytesRead = read(fd, buffer, 512); + ssize_t bytesRead = read(fd, buffer, length); if (bytesRead == -1) { perror("Error reading from device"); return -1; @@ -68,20 +63,16 @@ public: return 0; } - int rawdisk_write(off_t blockNumber, char *buffer){ - // Calculate the offset in bytes - off_t offset = blockNumber * 512; - - // Move the file pointer to the desired block - if (lseek(fd, offset, SEEK_SET) == -1) { - perror("Error seeking to block"); + // Write a specified number of bytes at a given byte offset + int rawdisk_write(off_t offset, char *buffer, size_t length) { + if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { + perror("Error seeking to offset"); return -1; } - // Write a block of data - ssize_t bytesWrite = write(fd, buffer, 512); - if (bytesWrite == -1) { - perror("Error writing from device"); + ssize_t bytesWritten = write(fd, buffer, length); + if (bytesWritten == -1) { + perror("Error writing to device"); return -1; } diff --git a/test/layer0.cpp b/test/layer0.cpp index 3a73b0b..5e61c72 100644 --- a/test/layer0.cpp +++ b/test/layer0.cpp @@ -15,11 +15,11 @@ int main(int argc, char *argv[]) { //use number to substitute H->getnumSector(), getnumSectors() are not yest implemented for(off_t i = 0; i < 10; i++) { - H->rawdisk_write(i, buf); + H->rawdisk_write(i*512, buf, sizeof(buf));//Change write_API } //use number to substitute H->getnumSector(), getnumSectors() are not yest implemented for(off_t i = 0; i < 10; i++) { - H->rawdisk_read(i, readBuffer); + H->rawdisk_read(i*512, readBuffer, sizeof(readBuffer));//Change read_API assert(strncmp(readBuffer, buf, strlen(buf)) == 0); } From 1a35ce3574d1b0632365e70a139d8aecad50871f Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 6 Nov 2023 14:07:25 -0800 Subject: [PATCH 3/3] use strlen not sizeof --- test/layer0.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/layer0.cpp b/test/layer0.cpp index 5e61c72..be5d998 100644 --- a/test/layer0.cpp +++ b/test/layer0.cpp @@ -15,7 +15,7 @@ int main(int argc, char *argv[]) { //use number to substitute H->getnumSector(), getnumSectors() are not yest implemented for(off_t i = 0; i < 10; i++) { - H->rawdisk_write(i*512, buf, sizeof(buf));//Change write_API + H->rawdisk_write(i*512, buf, strlen(buf));//Change write_API } //use number to substitute H->getnumSector(), getnumSectors() are not yest implemented for(off_t i = 0; i < 10; i++) {