lzma_vli read_file_index(lzma_vli offset) { void *bdata = NULL; if (!offset) offset = find_file_index(&bdata); if (!offset) return 0; while (true) { char *name = read_file_index_name(); if (!name) break; file_index_t *f = malloc(sizeof(file_index_t)); f->name = strlen(name) ? xstrdup(name) : NULL; f->offset = xle64dec(gFileIndexBuf + gFIBPos); gFIBPos += sizeof(uint64_t); if (gLastFile) { gLastFile->next = f; } else { gFileIndex = f; } gLastFile = f; } free(gFileIndexBuf); lzma_end(&gStream); free(bdata); return offset; }
struct file_descriptor* open_file( char* path ) { printf("opening file %s ...\n" , path); int i; if( (strlen(path) == 1) && path[0]=='/' ) { i = 1; }else{ i = 0; } char** dirs = split_string( path , "/" ); printf(" arg_count: %d\n" , arg_count); int k; for( k = 0 ; k < arg_count ; k++) { printf( " dirs[%d]: %s\n" , k , dirs[k] ); } int entry_count = 0 , j = 0; struct dir_table_entry* cur_entries; struct file_descriptor cur_fd; struct dir_table_entry* cur_file_entry; //get root directory file descriptor cur_fd.pointer = sizeof( struct boot_sec ); int found_file = 0; while( i < arg_count && !found_file ) { cur_entries = get_dir_entries( cur_fd ); cur_file_entry = get_file_entry( cur_fd ); //printf("\nretrieved file %s \n" , cur_file_entry->name ); entry_count = cur_file_entry->file_size / (int)sizeof( struct dir_table_entry ); //printf("entry_count: %d\n" , entry_count); for( j = 0 ; j < entry_count ; j++ ) { //printf("printing entry[%d]...\n" , j); cur_file_entry = cur_entries + j; //printf(" name: %s\n" , cur_file_entry->name ); if( cur_file_entry->allocated ) { //printf(" looking for file %s...\n" , *(dirs + i) ); if( strcmp( cur_file_entry->name , *(dirs + i) ) == 0 ) { if( i == (arg_count -1)) found_file = 1; //printf( " found file!\n"); cur_fd.pointer = find_file_index( cur_fd , cur_file_entry->name ); //printf(" %s fd pointer: %d\n" , cur_file_entry->name , cur_fd.pointer ); /* struct file_descriptor* ret = (struct file_descriptor*)malloc( sizeof(struct file_descriptor) ); memcpy( ret , &cur_fd , sizeof( struct file_descriptor ) ); return ret; */ } } } i++; } if( !found_file ) printf("file not found!\n"); struct file_descriptor* ret = (struct file_descriptor*)malloc( sizeof(struct file_descriptor) ); memcpy( ret , &cur_fd , sizeof( struct file_descriptor ) ); return ret; }