/* * Find a entry in the specified dir with name _dname_. */ static const struct iso_dir_entry * iso_find_entry(const char *dname, struct inode *inode) { struct fs_info *fs = inode->fs; block_t dir_block = PVT(inode)->lba; int i = 0, offset = 0; const char *de_name; int de_name_len, de_len; const struct iso_dir_entry *de; const char *data = NULL; dprintf("iso_find_entry: \"%s\"\n", dname); while (1) { if (!data) { dprintf("Getting block %d from block %llu\n", i, dir_block); if (++i > inode->blocks) return NULL; /* End of directory */ data = get_cache(fs->fs_dev, dir_block++); offset = 0; } de = (const struct iso_dir_entry *)(data + offset); de_len = de->length; offset += de_len; /* Make sure we have a full directory entry */ if (de_len < 33 || offset > BLOCK_SIZE(fs)) { /* * Zero = end of sector, or corrupt directory entry * * ECMA-119:1987 6.8.1.1: "Each Directory Record shall end * in the Logical Sector in which it begins. */ data = NULL; continue; } de_name_len = de->name_len; de_name = de->name; if (iso_compare_name(de_name, de_name_len, dname)) { dprintf("Found.\n"); return de; } } }
/* * Find a entry in the specified dir with name _dname_. */ static const struct iso_dir_entry * iso_find_entry(const char *dname, struct inode *inode) { struct fs_info *fs = inode->fs; block_t dir_block = PVT(inode)->lba; int i = 0, offset = 0; const char *de_name; int de_name_len, de_len, rr_name_len, ret; const struct iso_dir_entry *de; const char *data = NULL; char *rr_name = NULL; dprintf("iso_find_entry: \"%s\"\n", dname); while (1) { if (!data) { dprintf("Getting block %d from block %llu\n", i, dir_block); if (++i > inode->blocks) return NULL; /* End of directory */ data = get_cache(fs->fs_dev, dir_block++); offset = 0; } de = (const struct iso_dir_entry *)(data + offset); de_len = de->length; offset += de_len; /* Make sure we have a full directory entry */ if (de_len < 33 || offset > BLOCK_SIZE(fs)) { /* * Zero = end of sector, or corrupt directory entry * * ECMA-119:1987 6.8.1.1: "Each Directory Record shall end * in the Logical Sector in which it begins. */ data = NULL; continue; } /* Try to get Rock Ridge name */ ret = susp_rr_get_nm(fs, (char *) de, &rr_name, &rr_name_len); if (ret > 0) { if (strcmp(rr_name, dname) == 0) { dprintf("Found (by RR name).\n"); free(rr_name); return de; } free(rr_name); rr_name = NULL; continue; /* Rock Ridge was valid and did not match */ } /* Fall back to ISO name */ de_name_len = de->name_len; de_name = de->name; if (iso_compare_name(de_name, de_name_len, dname)) { dprintf("Found (by ISO name).\n"); return de; } } }