Check file type
This commit is contained in:
parent
355b3eed0f
commit
df80cd06fb
1 changed files with 27 additions and 6 deletions
|
@ -122,6 +122,9 @@ struct grub_btrfs_dir_item
|
||||||
grub_uint8_t dummy[8];
|
grub_uint8_t dummy[8];
|
||||||
grub_uint16_t m;
|
grub_uint16_t m;
|
||||||
grub_uint16_t n;
|
grub_uint16_t n;
|
||||||
|
#define GRUB_BTRFS_DIR_ITEM_TYPE_REGULAR 1
|
||||||
|
#define GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY 2
|
||||||
|
#define GRUB_BTRFS_DIR_ITEM_TYPE_SYMLINK 7
|
||||||
grub_uint8_t type;
|
grub_uint8_t type;
|
||||||
char name[0];
|
char name[0];
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
@ -605,7 +608,7 @@ static grub_err_t
|
||||||
find_path (struct grub_btrfs_data *data,
|
find_path (struct grub_btrfs_data *data,
|
||||||
grub_disk_t disk,
|
grub_disk_t disk,
|
||||||
const char *path, struct grub_btrfs_key *key,
|
const char *path, struct grub_btrfs_key *key,
|
||||||
grub_uint64_t *tree)
|
grub_uint64_t *tree, grub_uint8_t *type)
|
||||||
{
|
{
|
||||||
const char *slash;
|
const char *slash;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
|
@ -615,17 +618,22 @@ find_path (struct grub_btrfs_data *data,
|
||||||
struct grub_btrfs_dir_item *direl = NULL;
|
struct grub_btrfs_dir_item *direl = NULL;
|
||||||
struct grub_btrfs_key key_out;
|
struct grub_btrfs_key key_out;
|
||||||
|
|
||||||
|
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||||
*tree = data->sblock.root_tree;
|
*tree = data->sblock.root_tree;
|
||||||
key->object_id = data->sblock.root_dir_objectid;
|
key->object_id = data->sblock.root_dir_objectid;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
|
||||||
key->offset = 0;
|
|
||||||
while (path[0] == '/')
|
while (path[0] == '/')
|
||||||
path++;
|
path++;
|
||||||
if (!path[0])
|
if (!path[0])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (*type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY)
|
||||||
|
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||||
|
|
||||||
|
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||||
|
key->offset = 0;
|
||||||
slash = grub_strchr (path, '/');
|
slash = grub_strchr (path, '/');
|
||||||
if (!slash)
|
if (!slash)
|
||||||
slash = path + grub_strlen (path);
|
slash = path + grub_strlen (path);
|
||||||
|
@ -684,6 +692,13 @@ find_path (struct grub_btrfs_data *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
path = slash;
|
path = slash;
|
||||||
|
*type = cdirel->type;
|
||||||
|
if (*type == GRUB_BTRFS_DIR_ITEM_TYPE_SYMLINK)
|
||||||
|
{
|
||||||
|
grub_free (direl);
|
||||||
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
|
"symlinks not supported");
|
||||||
|
}
|
||||||
|
|
||||||
switch (cdirel->key.type)
|
switch (cdirel->key.type)
|
||||||
{
|
{
|
||||||
|
@ -739,13 +754,16 @@ grub_btrfs_dir (grub_device_t device,
|
||||||
struct grub_btrfs_leaf_descriptor desc;
|
struct grub_btrfs_leaf_descriptor desc;
|
||||||
int r;
|
int r;
|
||||||
grub_uint64_t tree;
|
grub_uint64_t tree;
|
||||||
|
grub_uint8_t type;
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
err = find_path (data, device->disk, path, &key_in, &tree);
|
err = find_path (data, device->disk, path, &key_in, &tree, &type);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
if (type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY)
|
||||||
|
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||||
|
|
||||||
err = lower_bound (data, device->disk, &key_in, &key_out,
|
err = lower_bound (data, device->disk, &key_in, &key_out,
|
||||||
tree,
|
tree,
|
||||||
|
@ -800,7 +818,7 @@ grub_btrfs_dir (grub_device_t device,
|
||||||
c = cdirel->name[grub_le_to_cpu16 (cdirel->n)];
|
c = cdirel->name[grub_le_to_cpu16 (cdirel->n)];
|
||||||
cdirel->name[grub_le_to_cpu16 (cdirel->n)] = 0;
|
cdirel->name[grub_le_to_cpu16 (cdirel->n)] = 0;
|
||||||
grub_memset (&info, 0, sizeof (info));
|
grub_memset (&info, 0, sizeof (info));
|
||||||
info.dir = (cdirel->type == 2);
|
info.dir = (cdirel->type == GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY);
|
||||||
if (hook (cdirel->name, &info))
|
if (hook (cdirel->name, &info))
|
||||||
goto out;
|
goto out;
|
||||||
cdirel->name[grub_le_to_cpu16 (cdirel->n)] = c;
|
cdirel->name[grub_le_to_cpu16 (cdirel->n)] = c;
|
||||||
|
@ -827,16 +845,19 @@ grub_btrfs_open (struct grub_file *file, const char *name)
|
||||||
grub_disk_addr_t elemaddr;
|
grub_disk_addr_t elemaddr;
|
||||||
grub_size_t elemsize;
|
grub_size_t elemsize;
|
||||||
struct grub_btrfs_inode inode;
|
struct grub_btrfs_inode inode;
|
||||||
|
grub_uint8_t type;
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
err = find_path (data, file->device->disk, name, &key_in, &data->tree);
|
err = find_path (data, file->device->disk, name, &key_in, &data->tree, &type);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
grub_free (data);
|
grub_free (data);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
if (type != GRUB_BTRFS_DIR_ITEM_TYPE_REGULAR)
|
||||||
|
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a regular file");
|
||||||
data->inode = key_in.object_id;
|
data->inode = key_in.object_id;
|
||||||
key_in.type = GRUB_BTRFS_ITEM_TYPE_INODE_ITEM;
|
key_in.type = GRUB_BTRFS_ITEM_TYPE_INODE_ITEM;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue