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