summaryrefslogtreecommitdiff
path: root/mpq-bios.c
diff options
context:
space:
mode:
authorpixel <pixel>2007-07-09 16:34:30 +0000
committerpixel <pixel>2007-07-09 16:34:30 +0000
commitfabd02b4bb0c1df2b65ea682b29087a1776954ed (patch)
treed05674f049e83e1fd8919ad74bfee84304d6887f /mpq-bios.c
parent2efe6f62b644ca93b7294de6dc83090542b2e4e2 (diff)
Adding basic file handling.
Diffstat (limited to 'mpq-bios.c')
-rw-r--r--mpq-bios.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/mpq-bios.c b/mpq-bios.c
index a093b84..055fa48 100644
--- a/mpq-bios.c
+++ b/mpq-bios.c
@@ -363,3 +363,39 @@ int __mpqlib_seek(mpq_archive_t * mpq_a, off_t off) {
int __mpqlib_read(mpq_archive_t * mpq_a, void * buffer, size_t size) {
return read_data(mpq_a, buffer, size);
}
+
+uint64_t mpqlib_ioctl(mpq_archive_t * mpq_a, enum mpqlib_ioctl_t command, int entry) {
+ switch(command) {
+ case MPQLIB_IOCTL_NO_ACTION:
+ return 0;
+ case MPQLIB_IOCTL_GET_FORMAT_VERSION:
+ return mpq_a->mpq_i->format_version;
+ case MPQLIB_IOCTL_GET_SECTOR_SIZE:
+ return mpq_a->mpq_i->sector_size;
+ case MPQLIB_IOCTL_GET_BLOCK_OFFSET:
+ case MPQLIB_IOCTL_GET_BLOCK_SIZE:
+ case MPQLIB_IOCTL_GET_FILE_SIZE:
+ case MPQLIB_IOCTL_GET_FLAGS:
+ if (entry >= mpq_a->mpq_i->block_table_entries) {
+ __mpqlib_errno = MPQLIB_ERROR_IOCTL_INVALID_ENTRY;
+ return -1;
+ }
+ switch (command) {
+ case MPQLIB_IOCTL_GET_BLOCK_OFFSET:
+ return mpq_a->mpq_i->blocks[entry].block_offset;
+ case MPQLIB_IOCTL_GET_BLOCK_SIZE:
+ return mpq_a->mpq_i->blocks[entry].block_size;
+ case MPQLIB_IOCTL_GET_FILE_SIZE:
+ return mpq_a->mpq_i->blocks[entry].file_size;
+ case MPQLIB_IOCTL_GET_FLAGS:
+ return mpq_a->mpq_i->blocks[entry].flags;
+ default:
+ // should never get there.
+ __mpqlib_errno = MPQLIB_ERROR_UNKNOWN;
+ return -1;
+ }
+ default:
+ __mpqlib_errno = MPQLIB_ERROR_INVALID_IOCTL;
+ return -1;
+ }
+}