* redistribute, and modify it as specified in the file "V3VEE_LICENSE".
*/
-#include "v3_nbd.h"
+#include "v3_disk.h"
+#include "raw.h"
+raw_disk::raw_disk(string & filename) : v3_disk(filename){
+ this->f = fopen(filename.c_str(), "r+");
+}
+
+
+off_t raw_disk::get_capacity() {
+ struct stat f_stats;
+
+ stat(this->filename.c_str(), &f_stats);
-raw_disk::raw_disk(string &filename) {
- this->f = fopen(filename.c_str(), "w+");
+ return f_stats.st_size;
}
-unsigned long long raw_disk::get_capacity() {
+unsigned int raw_disk::read(unsigned char * buf, off_t offset, int length) {
+ int total_bytes = length;
+ int bytes_read = 0;
-
+ fseeko(this->f, offset, SEEK_SET);
+
+ while (bytes_read < total_bytes) {
+ int tmp_bytes = fread(buf, 1, length - bytes_read, this->f);
+
+ if (tmp_bytes == 0) {
+ break;
+ }
+ bytes_read += tmp_bytes;
+ }
+
+ return bytes_read;
}
+unsigned int raw_disk::write(unsigned char * buf, off_t offset, int length) {
+ int total_bytes = length;
+ int bytes_written = 0;
-int raw_disk::read(unsigned char * buf, unsigned long long offset, int length) {
+ fseeko(this->f, offset, SEEK_SET);
+ while (bytes_written < total_bytes) {
+ int tmp_bytes = fwrite(buf, 1, length - bytes_written, this->f);
-}
+ if (tmp_bytes == 0) {
+ break;
+ }
+ bytes_written += tmp_bytes;
+ }
+ return bytes_written;
+}
-int raw_disk::write(unsigned char * buf, unsigned long long offset, int length) {
+void raw_disk::attach() {
+ this->locked = 1;
+}
+void raw_disk::detach() {
+ this->locked = 0;
}