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