1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftrfork.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Embedded resource forks accessor (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Copyright 2004-2010, 2013, 2014 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Masatake YAMATO and Redhat K.K. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* derived from ftobjs.c. */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Development of the code in this file is support of */ 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Information-technology Promotion Agency, Japan. */ 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h> 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_RFORK_H 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "basepic.h" 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "ftbase.h" 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_raccess 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** Resource fork directory access ****/ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( FT_Error ) 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Raccess_Get_HeaderInfo( FT_Library library, 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long rfork_offset, 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *map_offset, 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *rdata_pos ) 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char head[16], head2[16]; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long map_pos, rdata_len; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int allzeros, allmatch, i; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long type_list; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( library ); 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Seek( stream, rfork_offset ); 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( head[1] << 16 ) | 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( head[2] << 8 ) | 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov head[3] ); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov map_pos = rfork_offset + ( ( head[4] << 24 ) | 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( head[5] << 16 ) | 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( head[6] << 8 ) | 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov head[7] ); 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rdata_len = ( head[ 8] << 24 ) | 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( head[ 9] << 16 ) | 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( head[10] << 8 ) | 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov head[11]; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* map_len = head[12] .. head[15] */ 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Unknown_File_Format ); 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Seek( stream, map_pos ); 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov allzeros = 1; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov allmatch = 1; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < 16; ++i ) 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( head2[i] != 0 ) 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov allzeros = 0; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( head2[i] != head[i] ) 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov allmatch = 0; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !allzeros && !allmatch ) 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Unknown_File_Format ); 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If we have reached this point then it is probably a mac resource */ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* file. Now, does it contain any interesting resources? */ 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Skip handle to next resource map, the file resource number, and */ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* attributes. */ 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov + 2 /* skip file resource number */ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov + 2 ); /* skip attributes */ 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_USHORT( type_list ) ) 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( type_list == -1 ) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Unknown_File_Format ); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Seek( stream, map_pos + type_list ); 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *map_offset = map_pos + type_list; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static int 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_RFork_Ref* b ) 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( a->res_id < b->res_id ) 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( a->res_id > b->res_id ) 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( FT_Error ) 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Raccess_Get_DataOffsets( FT_Library library, 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long map_offset, 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long rdata_pos, 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long tag, 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Bool sort_by_res_id, 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long **offsets, 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *count ) 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i, j, cnt, subcnt; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long tag_internal, rpos; 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = library->memory; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long temp; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *offsets_internal = NULL; 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_RFork_Ref *ref = NULL; 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_TRACE3(( "\n" )); 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Seek( stream, map_offset ); 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_USHORT( cnt ) ) 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cnt++; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < cnt; ++i ) 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_LONG( tag_internal ) || 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_READ_USHORT( subcnt ) || 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_READ_USHORT( rpos ) ) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE2(( "Resource tags: %c%c%c%c\n", 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (char)( 0xff & ( tag_internal >> 24 ) ), 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (char)( 0xff & ( tag_internal >> 16 ) ), 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (char)( 0xff & ( tag_internal >> 8 ) ), 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (char)( 0xff & ( tag_internal >> 0 ) ) )); 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_TRACE3(( " : subcount=%d, suboffset=0x%04x\n", 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov subcnt, rpos )); 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( tag_internal == tag ) 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *count = subcnt + 1; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rpos += map_offset; 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Seek( stream, rpos ); 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_NEW_ARRAY( ref, *count ) ) 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = 0; j < *count; ++j ) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_USHORT( ref[j].res_id ) ) 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_LONG( temp ) ) 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ref[j].offset = temp & 0xFFFFFFL; 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_TRACE3(( " [%d]:" 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov " resource_id=0x%04x, offset=0x%08x\n", 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov j, ref[j].res_id, ref[j].offset )); 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (sort_by_res_id) 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ), 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ( int(*)(const void*, const void*) ) 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ft_raccess_sort_ref_by_id ); 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_TRACE3(( " -- sort resources by their ids --\n" )); 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for ( j = 0; j < *count; ++ j ) { 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_TRACE3(( " [%d]:" 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov " resource_id=0x%04x, offset=0x%08x\n", 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov j, ref[j].res_id, ref[j].offset )); 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_NEW_ARRAY( offsets_internal, *count ) ) 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: duplicated reference ID, 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * gap between reference IDs are acceptable? 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * further investigation on Apple implementation is needed. 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = 0; j < *count; ++j ) 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offsets_internal[j] = rdata_pos + ref[j].offset; 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *offsets = offsets_internal; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Err_Ok; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( ref ); 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Cannot_Open_Resource ); 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** Guessing functions ****/ 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** When you add a new guessing function, ****/ 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_apple_double( FT_Library library, 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_apple_single( FT_Library library, 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_darwin_ufs_export( FT_Library library, 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_darwin_newvfs( FT_Library library, 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_darwin_hfsplus( FT_Library library, 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_vfat( FT_Library library, 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_cap( FT_Library library, 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_double( FT_Library library, 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_netatalk( FT_Library library, 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table, 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_raccess_guess_rec) 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double) 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single) 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export) 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs) 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus) 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat) 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap) 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double) 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk) 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CONST_FT_RFORK_RULE_ARRAY_END 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** Helper functions ****/ 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_apple_generic( FT_Library library, 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 magic, 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_double_from_file_name( FT_Library library, 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char * file_name, 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ); 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static char * 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_make_file_name( FT_Memory memory, 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char *original_name, 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char *insertion ); 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( void ) 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Raccess_Guess( FT_Library library, 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* base_name, 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **new_names, 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *offsets, 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *errors ) 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_names[i] = NULL; 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( NULL != stream ) 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov errors[i] = FT_Stream_Seek( stream, 0 ); 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov errors[i] = FT_Err_Ok; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( errors[i] ) 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue ; 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library, 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream, base_name, 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &(new_names[i]), 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &(offsets[i]) ); 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_MACINTOSH 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_RFork_Rule 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_get_rule_type_from_rule_index( FT_Library library, 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt rule_index ) 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( library ); 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( rule_index >= FT_RACCESS_N_RULES ) 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_RFork_Rule_invalid; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_RACCESS_GUESS_TABLE_GET[rule_index].type; 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For this function, refer ftbase.h. 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Bool ) 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_raccess_rule_by_darwin_vfs( FT_Library library, 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt rule_index ) 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch( raccess_get_rule_type_from_rule_index( library, rule_index ) ) 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_RFork_Rule_darwin_newvfs: 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FT_RFork_Rule_darwin_hfsplus: 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_apple_double( FT_Library library, 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 magic = ( 0x00 << 24 ) | 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( 0x05 << 16 ) | 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( 0x16 << 8 ) | 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x07; 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = NULL; 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( NULL == stream ) 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Cannot_Open_Stream ); 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return raccess_guess_apple_generic( library, stream, base_file_name, 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov magic, result_offset ); 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_apple_single( FT_Library library, 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 magic = ( 0x00 << 24 ) | 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( 0x05 << 16 ) | 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( 0x16 << 8 ) | 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x00; 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = NULL; 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( NULL == stream ) 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Cannot_Open_Stream ); 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return raccess_guess_apple_generic( library, stream, base_file_name, 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov magic, result_offset ); 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_darwin_ufs_export( FT_Library library, 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath; 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newpath = raccess_make_file_name( memory, base_file_name, "._" ); 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !newpath ) 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Out_Of_Memory ); 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = raccess_guess_linux_double_from_file_name( library, newpath, 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_offset ); 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( newpath ); 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_darwin_hfsplus( FT_Library library, 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Only meaningful on systems with hfs+ drivers (or Macs). 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath = NULL; 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( base_file_len + 6 > FT_INT_MAX ) 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Array_Too_Large ); 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_ALLOC( newpath, base_file_len + 6 ) ) 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( newpath, base_file_name, base_file_len ); 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_offset = 0; 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_darwin_newvfs( FT_Library library, 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Only meaningful on systems with Mac OS X (> 10.1). 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath = NULL; 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( base_file_len + 18 > FT_INT_MAX ) 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Array_Too_Large ); 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_ALLOC( newpath, base_file_len + 18 ) ) 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( newpath, base_file_name, base_file_len ); 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_offset = 0; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_vfat( FT_Library library, 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath; 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newpath = raccess_make_file_name( memory, base_file_name, 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "resource.frk/" ); 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !newpath ) 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Out_Of_Memory ); 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_offset = 0; 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_cap( FT_Library library, 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath; 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !newpath ) 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Out_Of_Memory ); 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_offset = 0; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_double( FT_Library library, 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath; 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newpath = raccess_make_file_name( memory, base_file_name, "%" ); 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !newpath ) 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Out_Of_Memory ); 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = raccess_guess_linux_double_from_file_name( library, newpath, 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_offset ); 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( newpath ); 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_netatalk( FT_Library library, 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **result_file_name, 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* newpath; 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory = library->memory; 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov newpath = raccess_make_file_name( memory, base_file_name, 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ".AppleDouble/" ); 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !newpath ) 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Out_Of_Memory ); 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = raccess_guess_linux_double_from_file_name( library, newpath, 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_offset ); 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_file_name = newpath; 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FREE( newpath ); 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_apple_generic( FT_Library library, 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_file_name, 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 magic, 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 magic_from_stream; 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 version_number = 0; 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort n_of_entries; 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt32 entry_id, entry_offset, entry_length = 0; 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const FT_UInt32 resource_fork_entry_id = 0x2; 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( library ); 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( base_file_name ); 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( version_number ); 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( entry_length ); 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_LONG( magic_from_stream ) ) 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( magic_from_stream != magic ) 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Unknown_File_Format ); 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_LONG( version_number ) ) 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* filler */ 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Skip( stream, 16 ); 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_USHORT( n_of_entries ) ) 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( n_of_entries == 0 ) 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Unknown_File_Format ); 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < n_of_entries; i++ ) 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_LONG( entry_id ) ) 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( entry_id == resource_fork_entry_id ) 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_READ_LONG( entry_offset ) || 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_READ_LONG( entry_length ) ) 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_offset = entry_offset; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Unknown_File_Format ); 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_guess_linux_double_from_file_name( FT_Library library, 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *file_name, 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *result_offset ) 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Open_Args args2; 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream2; 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char * nouse = NULL; 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov args2.flags = FT_OPEN_PATHNAME; 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov args2.pathname = file_name; 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Stream_New( library, &args2, &stream2 ); 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = raccess_guess_apple_double( library, stream2, file_name, 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &nouse, result_offset ); 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream_Free( stream2, 0 ); 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static char* 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov raccess_make_file_name( FT_Memory memory, 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char *original_name, 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char *insertion ) 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char* new_name = NULL; 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* tmp; 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* slash; 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t new_length; 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( error ); 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_length = ft_strlen( original_name ) + ft_strlen( insertion ); 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_ALLOC( new_name, new_length + 1 ) ) 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tmp = ft_strrchr( original_name, '/' ); 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( tmp ) 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_strncpy( new_name, original_name, tmp - original_name + 1 ); 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_name[tmp - original_name + 1] = '\0'; 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slash = tmp + 1; 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov slash = original_name; 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_name[0] = '\0'; 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_strcat( new_name, insertion ); 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_strcat( new_name, slash ); 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return new_name; 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dummy function; just sets errors */ 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( void ) 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Raccess_Guess( FT_Library library, 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *base_name, 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char **new_names, 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long *offsets, 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error *errors ) 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int i; 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( library ); 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( stream ); 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( base_name ); 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_names[i] = NULL; 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov offsets[i] = 0; 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov errors[i] = FT_ERR( Unimplemented_Feature ); 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 868