raw_image.hpp
00001 #if !defined(__RAW_IMAGE_HPP__)
00002 #define __RAW_IMAGE_HPP__
00003
00004
00005
00006
00007 #include "block_driver_base.hpp"
00008
00012 struct raw_image : public block_driver_base
00013 {
00014 protected:
00015 const string driver_name;
00016
00017 l4vmm_file file;
00018
00019 public:
00020
00021
00022
00023 inline raw_image(const string &filename, const state_flags flags=0)
00024 : block_driver_base(string(L4VMM_DRIVER" file: ") + filename, flags),
00025 file(filename, this->flags.is(READONLY))
00026 {
00027 this->flags.clear(FLUSHABLE);
00028 this->flags.set(READY, file.is_open());
00029 }
00030
00031
00032
00033
00034 virtual inline l4_sector_t sectors(void) const
00035 {
00036 return is(READY) ? file.size() / SECTOR_SIZE : 0;
00037 }
00038
00039 virtual inline int read_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00040 {
00041 if (!is(READY)) return -L4_ENOTAVAIL;
00042
00043 file::offset_t bytes=file.read(buffer, sector * SECTOR_SIZE, number * SECTOR_SIZE);
00044 return (bytes < 0) ? bytes : 0;
00045 }
00046
00047 virtual inline int write_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00048 {
00049 if (!is(READY)) return -L4_ENOTAVAIL;
00050
00051 file::offset_t bytes=file.write(buffer, sector * SECTOR_SIZE, number * SECTOR_SIZE);
00052 return (bytes < 0) ? bytes : 0;
00053 }
00054
00055 virtual inline int flush_sectors(void)
00056 {
00057 return file.flush();
00058 }
00059 };
00060
00061 #endif
00062
00063
00064