misc/libphysfs/archiver_iso9660.c
author nemo
Sat, 27 Apr 2013 16:56:50 -0400
changeset 8939 b26aaf28c920
parent 8524 a65e9bcf0a03
child 12213 bb5522e88ab2
permissions -rw-r--r--
So. First pass. Add secondary explosions to RateExplosion and RateShotgun. Not yet added to shoves. This is of limited utility at present since the dX has to be small since we can't bother tracing all hog motion. But, should be more useful once shove is added, and tracking of explosives and mines.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     1
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     2
 * ISO9660 support routines for PhysicsFS.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     3
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     4
 * Please see the file LICENSE.txt in the source's root directory.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     5
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     6
 *  This file written by Christoph Nelles.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     7
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     8
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     9
/* !!! FIXME: this file needs Ryanification. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    10
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    11
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    12
 * Handles CD-ROM disk images (and raw CD-ROM devices).
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    13
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    14
 * Not supported:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    15
 * - RockRidge
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    16
 * - Non 2048 Sectors
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    17
 * - UDF
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    18
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    19
 * Deviations from the standard
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    20
 * - Ignores mandatory sort order
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    21
 * - Allows various invalid file names
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    22
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    23
 * Problems
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    24
 * - Ambiguities in the standard
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    25
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    26
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    27
#define __PHYSICSFS_INTERNAL__
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    28
#include "physfs_internal.h"
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    29
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    30
#if PHYSFS_SUPPORTS_ISO9660
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    31
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    32
#include <time.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    33
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    34
/* cache files smaller than this completely in memory */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    35
#define ISO9660_FULLCACHEMAXSIZE 2048
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    36
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    37
/* !!! FIXME: this is going to cause trouble. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    38
#pragma pack(push)  /* push current alignment to stack */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    39
#pragma pack(1)     /* set alignment to 1 byte boundary */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    40
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    41
/* This is the format as defined by the standard
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    42
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    43
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    44
    PHYSFS_uint32 lsb;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    45
    PHYSFS_uint32 msb;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    46
} ISOBB32bit; // 32byte Both Byte type, means the value first in LSB then in MSB
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    47
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    48
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    49
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    50
    PHYSFS_uint16 lsb;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    51
    PHYSFS_uint16 msb;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    52
} ISOBB16bit; // 16byte Both Byte type, means the value first in LSB then in MSB
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    53
*/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    54
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    55
/* define better ones to simplify coding (less if's) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    56
#if PHYSFS_BYTEORDER == PHYSFS_LIL_ENDIAN
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    57
#define ISOBB32bit(name) PHYSFS_uint32 name; PHYSFS_uint32 __dummy_##name;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    58
#define ISOBB16bit(name) PHYSFS_uint16 name; PHYSFS_uint16 __dummy_##name;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    59
#else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    60
#define ISOBB32bit(name) PHYSFS_uint32 __dummy_##name; PHYSFS_uint32 name;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    61
#define ISOBB16bit(name) PHYSFS_uint16 __dummy_##name; PHYSFS_uint16 name;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    62
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    63
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    64
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    65
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    66
    char year[4];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    67
    char month[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    68
    char day[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    69
    char hour[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    70
    char minute[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    71
    char second[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    72
    char centisec[2];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    73
    PHYSFS_sint8 offset; /* in 15min from GMT */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    74
} ISO9660VolumeTimestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    75
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    76
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    77
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    78
    PHYSFS_uint8 year;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    79
    PHYSFS_uint8 month;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    80
    PHYSFS_uint8 day;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    81
    PHYSFS_uint8 hour;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    82
    PHYSFS_uint8 minute;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    83
    PHYSFS_uint8 second;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    84
    PHYSFS_sint8 offset;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    85
} ISO9660FileTimestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    86
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    87
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    88
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    89
  unsigned existence:1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    90
  unsigned directory:1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    91
  unsigned associated_file:1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    92
  unsigned record:1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    93
  unsigned protection:1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    94
  unsigned reserved:2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    95
  unsigned multiextent:1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    96
} ISO9660FileFlags;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    97
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    98
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    99
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   100
    PHYSFS_uint8 length;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   101
    PHYSFS_uint8 attribute_length;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   102
    ISOBB32bit(extent_location)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   103
    ISOBB32bit(data_length)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   104
    ISO9660FileTimestamp timestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   105
    ISO9660FileFlags file_flags;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   106
    PHYSFS_uint8 file_unit_size;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   107
    PHYSFS_uint8 gap_size;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   108
    ISOBB16bit(vol_seq_no)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   109
    PHYSFS_uint8 len_fi;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   110
    char unused;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   111
} ISO9660RootDirectoryRecord;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   112
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   113
/* this structure is combined for all Volume descriptor types */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   114
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   115
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   116
    PHYSFS_uint8 type;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   117
    char identifier[5];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   118
    PHYSFS_uint8 version;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   119
    PHYSFS_uint8 flags;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   120
    char system_identifier[32];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   121
    char volume_identifier[32];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   122
    char unused2[8];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   123
    ISOBB32bit(space_size)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   124
    PHYSFS_uint8 escape_sequences[32];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   125
    ISOBB16bit(vol_set_size)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   126
    ISOBB16bit(vol_seq_no)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   127
    ISOBB16bit(block_size)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   128
    ISOBB32bit(path_table_size)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   129
/*    PHYSFS_uint32 path_table_start_lsb; // why didn't they use both byte type?
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   130
    PHYSFS_uint32 opt_path_table_start_lsb;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   131
    PHYSFS_uint32 path_table_start_msb;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   132
    PHYSFS_uint32 opt_path_table_start_msb;*/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   133
#if PHYSFS_BYTEORDER == PHYSFS_LIL_ENDIAN
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   134
    PHYSFS_uint32 path_table_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   135
    PHYSFS_uint32 opt_path_table_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   136
    PHYSFS_uint32 unused6;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   137
    PHYSFS_uint32 unused7;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   138
#else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   139
    PHYSFS_uint32 unused6;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   140
    PHYSFS_uint32 unused7;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   141
    PHYSFS_uint32 path_table_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   142
    PHYSFS_uint32 opt_path_table_start;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   143
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   144
    ISO9660RootDirectoryRecord rootdirectory;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   145
    char set_identifier[128];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   146
    char publisher_identifier[128];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   147
    char preparer_identifer[128];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   148
    char application_identifier[128];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   149
    char copyright_file_identifier[37];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   150
    char abstract_file_identifier[37];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   151
    char bibliographic_file_identifier[37];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   152
    ISO9660VolumeTimestamp creation_timestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   153
    ISO9660VolumeTimestamp modification_timestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   154
    ISO9660VolumeTimestamp expiration_timestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   155
    ISO9660VolumeTimestamp effective_timestamp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   156
    PHYSFS_uint8 file_structure_version;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   157
    char unused4;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   158
    char application_use[512];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   159
    char unused5[653];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   160
} ISO9660VolumeDescriptor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   161
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   162
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   163
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   164
    PHYSFS_uint8 recordlen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   165
    PHYSFS_uint8 extattributelen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   166
    ISOBB32bit(extentpos)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   167
    ISOBB32bit(datalen)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   168
    ISO9660FileTimestamp recordtime;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   169
    ISO9660FileFlags flags;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   170
    PHYSFS_uint8 file_unit_size;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   171
    PHYSFS_uint8 interleave_gap;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   172
    ISOBB16bit(volseqno)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   173
    PHYSFS_uint8 filenamelen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   174
    char filename[222]; /* This is not exact, but makes reading easier */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   175
} ISO9660FileDescriptor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   176
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   177
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   178
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   179
    ISOBB16bit(owner)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   180
    ISOBB16bit(group)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   181
    PHYSFS_uint16 flags; /* not implemented*/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   182
    ISO9660VolumeTimestamp create_time; /* yes, not file timestamp */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   183
    ISO9660VolumeTimestamp mod_time;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   184
    ISO9660VolumeTimestamp expire_time;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   185
    ISO9660VolumeTimestamp effective_time;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   186
    PHYSFS_uint8 record_format;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   187
    PHYSFS_uint8 record_attributes;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   188
    ISOBB16bit(record_len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   189
    char system_identifier[32];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   190
    char system_use[64];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   191
    PHYSFS_uint8 version;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   192
    ISOBB16bit(escape_len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   193
    char reserved[64];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   194
    /** further fields not implemented */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   195
} ISO9660ExtAttributeRec;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   196
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   197
#pragma pack(pop)   /* restore original alignment from stack */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   198
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   199
typedef struct
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   200
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   201
    PHYSFS_Io *io;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   202
    PHYSFS_uint32 rootdirstart;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   203
    PHYSFS_uint32 rootdirsize;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   204
    PHYSFS_uint64 currpos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   205
    int isjoliet;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   206
    char *path;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   207
    void *mutex;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   208
} ISO9660Handle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   209
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   210
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   211
typedef struct __ISO9660FileHandle
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   212
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   213
    PHYSFS_sint64 filesize;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   214
    PHYSFS_uint64 currpos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   215
    PHYSFS_uint64 startblock;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   216
    ISO9660Handle *isohandle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   217
    PHYSFS_uint32 (*read) (struct __ISO9660FileHandle *filehandle, void *buffer,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   218
            PHYSFS_uint64 len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   219
    int (*seek)(struct __ISO9660FileHandle *filehandle,  PHYSFS_sint64 offset);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   220
    void (*close)(struct __ISO9660FileHandle *filehandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   221
    /* !!! FIXME: anonymouse union is going to cause problems. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   222
    union
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   223
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   224
        /* !!! FIXME: just use a memory PHYSFS_Io here, unify all this code. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   225
        char *cacheddata; /* data of file when cached */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   226
        PHYSFS_Io *io; /* handle to separate opened file */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   227
    };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   228
} ISO9660FileHandle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   229
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   230
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   231
 * Time conversion functions
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   232
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   233
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   234
static PHYSFS_sint64 iso_mktime(ISO9660FileTimestamp *timestamp)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   235
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   236
    struct tm tm;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   237
    tm.tm_year = timestamp->year;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   238
    tm.tm_mon = timestamp->month - 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   239
    tm.tm_mday = timestamp->day;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   240
    tm.tm_hour = timestamp->hour;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   241
    tm.tm_min = timestamp->minute;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   242
    tm.tm_sec = timestamp->second;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   243
    /* Ignore GMT offset for now... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   244
    return mktime(&tm);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   245
} /* iso_mktime */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   246
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   247
static int iso_atoi2(char *text)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   248
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   249
    return ((text[0] - 40) * 10) + (text[1] - 40);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   250
} /* iso_atoi2 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   251
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   252
static int iso_atoi4(char *text)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   253
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   254
    return ((text[0] - 40) * 1000) + ((text[1] - 40) * 100) +
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   255
           ((text[2] - 40) * 10) + (text[3] - 40);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   256
} /* iso_atoi4 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   257
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   258
static PHYSFS_sint64 iso_volume_mktime(ISO9660VolumeTimestamp *timestamp)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   259
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   260
    struct tm tm;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   261
    tm.tm_year = iso_atoi4(timestamp->year);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   262
    tm.tm_mon = iso_atoi2(timestamp->month) - 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   263
    tm.tm_mday = iso_atoi2(timestamp->day);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   264
    tm.tm_hour = iso_atoi2(timestamp->hour);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   265
    tm.tm_min = iso_atoi2(timestamp->minute);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   266
    tm.tm_sec = iso_atoi2(timestamp->second);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   267
    /* this allows values outside the range of a unix timestamp... sanitize them */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   268
    PHYSFS_sint64 value = mktime(&tm);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   269
    return value == -1 ? 0 : value;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   270
} /* iso_volume_mktime */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   271
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   272
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   273
 * Filename extraction
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   274
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   275
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   276
static int iso_extractfilenameISO(ISO9660FileDescriptor *descriptor,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   277
        char *filename, int *version)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   278
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   279
    *filename = '\0';
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   280
    if (descriptor->flags.directory)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   281
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   282
        strncpy(filename, descriptor->filename, descriptor->filenamelen);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   283
        filename[descriptor->filenamelen] = '\0';
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   284
        *version = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   285
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   286
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   287
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   288
        /* find last SEPARATOR2 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   289
        int pos = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   290
        int lastfound = -1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   291
        for(;pos < descriptor->filenamelen; pos++)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   292
            if (descriptor->filename[pos] == ';')
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   293
                lastfound = pos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   294
        BAIL_IF_MACRO(lastfound < 1, PHYSFS_ERR_NO_SUCH_PATH /* !!! FIXME: PHYSFS_ERR_BAD_FILENAME */, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   295
        BAIL_IF_MACRO(lastfound == (descriptor->filenamelen -1), PHYSFS_ERR_NO_SUCH_PATH /* !!! PHYSFS_ERR_BAD_FILENAME */, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   296
        strncpy(filename, descriptor->filename, lastfound);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   297
        if (filename[lastfound - 1] == '.')
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   298
            filename[lastfound - 1] = '\0'; /* consume trailing ., as done in all implementations */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   299
        else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   300
            filename[lastfound] = '\0';
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   301
        *version = atoi(descriptor->filename + lastfound);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   302
    } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   303
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   304
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   305
} /* iso_extractfilenameISO */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   306
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   307
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   308
static int iso_extractfilenameUCS2(ISO9660FileDescriptor *descriptor,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   309
        char *filename, int *version)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   310
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   311
    PHYSFS_uint16 tmp[128];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   312
    PHYSFS_uint16 *src;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   313
    int len;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   314
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   315
    *filename = '\0';
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   316
    *version = 1; /* Joliet does not have versions.. at least not on my images */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   317
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   318
    src = (PHYSFS_uint16*) descriptor->filename;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   319
    len = descriptor->filenamelen / 2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   320
    tmp[len] = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   321
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   322
    while(len--)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   323
        tmp[len] = PHYSFS_swapUBE16(src[len]);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   324
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   325
    PHYSFS_utf8FromUcs2(tmp, filename, 255);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   326
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   327
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   328
} /* iso_extractfilenameUCS2 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   329
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   330
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   331
static int iso_extractfilename(ISO9660Handle *handle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   332
        ISO9660FileDescriptor *descriptor, char *filename,int *version)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   333
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   334
    if (handle->isjoliet)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   335
        return iso_extractfilenameUCS2(descriptor, filename, version);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   336
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   337
        return iso_extractfilenameISO(descriptor, filename, version);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   338
} /* iso_extractfilename */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   339
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   340
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   341
 * Basic image read functions
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   342
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   343
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   344
static int iso_readimage(ISO9660Handle *handle, PHYSFS_uint64 where,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   345
                         void *buffer, PHYSFS_uint64 len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   346
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   347
    BAIL_IF_MACRO(!__PHYSFS_platformGrabMutex(handle->mutex), ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   348
    int rc = -1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   349
    if (where != handle->currpos)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   350
        GOTO_IF_MACRO(!handle->io->seek(handle->io,where), ERRPASS, unlockme);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   351
    rc = handle->io->read(handle->io, buffer, len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   352
    if (rc == -1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   353
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   354
        handle->currpos = (PHYSFS_uint64) -1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   355
        goto unlockme;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   356
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   357
    handle->currpos += rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   358
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   359
    unlockme:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   360
    __PHYSFS_platformReleaseMutex(handle->mutex);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   361
    return rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   362
} /* iso_readimage */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   363
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   364
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   365
static PHYSFS_sint64 iso_readfiledescriptor(ISO9660Handle *handle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   366
                                            PHYSFS_uint64 where,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   367
                                            ISO9660FileDescriptor *descriptor)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   368
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   369
    PHYSFS_sint64 rc = iso_readimage(handle, where, descriptor,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   370
                                     sizeof (descriptor->recordlen));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   371
    BAIL_IF_MACRO(rc == -1, ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   372
    BAIL_IF_MACRO(rc != 1, PHYSFS_ERR_CORRUPT, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   373
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   374
    if (descriptor->recordlen == 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   375
        return 0; /* fill bytes at the end of a sector */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   376
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   377
    rc = iso_readimage(handle, where + 1, &descriptor->extattributelen,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   378
            descriptor->recordlen - sizeof(descriptor->recordlen));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   379
    BAIL_IF_MACRO(rc == -1, ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   380
    BAIL_IF_MACRO(rc != 1, PHYSFS_ERR_CORRUPT, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   381
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   382
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   383
} /* iso_readfiledescriptor */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   384
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   385
static void iso_extractsubpath(char *path, char **subpath)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   386
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   387
    *subpath = strchr(path,'/');
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   388
    if (*subpath != 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   389
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   390
        **subpath = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   391
        *subpath +=1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   392
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   393
} /* iso_extractsubpath */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   394
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   395
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   396
 * Don't use path tables, they are not necessarily faster, but more complicated
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   397
 * to implement as they store only directories and not files, so searching for
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   398
 * a file needs to branch to the directory extent sooner or later.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   399
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   400
static int iso_find_dir_entry(ISO9660Handle *handle,const char *path,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   401
                              ISO9660FileDescriptor *descriptor, int *exists)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   402
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   403
    char *subpath = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   404
    PHYSFS_uint64 readpos, end_of_dir;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   405
    char filename[255];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   406
    char pathcopy[256];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   407
    char *mypath;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   408
    int version = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   409
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   410
    strcpy(pathcopy, path);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   411
    mypath = pathcopy;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   412
    *exists = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   413
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   414
    readpos = handle->rootdirstart;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   415
    end_of_dir = handle->rootdirstart + handle->rootdirsize;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   416
    iso_extractsubpath(mypath, &subpath);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   417
    while (1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   418
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   419
        BAIL_IF_MACRO(iso_readfiledescriptor(handle, readpos, descriptor), ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   420
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   421
        /* recordlen = 0 -> no more entries or fill entry */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   422
        if (!descriptor->recordlen)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   423
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   424
            /* if we are in the last sector of the directory & it's 0 -> end */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   425
            if ((end_of_dir - 2048) <= (readpos -1))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   426
                break; /* finished */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   427
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   428
            /* else skip to the next sector & continue; */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   429
            readpos = (((readpos - 1) / 2048) + 1) * 2048;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   430
            continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   431
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   432
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   433
        readpos += descriptor->recordlen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   434
        if (descriptor->filenamelen == 1 && (descriptor->filename[0] == 0
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   435
                || descriptor->filename[0] == 1))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   436
            continue; /* special ones, ignore */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   437
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   438
        BAIL_IF_MACRO(
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   439
            iso_extractfilename(handle, descriptor, filename, &version),
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   440
            ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   441
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   442
        if (strcmp(filename, mypath) == 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   443
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   444
            if ( (subpath == 0) || (subpath[0] == 0) )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   445
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   446
                *exists = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   447
                return 0;  /* no subpaths left and we found the entry */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   448
            } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   449
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   450
            if (descriptor->flags.directory)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   451
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   452
                /* shorten the path to the subpath */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   453
                mypath = subpath;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   454
                iso_extractsubpath(mypath, &subpath);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   455
                /* gosub to the new directory extent */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   456
                readpos = descriptor->extentpos * 2048;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   457
                end_of_dir = readpos + descriptor->datalen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   458
            } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   459
            else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   460
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   461
                /* we're at a file but have a remaining subpath -> no match */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   462
                return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   463
            } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   464
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   465
    } /* while */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   466
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   467
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   468
} /* iso_find_dir_entry */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   469
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   470
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   471
static int iso_read_ext_attributes(ISO9660Handle *handle, int block,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   472
                                   ISO9660ExtAttributeRec *attributes)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   473
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   474
    return iso_readimage(handle, block * 2048, attributes,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   475
                         sizeof(ISO9660ExtAttributeRec));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   476
} /* iso_read_ext_attributes */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   477
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   478
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   479
static int ISO9660_flush(PHYSFS_Io *io) { return 1;  /* no write support. */ }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   480
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   481
static PHYSFS_Io *ISO9660_duplicate(PHYSFS_Io *_io)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   482
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   483
    BAIL_MACRO(PHYSFS_ERR_UNSUPPORTED, NULL);  /* !!! FIXME: write me. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   484
} /* ISO9660_duplicate */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   485
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   486
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   487
static void ISO9660_destroy(PHYSFS_Io *io)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   488
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   489
    ISO9660FileHandle *fhandle = (ISO9660FileHandle*) io->opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   490
    fhandle->close(fhandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   491
    allocator.Free(io);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   492
} /* ISO9660_destroy */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   493
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   494
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   495
static PHYSFS_sint64 ISO9660_read(PHYSFS_Io *io, void *buf, PHYSFS_uint64 len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   496
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   497
    ISO9660FileHandle *fhandle = (ISO9660FileHandle*) io->opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   498
    return fhandle->read(fhandle, buf, len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   499
} /* ISO9660_read */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   500
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   501
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   502
static PHYSFS_sint64 ISO9660_write(PHYSFS_Io *io, const void *b, PHYSFS_uint64 l)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   503
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   504
    BAIL_MACRO(PHYSFS_ERR_READ_ONLY, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   505
} /* ISO9660_write */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   506
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   507
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   508
static PHYSFS_sint64 ISO9660_tell(PHYSFS_Io *io)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   509
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   510
    return ((ISO9660FileHandle*) io->opaque)->currpos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   511
} /* ISO9660_tell */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   512
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   513
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   514
static int ISO9660_seek(PHYSFS_Io *io, PHYSFS_uint64 offset)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   515
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   516
    ISO9660FileHandle *fhandle = (ISO9660FileHandle*) io->opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   517
    return fhandle->seek(fhandle, offset);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   518
} /* ISO9660_seek */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   519
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   520
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   521
static PHYSFS_sint64 ISO9660_length(PHYSFS_Io *io)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   522
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   523
    return ((ISO9660FileHandle*) io->opaque)->filesize;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   524
} /* ISO9660_length */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   525
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   526
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   527
static const PHYSFS_Io ISO9660_Io =
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   528
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   529
    CURRENT_PHYSFS_IO_API_VERSION, NULL,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   530
    ISO9660_read,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   531
    ISO9660_write,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   532
    ISO9660_seek,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   533
    ISO9660_tell,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   534
    ISO9660_length,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   535
    ISO9660_duplicate,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   536
    ISO9660_flush,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   537
    ISO9660_destroy
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   538
};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   539
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   540
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   541
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   542
 * Archive management functions
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   543
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   544
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   545
static void *ISO9660_openArchive(PHYSFS_Io *io, const char *filename, int forWriting)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   546
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   547
    char magicnumber[6];
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   548
    ISO9660Handle *handle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   549
    int founddescriptor = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   550
    int foundjoliet = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   551
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   552
    assert(io != NULL);  /* shouldn't ever happen. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   553
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   554
    BAIL_IF_MACRO(forWriting, PHYSFS_ERR_READ_ONLY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   555
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   556
    /* Skip system area to magic number in Volume descriptor */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   557
    BAIL_IF_MACRO(!io->seek(io, 32769), ERRPASS, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   558
    BAIL_IF_MACRO(!io->read(io, magicnumber, 5) != 5, ERRPASS, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   559
    if (memcmp(magicnumber, "CD001", 6) != 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   560
        BAIL_MACRO(PHYSFS_ERR_UNSUPPORTED, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   561
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   562
    handle = allocator.Malloc(sizeof(ISO9660Handle));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   563
    GOTO_IF_MACRO(!handle, PHYSFS_ERR_OUT_OF_MEMORY, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   564
    handle->path = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   565
    handle->mutex= 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   566
    handle->io = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   567
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   568
    handle->path = allocator.Malloc(strlen(filename) + 1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   569
    GOTO_IF_MACRO(!handle->path, PHYSFS_ERR_OUT_OF_MEMORY, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   570
    strcpy(handle->path, filename);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   571
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   572
    handle->mutex = __PHYSFS_platformCreateMutex();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   573
    GOTO_IF_MACRO(!handle->mutex, ERRPASS, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   574
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   575
    handle->io = io;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   576
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   577
    /* seek Primary Volume Descriptor */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   578
    GOTO_IF_MACRO(!io->seek(io, 32768), PHYSFS_ERR_IO, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   579
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   580
    while (1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   581
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   582
        ISO9660VolumeDescriptor descriptor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   583
        GOTO_IF_MACRO(io->read(io, &descriptor, sizeof(ISO9660VolumeDescriptor)) != sizeof(ISO9660VolumeDescriptor), PHYSFS_ERR_IO, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   584
        GOTO_IF_MACRO(strncmp(descriptor.identifier, "CD001", 5) != 0, PHYSFS_ERR_UNSUPPORTED, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   585
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   586
        if (descriptor.type == 255)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   587
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   588
            /* type 255 terminates the volume descriptor list */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   589
            if (founddescriptor)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   590
                return handle; /* ok, we've found one volume descriptor */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   591
            else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   592
                GOTO_MACRO(PHYSFS_ERR_CORRUPT, errorcleanup);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   593
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   594
        if (descriptor.type == 1 && !founddescriptor)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   595
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   596
            handle->currpos = io->tell(io);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   597
            handle->rootdirstart =
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   598
                    descriptor.rootdirectory.extent_location * 2048;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   599
            handle->rootdirsize =
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   600
                    descriptor.rootdirectory.data_length;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   601
            handle->isjoliet = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   602
            founddescriptor = 1; /* continue search for joliet */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   603
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   604
        if (descriptor.type == 2 && !foundjoliet)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   605
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   606
            /* check if is joliet */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   607
            PHYSFS_uint8 *s = descriptor.escape_sequences;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   608
            int joliet = !(descriptor.flags & 1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   609
                    && (s[0] == 0x25)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   610
                    && (s[1] == 0x2F)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   611
                    && ((s[2] == 0x40) || (s[2] == 0x43) || (s[2] == 0x45));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   612
            if (!joliet)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   613
                continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   614
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   615
            handle->currpos = io->tell(io);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   616
            handle->rootdirstart =
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   617
                    descriptor.rootdirectory.extent_location * 2048;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   618
            handle->rootdirsize =
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   619
                    descriptor.rootdirectory.data_length;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   620
            handle->isjoliet = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   621
            founddescriptor = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   622
            foundjoliet = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   623
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   624
    } /* while */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   625
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   626
    GOTO_MACRO(PHYSFS_ERR_CORRUPT, errorcleanup);  /* not found. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   627
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   628
errorcleanup:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   629
    if (handle)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   630
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   631
        if (handle->path)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   632
            allocator.Free(handle->path);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   633
        if (handle->mutex)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   634
            __PHYSFS_platformDestroyMutex(handle->mutex);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   635
        allocator.Free(handle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   636
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   637
    return NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   638
} /* ISO9660_openArchive */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   639
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   640
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   641
static void ISO9660_closeArchive(PHYSFS_Dir *opaque)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   642
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   643
    ISO9660Handle *handle = (ISO9660Handle*) opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   644
    handle->io->destroy(handle->io);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   645
    __PHYSFS_platformDestroyMutex(handle->mutex);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   646
    allocator.Free(handle->path);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   647
    allocator.Free(handle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   648
} /* ISO9660_closeArchive */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   649
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   650
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   651
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   652
 * Read functions
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   653
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   654
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   655
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   656
static PHYSFS_uint32 iso_file_read_mem(ISO9660FileHandle *filehandle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   657
                                       void *buffer, PHYSFS_uint64 len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   658
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   659
    /* check remaining bytes & max obj which can be fetched */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   660
    const PHYSFS_sint64 bytesleft = filehandle->filesize - filehandle->currpos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   661
    if (bytesleft < len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   662
        len = bytesleft;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   663
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   664
    if (len == 0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   665
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   666
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   667
    memcpy(buffer, filehandle->cacheddata + filehandle->currpos, (size_t) len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   668
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   669
    filehandle->currpos += len;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   670
    return (PHYSFS_uint32) len;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   671
} /* iso_file_read_mem */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   672
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   673
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   674
static int iso_file_seek_mem(ISO9660FileHandle *fhandle, PHYSFS_sint64 offset)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   675
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   676
    BAIL_IF_MACRO(offset < 0, PHYSFS_ERR_INVALID_ARGUMENT, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   677
    BAIL_IF_MACRO(offset >= fhandle->filesize, PHYSFS_ERR_PAST_EOF, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   678
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   679
    fhandle->currpos = offset;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   680
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   681
} /* iso_file_seek_mem */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   682
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   683
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   684
static void iso_file_close_mem(ISO9660FileHandle *fhandle)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   685
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   686
    allocator.Free(fhandle->cacheddata);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   687
    allocator.Free(fhandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   688
} /* iso_file_close_mem */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   689
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   690
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   691
static PHYSFS_uint32 iso_file_read_foreign(ISO9660FileHandle *filehandle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   692
                                           void *buffer, PHYSFS_uint64 len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   693
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   694
    /* check remaining bytes & max obj which can be fetched */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   695
    const PHYSFS_sint64 bytesleft = filehandle->filesize - filehandle->currpos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   696
    if (bytesleft < len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   697
        len = bytesleft;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   698
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   699
    const PHYSFS_sint64 rc = filehandle->io->read(filehandle->io, buffer, len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   700
    BAIL_IF_MACRO(rc == -1, ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   701
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   702
    filehandle->currpos += rc; /* i trust my internal book keeping */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   703
    BAIL_IF_MACRO(rc < len, PHYSFS_ERR_CORRUPT, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   704
    return rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   705
} /* iso_file_read_foreign */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   706
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   707
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   708
static int iso_file_seek_foreign(ISO9660FileHandle *fhandle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   709
                                 PHYSFS_sint64 offset)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   710
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   711
    BAIL_IF_MACRO(offset < 0, PHYSFS_ERR_INVALID_ARGUMENT, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   712
    BAIL_IF_MACRO(offset >= fhandle->filesize, PHYSFS_ERR_PAST_EOF, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   713
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   714
    PHYSFS_sint64 pos = fhandle->startblock * 2048 + offset;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   715
    BAIL_IF_MACRO(!fhandle->io->seek(fhandle->io, pos), ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   716
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   717
    fhandle->currpos = offset;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   718
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   719
} /* iso_file_seek_foreign */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   720
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   721
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   722
static void iso_file_close_foreign(ISO9660FileHandle *fhandle)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   723
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   724
    fhandle->io->destroy(fhandle->io);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   725
    allocator.Free(fhandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   726
} /* iso_file_close_foreign */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   727
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   728
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   729
static int iso_file_open_mem(ISO9660Handle *handle, ISO9660FileHandle *fhandle)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   730
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   731
    fhandle->cacheddata = allocator.Malloc(fhandle->filesize);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   732
    BAIL_IF_MACRO(!fhandle->cacheddata, PHYSFS_ERR_OUT_OF_MEMORY, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   733
    int rc = iso_readimage(handle, fhandle->startblock * 2048,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   734
                           fhandle->cacheddata, fhandle->filesize);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   735
    GOTO_IF_MACRO(rc < 0, ERRPASS, freemem);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   736
    GOTO_IF_MACRO(rc == 0, PHYSFS_ERR_CORRUPT, freemem);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   737
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   738
    fhandle->read = iso_file_read_mem;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   739
    fhandle->seek = iso_file_seek_mem;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   740
    fhandle->close = iso_file_close_mem;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   741
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   742
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   743
freemem:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   744
    allocator.Free(fhandle->cacheddata);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   745
    return -1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   746
} /* iso_file_open_mem */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   747
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   748
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   749
static int iso_file_open_foreign(ISO9660Handle *handle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   750
                                 ISO9660FileHandle *fhandle)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   751
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   752
    int rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   753
    fhandle->io = __PHYSFS_createNativeIo(handle->path, 'r');
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   754
    BAIL_IF_MACRO(!fhandle->io, ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   755
    rc = fhandle->io->seek(fhandle->io, fhandle->startblock * 2048);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   756
    GOTO_IF_MACRO(!rc, ERRPASS, closefile);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   757
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   758
    fhandle->read = iso_file_read_foreign;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   759
    fhandle->seek = iso_file_seek_foreign;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   760
    fhandle->close = iso_file_close_foreign;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   761
    return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   762
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   763
closefile:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   764
    fhandle->io->destroy(fhandle->io);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   765
    return -1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   766
} /* iso_file_open_foreign */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   767
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   769
static PHYSFS_Io *ISO9660_openRead(PHYSFS_Dir *opaque, const char *filename,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   770
                                   int *exists)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   771
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   772
    PHYSFS_Io *retval = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   773
    ISO9660Handle *handle = (ISO9660Handle*) opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   774
    ISO9660FileHandle *fhandle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   775
    ISO9660FileDescriptor descriptor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   776
    int rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   777
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   778
    fhandle = allocator.Malloc(sizeof(ISO9660FileHandle));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   779
    BAIL_IF_MACRO(fhandle == 0, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   780
    fhandle->cacheddata = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   781
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   782
    retval = allocator.Malloc(sizeof(PHYSFS_Io));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   783
    GOTO_IF_MACRO(retval == 0, PHYSFS_ERR_OUT_OF_MEMORY, errorhandling);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   784
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   785
    /* find file descriptor */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   786
    rc = iso_find_dir_entry(handle, filename, &descriptor, exists);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   787
    GOTO_IF_MACRO(rc, ERRPASS, errorhandling);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   788
    GOTO_IF_MACRO(!*exists, PHYSFS_ERR_NO_SUCH_PATH, errorhandling);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   789
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   790
    fhandle->startblock = descriptor.extentpos + descriptor.extattributelen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   791
    fhandle->filesize = descriptor.datalen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   792
    fhandle->currpos = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   793
    fhandle->isohandle = handle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   794
    fhandle->cacheddata = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   795
    fhandle->io = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   796
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   797
    if (descriptor.datalen <= ISO9660_FULLCACHEMAXSIZE)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   798
        rc = iso_file_open_mem(handle, fhandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   799
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   800
        rc = iso_file_open_foreign(handle, fhandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   801
    GOTO_IF_MACRO(rc, ERRPASS, errorhandling);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   802
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   803
    memcpy(retval, &ISO9660_Io, sizeof (PHYSFS_Io));
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   804
    retval->opaque = fhandle;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   805
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   806
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   807
errorhandling:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   808
    if (retval) allocator.Free(retval);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   809
    if (fhandle) allocator.Free(fhandle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   810
    return NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   811
} /* ISO9660_openRead */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   812
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   813
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   814
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   815
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   816
 * Information gathering functions
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   817
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   818
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   819
static void ISO9660_enumerateFiles(PHYSFS_Dir *opaque, const char *dname,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   820
                                   int omitSymLinks,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   821
                                   PHYSFS_EnumFilesCallback cb,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   822
                                   const char *origdir, void *callbackdata)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   823
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   824
    ISO9660Handle *handle = (ISO9660Handle*) opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   825
    ISO9660FileDescriptor descriptor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   826
    PHYSFS_uint64 readpos;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   827
    PHYSFS_uint64 end_of_dir;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   828
    char filename[130]; /* ISO allows 31, Joliet 128 -> 128 + 2 eol bytes */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   829
    int version = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   830
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   831
    if (*dname == '\0')
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   832
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   833
        readpos = handle->rootdirstart;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   834
        end_of_dir = readpos + handle->rootdirsize;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   835
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   836
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   837
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   838
        printf("pfad %s\n",dname);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   839
        int exists = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   840
        BAIL_IF_MACRO(iso_find_dir_entry(handle,dname, &descriptor, &exists), ERRPASS,);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   841
        BAIL_IF_MACRO(!exists, ERRPASS, );
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   842
        BAIL_IF_MACRO(!descriptor.flags.directory, ERRPASS,);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   843
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   844
        readpos = descriptor.extentpos * 2048;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   845
        end_of_dir = readpos + descriptor.datalen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   846
    } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   847
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   848
    while (1)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   849
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   850
        BAIL_IF_MACRO(iso_readfiledescriptor(handle, readpos, &descriptor), ERRPASS, );
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   851
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   852
        /* recordlen = 0 -> no more entries or fill entry */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   853
        if (!descriptor.recordlen)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   854
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   855
            /* if we are in the last sector of the directory & it's 0 -> end */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   856
            if ((end_of_dir - 2048) <= (readpos -1))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   857
                break;  /* finished */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   858
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   859
            /* else skip to the next sector & continue; */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   860
            readpos = (((readpos - 1) / 2048) + 1) * 2048;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   861
            continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   862
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   863
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   864
        readpos +=  descriptor.recordlen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   865
        if (descriptor.filenamelen == 1 && (descriptor.filename[0] == 0
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   866
                || descriptor.filename[0] == 1))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   867
            continue; /* special ones, ignore */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   868
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   869
        strncpy(filename,descriptor.filename,descriptor.filenamelen);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   870
        iso_extractfilename(handle, &descriptor, filename, &version);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   871
        cb(callbackdata, origdir,filename);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   872
    } /* while */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   873
} /* ISO9660_enumerateFiles */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   874
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   875
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   876
static int ISO9660_stat(PHYSFS_Dir *opaque, const char *name, int *exists,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   877
                        PHYSFS_Stat *stat)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   878
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   879
    ISO9660Handle *handle = (ISO9660Handle*) opaque;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   880
    ISO9660FileDescriptor descriptor;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   881
    ISO9660ExtAttributeRec extattr;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   882
    BAIL_IF_MACRO(iso_find_dir_entry(handle, name, &descriptor, exists), ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   883
    if (!*exists)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   884
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   885
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   886
    stat->readonly = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   887
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   888
    /* try to get extended info */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   889
    if (descriptor.extattributelen)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   890
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   891
        BAIL_IF_MACRO(iso_read_ext_attributes(handle,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   892
                descriptor.extentpos, &extattr), ERRPASS, -1);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   893
        stat->createtime = iso_volume_mktime(&extattr.create_time);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   894
        stat->modtime = iso_volume_mktime(&extattr.mod_time);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   895
        stat->accesstime = iso_volume_mktime(&extattr.mod_time);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   896
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   897
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   898
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   899
        stat->createtime = iso_mktime(&descriptor.recordtime);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   900
        stat->modtime = iso_mktime(&descriptor.recordtime);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   901
        stat->accesstime = iso_mktime(&descriptor.recordtime);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   902
    } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   903
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   904
    if (descriptor.flags.directory)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   905
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   906
        stat->filesize = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   907
        stat->filetype = PHYSFS_FILETYPE_DIRECTORY;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   908
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   909
    else
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   910
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   911
        stat->filesize = descriptor.datalen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   912
        stat->filetype = PHYSFS_FILETYPE_REGULAR;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   913
    } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   914
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   915
    return 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   916
} /* ISO9660_stat */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   917
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   918
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   919
/*******************************************************************************
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   920
 * Not supported functions
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   921
 ******************************************************************************/
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   922
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   923
static PHYSFS_Io *ISO9660_openWrite(PHYSFS_Dir *opaque, const char *name)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   924
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   925
    BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   926
} /* ISO9660_openWrite */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   927
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   928
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   929
static PHYSFS_Io *ISO9660_openAppend(PHYSFS_Dir *opaque, const char *name)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   930
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   931
    BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   932
} /* ISO9660_openAppend */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   933
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   934
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   935
static int ISO9660_remove(PHYSFS_Dir *opaque, const char *name)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   936
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   937
    BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   938
} /* ISO9660_remove */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   939
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   940
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   941
static int ISO9660_mkdir(PHYSFS_Dir *opaque, const char *name)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   942
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   943
    BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   944
} /* ISO9660_mkdir */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   945
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   946
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   947
const PHYSFS_Archiver __PHYSFS_Archiver_ISO9660 =
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   948
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   949
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   950
        "ISO",
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   951
        "ISO9660 image file",
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   952
        "Christoph Nelles <evilazrael@evilazrael.de>",
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   953
        "http://www.evilazrael.de/",
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   954
    },
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   955
    ISO9660_openArchive,        /* openArchive() method    */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   956
    ISO9660_enumerateFiles,     /* enumerateFiles() method */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   957
    ISO9660_openRead,           /* openRead() method       */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   958
    ISO9660_openWrite,          /* openWrite() method      */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   959
    ISO9660_openAppend,         /* openAppend() method     */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   960
    ISO9660_remove,             /* remove() method         */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   961
    ISO9660_mkdir,              /* mkdir() method          */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   962
    ISO9660_closeArchive,       /* closeArchive() method   */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   963
    ISO9660_stat                /* stat() method           */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   964
};
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   965
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   966
#endif  /* defined PHYSFS_SUPPORTS_ISO9660 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   967
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   968
/* end of archiver_iso9660.c ... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   969