X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=misc%2Fnetwork_servers%2Fv3_nbd%2Fraw.cc;h=04228aebab5710bdb12a6dcf90a3735ecdfcf196;hb=1a24d4e8fb3918a42b124777db5b41940150023e;hp=f4d5ef51acdd9d1df3e735864d604cf72ad8e001;hpb=9a4af090e32278f088a3f9b444b1aa23e3b1f0d2;p=palacios.git diff --git a/misc/network_servers/v3_nbd/raw.cc b/misc/network_servers/v3_nbd/raw.cc index f4d5ef5..04228ae 100644 --- a/misc/network_servers/v3_nbd/raw.cc +++ b/misc/network_servers/v3_nbd/raw.cc @@ -22,27 +22,54 @@ raw_disk::raw_disk(string & filename) : v3_disk(filename){ - this->f = fopen(filename.c_str(), "w+"); + this->f = fopen(filename.c_str(), "r+"); } off_t raw_disk::get_capacity() { - - return 0; -} + struct stat f_stats; + stat(this->filename.c_str(), &f_stats); + return f_stats.st_size; +} -int raw_disk::read(unsigned char * buf, unsigned long long offset, int length) { - return -1; +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::write(unsigned char * buf, unsigned long long offset, int length) { - - return -1; + 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; }