summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/harddisk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/harddisk.cpp')
-rw-r--r--src/lib/util/harddisk.cpp60
1 files changed, 34 insertions, 26 deletions
diff --git a/src/lib/util/harddisk.cpp b/src/lib/util/harddisk.cpp
index 66d98582bb6..ad0108092c8 100644
--- a/src/lib/util/harddisk.cpp
+++ b/src/lib/util/harddisk.cpp
@@ -10,7 +10,7 @@
#include "harddisk.h"
-#include "corefile.h"
+#include "ioprocs.h"
#include <cstdlib>
@@ -21,9 +21,9 @@
struct hard_disk_file
{
- chd_file * chd; /* CHD file */
- util::core_file *fhandle; /* core_file if not a CHD */
- hard_disk_info info; /* hard disk info */
+ chd_file * chd; // CHD file
+ util::random_read_write * fhandle; // file if not a CHD
+ hard_disk_info info; // hard disk info
};
@@ -73,11 +73,16 @@ hard_disk_file *hard_disk_open(chd_file *chd)
return file;
}
-hard_disk_file *hard_disk_open(util::core_file &corefile, uint32_t skipoffs)
+hard_disk_file *hard_disk_open(util::random_read_write &corefile, uint32_t skipoffs)
{
+ // bail if getting the file length fails
+ std::uint64_t length;
+ if (corefile.length(length))
+ return nullptr;
+
hard_disk_file *file;
- /* allocate memory for the hard disk file */
+ // allocate memory for the hard disk file
file = (hard_disk_file *)malloc(sizeof(hard_disk_file));
if (file == nullptr)
return nullptr;
@@ -91,7 +96,7 @@ hard_disk_file *hard_disk_open(util::core_file &corefile, uint32_t skipoffs)
file->info.fileoffset = skipoffs;
// attempt to guess geometry in case this is an ATA situation
- for (uint32_t totalsectors = (corefile.size() - skipoffs) / file->info.sectorbytes; ; totalsectors++)
+ for (uint32_t totalsectors = (length - skipoffs) / file->info.sectorbytes; ; totalsectors++)
for (uint32_t cursectors = 63; cursectors > 1; cursectors--)
if (totalsectors % cursectors == 0)
{
@@ -118,9 +123,7 @@ hard_disk_file *hard_disk_open(util::core_file &corefile, uint32_t skipoffs)
void hard_disk_close(hard_disk_file *file)
{
if (file->fhandle)
- {
file->fhandle->flush();
- }
free(file);
}
@@ -164,7 +167,7 @@ hard_disk_info *hard_disk_get_info(hard_disk_file *file)
-------------------------------------------------*/
/**
- * @fn uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
+ * @fn bool hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
*
* @brief Hard disk read.
*
@@ -172,22 +175,24 @@ hard_disk_info *hard_disk_get_info(hard_disk_file *file)
* @param lbasector The sector number (Linear Block Address) to read.
* @param buffer The buffer where the hard disk data will be placed.
*
- * @return An uint32_t.
+ * @return True if the operation succeeded
*/
-uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
+bool hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
{
+ std::error_condition err;
if (file->chd)
{
- std::error_condition err = file->chd->read_units(lbasector, buffer);
+ err = file->chd->read_units(lbasector, buffer);
return !err;
}
else
{
- uint32_t actual = 0;
- file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET);
- actual = file->fhandle->read(buffer, file->info.sectorbytes);
- return (actual == file->info.sectorbytes);
+ size_t actual = 0;
+ err = file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET);
+ if (!err)
+ err = file->fhandle->read(buffer, file->info.sectorbytes, actual);
+ return !err && (actual == file->info.sectorbytes);
}
}
@@ -198,7 +203,7 @@ uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
-------------------------------------------------*/
/**
- * @fn uint32_t hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer)
+ * @fn bool hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer)
*
* @brief Hard disk write.
*
@@ -206,25 +211,28 @@ uint32_t hard_disk_read(hard_disk_file *file, uint32_t lbasector, void *buffer)
* @param lbasector The sector number (Linear Block Address) to write.
* @param buffer The buffer containing the data to write.
*
- * @return An uint32_t.
+ * @return True if the operation succeeded
*/
-uint32_t hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer)
+bool hard_disk_write(hard_disk_file *file, uint32_t lbasector, const void *buffer)
{
+ std::error_condition err;
if (file->chd)
{
- std::error_condition err = file->chd->write_units(lbasector, buffer);
+ err = file->chd->write_units(lbasector, buffer);
return !err;
}
else
{
- uint32_t actual = 0;
- file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET);
- actual = file->fhandle->write(buffer, file->info.sectorbytes);
- return (actual == file->info.sectorbytes);
+ size_t actual = 0;
+ err = file->fhandle->seek(file->info.fileoffset + (lbasector * file->info.sectorbytes), SEEK_SET);
+ if (!err)
+ err = file->fhandle->write(buffer, file->info.sectorbytes, actual);
+ return !err && (actual == file->info.sectorbytes);
}
}
+
/*-------------------------------------------------
hard_disk_set_block_size - sets the block size
for a non-CHD-backed hard disk (a bare file).
@@ -259,6 +267,6 @@ bool hard_disk_set_block_size(hard_disk_file *file, uint32_t blocksize)
else
{
file->info.sectorbytes = blocksize;
+ return true;
}
- return true;
}