fsw_status_t fsw_dnode_readlink_data(struct fsw_dnode *dno, struct fsw_string *link_target) { fsw_status_t status; struct fsw_shandle shand; fsw_u32 buffer_size; char buffer[FSW_PATH_MAX]; struct fsw_string s; if (dno->size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = (int)dno->size; s.data = buffer; // open shandle and read the data status = fsw_shandle_open(dno, &shand); if (status) return status; buffer_size = (fsw_u32)s.size; status = fsw_shandle_read(&shand, &buffer_size, buffer); fsw_shandle_close(&shand); if (status) return status; if ((int)buffer_size < s.size) return FSW_VOLUME_CORRUPTED; status = fsw_strdup_coerce(link_target, dno->vol->host_string_type, &s); return status; }
EFI_STATUS EFIAPI fsw_efi_FileHandle_Close(IN EFI_FILE_PROTOCOL *This) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); #if DEBUG_LEVEL // Print(L"fsw_efi_FileHandle_Close\n"); #endif fsw_shandle_close(&File->shand); FreePool(File); return EFI_SUCCESS; }
EFI_STATUS EFIAPI fsw_efi_FileHandle_Close(IN EFI_FILE *This) { FSW_FILE_DATA *File; FSW_MSG_DEBUG((FSW_MSGSTR(__FUNCTION__ ": enter\n"))); File = FSW_FILE_FROM_FILE_HANDLE(This); fsw_shandle_close(&File->shand); FreePool(File); FSW_MSG_DEBUG((FSW_MSGSTR(__FUNCTION__ ": leaving with Success\n"))); return EFI_SUCCESS; }
static fsw_status_t fsw_ext2_dir_lookup(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_string *lookup_name, struct fsw_ext2_dnode **child_dno_out) { fsw_status_t status; struct fsw_shandle shand; fsw_u32 child_ino; struct ext2_dir_entry entry; struct fsw_string entry_name; // Preconditions: The caller has checked that dno is a directory node. entry_name.type = FSW_STRING_TYPE_ISO88591; // setup handle to read the directory status = fsw_shandle_open(dno, &shand); if (status) return status; // scan the directory for the file child_ino = 0; while (child_ino == 0) { // read next entry status = fsw_ext2_read_dentry(&shand, &entry); if (status) goto errorexit; if (entry.inode == 0) { // end of directory reached status = FSW_NOT_FOUND; goto errorexit; } // compare name entry_name.len = entry_name.size = entry.name_len; entry_name.data = entry.name; if (fsw_streq(lookup_name, &entry_name)) { child_ino = entry.inode; break; } } // setup a dnode for the child item status = fsw_dnode_create(dno, child_ino, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); errorexit: fsw_shandle_close(&shand); return status; }
static fsw_status_t fsw_iso9660_dir_lookup(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_string *lookup_name, struct fsw_iso9660_dnode **child_dno_out) { fsw_status_t status; struct fsw_shandle shand; struct iso9660_dirrec_buffer dirrec_buffer; struct iso9660_dirrec *dirrec = &dirrec_buffer.dirrec; // Preconditions: The caller has checked that dno is a directory node. // setup handle to read the directory status = fsw_shandle_open(dno, &shand); if (status) return status; // scan the directory for the file while (1) { // read next entry status = fsw_iso9660_read_dirrec(vol, &shand, &dirrec_buffer); if (status) goto errorexit; if (dirrec->dirrec_length == 0) { // end of directory reached status = FSW_NOT_FOUND; goto errorexit; } // skip . and .. if (dirrec->file_identifier_length == 1 && (dirrec->file_identifier[0] == 0 || dirrec->file_identifier[0] == 1)) continue; // compare name if (fsw_streq(lookup_name, &dirrec_buffer.name)) // TODO: compare case-insensitively break; } // setup a dnode for the child item status = fsw_dnode_create(dno, dirrec_buffer.ino, FSW_DNODE_TYPE_UNKNOWN, &dirrec_buffer.name, child_dno_out); if (status == FSW_SUCCESS) fsw_memcpy(&(*child_dno_out)->dirrec, dirrec, sizeof(struct iso9660_dirrec)); errorexit: fsw_shandle_close(&shand); return status; }
int fsw_posix_closedir(struct fsw_posix_dir *dir) { fsw_shandle_close(&dir->shand); fsw_free(dir); return 0; }
int fsw_posix_close(struct fsw_posix_file *file) { fsw_shandle_close(&file->shand); fsw_free(file); return 0; }