1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftrfork.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Embedded resource forks accessor (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/* Copyright 2004-2010, 2013 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Masatake YAMATO and Redhat K.K. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* derived from ftobjs.c. */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Development of the code in this file is support of */ 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Information-technology Promotion Agency, Japan. */ 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_RFORK_H 31e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#include "basepic.h" 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_raccess 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** Resource fork directory access ****/ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Raccess_Get_HeaderInfo( FT_Library library, 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long rfork_offset, 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *map_offset, 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *rdata_pos ) 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned char head[16], head2[16]; 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long map_pos, rdata_len; 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int allzeros, allmatch, i; 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long type_list; 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( library ); 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Seek( stream, rfork_offset ); 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( head[1] << 16 ) | 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( head[2] << 8 ) | 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project head[3] ); 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project map_pos = rfork_offset + ( ( head[4] << 24 ) | 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( head[5] << 16 ) | 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( head[6] << 8 ) | 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project head[7] ); 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rdata_len = ( head[ 8] << 24 ) | 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( head[ 9] << 16 ) | 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( head[10] << 8 ) | 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project head[11]; 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* map_len = head[12] .. head[15] */ 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) 89a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Unknown_File_Format ); 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Seek( stream, map_pos ); 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project allzeros = 1; 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project allmatch = 1; 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < 16; ++i ) 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( head2[i] != 0 ) 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project allzeros = 0; 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( head2[i] != head[i] ) 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project allmatch = 0; 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !allzeros && !allmatch ) 111a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Unknown_File_Format ); 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If we have reached this point then it is probably a mac resource */ 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* file. Now, does it contain any interesting resources? */ 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Skip handle to next resource map, the file resource number, and */ 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* attributes. */ 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project + 2 /* skip file resource number */ 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project + 2 ); /* skip attributes */ 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_USHORT( type_list ) ) 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( type_list == -1 ) 124a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Unknown_File_Format ); 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Seek( stream, map_pos + type_list ); 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *map_offset = map_pos + type_list; 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static int 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_RFork_Ref* b ) 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a->res_id < b->res_id ) 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return -1; 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( a->res_id > b->res_id ) 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Error ) 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Raccess_Get_DataOffsets( FT_Library library, 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long map_offset, 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long rdata_pos, 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long tag, 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long **offsets, 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *count ) 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int i, j, cnt, subcnt; 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long tag_internal, rpos; 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = library->memory; 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long temp; 162c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Long *offsets_internal = NULL; 163c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_RFork_Ref *ref = NULL; 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Seek( stream, map_offset ); 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_USHORT( cnt ) ) 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cnt++; 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < cnt; ++i ) 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_LONG( tag_internal ) || 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_READ_USHORT( subcnt ) || 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_READ_USHORT( rpos ) ) 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE2(( "Resource tags: %c%c%c%c\n", 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (char)( 0xff & ( tag_internal >> 24 ) ), 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (char)( 0xff & ( tag_internal >> 16 ) ), 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (char)( 0xff & ( tag_internal >> 8 ) ), 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (char)( 0xff & ( tag_internal >> 0 ) ) )); 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tag_internal == tag ) 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *count = subcnt + 1; 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rpos += map_offset; 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Seek( stream, rpos ); 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( ref, *count ) ) 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( j = 0; j < *count; ++j ) 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_USHORT( ref[j].res_id ) ) 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_LONG( temp ) ) 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ref[j].offset = temp & 0xFFFFFFL; 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ), 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( int(*)(const void*, const void*) ) 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_raccess_sort_ref_by_id ); 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( offsets_internal, *count ) ) 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: duplicated reference ID, 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * gap between reference IDs are acceptable? 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * further investigation on Apple implementation is needed. 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( j = 0; j < *count; ++j ) 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project offsets_internal[j] = rdata_pos + ref[j].offset; 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *offsets = offsets_internal; 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Ok; 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( ref ); 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 236a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Cannot_Open_Resource ); 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** Guessing functions ****/ 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** When you add a new guessing function, ****/ 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_apple_double( FT_Library library, 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_apple_single( FT_Library library, 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_darwin_ufs_export( FT_Library library, 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_darwin_newvfs( FT_Library library, 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_darwin_hfsplus( FT_Library library, 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_vfat( FT_Library library, 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_cap( FT_Library library, 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_double( FT_Library library, 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_netatalk( FT_Library library, 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 320e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table, 321e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang ft_raccess_guess_rec) 322e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double) 323e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single) 324e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export) 325e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs) 326e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus) 327e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat) 328e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap) 329e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double) 330e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk) 331e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CONST_FT_RFORK_RULE_ARRAY_END 332e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 333e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** Helper functions ****/ 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_apple_generic( FT_Library library, 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 magic, 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_double_from_file_name( FT_Library library, 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char * file_name, 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ); 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static char * 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_make_file_name( FT_Memory memory, 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *original_name, 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *insertion ); 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Raccess_Guess( FT_Library library, 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* base_name, 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **new_names, 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *offsets, 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *errors ) 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 365a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Int i; 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_names[i] = NULL; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( NULL != stream ) 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project errors[i] = FT_Stream_Seek( stream, 0 ); 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project errors[i] = FT_Err_Ok; 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( errors[i] ) 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue ; 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 379e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library, 3808583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner stream, base_name, 3818583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner &(new_names[i]), 3828583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner &(offsets[i]) ); 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 389e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#ifndef FT_MACINTOSH 3908583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner static FT_RFork_Rule 391e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang raccess_get_rule_type_from_rule_index( FT_Library library, 392e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang FT_UInt rule_index ) 3938583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 394e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang FT_UNUSED( library ); 395e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 3968583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if ( rule_index >= FT_RACCESS_N_RULES ) 3978583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return FT_RFork_Rule_invalid; 3988583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 399e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang return FT_RACCESS_GUESS_TABLE_GET[rule_index].type; 4008583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 4018583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4028583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 403e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang /* 404e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang * For this function, refer ftbase.h. 405e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang */ 4068583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner FT_LOCAL_DEF( FT_Bool ) 407e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang ft_raccess_rule_by_darwin_vfs( FT_Library library, 408e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang FT_UInt rule_index ) 4098583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 410e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang switch( raccess_get_rule_type_from_rule_index( library, rule_index ) ) 4118583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner { 4128583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner case FT_RFork_Rule_darwin_newvfs: 4138583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner case FT_RFork_Rule_darwin_hfsplus: 4148583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return TRUE; 4158583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4168583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner default: 4178583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner return FALSE; 4188583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 4198583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 420e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#endif 4218583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 4228583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_apple_double( FT_Library library, 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 43077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner FT_Int32 magic = ( 0x00 << 24 ) | 43177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner ( 0x05 << 16 ) | 43277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner ( 0x16 << 8 ) | 43377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner 0x07; 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = NULL; 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( NULL == stream ) 438a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Cannot_Open_Stream ); 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return raccess_guess_apple_generic( library, stream, base_file_name, 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project magic, result_offset ); 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_apple_single( FT_Library library, 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 45277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner FT_Int32 magic = ( 0x00 << 24 ) | 45377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner ( 0x05 << 16 ) | 45477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner ( 0x16 << 8 ) | 45577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner 0x00; 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = NULL; 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( NULL == stream ) 460a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Cannot_Open_Stream ); 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return raccess_guess_apple_generic( library, stream, base_file_name, 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project magic, result_offset ); 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_darwin_ufs_export( FT_Library library, 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* newpath; 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newpath = raccess_make_file_name( memory, base_file_name, "._" ); 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !newpath ) 484a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Out_Of_Memory ); 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = raccess_guess_linux_double_from_file_name( library, newpath, 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result_offset ); 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( newpath ); 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_darwin_hfsplus( FT_Library library, 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Only meaningful on systems with hfs+ drivers (or Macs). 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 508c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner char* newpath = NULL; 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 510a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( base_file_len + 6 > FT_INT_MAX ) 518a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Array_Too_Large ); 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_ALLOC( newpath, base_file_len + 6 ) ) 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_COPY( newpath, base_file_name, base_file_len ); 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_offset = 0; 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_darwin_newvfs( FT_Library library, 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Only meaningful on systems with Mac OS X (> 10.1). 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 544c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner char* newpath = NULL; 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 546a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( base_file_len + 18 > FT_INT_MAX ) 554a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Array_Too_Large ); 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_ALLOC( newpath, base_file_len + 18 ) ) 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_COPY( newpath, base_file_name, base_file_len ); 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_offset = 0; 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_vfat( FT_Library library, 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* newpath; 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newpath = raccess_make_file_name( memory, base_file_name, 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "resource.frk/" ); 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !newpath ) 587a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Out_Of_Memory ); 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_offset = 0; 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_cap( FT_Library library, 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* newpath; 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !newpath ) 613a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Out_Of_Memory ); 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_offset = 0; 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_double( FT_Library library, 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* newpath; 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newpath = raccess_make_file_name( memory, base_file_name, "%" ); 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !newpath ) 640a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Out_Of_Memory ); 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = raccess_guess_linux_double_from_file_name( library, newpath, 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result_offset ); 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( newpath ); 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_netatalk( FT_Library library, 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **result_file_name, 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* newpath; 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = library->memory; 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newpath = raccess_make_file_name( memory, base_file_name, 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ".AppleDouble/" ); 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !newpath ) 672a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Out_Of_Memory ); 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = raccess_guess_linux_double_from_file_name( library, newpath, 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result_offset ); 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_file_name = newpath; 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( newpath ); 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_apple_generic( FT_Library library, 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_file_name, 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 magic, 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 magic_from_stream; 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 version_number = 0; 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort n_of_entries; 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int i; 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 entry_id, entry_offset, entry_length = 0; 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_UInt32 resource_fork_entry_id = 0x2; 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( library ); 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( base_file_name ); 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( version_number ); 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( entry_length ); 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_LONG( magic_from_stream ) ) 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( magic_from_stream != magic ) 711a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Unknown_File_Format ); 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_LONG( version_number ) ) 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* filler */ 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_Skip( stream, 16 ); 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_USHORT( n_of_entries ) ) 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n_of_entries == 0 ) 724a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Unknown_File_Format ); 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < n_of_entries; i++ ) 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_LONG( entry_id ) ) 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( entry_id == resource_fork_entry_id ) 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_READ_LONG( entry_offset ) || 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_READ_LONG( entry_length ) ) 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *result_offset = entry_offset; 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 74077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner { 74177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ 74277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner if ( error ) 74377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner return error; 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 74577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner } 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 747a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return FT_THROW( Unknown_File_Format ); 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_guess_linux_double_from_file_name( FT_Library library, 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *file_name, 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *result_offset ) 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Open_Args args2; 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream2; 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char * nouse = NULL; 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args2.flags = FT_OPEN_PATHNAME; 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args2.pathname = file_name; 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Stream_New( library, &args2, &stream2 ); 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = raccess_guess_apple_double( library, stream2, file_name, 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &nouse, result_offset ); 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream_Free( stream2, 0 ); 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static char* 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project raccess_make_file_name( FT_Memory memory, 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *original_name, 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *insertion ) 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 782aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char* new_name = NULL; 783295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner const char* tmp; 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char* slash; 785295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner size_t new_length; 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( error ); 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_length = ft_strlen( original_name ) + ft_strlen( insertion ); 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_ALLOC( new_name, new_length + 1 ) ) 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return NULL; 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tmp = ft_strrchr( original_name, '/' ); 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( tmp ) 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_strncpy( new_name, original_name, tmp - original_name + 1 ); 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_name[tmp - original_name + 1] = '\0'; 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slash = tmp + 1; 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slash = original_name; 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_name[0] = '\0'; 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_strcat( new_name, insertion ); 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_strcat( new_name, slash ); 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return new_name; 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Dummy function; just sets errors */ 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Raccess_Guess( FT_Library library, 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Stream stream, 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *base_name, 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char **new_names, 827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long *offsets, 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error *errors ) 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 830a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Int i; 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( library ); 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( stream ); 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( base_name ); 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_names[i] = NULL; 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project offsets[i] = 0; 841a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang errors[i] = FT_ERR( Unimplemented_Feature ); 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 850