diff options
author | pixel <pixel> | 2007-07-09 16:34:30 +0000 |
---|---|---|
committer | pixel <pixel> | 2007-07-09 16:34:30 +0000 |
commit | fabd02b4bb0c1df2b65ea682b29087a1776954ed (patch) | |
tree | d05674f049e83e1fd8919ad74bfee84304d6887f /mpq-bios.c | |
parent | 2efe6f62b644ca93b7294de6dc83090542b2e4e2 (diff) |
Adding basic file handling.
Diffstat (limited to 'mpq-bios.c')
-rw-r--r-- | mpq-bios.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -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; + } +} |