From fabd02b4bb0c1df2b65ea682b29087a1776954ed Mon Sep 17 00:00:00 2001 From: pixel Date: Mon, 9 Jul 2007 16:34:30 +0000 Subject: Adding basic file handling. --- mpq-bios.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'mpq-bios.c') 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; + } +} -- cgit v1.2.3