static fsw_status_t fsw_ext2_readlink(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_string *link_target) { fsw_status_t status; int ea_blocks; struct fsw_string s; if (dno->g.size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; ea_blocks = dno->raw->i_file_acl ? (vol->g.log_blocksize >> 9) : 0; if (dno->raw->i_blocks - ea_blocks == 0) { // "fast" symlink, path is stored inside the inode s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = (int)dno->g.size; s.data = dno->raw->i_block; status = fsw_strdup_coerce(link_target, vol->g.host_string_type, &s); } else { // "slow" symlink, path is stored in normal inode data status = fsw_dnode_readlink_data(dno, link_target); } return status; }
static fsw_status_t fsw_iso9660_readlink(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_string *link_target) { fsw_status_t status; if (dno->g.size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; status = fsw_dnode_readlink_data(dno, link_target); return status; }