X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=misc%2Fnetwork_servers%2Fv3_nbd%2Fraw.cc;h=04228aebab5710bdb12a6dcf90a3735ecdfcf196;hb=46db31bad625ca5d360ec78d8ea2accce1faac6a;hp=67b03d51e403e9e30b2622800bb04a431f84746d;hpb=7e8a39a13c99e8a04885ca3b6fafdfafb6078288;p=palacios.git diff --git a/misc/network_servers/v3_nbd/raw.cc b/misc/network_servers/v3_nbd/raw.cc index 67b03d5..04228ae 100644 --- a/misc/network_servers/v3_nbd/raw.cc +++ b/misc/network_servers/v3_nbd/raw.cc @@ -17,30 +17,67 @@ * 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; }