remove all trailing whitespace
This commit is contained in:
parent
d2d4966571
commit
b39f9d20a9
222 changed files with 3286 additions and 3286 deletions
32
fs/affs.c
32
fs/affs.c
|
@ -127,7 +127,7 @@ grub_affs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
|||
sizeof (file), &file);
|
||||
if (grub_errno)
|
||||
return 0;
|
||||
|
||||
|
||||
block = grub_be_to_cpu32 (file.extension);
|
||||
}
|
||||
|
||||
|
@ -139,7 +139,7 @@ grub_affs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
|||
sizeof (pos), &pos);
|
||||
if (grub_errno)
|
||||
return 0;
|
||||
|
||||
|
||||
return grub_be_to_cpu32 (pos);
|
||||
}
|
||||
|
||||
|
@ -353,7 +353,7 @@ grub_affs_iterate_dir (grub_fshelp_node_t dir,
|
|||
sizeof (file), (char *) &file);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
file.name[file.namelen] = '\0';
|
||||
|
||||
if ((int) grub_be_to_cpu32 (file.type) == GRUB_AFFS_FILETYPE_DIR)
|
||||
|
@ -370,7 +370,7 @@ grub_affs_iterate_dir (grub_fshelp_node_t dir,
|
|||
return 1;
|
||||
|
||||
next = grub_be_to_cpu32 (file.next);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grub_free (hashtable);
|
||||
|
@ -389,18 +389,18 @@ grub_affs_open (struct grub_file *file, const char *name)
|
|||
{
|
||||
struct grub_affs_data *data;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_affs_mount (file->device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (name, &data->diropen, &fdiro, grub_affs_iterate_dir,
|
||||
grub_affs_read_symlink, GRUB_FSHELP_REG);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
file->size = fdiro->size;
|
||||
data->diropen = *fdiro;
|
||||
grub_free (fdiro);
|
||||
|
@ -414,7 +414,7 @@ grub_affs_open (struct grub_file *file, const char *name)
|
|||
if (data && fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
return grub_errno;
|
||||
|
@ -436,7 +436,7 @@ grub_affs_close (grub_file_t file)
|
|||
static grub_ssize_t
|
||||
grub_affs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_affs_data *data =
|
||||
struct grub_affs_data *data =
|
||||
(struct grub_affs_data *) file->data;
|
||||
|
||||
int size = grub_affs_read_file (&data->diropen, file->read_hook,
|
||||
|
@ -447,13 +447,13 @@ grub_affs_read (grub_file_t file, char *buf, grub_size_t len)
|
|||
|
||||
|
||||
static grub_err_t
|
||||
grub_affs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_affs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_affs_data *data = 0;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
auto int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node);
|
||||
|
@ -470,18 +470,18 @@ grub_affs_dir (grub_device_t device, const char *path,
|
|||
}
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_affs_mount (device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (path, &data->diropen, &fdiro, grub_affs_iterate_dir,
|
||||
grub_affs_read_symlink, GRUB_FSHELP_DIR);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
grub_affs_iterate_dir (fdiro, iterate);
|
||||
|
||||
|
||||
fail:
|
||||
if (data && fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
|
|
2
fs/afs.c
2
fs/afs.c
|
@ -554,7 +554,7 @@ grub_afs_close (grub_file_t file)
|
|||
|
||||
static grub_err_t
|
||||
grub_afs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_afs_data *data = 0;;
|
||||
|
|
10
fs/cpio.c
10
fs/cpio.c
|
@ -181,7 +181,7 @@ fail:
|
|||
|
||||
static grub_err_t
|
||||
grub_cpio_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_cpio_data *data;
|
||||
|
@ -286,13 +286,13 @@ grub_cpio_open (grub_file_t file, const char *name)
|
|||
{
|
||||
if (name[i] != fn[j])
|
||||
goto no_match;
|
||||
|
||||
|
||||
if (name[i] == '\0')
|
||||
break;
|
||||
|
||||
|
||||
if (name[i] == '/' && name[i+1] == '/')
|
||||
i++;
|
||||
|
||||
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
|
@ -304,7 +304,7 @@ grub_cpio_open (grub_file_t file, const char *name)
|
|||
return GRUB_ERR_NONE;
|
||||
|
||||
no_match:
|
||||
|
||||
|
||||
grub_free (fn);
|
||||
data->hofs = ofs;
|
||||
}
|
||||
|
|
92
fs/ext2.c
92
fs/ext2.c
|
@ -54,7 +54,7 @@
|
|||
/* Log2 size of ext2 block in 512 blocks. */
|
||||
#define LOG2_EXT2_BLOCK_SIZE(data) \
|
||||
(grub_le_to_cpu32 (data->sblock.log2_block_size) + 1)
|
||||
|
||||
|
||||
/* Log2 size of ext2 block in bytes. */
|
||||
#define LOG2_BLOCK_SIZE(data) \
|
||||
(grub_le_to_cpu32 (data->sblock.log2_block_size) + 10)
|
||||
|
@ -324,7 +324,7 @@ static grub_dl_t my_mod;
|
|||
/* Read into BLKGRP the blockgroup descriptor of blockgroup GROUP of
|
||||
the mounted filesystem DATA. */
|
||||
inline static grub_err_t
|
||||
grub_ext2_blockgroup (struct grub_ext2_data *data, int group,
|
||||
grub_ext2_blockgroup (struct grub_ext2_data *data, int group,
|
||||
struct grub_ext2_block_group *blkgrp)
|
||||
{
|
||||
return grub_disk_read (data->disk,
|
||||
|
@ -382,7 +382,7 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
|||
int blknr = -1;
|
||||
unsigned int blksz = EXT2_BLOCK_SIZE (data);
|
||||
int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data);
|
||||
|
||||
|
||||
if (grub_le_to_cpu32(inode->flags) & EXT4_EXTENTS_FLAG)
|
||||
{
|
||||
char buf[EXT2_BLOCK_SIZE(data)];
|
||||
|
@ -440,14 +440,14 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
|||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]);
|
||||
}
|
||||
/* Double indirect. */
|
||||
else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * (blksz / 4 + 1))
|
||||
{
|
||||
unsigned int perblock = blksz / 4;
|
||||
unsigned int rblock = fileblock - (INDIRECT_BLOCKS
|
||||
unsigned int rblock = fileblock - (INDIRECT_BLOCKS
|
||||
+ blksz / 4);
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
|
@ -463,7 +463,7 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
|||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[rblock % perblock]);
|
||||
}
|
||||
/* triple indirect. */
|
||||
|
@ -488,7 +488,7 @@ grub_ext2_read_file (grub_fshelp_node_t node,
|
|||
pos, len, buf, grub_ext2_read_block,
|
||||
node->inode.size,
|
||||
LOG2_EXT2_BLOCK_SIZE (node->data));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -505,7 +505,7 @@ grub_ext2_read_inode (struct grub_ext2_data *data,
|
|||
|
||||
/* It is easier to calculate if the first inode is 0. */
|
||||
ino--;
|
||||
|
||||
|
||||
grub_ext2_blockgroup (data,
|
||||
ino / grub_le_to_cpu32 (sblock->inodes_per_group),
|
||||
&blkgrp);
|
||||
|
@ -525,7 +525,7 @@ grub_ext2_read_inode (struct grub_ext2_data *data,
|
|||
EXT2_INODE_SIZE (data) * blkoff,
|
||||
sizeof (struct grub_ext2_inode), inode))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -550,7 +550,7 @@ grub_ext2_mount (grub_disk_t disk)
|
|||
grub_error (GRUB_ERR_BAD_FS, "not an ext2 filesystem");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
/* Check the FS doesn't have feature bits enabled that we don't support. */
|
||||
if (grub_le_to_cpu32 (data->sblock.feature_incompat)
|
||||
& ~(EXT2_DRIVER_SUPPORTED_INCOMPAT | EXT2_DRIVER_IGNORED_INCOMPAT))
|
||||
|
@ -558,8 +558,8 @@ grub_ext2_mount (grub_disk_t disk)
|
|||
grub_error (GRUB_ERR_BAD_FS, "filesystem has unsupported incompatible features");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
data->disk = disk;
|
||||
|
||||
data->diropen.data = data;
|
||||
|
@ -571,7 +571,7 @@ grub_ext2_mount (grub_disk_t disk)
|
|||
grub_ext2_read_inode (data, 2, data->inode);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
return data;
|
||||
|
||||
fail:
|
||||
|
@ -587,23 +587,23 @@ grub_ext2_read_symlink (grub_fshelp_node_t node)
|
|||
{
|
||||
char *symlink;
|
||||
struct grub_fshelp_node *diro = node;
|
||||
|
||||
|
||||
if (! diro->inode_read)
|
||||
{
|
||||
grub_ext2_read_inode (diro->data, diro->ino, &diro->inode);
|
||||
if (grub_errno)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
symlink = grub_malloc (grub_le_to_cpu32 (diro->inode.size) + 1);
|
||||
if (! symlink)
|
||||
return 0;
|
||||
|
||||
|
||||
/* If the filesize of the symlink is bigger than
|
||||
60 the symlink is stored in a separate block,
|
||||
otherwise it is stored in the inode. */
|
||||
if (grub_le_to_cpu32 (diro->inode.size) <= 60)
|
||||
grub_strncpy (symlink,
|
||||
grub_strncpy (symlink,
|
||||
diro->inode.symlink,
|
||||
grub_le_to_cpu32 (diro->inode.size));
|
||||
else
|
||||
|
@ -617,7 +617,7 @@ grub_ext2_read_symlink (grub_fshelp_node_t node)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
symlink[grub_le_to_cpu32 (diro->inode.size)] = '\0';
|
||||
return symlink;
|
||||
}
|
||||
|
@ -631,14 +631,14 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
|
|||
{
|
||||
unsigned int fpos = 0;
|
||||
struct grub_fshelp_node *diro = (struct grub_fshelp_node *) dir;
|
||||
|
||||
|
||||
if (! diro->inode_read)
|
||||
{
|
||||
grub_ext2_read_inode (diro->data, diro->ino, &diro->inode);
|
||||
if (grub_errno)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Search the file. */
|
||||
while (fpos < grub_le_to_cpu32 (diro->inode.size))
|
||||
{
|
||||
|
@ -648,25 +648,25 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
|
|||
(char *) &dirent);
|
||||
if (grub_errno)
|
||||
return 0;
|
||||
|
||||
|
||||
if (dirent.namelen != 0)
|
||||
{
|
||||
char filename[dirent.namelen + 1];
|
||||
struct grub_fshelp_node *fdiro;
|
||||
enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN;
|
||||
|
||||
|
||||
grub_ext2_read_file (diro, 0, fpos + sizeof (struct ext2_dirent),
|
||||
dirent.namelen, filename);
|
||||
if (grub_errno)
|
||||
return 0;
|
||||
|
||||
|
||||
fdiro = grub_malloc (sizeof (struct grub_fshelp_node));
|
||||
if (! fdiro)
|
||||
return 0;
|
||||
|
||||
|
||||
fdiro->data = diro->data;
|
||||
fdiro->ino = grub_le_to_cpu32 (dirent.inode);
|
||||
|
||||
|
||||
filename[dirent.namelen] = '\0';
|
||||
|
||||
if (dirent.filetype != FILETYPE_UNKNOWN)
|
||||
|
@ -692,9 +692,9 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
|
|||
grub_free (fdiro);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
fdiro->inode_read = 1;
|
||||
|
||||
|
||||
if ((grub_le_to_cpu16 (fdiro->inode.mode)
|
||||
& FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
|
||||
type = GRUB_FSHELP_DIR;
|
||||
|
@ -705,14 +705,14 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
|
|||
& FILETYPE_INO_MASK) == FILETYPE_INO_REG)
|
||||
type = GRUB_FSHELP_REG;
|
||||
}
|
||||
|
||||
|
||||
if (hook (filename, type, fdiro))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
fpos += grub_le_to_cpu16 (dirent.direntlen);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -722,25 +722,25 @@ grub_ext2_open (struct grub_file *file, const char *name)
|
|||
{
|
||||
struct grub_ext2_data *data;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_ext2_mount (file->device->disk);
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (name, &data->diropen, &fdiro, grub_ext2_iterate_dir,
|
||||
grub_ext2_read_symlink, GRUB_FSHELP_REG);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
if (! fdiro->inode_read)
|
||||
{
|
||||
grub_ext2_read_inode (data, fdiro->ino, &fdiro->inode);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
grub_memcpy (data->inode, &fdiro->inode, sizeof (struct grub_ext2_inode));
|
||||
grub_free (fdiro);
|
||||
|
||||
|
@ -754,7 +754,7 @@ grub_ext2_open (struct grub_file *file, const char *name)
|
|||
if (fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
return grub_errno;
|
||||
|
@ -775,20 +775,20 @@ static grub_ssize_t
|
|||
grub_ext2_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_ext2_data *data = (struct grub_ext2_data *) file->data;
|
||||
|
||||
|
||||
return grub_ext2_read_file (&data->diropen, file->read_hook,
|
||||
file->offset, len, buf);
|
||||
}
|
||||
|
||||
|
||||
static grub_err_t
|
||||
grub_ext2_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_ext2_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_ext2_data *data = 0;;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
auto int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node);
|
||||
|
@ -818,18 +818,18 @@ grub_ext2_dir (grub_device_t device, const char *path,
|
|||
}
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_ext2_mount (device->disk);
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (path, &data->diropen, &fdiro, grub_ext2_iterate_dir,
|
||||
grub_ext2_read_symlink, GRUB_FSHELP_DIR);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_ext2_iterate_dir (fdiro, iterate);
|
||||
|
||||
|
||||
fail:
|
||||
if (fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
|
@ -890,7 +890,7 @@ grub_ext2_uuid (grub_device_t device, char **uuid)
|
|||
}
|
||||
|
||||
/* Get mtime. */
|
||||
static grub_err_t
|
||||
static grub_err_t
|
||||
grub_ext2_mtime (grub_device_t device, grub_int32_t *tm)
|
||||
{
|
||||
struct grub_ext2_data *data;
|
||||
|
@ -901,7 +901,7 @@ grub_ext2_mtime (grub_device_t device, grub_int32_t *tm)
|
|||
data = grub_ext2_mount (disk);
|
||||
if (!data)
|
||||
*tm = 0;
|
||||
else
|
||||
else
|
||||
*tm = grub_le_to_cpu32 (data->sblock.utime);
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
|
92
fs/fat.c
92
fs/fat.c
|
@ -126,15 +126,15 @@ struct grub_fat_data
|
|||
{
|
||||
int logical_sector_bits;
|
||||
grub_uint32_t num_sectors;
|
||||
|
||||
|
||||
grub_uint16_t fat_sector;
|
||||
grub_uint32_t sectors_per_fat;
|
||||
int fat_size;
|
||||
|
||||
|
||||
grub_uint32_t root_cluster;
|
||||
grub_uint32_t root_sector;
|
||||
grub_uint32_t num_root_sectors;
|
||||
|
||||
|
||||
int cluster_bits;
|
||||
grub_uint32_t cluster_eof_mark;
|
||||
grub_uint32_t cluster_sector;
|
||||
|
@ -155,7 +155,7 @@ static int
|
|||
fat_log2 (unsigned x)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if (x == 0)
|
||||
return -1;
|
||||
|
||||
|
@ -190,14 +190,14 @@ grub_fat_mount (grub_disk_t disk)
|
|||
&& grub_strncmp((const char *) bpb.version_specific.fat12_or_fat16.fstype, "FAT16", 5)
|
||||
&& grub_strncmp((const char *) bpb.version_specific.fat32.fstype, "FAT32", 5))
|
||||
goto fail;
|
||||
|
||||
|
||||
/* Get the sizes of logical sectors and clusters. */
|
||||
data->logical_sector_bits =
|
||||
fat_log2 (grub_le_to_cpu16 (bpb.bytes_per_sector));
|
||||
if (data->logical_sector_bits < GRUB_DISK_SECTOR_BITS)
|
||||
goto fail;
|
||||
data->logical_sector_bits -= GRUB_DISK_SECTOR_BITS;
|
||||
|
||||
|
||||
data->cluster_bits = fat_log2 (bpb.sectors_per_cluster);
|
||||
if (data->cluster_bits < 0)
|
||||
goto fail;
|
||||
|
@ -248,16 +248,16 @@ grub_fat_mount (grub_disk_t disk)
|
|||
{
|
||||
/* FAT32. */
|
||||
grub_uint16_t flags = grub_le_to_cpu16 (bpb.version_specific.fat32.extended_flags);
|
||||
|
||||
|
||||
data->root_cluster = grub_le_to_cpu32 (bpb.version_specific.fat32.root_cluster);
|
||||
data->fat_size = 32;
|
||||
data->cluster_eof_mark = 0x0ffffff8;
|
||||
|
||||
|
||||
if (flags & 0x80)
|
||||
{
|
||||
/* Get an active FAT. */
|
||||
unsigned active_fat = flags & 0xf;
|
||||
|
||||
|
||||
if (active_fat > bpb.num_fats)
|
||||
goto fail;
|
||||
|
||||
|
@ -320,7 +320,7 @@ grub_fat_mount (grub_disk_t disk)
|
|||
data->uuid = grub_le_to_cpu32 (bpb.version_specific.fat12_or_fat16.num_serial);
|
||||
else
|
||||
data->uuid = grub_le_to_cpu32 (bpb.version_specific.fat32.num_serial);
|
||||
|
||||
|
||||
/* Ignore the 3rd bit, because some BIOSes assigns 0xF0 to the media
|
||||
descriptor, even if it is a so-called superfloppy (e.g. an USB key).
|
||||
The check may be too strict for this kind of stupid BIOSes, as
|
||||
|
@ -352,7 +352,7 @@ grub_fat_read_data (grub_disk_t disk, struct grub_fat_data *data,
|
|||
unsigned logical_cluster_bits;
|
||||
grub_ssize_t ret = 0;
|
||||
unsigned long sector;
|
||||
|
||||
|
||||
/* This is a special case. FAT12 and FAT16 doesn't have the root directory
|
||||
in clusters. */
|
||||
if (data->file_cluster == ~0U)
|
||||
|
@ -417,7 +417,7 @@ grub_fat_read_data (grub_disk_t disk, struct grub_fat_data *data,
|
|||
case 12:
|
||||
if (data->cur_cluster & 1)
|
||||
next_cluster >>= 4;
|
||||
|
||||
|
||||
next_cluster &= 0x0FFF;
|
||||
break;
|
||||
}
|
||||
|
@ -426,7 +426,7 @@ grub_fat_read_data (grub_disk_t disk, struct grub_fat_data *data,
|
|||
grub_printf ("%s:%d: fat_size=%d, next_cluster=%u\n",
|
||||
__FILE__, __LINE__, data->fat_size, next_cluster);
|
||||
#endif
|
||||
|
||||
|
||||
/* Check the end. */
|
||||
if (next_cluster >= data->cluster_eof_mark)
|
||||
return ret;
|
||||
|
@ -468,7 +468,7 @@ grub_fat_read_data (grub_disk_t disk, struct grub_fat_data *data,
|
|||
|
||||
static grub_err_t
|
||||
grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
struct grub_fat_dir_entry *dir))
|
||||
{
|
||||
struct grub_fat_dir_entry dir;
|
||||
|
@ -477,10 +477,10 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
int slot = -1, slots = -1;
|
||||
int checksum = -1;
|
||||
grub_ssize_t offset = -sizeof(dir);
|
||||
|
||||
|
||||
if (! (data->attr & GRUB_FAT_ATTR_DIRECTORY))
|
||||
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
|
||||
|
||||
/* Allocate space enough to hold a long name. */
|
||||
filename = grub_malloc (0x40 * 13 * 4 + 1);
|
||||
unibuf = (grub_uint16_t *) grub_malloc (0x40 * 13 * 2);
|
||||
|
@ -490,7 +490,7 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
grub_free (unibuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
while (1)
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -509,7 +509,7 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
struct grub_fat_long_name_entry *long_name
|
||||
= (struct grub_fat_long_name_entry *) &dir;
|
||||
grub_uint8_t id = long_name->id;
|
||||
|
||||
|
||||
if (id & 0x40)
|
||||
{
|
||||
id &= 0x3f;
|
||||
|
@ -537,11 +537,11 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
/* This is a workaround for Japanese. */
|
||||
if (dir.name[0] == 0x05)
|
||||
dir.name[0] = 0xe5;
|
||||
|
||||
|
||||
if (checksum != -1 && slot == 0)
|
||||
{
|
||||
grub_uint8_t sum;
|
||||
|
||||
|
||||
for (sum = 0, i = 0; i < sizeof (dir.name); i++)
|
||||
sum = ((sum >> 1) | (sum << 7)) + dir.name[i];
|
||||
|
||||
|
@ -551,13 +551,13 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
|
||||
for (u = 0; u < slots * 13; u++)
|
||||
unibuf[u] = grub_le_to_cpu16 (unibuf[u]);
|
||||
|
||||
|
||||
*grub_utf16_to_utf8 ((grub_uint8_t *) filename, unibuf,
|
||||
slots * 13) = '\0';
|
||||
|
||||
|
||||
if (hook (filename, &dir))
|
||||
break;
|
||||
|
||||
|
||||
checksum = -1;
|
||||
continue;
|
||||
}
|
||||
|
@ -569,7 +569,7 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
filep = filename;
|
||||
if (dir.attr & GRUB_FAT_ATTR_VOLUME_ID)
|
||||
{
|
||||
for (i = 0; i < sizeof (dir.name) && dir.name[i]
|
||||
for (i = 0; i < sizeof (dir.name) && dir.name[i]
|
||||
&& ! grub_isspace (dir.name[i]); i++)
|
||||
*filep++ = dir.name[i];
|
||||
}
|
||||
|
@ -577,9 +577,9 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
{
|
||||
for (i = 0; i < 8 && dir.name[i] && ! grub_isspace (dir.name[i]); i++)
|
||||
*filep++ = grub_tolower (dir.name[i]);
|
||||
|
||||
|
||||
*filep = '.';
|
||||
|
||||
|
||||
for (i = 8; i < 11 && dir.name[i] && ! grub_isspace (dir.name[i]); i++)
|
||||
*++filep = grub_tolower (dir.name[i]);
|
||||
|
||||
|
@ -604,7 +604,7 @@ grub_fat_iterate_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
static char *
|
||||
grub_fat_find_dir (grub_disk_t disk, struct grub_fat_data *data,
|
||||
const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
char *dirname, *dirp;
|
||||
|
@ -636,18 +636,18 @@ grub_fat_find_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
|
||||
if (call_hook)
|
||||
hook (filename, &info);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (! (data->attr & GRUB_FAT_ATTR_DIRECTORY))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Extract a directory name. */
|
||||
while (*path == '/')
|
||||
path++;
|
||||
|
@ -656,7 +656,7 @@ grub_fat_find_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
if (dirp)
|
||||
{
|
||||
unsigned len = dirp - path;
|
||||
|
||||
|
||||
dirname = grub_malloc (len + 1);
|
||||
if (! dirname)
|
||||
return 0;
|
||||
|
@ -669,7 +669,7 @@ grub_fat_find_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
dirname = grub_strdup (path);
|
||||
|
||||
call_hook = (! dirp && hook);
|
||||
|
||||
|
||||
grub_fat_iterate_dir (disk, data, iter_hook);
|
||||
if (grub_errno == GRUB_ERR_NONE && ! found && !call_hook)
|
||||
grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
|
||||
|
@ -681,7 +681,7 @@ grub_fat_find_dir (grub_disk_t disk, struct grub_fat_data *data,
|
|||
|
||||
static grub_err_t
|
||||
grub_fat_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_fat_data *data = 0;
|
||||
|
@ -691,7 +691,7 @@ grub_fat_dir (grub_device_t device, const char *path,
|
|||
char *p;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_fat_mount (disk);
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
@ -707,7 +707,7 @@ grub_fat_dir (grub_device_t device, const char *path,
|
|||
*p++ = '/';
|
||||
*p = '\0';
|
||||
p = dirname;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
p = grub_fat_find_dir (disk, data, p, hook);
|
||||
|
@ -718,9 +718,9 @@ grub_fat_dir (grub_device_t device, const char *path,
|
|||
|
||||
grub_free (dirname);
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -731,7 +731,7 @@ grub_fat_open (grub_file_t file, const char *name)
|
|||
char *p = (char *) name;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_fat_mount (file->device->disk);
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
@ -752,15 +752,15 @@ grub_fat_open (grub_file_t file, const char *name)
|
|||
|
||||
file->data = data;
|
||||
file->size = data->file_size;
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
|
||||
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -775,9 +775,9 @@ static grub_err_t
|
|||
grub_fat_close (grub_file_t file)
|
||||
{
|
||||
grub_free (file->data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -799,7 +799,7 @@ grub_fat_label (grub_device_t device, char **label)
|
|||
}
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_fat_mount (disk);
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
@ -811,7 +811,7 @@ grub_fat_label (grub_device_t device, char **label)
|
|||
}
|
||||
|
||||
*label = 0;
|
||||
|
||||
|
||||
grub_fat_iterate_dir (disk, data, iter_hook);
|
||||
|
||||
fail:
|
||||
|
|
66
fs/fshelp.c
66
fs/fshelp.c
|
@ -47,7 +47,7 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
grub_err_t err;
|
||||
enum grub_fshelp_filetype foundtype = GRUB_FSHELP_DIR;
|
||||
int symlinknest = 0;
|
||||
|
||||
|
||||
auto grub_err_t NESTED_FUNC_ATTR find_file (const char *currpath,
|
||||
grub_fshelp_node_t currroot,
|
||||
grub_fshelp_node_t *currfound);
|
||||
|
@ -69,13 +69,13 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
grub_fshelp_node_t node);
|
||||
|
||||
auto void free_node (grub_fshelp_node_t node);
|
||||
|
||||
|
||||
void free_node (grub_fshelp_node_t node)
|
||||
{
|
||||
if (node != rootnode && node != currroot)
|
||||
grub_free (node);
|
||||
}
|
||||
|
||||
|
||||
int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node)
|
||||
|
@ -88,31 +88,31 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
grub_free (node);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* The node is found, stop iterating over the nodes. */
|
||||
type = filetype & ~GRUB_FSHELP_CASE_INSENSITIVE;
|
||||
oldnode = currnode;
|
||||
currnode = node;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
grub_strncpy (fpath, currpath, grub_strlen (currpath) + 1);
|
||||
|
||||
|
||||
/* Remove all leading slashes. */
|
||||
while (*name == '/')
|
||||
name++;
|
||||
|
||||
|
||||
if (! *name)
|
||||
{
|
||||
*currfound = currnode;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int found;
|
||||
|
||||
|
||||
/* Extract the actual part from the pathname. */
|
||||
next = grub_strchr (name, '/');
|
||||
if (next)
|
||||
|
@ -121,7 +121,7 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
while (*next == '/')
|
||||
*(next++) = '\0';
|
||||
}
|
||||
|
||||
|
||||
/* At this point it is expected that the current node is a
|
||||
directory, check if this is true. */
|
||||
if (type != GRUB_FSHELP_DIR)
|
||||
|
@ -129,22 +129,22 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
free_node (currnode);
|
||||
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
}
|
||||
|
||||
|
||||
/* Iterate over the directory. */
|
||||
found = iterate_dir (currnode, iterate);
|
||||
if (! found)
|
||||
{
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* Read in the symlink and follow it. */
|
||||
if (type == GRUB_FSHELP_SYMLINK)
|
||||
{
|
||||
char *symlink;
|
||||
|
||||
|
||||
/* Test if the symlink does not loop. */
|
||||
if (++symlinknest == 8)
|
||||
{
|
||||
|
@ -153,37 +153,37 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
return grub_error (GRUB_ERR_SYMLINK_LOOP,
|
||||
"too deep nesting of symlinks");
|
||||
}
|
||||
|
||||
|
||||
symlink = read_symlink (currnode);
|
||||
free_node (currnode);
|
||||
|
||||
|
||||
if (!symlink)
|
||||
{
|
||||
free_node (oldnode);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
/* The symlink is an absolute path, go back to the root inode. */
|
||||
if (symlink[0] == '/')
|
||||
{
|
||||
free_node (oldnode);
|
||||
oldnode = rootnode;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Lookup the node the symlink points to. */
|
||||
find_file (symlink, oldnode, &currnode);
|
||||
type = foundtype;
|
||||
grub_free (symlink);
|
||||
|
||||
|
||||
if (grub_errno)
|
||||
{
|
||||
free_node (oldnode);
|
||||
return grub_errno;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
free_node (oldnode);
|
||||
|
||||
|
||||
/* Found the node! */
|
||||
if (! next || *next == '\0')
|
||||
{
|
||||
|
@ -191,10 +191,10 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
foundtype = type;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
name = next;
|
||||
}
|
||||
|
||||
|
||||
return grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
|
||||
}
|
||||
|
||||
|
@ -203,17 +203,17 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
|
|||
grub_error (GRUB_ERR_BAD_FILENAME, "bad filename");
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
err = find_file (path, rootnode, foundnode);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
/* Check if the node that was found was of the expected type. */
|
||||
if (expecttype == GRUB_FSHELP_REG && foundtype != expecttype)
|
||||
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a regular file");
|
||||
else if (expecttype == GRUB_FSHELP_DIR && foundtype != expecttype)
|
||||
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -252,14 +252,14 @@ grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node,
|
|||
blknr = get_block (node, i);
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
||||
|
||||
blknr = blknr << log2blocksize;
|
||||
|
||||
/* Last block. */
|
||||
if (i == blockcnt - 1)
|
||||
{
|
||||
blockend = (len + pos) & (blocksize - 1);
|
||||
|
||||
|
||||
/* The last portion is exactly blocksize. */
|
||||
if (! blockend)
|
||||
blockend = blocksize;
|
||||
|
@ -271,12 +271,12 @@ grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node,
|
|||
skipfirst = blockoff;
|
||||
blockend -= skipfirst;
|
||||
}
|
||||
|
||||
|
||||
/* If the block number is 0 this block is not stored on disk but
|
||||
is zero filled instead. */
|
||||
if (blknr)
|
||||
{
|
||||
disk->read_hook = read_hook;
|
||||
disk->read_hook = read_hook;
|
||||
|
||||
grub_disk_read (disk, blknr, skipfirst,
|
||||
blockend, buf);
|
||||
|
@ -297,7 +297,7 @@ unsigned int
|
|||
grub_fshelp_log2blksize (unsigned int blksize, unsigned int *pow)
|
||||
{
|
||||
int mod;
|
||||
|
||||
|
||||
*pow = 0;
|
||||
while (blksize > 1)
|
||||
{
|
||||
|
|
200
fs/hfs.c
200
fs/hfs.c
|
@ -103,7 +103,7 @@ struct grub_hfs_catalog_key
|
|||
{
|
||||
grub_uint8_t unused;
|
||||
grub_uint32_t parent_dir;
|
||||
|
||||
|
||||
/* Filename length. */
|
||||
grub_uint8_t strlen;
|
||||
|
||||
|
@ -174,28 +174,28 @@ grub_hfs_block (struct grub_hfs_data *data, grub_hfs_datarecord_t dat,
|
|||
grub_hfs_datarecord_t dr;
|
||||
int pos = 0;
|
||||
struct grub_hfs_extent_key key;
|
||||
|
||||
|
||||
int tree = 0;
|
||||
static int cache_file = 0;
|
||||
static int cache_pos = 0;
|
||||
static int cache_pos = 0;
|
||||
static grub_hfs_datarecord_t cache_dr;
|
||||
|
||||
|
||||
grub_memcpy (dr, dat, sizeof (dr));
|
||||
|
||||
|
||||
key.forktype = 0;
|
||||
key.fileid = grub_cpu_to_be32 (file);
|
||||
|
||||
|
||||
if (cache && cache_file == file && block > cache_pos)
|
||||
{
|
||||
pos = cache_pos;
|
||||
key.first_block = grub_cpu_to_be16 (pos);
|
||||
grub_memcpy (dr, cache_dr, sizeof (cache_dr));
|
||||
}
|
||||
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
/* Try all 3 extents. */
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
|
@ -203,7 +203,7 @@ grub_hfs_block (struct grub_hfs_data *data, grub_hfs_datarecord_t dat,
|
|||
if (grub_be_to_cpu16 (dr[i].count) + pos > block)
|
||||
{
|
||||
int first = grub_be_to_cpu16 (dr[i].first_block);
|
||||
|
||||
|
||||
/* If the cache is enabled, store the current position
|
||||
in the tree. */
|
||||
if (tree && cache)
|
||||
|
@ -212,15 +212,15 @@ grub_hfs_block (struct grub_hfs_data *data, grub_hfs_datarecord_t dat,
|
|||
cache_pos = pos;
|
||||
grub_memcpy (cache_dr, dr, sizeof (cache_dr));
|
||||
}
|
||||
|
||||
|
||||
return (grub_be_to_cpu16 (data->sblock.first_block)
|
||||
+ (first + block - pos) * GRUB_HFS_BLKS);
|
||||
}
|
||||
|
||||
|
||||
/* Try the next extent. */
|
||||
pos += grub_be_to_cpu16 (dr[i].count);
|
||||
}
|
||||
|
||||
|
||||
/* Lookup the block in the extent overflow file. */
|
||||
key.first_block = grub_cpu_to_be16 (pos);
|
||||
tree = 1;
|
||||
|
@ -247,7 +247,7 @@ grub_hfs_read_file (struct grub_hfs_data *data,
|
|||
if (len > grub_le_to_cpu32 (data->size))
|
||||
len = grub_le_to_cpu32 (data->size);
|
||||
|
||||
blockcnt = ((len + pos)
|
||||
blockcnt = ((len + pos)
|
||||
+ data->blksz - 1) / data->blksz;
|
||||
|
||||
for (i = pos / data->blksz; i < blockcnt; i++)
|
||||
|
@ -257,16 +257,16 @@ grub_hfs_read_file (struct grub_hfs_data *data,
|
|||
int blockend = data->blksz;
|
||||
|
||||
int skipfirst = 0;
|
||||
|
||||
|
||||
blknr = grub_hfs_block (data, data->extents, data->fileid, i, 1);
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
||||
|
||||
/* Last block. */
|
||||
if (i == blockcnt - 1)
|
||||
{
|
||||
blockend = (len + pos) % data->blksz;
|
||||
|
||||
|
||||
/* The last portion is exactly EXT2_BLOCK_SIZE (data). */
|
||||
if (! blockend)
|
||||
blockend = data->blksz;
|
||||
|
@ -283,17 +283,17 @@ grub_hfs_read_file (struct grub_hfs_data *data,
|
|||
is zero filled instead. */
|
||||
if (blknr)
|
||||
{
|
||||
data->disk->read_hook = read_hook;
|
||||
data->disk->read_hook = read_hook;
|
||||
grub_disk_read (data->disk, blknr, skipfirst,
|
||||
blockend, buf);
|
||||
data->disk->read_hook = 0;
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
buf += data->blksz - skipfirst;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -306,13 +306,13 @@ grub_hfs_mount (grub_disk_t disk)
|
|||
struct grub_hfs_catalog_key key;
|
||||
struct grub_hfs_dirrec dir;
|
||||
int first_block;
|
||||
|
||||
|
||||
struct
|
||||
{
|
||||
struct grub_hfs_node node;
|
||||
struct grub_hfs_treeheader head;
|
||||
} treehead;
|
||||
|
||||
|
||||
data = grub_malloc (sizeof (struct grub_hfs_data));
|
||||
if (!data)
|
||||
return 0;
|
||||
|
@ -321,7 +321,7 @@ grub_hfs_mount (grub_disk_t disk)
|
|||
if (grub_disk_read (disk, GRUB_HFS_SBLOCK, 0,
|
||||
sizeof (struct grub_hfs_sblock), &data->sblock))
|
||||
goto fail;
|
||||
|
||||
|
||||
/* Check if this is a HFS filesystem. */
|
||||
if (grub_be_to_cpu16 (data->sblock.magic) != GRUB_HFS_MAGIC)
|
||||
{
|
||||
|
@ -335,23 +335,23 @@ grub_hfs_mount (grub_disk_t disk)
|
|||
grub_error (GRUB_ERR_BAD_FS, "embedded HFS+ filesystem");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
data->blksz = grub_be_to_cpu32 (data->sblock.blksz);
|
||||
data->disk = disk;
|
||||
|
||||
|
||||
/* Lookup the root node of the extent overflow tree. */
|
||||
first_block = ((grub_be_to_cpu16 (data->sblock.extent_recs[0].first_block)
|
||||
first_block = ((grub_be_to_cpu16 (data->sblock.extent_recs[0].first_block)
|
||||
* GRUB_HFS_BLKS)
|
||||
+ grub_be_to_cpu16 (data->sblock.first_block));
|
||||
|
||||
|
||||
if (grub_disk_read (data->disk, first_block, 0,
|
||||
sizeof (treehead), &treehead))
|
||||
goto fail;
|
||||
data->ext_root = grub_be_to_cpu32 (treehead.head.root_node);
|
||||
data->ext_size = grub_be_to_cpu16 (treehead.head.node_size);
|
||||
|
||||
|
||||
/* Lookup the root node of the catalog tree. */
|
||||
first_block = ((grub_be_to_cpu16 (data->sblock.catalog_recs[0].first_block)
|
||||
first_block = ((grub_be_to_cpu16 (data->sblock.catalog_recs[0].first_block)
|
||||
* GRUB_HFS_BLKS)
|
||||
+ grub_be_to_cpu16 (data->sblock.first_block));
|
||||
if (grub_disk_read (data->disk, first_block, 0,
|
||||
|
@ -359,32 +359,32 @@ grub_hfs_mount (grub_disk_t disk)
|
|||
goto fail;
|
||||
data->cat_root = grub_be_to_cpu32 (treehead.head.root_node);
|
||||
data->cat_size = grub_be_to_cpu16 (treehead.head.node_size);
|
||||
|
||||
|
||||
/* Lookup the root directory node in the catalog tree using the
|
||||
volume name. */
|
||||
key.parent_dir = grub_cpu_to_be32 (1);
|
||||
key.strlen = data->sblock.volname[0];
|
||||
grub_strcpy ((char *) key.str, (char *) (data->sblock.volname + 1));
|
||||
|
||||
|
||||
if (grub_hfs_find_node (data, (char *) &key, data->cat_root,
|
||||
0, (char *) &dir, sizeof (dir)) == 0)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "can not find the hfs root directory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
data->rootdir = grub_be_to_cpu32 (dir.dirid);
|
||||
|
||||
|
||||
return data;
|
||||
fail:
|
||||
grub_free (data);
|
||||
|
||||
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
|
||||
grub_error (GRUB_ERR_BAD_FS, "not a hfs filesystem");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -641,7 +641,7 @@ grub_hfs_cmp_extkeys (struct grub_hfs_extent_key *k1,
|
|||
if (cmp == 0)
|
||||
cmp = grub_be_to_cpu32 (k1->fileid) - grub_be_to_cpu32 (k2->fileid);
|
||||
if (cmp == 0)
|
||||
cmp = (grub_be_to_cpu16 (k1->first_block)
|
||||
cmp = (grub_be_to_cpu16 (k1->first_block)
|
||||
- grub_be_to_cpu16 (k2->first_block));
|
||||
return cmp;
|
||||
}
|
||||
|
@ -657,24 +657,24 @@ grub_hfs_iterate_records (struct grub_hfs_data *data, int type, int idx,
|
|||
struct grub_hfs_record *))
|
||||
{
|
||||
int nodesize = type == 0 ? data->cat_size : data->ext_size;
|
||||
|
||||
|
||||
union
|
||||
{
|
||||
struct grub_hfs_node node;
|
||||
char rawnode[nodesize];
|
||||
grub_uint16_t offsets[nodesize / 2];
|
||||
} node;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
int i;
|
||||
struct grub_hfs_extent *dat;
|
||||
int blk;
|
||||
|
||||
dat = (struct grub_hfs_extent *) (type == 0
|
||||
|
||||
dat = (struct grub_hfs_extent *) (type == 0
|
||||
? (&data->sblock.catalog_recs)
|
||||
: (&data->sblock.extent_recs));
|
||||
|
||||
|
||||
/* Read the node into memory. */
|
||||
blk = grub_hfs_block (data, dat,
|
||||
(type == 0) ? GRUB_HFS_CNID_CAT : GRUB_HFS_CNID_EXT,
|
||||
|
@ -682,11 +682,11 @@ grub_hfs_iterate_records (struct grub_hfs_data *data, int type, int idx,
|
|||
blk += (idx % (data->blksz / nodesize));
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
if (grub_disk_read (data->disk, blk, 0,
|
||||
sizeof (node), &node))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
/* Iterate over all records in this node. */
|
||||
for (i = 0; i < grub_be_to_cpu16 (node.node.reccnt); i++)
|
||||
{
|
||||
|
@ -698,23 +698,23 @@ grub_hfs_iterate_records (struct grub_hfs_data *data, int type, int idx,
|
|||
} __attribute__ ((packed)) *pnt;
|
||||
pnt = (struct pointer *) (grub_be_to_cpu16 (node.offsets[pos])
|
||||
+ node.rawnode);
|
||||
|
||||
struct grub_hfs_record rec =
|
||||
|
||||
struct grub_hfs_record rec =
|
||||
{
|
||||
&pnt->key,
|
||||
pnt->keylen,
|
||||
&pnt->key + pnt->keylen +(pnt->keylen + 1) % 2,
|
||||
nodesize - grub_be_to_cpu16 (node.offsets[pos])
|
||||
nodesize - grub_be_to_cpu16 (node.offsets[pos])
|
||||
- pnt->keylen - 1
|
||||
};
|
||||
|
||||
|
||||
if (node_hook (&node.node, &rec))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
idx = grub_be_to_cpu32 (node.node.next);
|
||||
} while (idx && this);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -730,18 +730,18 @@ grub_hfs_find_node (struct grub_hfs_data *data, char *key,
|
|||
int found = -1;
|
||||
int isleaf = 0;
|
||||
int done = 0;
|
||||
|
||||
|
||||
auto int node_found (struct grub_hfs_node *, struct grub_hfs_record *);
|
||||
|
||||
|
||||
int node_found (struct grub_hfs_node *hnd, struct grub_hfs_record *rec)
|
||||
{
|
||||
int cmp = 1;
|
||||
|
||||
|
||||
if (type == 0)
|
||||
cmp = grub_hfs_cmp_catkeys (rec->key, (void *) key);
|
||||
else
|
||||
cmp = grub_hfs_cmp_extkeys (rec->key, (void *) key);
|
||||
|
||||
|
||||
/* If the key is smaller or equal to the current node, mark the
|
||||
entry. In case of a non-leaf mode it will be used to lookup
|
||||
the rest of the tree. */
|
||||
|
@ -752,12 +752,12 @@ grub_hfs_find_node (struct grub_hfs_data *data, char *key,
|
|||
}
|
||||
else /* The key can not be found in the tree. */
|
||||
return 1;
|
||||
|
||||
|
||||
/* Check if this node is a leaf node. */
|
||||
if (hnd->type == GRUB_HFS_NODE_LEAF)
|
||||
{
|
||||
isleaf = 1;
|
||||
|
||||
|
||||
/* Found it!!!! */
|
||||
if (cmp == 0)
|
||||
{
|
||||
|
@ -768,23 +768,23 @@ grub_hfs_find_node (struct grub_hfs_data *data, char *key,
|
|||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
found = -1;
|
||||
|
||||
if (grub_hfs_iterate_records (data, type, idx, 0, node_found))
|
||||
return 0;
|
||||
|
||||
|
||||
if (found == -1)
|
||||
return 0;
|
||||
|
||||
idx = found;
|
||||
} while (! isleaf);
|
||||
|
||||
|
||||
return done;
|
||||
}
|
||||
|
||||
|
@ -799,7 +799,7 @@ grub_hfs_iterate_dir (struct grub_hfs_data *data, grub_uint32_t root_idx,
|
|||
int found = -1;
|
||||
int isleaf = 0;
|
||||
int next = 0;
|
||||
|
||||
|
||||
/* The lowest key possible with DIR as root directory. */
|
||||
struct grub_hfs_catalog_key key = {0, grub_cpu_to_be32 (dir), 0, ""};
|
||||
|
||||
|
@ -807,51 +807,51 @@ grub_hfs_iterate_dir (struct grub_hfs_data *data, grub_uint32_t root_idx,
|
|||
auto int it_dir (struct grub_hfs_node * __attribute ((unused)),
|
||||
struct grub_hfs_record *);
|
||||
|
||||
|
||||
|
||||
int node_found (struct grub_hfs_node *hnd, struct grub_hfs_record *rec)
|
||||
{
|
||||
struct grub_hfs_catalog_key *ckey = rec->key;
|
||||
|
||||
|
||||
if (grub_hfs_cmp_catkeys (rec->key, (void *) &key) <= 0)
|
||||
found = grub_be_to_cpu32 (*(grub_uint32_t *) rec->data);
|
||||
|
||||
|
||||
if (hnd->type == 0xFF && ckey->strlen > 0)
|
||||
{
|
||||
isleaf = 1;
|
||||
next = grub_be_to_cpu32 (hnd->next);
|
||||
|
||||
|
||||
/* An entry was found. */
|
||||
if (grub_be_to_cpu32 (ckey->parent_dir) == dir)
|
||||
return hook (rec);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int it_dir (struct grub_hfs_node *hnd __attribute ((unused)),
|
||||
struct grub_hfs_record *rec)
|
||||
{
|
||||
struct grub_hfs_catalog_key *ckey = rec->key;
|
||||
struct grub_hfs_catalog_key *origkey = &key;
|
||||
|
||||
|
||||
/* Stop when the entries do not match anymore. */
|
||||
if (grub_be_to_cpu32 (ckey->parent_dir)
|
||||
if (grub_be_to_cpu32 (ckey->parent_dir)
|
||||
!= grub_be_to_cpu32 ((origkey)->parent_dir))
|
||||
return 1;
|
||||
|
||||
|
||||
return hook (rec);
|
||||
}
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
found = -1;
|
||||
|
||||
if (grub_hfs_iterate_records (data, 0, root_idx, 0, node_found))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
if (found == -1)
|
||||
return 0;
|
||||
|
||||
|
||||
root_idx = found;
|
||||
} while (! isleaf);
|
||||
|
||||
|
@ -878,21 +878,21 @@ grub_hfs_find_dir (struct grub_hfs_data *data, const char *path,
|
|||
} fdrec;
|
||||
|
||||
fdrec.frec.type = GRUB_HFS_FILETYPE_DIR;
|
||||
|
||||
|
||||
if (path[0] != '/')
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILENAME, "bad filename");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
origpath = grub_strdup (path);
|
||||
if (!origpath)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
path = origpath;
|
||||
while (*path == '/')
|
||||
path++;
|
||||
|
||||
|
||||
while (path && grub_strlen (path))
|
||||
{
|
||||
if (fdrec.frec.type != GRUB_HFS_FILETYPE_DIR)
|
||||
|
@ -900,7 +900,7 @@ grub_hfs_find_dir (struct grub_hfs_data *data, const char *path,
|
|||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
/* Isolate a part of the path. */
|
||||
next = grub_strchr (path, '/');
|
||||
if (next)
|
||||
|
@ -908,13 +908,13 @@ grub_hfs_find_dir (struct grub_hfs_data *data, const char *path,
|
|||
while (*next == '/')
|
||||
*(next++) = '\0';
|
||||
}
|
||||
|
||||
|
||||
struct grub_hfs_catalog_key key;
|
||||
|
||||
|
||||
key.parent_dir = grub_cpu_to_be32 (inode);
|
||||
key.strlen = grub_strlen (path);
|
||||
grub_strcpy ((char *) (key.str), path);
|
||||
|
||||
|
||||
/* Lookup this node. */
|
||||
if (! grub_hfs_find_node (data, (char *) &key, data->cat_root,
|
||||
0, (char *) &fdrec.frec, sizeof (fdrec.frec)))
|
||||
|
@ -925,17 +925,17 @@ grub_hfs_find_dir (struct grub_hfs_data *data, const char *path,
|
|||
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
inode = grub_be_to_cpu32 (fdrec.dir.dirid);
|
||||
path = next;
|
||||
}
|
||||
|
||||
if (retdata)
|
||||
grub_memcpy (retdata, &fdrec.frec, sizeof (fdrec.frec));
|
||||
|
||||
|
||||
if (retinode)
|
||||
*retinode = inode;
|
||||
|
||||
|
||||
fail:
|
||||
grub_free (origpath);
|
||||
return grub_errno;
|
||||
|
@ -944,7 +944,7 @@ grub_hfs_find_dir (struct grub_hfs_data *data, const char *path,
|
|||
|
||||
|
||||
static grub_err_t
|
||||
grub_hfs_dir (grub_device_t device, const char *path,
|
||||
grub_hfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
|
@ -959,10 +959,10 @@ grub_hfs_dir (grub_device_t device, const char *path,
|
|||
struct grub_hfs_catalog_key *ckey = rec->key;
|
||||
struct grub_dirhook_info info;
|
||||
grub_memset (&info, 0, sizeof (info));
|
||||
|
||||
|
||||
grub_strncpy (fname, (char *) (ckey->str), ckey->strlen);
|
||||
|
||||
if (*filetype == GRUB_HFS_FILETYPE_DIR
|
||||
|
||||
if (*filetype == GRUB_HFS_FILETYPE_DIR
|
||||
|| *filetype == GRUB_HFS_FILETYPE_FILE)
|
||||
{
|
||||
info.dir = (*filetype == GRUB_HFS_FILETYPE_DIR);
|
||||
|
@ -970,16 +970,16 @@ grub_hfs_dir (grub_device_t device, const char *path,
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct grub_hfs_data *data;
|
||||
struct grub_hfs_filerec frec;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_hfs_mount (device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
/* First the directory ID for the directory. */
|
||||
if (grub_hfs_find_dir (data, path, &frec, &inode))
|
||||
goto fail;
|
||||
|
@ -989,14 +989,14 @@ grub_hfs_dir (grub_device_t device, const char *path,
|
|||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
grub_hfs_iterate_dir (data, data->cat_root, inode, dir_hook);
|
||||
|
||||
|
||||
fail:
|
||||
grub_free (data);
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -1007,18 +1007,18 @@ grub_hfs_open (struct grub_file *file, const char *name)
|
|||
{
|
||||
struct grub_hfs_data *data;
|
||||
struct grub_hfs_filerec frec;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
data = grub_hfs_mount (file->device->disk);
|
||||
|
||||
|
||||
if (grub_hfs_find_dir (data, name, &frec, 0))
|
||||
{
|
||||
grub_free (data);
|
||||
grub_dl_unref (my_mod);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
if (frec.type != GRUB_HFS_FILETYPE_FILE)
|
||||
{
|
||||
grub_free (data);
|
||||
|
@ -1026,7 +1026,7 @@ grub_hfs_open (struct grub_file *file, const char *name)
|
|||
grub_dl_unref (my_mod);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
grub_memcpy (data->extents, frec.extents, sizeof (grub_hfs_datarecord_t));
|
||||
file->size = grub_be_to_cpu32 (frec.size);
|
||||
data->size = grub_be_to_cpu32 (frec.size);
|
||||
|
@ -1034,16 +1034,16 @@ grub_hfs_open (struct grub_file *file, const char *name)
|
|||
file->offset = 0;
|
||||
|
||||
file->data = data;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_ssize_t
|
||||
grub_hfs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_hfs_data *data =
|
||||
struct grub_hfs_data *data =
|
||||
(struct grub_hfs_data *) file->data;
|
||||
|
||||
|
||||
return grub_hfs_read_file (data, file->read_hook, file->offset, len, buf);
|
||||
}
|
||||
|
||||
|
@ -1065,7 +1065,7 @@ grub_hfs_label (grub_device_t device, char **label)
|
|||
struct grub_hfs_data *data;
|
||||
|
||||
data = grub_hfs_mount (device->disk);
|
||||
|
||||
|
||||
if (data)
|
||||
*label = grub_strndup ((char *) (data->sblock.volname + 1),
|
||||
*data->sblock.volname);
|
||||
|
|
48
fs/hfsplus.c
48
fs/hfsplus.c
|
@ -321,7 +321,7 @@ grub_hfsplus_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
|||
code above used this memory, it can be freed now. */
|
||||
grub_free (nnode);
|
||||
nnode = 0;
|
||||
|
||||
|
||||
if (blk != -1)
|
||||
return (blk
|
||||
+ (node->data->embedded_offset >> (node->data->log2blksize
|
||||
|
@ -455,7 +455,7 @@ grub_hfsplus_mount (grub_disk_t disk)
|
|||
grub_memcpy (&data->catalog_tree.file.extents,
|
||||
data->volheader.catalog_file.extents,
|
||||
sizeof data->volheader.catalog_file.extents);
|
||||
data->catalog_tree.file.size =
|
||||
data->catalog_tree.file.size =
|
||||
grub_be_to_cpu64 (data->volheader.catalog_file.size);
|
||||
|
||||
/* Make a new node for the extent overflow file. */
|
||||
|
@ -465,7 +465,7 @@ grub_hfsplus_mount (grub_disk_t disk)
|
|||
data->volheader.extents_file.extents,
|
||||
sizeof data->volheader.catalog_file.extents);
|
||||
|
||||
data->extoverflow_tree.file.size =
|
||||
data->extoverflow_tree.file.size =
|
||||
grub_be_to_cpu64 (data->volheader.extents_file.size);
|
||||
|
||||
/* Read the essential information about the trees. */
|
||||
|
@ -518,10 +518,10 @@ grub_hfsplus_cmp_catkey (struct grub_hfsplus_key *keya,
|
|||
char *filename;
|
||||
int i;
|
||||
int diff;
|
||||
|
||||
|
||||
diff = grub_be_to_cpu32 (catkey_a->parent) - catkey_b->parent;
|
||||
if (diff)
|
||||
return diff;
|
||||
return diff;
|
||||
|
||||
/* Change the filename in keya so the endianness is correct. */
|
||||
for (i = 0; i < grub_be_to_cpu16 (catkey_a->namelen); i++)
|
||||
|
@ -592,7 +592,7 @@ grub_hfsplus_btree_iterate_node (struct grub_hfsplus_btree *btree,
|
|||
int first_rec,
|
||||
int (*hook) (void *record))
|
||||
{
|
||||
int rec;
|
||||
int rec;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
@ -661,8 +661,8 @@ grub_hfsplus_btree_search (struct grub_hfsplus_btree *btree,
|
|||
for (rec = 0; rec < grub_be_to_cpu16 (nodedesc->count); rec++)
|
||||
{
|
||||
struct grub_hfsplus_key *currkey;
|
||||
currkey = grub_hfsplus_btree_recptr (btree, nodedesc, rec);
|
||||
|
||||
currkey = grub_hfsplus_btree_recptr (btree, nodedesc, rec);
|
||||
|
||||
/* The action that has to be taken depend on the type of
|
||||
record. */
|
||||
if (nodedesc->type == GRUB_HFSPLUS_BTNODE_TYPE_LEAF
|
||||
|
@ -716,7 +716,7 @@ grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
|
|||
grub_fshelp_node_t node))
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
|
||||
auto int list_nodes (void *record);
|
||||
int list_nodes (void *record)
|
||||
{
|
||||
|
@ -730,7 +730,7 @@ grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
|
|||
catkey = (struct grub_hfsplus_catkey *) record;
|
||||
|
||||
fileinfo =
|
||||
(struct grub_hfsplus_catfile *) ((char *) record
|
||||
(struct grub_hfsplus_catfile *) ((char *) record
|
||||
+ grub_be_to_cpu16 (catkey->keylen)
|
||||
+ 2 + (grub_be_to_cpu16(catkey->keylen)
|
||||
% 2));
|
||||
|
@ -796,7 +796,7 @@ grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
|
|||
callback function. */
|
||||
node = grub_malloc (sizeof (*node));
|
||||
node->data = dir->data;
|
||||
|
||||
|
||||
grub_memcpy (node->extents, fileinfo->data.extents,
|
||||
sizeof (node->extents));
|
||||
node->mtime = grub_be_to_cpu32 (fileinfo->mtime) - 2082844800;
|
||||
|
@ -839,9 +839,9 @@ grub_hfsplus_open (struct grub_file *file, const char *name)
|
|||
{
|
||||
struct grub_hfsplus_data *data;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_hfsplus_mount (file->device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
@ -865,7 +865,7 @@ grub_hfsplus_open (struct grub_file *file, const char *name)
|
|||
if (data && fdiro != &data->dirroot)
|
||||
grub_free (fdiro);
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
return grub_errno;
|
||||
|
@ -887,7 +887,7 @@ grub_hfsplus_close (grub_file_t file)
|
|||
static grub_ssize_t
|
||||
grub_hfsplus_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_hfsplus_data *data =
|
||||
struct grub_hfsplus_data *data =
|
||||
(struct grub_hfsplus_data *) file->data;
|
||||
|
||||
int size = grub_hfsplus_read_file (&data->opened_file, file->read_hook,
|
||||
|
@ -898,13 +898,13 @@ grub_hfsplus_read (grub_file_t file, char *buf, grub_size_t len)
|
|||
|
||||
|
||||
static grub_err_t
|
||||
grub_hfsplus_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_hfsplus_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_hfsplus_data *data = 0;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
auto int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node);
|
||||
|
@ -924,7 +924,7 @@ grub_hfsplus_dir (grub_device_t device, const char *path,
|
|||
}
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_hfsplus_mount (device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
@ -938,7 +938,7 @@ grub_hfsplus_dir (grub_device_t device, const char *path,
|
|||
|
||||
/* Iterate over all entries in this directory. */
|
||||
grub_hfsplus_iterate_dir (fdiro, iterate);
|
||||
|
||||
|
||||
fail:
|
||||
if (data && fdiro != &data->dirroot)
|
||||
grub_free (fdiro);
|
||||
|
@ -961,7 +961,7 @@ grub_hfsplus_label (grub_device_t device __attribute__((unused))
|
|||
}
|
||||
|
||||
/* Get mtime. */
|
||||
static grub_err_t
|
||||
static grub_err_t
|
||||
grub_hfsplus_mtime (grub_device_t device, grub_int32_t *tm)
|
||||
{
|
||||
struct grub_hfsplus_data *data;
|
||||
|
@ -972,7 +972,7 @@ grub_hfsplus_mtime (grub_device_t device, grub_int32_t *tm)
|
|||
data = grub_hfsplus_mount (disk);
|
||||
if (!data)
|
||||
*tm = 0;
|
||||
else
|
||||
else
|
||||
*tm = grub_be_to_cpu32 (data->volheader.utime) - 2082844800;
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
@ -995,8 +995,8 @@ grub_hfsplus_uuid (grub_device_t device, char **uuid)
|
|||
if (data)
|
||||
{
|
||||
*uuid = grub_malloc (16 + sizeof ('\0'));
|
||||
grub_sprintf (*uuid, "%016llx",
|
||||
(unsigned long long)
|
||||
grub_sprintf (*uuid, "%016llx",
|
||||
(unsigned long long)
|
||||
grub_be_to_cpu64 (data->volheader.num_serial));
|
||||
}
|
||||
else
|
||||
|
|
158
fs/iso9660.c
158
fs/iso9660.c
|
@ -164,27 +164,27 @@ grub_iso9660_susp_iterate (struct grub_iso9660_data *data,
|
|||
{
|
||||
char *sua;
|
||||
struct grub_iso9660_susp_entry *entry;
|
||||
|
||||
|
||||
auto grub_err_t load_sua (void);
|
||||
|
||||
|
||||
/* Load a part of the System Usage Area. */
|
||||
grub_err_t load_sua (void)
|
||||
{
|
||||
sua = grub_malloc (sua_size);
|
||||
if (!sua)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
if (grub_disk_read (data->disk, sua_block, sua_pos,
|
||||
sua_size, sua))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
entry = (struct grub_iso9660_susp_entry *) sua;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (load_sua ())
|
||||
return grub_errno;
|
||||
|
||||
|
||||
for (; (char *) entry < (char *) sua + sua_size - 1;
|
||||
entry = (struct grub_iso9660_susp_entry *)
|
||||
((char *) entry + entry->len))
|
||||
|
@ -192,29 +192,29 @@ grub_iso9660_susp_iterate (struct grub_iso9660_data *data,
|
|||
/* The last entry. */
|
||||
if (grub_strncmp ((char *) entry->sig, "ST", 2) == 0)
|
||||
break;
|
||||
|
||||
|
||||
/* Additional entries are stored elsewhere. */
|
||||
if (grub_strncmp ((char *) entry->sig, "CE", 2) == 0)
|
||||
{
|
||||
struct grub_iso9660_susp_ce *ce;
|
||||
|
||||
|
||||
ce = (struct grub_iso9660_susp_ce *) entry;
|
||||
sua_size = grub_le_to_cpu32 (ce->len);
|
||||
sua_pos = grub_le_to_cpu32 (ce->off);
|
||||
sua_block = grub_le_to_cpu32 (ce->blk) << GRUB_ISO9660_LOG2_BLKSZ;
|
||||
|
||||
|
||||
grub_free (sua);
|
||||
if (load_sua ())
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
if (hook (entry))
|
||||
{
|
||||
grub_free (sua);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
grub_free (sua);
|
||||
return 0;
|
||||
}
|
||||
|
@ -248,9 +248,9 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
struct grub_iso9660_susp_entry *entry;
|
||||
struct grub_iso9660_primary_voldesc voldesc;
|
||||
int block;
|
||||
|
||||
|
||||
auto grub_err_t susp_iterate (struct grub_iso9660_susp_entry *);
|
||||
|
||||
|
||||
grub_err_t susp_iterate (struct grub_iso9660_susp_entry *susp_entry)
|
||||
{
|
||||
/* The "ER" entry is used to detect extensions. The
|
||||
|
@ -262,11 +262,11 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
data = grub_malloc (sizeof (struct grub_iso9660_data));
|
||||
if (! data)
|
||||
return 0;
|
||||
|
||||
|
||||
data->disk = disk;
|
||||
data->rockridge = 0;
|
||||
data->joliet = 0;
|
||||
|
@ -319,7 +319,7 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
grub_error (GRUB_ERR_BAD_FS, "not a iso9660 filesystem");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
sua_pos = (sizeof (rootdir) + rootdir.namelen
|
||||
+ (rootdir.namelen % 2) - 1);
|
||||
sua_size = rootdir.len - sua_pos;
|
||||
|
@ -327,7 +327,7 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
sua = grub_malloc (sua_size);
|
||||
if (! sua)
|
||||
goto fail;
|
||||
|
||||
|
||||
if (grub_disk_read (disk, (grub_le_to_cpu32 (data->voldesc.rootdir.first_sector)
|
||||
<< GRUB_ISO9660_LOG2_BLKSZ), sua_pos,
|
||||
sua_size, sua))
|
||||
|
@ -335,9 +335,9 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
grub_error (GRUB_ERR_BAD_FS, "not a iso9660 filesystem");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
entry = (struct grub_iso9660_susp_entry *) sua;
|
||||
|
||||
|
||||
/* Test if the SUSP protocol is used on this filesystem. */
|
||||
if (grub_strncmp ((char *) entry->sig, "SP", 2) == 0)
|
||||
{
|
||||
|
@ -345,7 +345,7 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
to get to the SUA (System Usage Area). */
|
||||
data->susp_skip = entry->data[2];
|
||||
entry = (struct grub_iso9660_susp_entry *) ((char *) entry + entry->len);
|
||||
|
||||
|
||||
/* Iterate over the entries in the SUA area to detect
|
||||
extensions. */
|
||||
if (grub_iso9660_susp_iterate (data,
|
||||
|
@ -354,9 +354,9 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||
sua_pos, sua_size, susp_iterate))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
return data;
|
||||
|
||||
|
||||
fail:
|
||||
grub_free (data);
|
||||
return 0;
|
||||
|
@ -371,7 +371,7 @@ grub_iso9660_read_symlink (grub_fshelp_node_t node)
|
|||
int sua_size;
|
||||
char *symlink = 0;
|
||||
int addslash = 0;
|
||||
|
||||
|
||||
auto void add_part (const char *part, int len);
|
||||
auto grub_err_t susp_iterate_sl (struct grub_iso9660_susp_entry *);
|
||||
|
||||
|
@ -379,14 +379,14 @@ grub_iso9660_read_symlink (grub_fshelp_node_t node)
|
|||
void add_part (const char *part, int len)
|
||||
{
|
||||
int size = grub_strlen (symlink);
|
||||
|
||||
|
||||
symlink = grub_realloc (symlink, size + len + 1);
|
||||
if (! symlink)
|
||||
return;
|
||||
|
||||
|
||||
grub_strncat (symlink, part, len);
|
||||
}
|
||||
|
||||
|
||||
/* Read in a symlink. */
|
||||
grub_err_t susp_iterate_sl (struct grub_iso9660_susp_entry *entry)
|
||||
{
|
||||
|
@ -402,7 +402,7 @@ grub_iso9660_read_symlink (grub_fshelp_node_t node)
|
|||
add_part ("/", 1);
|
||||
addslash = 0;
|
||||
}
|
||||
|
||||
|
||||
/* The current position is the `Component Flag'. */
|
||||
switch (entry->data[pos] & 30)
|
||||
{
|
||||
|
@ -418,15 +418,15 @@ grub_iso9660_read_symlink (grub_fshelp_node_t node)
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case 2:
|
||||
add_part ("./", 2);
|
||||
break;
|
||||
|
||||
|
||||
case 4:
|
||||
add_part ("../", 3);
|
||||
break;
|
||||
|
||||
|
||||
case 8:
|
||||
add_part ("/", 1);
|
||||
break;
|
||||
|
@ -435,29 +435,29 @@ grub_iso9660_read_symlink (grub_fshelp_node_t node)
|
|||
stored. */
|
||||
pos += entry->data[pos + 1] + 2;
|
||||
}
|
||||
|
||||
|
||||
/* Check if `grub_realloc' failed. */
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (grub_disk_read (node->data->disk, node->dir_blk, node->dir_off,
|
||||
sizeof (dirent), (char *) &dirent))
|
||||
return 0;
|
||||
|
||||
|
||||
sua_off = (sizeof (dirent) + dirent.namelen + 1 - (dirent.namelen % 2)
|
||||
+ node->data->susp_skip);
|
||||
sua_size = dirent.len - sua_off;
|
||||
|
||||
|
||||
symlink = grub_malloc (1);
|
||||
if (!symlink)
|
||||
return 0;
|
||||
|
||||
|
||||
*symlink = '\0';
|
||||
|
||||
|
||||
if (grub_iso9660_susp_iterate (node->data, node->dir_blk,
|
||||
node->dir_off + sua_off,
|
||||
sua_size, susp_iterate_sl))
|
||||
|
@ -465,7 +465,7 @@ grub_iso9660_read_symlink (grub_fshelp_node_t node)
|
|||
grub_free (symlink);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
return symlink;
|
||||
}
|
||||
|
||||
|
@ -482,7 +482,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
char *filename;
|
||||
int filename_alloc = 0;
|
||||
enum grub_fshelp_filetype type;
|
||||
|
||||
|
||||
auto grub_err_t susp_iterate_dir (struct grub_iso9660_susp_entry *);
|
||||
|
||||
grub_err_t susp_iterate_dir (struct grub_iso9660_susp_entry *entry)
|
||||
|
@ -540,7 +540,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
type = GRUB_FSHELP_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -552,14 +552,14 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
offset % GRUB_DISK_SECTOR_SIZE,
|
||||
sizeof (dirent), (char *) &dirent))
|
||||
return 0;
|
||||
|
||||
|
||||
/* The end of the block, skip to the next one. */
|
||||
if (!dirent.len)
|
||||
{
|
||||
offset = (offset / GRUB_ISO9660_BLKSZ + 1) * GRUB_ISO9660_BLKSZ;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
char name[dirent.namelen + 1];
|
||||
int nameoffset = offset + sizeof (dirent);
|
||||
|
@ -567,9 +567,9 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
int sua_off = (sizeof (dirent) + dirent.namelen + 1
|
||||
- (dirent.namelen % 2));;
|
||||
int sua_size = dirent.len - sua_off;
|
||||
|
||||
|
||||
sua_off += offset + dir->data->susp_skip;
|
||||
|
||||
|
||||
filename = 0;
|
||||
filename_alloc = 0;
|
||||
type = GRUB_FSHELP_UNKNOWN;
|
||||
|
@ -582,7 +582,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
sua_off % GRUB_DISK_SECTOR_SIZE,
|
||||
sua_size, susp_iterate_dir))
|
||||
return 0;
|
||||
|
||||
|
||||
/* Read the name. */
|
||||
if (grub_disk_read (dir->data->disk,
|
||||
(dir->blk << GRUB_ISO9660_LOG2_BLKSZ)
|
||||
|
@ -590,11 +590,11 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
nameoffset % GRUB_DISK_SECTOR_SIZE,
|
||||
dirent.namelen, (char *) name))
|
||||
return 0;
|
||||
|
||||
|
||||
node = grub_malloc (sizeof (struct grub_fshelp_node));
|
||||
if (!node)
|
||||
return 0;
|
||||
|
||||
|
||||
/* Setup a new node. */
|
||||
node->data = dir->data;
|
||||
node->size = grub_le_to_cpu32 (dirent.size);
|
||||
|
@ -602,7 +602,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
node->dir_blk = ((dir->blk << GRUB_ISO9660_LOG2_BLKSZ)
|
||||
+ offset / GRUB_DISK_SECTOR_SIZE);
|
||||
node->dir_off = offset % GRUB_DISK_SECTOR_SIZE;
|
||||
|
||||
|
||||
/* If the filetype was not stored using rockridge, use
|
||||
whatever is stored in the iso9660 filesystem. */
|
||||
if (type == GRUB_FSHELP_UNKNOWN)
|
||||
|
@ -612,7 +612,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
else
|
||||
type = GRUB_FSHELP_REG;
|
||||
}
|
||||
|
||||
|
||||
/* The filename was not stored in a rock ridge entry. Read it
|
||||
from the iso9660 filesystem. */
|
||||
if (!filename)
|
||||
|
@ -621,7 +621,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
filename = grub_strrchr (name, ';');
|
||||
if (filename)
|
||||
*filename = '\0';
|
||||
|
||||
|
||||
if (dirent.namelen == 1 && name[0] == 0)
|
||||
filename = ".";
|
||||
else if (dirent.namelen == 1 && name[0] == 1)
|
||||
|
@ -629,7 +629,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
else
|
||||
filename = name;
|
||||
}
|
||||
|
||||
|
||||
if (dir->data->joliet)
|
||||
{
|
||||
char *oldname;
|
||||
|
@ -653,24 +653,24 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
|
|||
if (filename_alloc)
|
||||
grub_free (filename);
|
||||
}
|
||||
|
||||
|
||||
offset += dirent.len;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static grub_err_t
|
||||
grub_iso9660_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_iso9660_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_iso9660_data *data = 0;
|
||||
struct grub_fshelp_node rootnode;
|
||||
struct grub_fshelp_node *foundnode;
|
||||
|
||||
|
||||
auto int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node);
|
||||
|
@ -691,11 +691,11 @@ grub_iso9660_dir (grub_device_t device, const char *path,
|
|||
data = grub_iso9660_mount (device->disk);
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
||||
|
||||
rootnode.data = data;
|
||||
rootnode.blk = grub_le_to_cpu32 (data->voldesc.rootdir.first_sector);
|
||||
rootnode.size = grub_le_to_cpu32 (data->voldesc.rootdir.size);
|
||||
|
||||
|
||||
/* Use the fshelp function to traverse the path. */
|
||||
if (grub_fshelp_find_file (path, &rootnode,
|
||||
&foundnode,
|
||||
|
@ -703,13 +703,13 @@ grub_iso9660_dir (grub_device_t device, const char *path,
|
|||
grub_iso9660_read_symlink,
|
||||
GRUB_FSHELP_DIR))
|
||||
goto fail;
|
||||
|
||||
|
||||
/* List the files in the directory. */
|
||||
grub_iso9660_iterate_dir (foundnode, iterate);
|
||||
|
||||
|
||||
if (foundnode != &rootnode)
|
||||
grub_free (foundnode);
|
||||
|
||||
|
||||
fail:
|
||||
grub_free (data);
|
||||
|
||||
|
@ -726,17 +726,17 @@ grub_iso9660_open (struct grub_file *file, const char *name)
|
|||
struct grub_iso9660_data *data;
|
||||
struct grub_fshelp_node rootnode;
|
||||
struct grub_fshelp_node *foundnode;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
data = grub_iso9660_mount (file->device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
rootnode.data = data;
|
||||
rootnode.blk = grub_le_to_cpu32 (data->voldesc.rootdir.first_sector);
|
||||
rootnode.size = grub_le_to_cpu32 (data->voldesc.rootdir.size);
|
||||
|
||||
|
||||
/* Use the fshelp function to traverse the path. */
|
||||
if (grub_fshelp_find_file (name, &rootnode,
|
||||
&foundnode,
|
||||
|
@ -744,21 +744,21 @@ grub_iso9660_open (struct grub_file *file, const char *name)
|
|||
grub_iso9660_read_symlink,
|
||||
GRUB_FSHELP_REG))
|
||||
goto fail;
|
||||
|
||||
|
||||
data->first_sector = foundnode->blk;
|
||||
data->length = foundnode->size;
|
||||
|
||||
|
||||
file->data = data;
|
||||
file->size = foundnode->size;
|
||||
file->offset = 0;
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
fail:
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
grub_free (data);
|
||||
|
||||
|
||||
return grub_errno;;
|
||||
}
|
||||
|
||||
|
@ -766,17 +766,17 @@ grub_iso9660_open (struct grub_file *file, const char *name)
|
|||
static grub_ssize_t
|
||||
grub_iso9660_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_iso9660_data *data =
|
||||
struct grub_iso9660_data *data =
|
||||
(struct grub_iso9660_data *) file->data;
|
||||
|
||||
|
||||
/* XXX: The file is stored in as a single extent. */
|
||||
data->disk->read_hook = file->read_hook;
|
||||
data->disk->read_hook = file->read_hook;
|
||||
grub_disk_read (data->disk,
|
||||
data->first_sector << GRUB_ISO9660_LOG2_BLKSZ,
|
||||
file->offset,
|
||||
len, buf);
|
||||
data->disk->read_hook = 0;
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -785,9 +785,9 @@ static grub_err_t
|
|||
grub_iso9660_close (grub_file_t file)
|
||||
{
|
||||
grub_free (file->data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -797,7 +797,7 @@ grub_iso9660_label (grub_device_t device, char **label)
|
|||
{
|
||||
struct grub_iso9660_data *data;
|
||||
data = grub_iso9660_mount (device->disk);
|
||||
|
||||
|
||||
if (data)
|
||||
{
|
||||
if (data->joliet)
|
||||
|
@ -837,11 +837,11 @@ grub_iso9660_uuid (grub_device_t device, char **uuid)
|
|||
grub_error (GRUB_ERR_BAD_NUMBER, "No creation date in filesystem to generate UUID.");
|
||||
*uuid = NULL;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
*uuid = grub_malloc (sizeof ("YYYY-MM-DD-HH-mm-ss-hh"));
|
||||
grub_sprintf (*uuid, "%c%c%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c",
|
||||
data->voldesc.modified.year[0], data->voldesc.modified.year[1],
|
||||
data->voldesc.modified.year[0], data->voldesc.modified.year[1],
|
||||
data->voldesc.modified.year[2], data->voldesc.modified.year[3],
|
||||
data->voldesc.modified.month[0], data->voldesc.modified.month[1],
|
||||
data->voldesc.modified.day[0], data->voldesc.modified.day[1],
|
||||
|
|
186
fs/jfs.c
186
fs/jfs.c
|
@ -43,14 +43,14 @@ struct grub_jfs_sblock
|
|||
grub_uint8_t magic[4];
|
||||
grub_uint32_t version;
|
||||
grub_uint64_t ag_size;
|
||||
|
||||
|
||||
/* The size of a filesystem block in bytes. XXX: currently only
|
||||
4096 was tested. */
|
||||
grub_uint32_t blksz;
|
||||
grub_uint16_t log2_blksz;
|
||||
|
||||
|
||||
grub_uint8_t unused[71];
|
||||
grub_uint8_t volname[11];
|
||||
grub_uint8_t volname[11];
|
||||
};
|
||||
|
||||
struct grub_jfs_extent
|
||||
|
@ -58,7 +58,7 @@ struct grub_jfs_extent
|
|||
/* The length of the extent in filesystem blocks. */
|
||||
grub_uint16_t length;
|
||||
grub_uint8_t length2;
|
||||
|
||||
|
||||
/* The physical offset of the first block on the disk. */
|
||||
grub_uint8_t blk1;
|
||||
grub_uint32_t blk2;
|
||||
|
@ -76,10 +76,10 @@ struct grub_jfs_treehead
|
|||
{
|
||||
grub_uint64_t next;
|
||||
grub_uint64_t prev;
|
||||
|
||||
grub_uint8_t flags;
|
||||
|
||||
grub_uint8_t flags;
|
||||
grub_uint8_t unused;
|
||||
|
||||
|
||||
grub_uint16_t count;
|
||||
grub_uint16_t max;
|
||||
grub_uint8_t unused2[10];
|
||||
|
@ -94,7 +94,7 @@ struct grub_jfs_tree_extent
|
|||
/* The offset is the key used to lookup an extent. */
|
||||
grub_uint8_t offset1;
|
||||
grub_uint32_t offset2;
|
||||
|
||||
|
||||
struct grub_jfs_extent extent;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
@ -105,15 +105,15 @@ struct grub_jfs_tree_dir
|
|||
this level. */
|
||||
grub_uint64_t nextb;
|
||||
grub_uint64_t prevb;
|
||||
|
||||
|
||||
grub_uint8_t flags;
|
||||
|
||||
|
||||
/* The amount of dirents in this node. */
|
||||
grub_uint8_t count;
|
||||
grub_uint8_t freecnt;
|
||||
grub_uint8_t freelist;
|
||||
grub_uint8_t maxslot;
|
||||
|
||||
|
||||
/* The location of the sorted array of pointers to dirents. */
|
||||
grub_uint8_t sindex;
|
||||
grub_uint8_t unused[10];
|
||||
|
@ -161,7 +161,7 @@ struct grub_jfs_inode
|
|||
grub_uint32_t mode;
|
||||
grub_uint8_t unused3[72];
|
||||
grub_uint8_t unused4[96];
|
||||
|
||||
|
||||
union
|
||||
{
|
||||
/* The tree describing the extents of the file. */
|
||||
|
@ -177,7 +177,7 @@ struct grub_jfs_inode
|
|||
{
|
||||
grub_uint8_t unused[16];
|
||||
grub_uint8_t flags;
|
||||
|
||||
|
||||
/* Amount of dirents in this node. */
|
||||
grub_uint8_t count;
|
||||
grub_uint8_t freecnt;
|
||||
|
@ -222,7 +222,7 @@ struct grub_jfs_diropen
|
|||
char *sorted;
|
||||
struct grub_jfs_leaf_dirent *leaf;
|
||||
struct grub_jfs_leaf_next_dirent *next_leaf;
|
||||
|
||||
|
||||
/* The filename and inode of the last read dirent. */
|
||||
char name[255];
|
||||
grub_uint32_t ino;
|
||||
|
@ -241,19 +241,19 @@ grub_jfs_blkno (struct grub_jfs_data *data, struct grub_jfs_inode *inode,
|
|||
{
|
||||
auto int getblk (struct grub_jfs_treehead *treehead,
|
||||
struct grub_jfs_tree_extent *extents);
|
||||
|
||||
|
||||
int getblk (struct grub_jfs_treehead *treehead,
|
||||
struct grub_jfs_tree_extent *extents)
|
||||
{
|
||||
int found = -1;
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 0; i < grub_le_to_cpu16 (treehead->count) - 2; i++)
|
||||
{
|
||||
if (treehead->flags & GRUB_JFS_TREE_LEAF)
|
||||
{
|
||||
/* Read the leafnode. */
|
||||
if (grub_le_to_cpu32 (extents[i].offset2) <= blk
|
||||
if (grub_le_to_cpu32 (extents[i].offset2) <= blk
|
||||
&& ((grub_le_to_cpu16 (extents[i].extent.length))
|
||||
+ (extents[i].extent.length2 << 8)
|
||||
+ grub_le_to_cpu32 (extents[i].offset2)) > blk)
|
||||
|
@ -264,7 +264,7 @@ grub_jfs_blkno (struct grub_jfs_data *data, struct grub_jfs_inode *inode,
|
|||
if (blk >= grub_le_to_cpu32 (extents[i].offset2))
|
||||
found = i;
|
||||
}
|
||||
|
||||
|
||||
if (found != -1)
|
||||
{
|
||||
struct
|
||||
|
@ -272,20 +272,20 @@ grub_jfs_blkno (struct grub_jfs_data *data, struct grub_jfs_inode *inode,
|
|||
struct grub_jfs_treehead treehead;
|
||||
struct grub_jfs_tree_extent extents[254];
|
||||
} tree;
|
||||
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
grub_le_to_cpu32 (extents[found].extent.blk2)
|
||||
<< (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (tree), (char *) &tree))
|
||||
return -1;
|
||||
|
||||
|
||||
return getblk (&tree.treehead, &tree.extents[0]);
|
||||
}
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return getblk (&inode->file.tree, &inode->file.extents[0]);
|
||||
}
|
||||
|
||||
|
@ -311,12 +311,12 @@ grub_jfs_read_inode (struct grub_jfs_data *data, int ino,
|
|||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (struct grub_jfs_iag), &iag))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
inoblk = grub_le_to_cpu32 (iag.inodes[inoext].blk2);
|
||||
inoblk <<= (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS);
|
||||
inoblk += inonum;
|
||||
|
||||
|
||||
if (grub_disk_read (data->disk, inoblk, 0,
|
||||
sizeof (struct grub_jfs_inode), inode))
|
||||
return grub_errno;
|
||||
|
@ -338,13 +338,13 @@ grub_jfs_mount (grub_disk_t disk)
|
|||
if (grub_disk_read (disk, GRUB_JFS_SBLOCK, 0,
|
||||
sizeof (struct grub_jfs_sblock), &data->sblock))
|
||||
goto fail;
|
||||
|
||||
|
||||
if (grub_strncmp ((char *) (data->sblock.magic), "JFS1", 4))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "not a jfs filesystem");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
data->disk = disk;
|
||||
data->pos = 0;
|
||||
data->linknest = 0;
|
||||
|
@ -353,15 +353,15 @@ grub_jfs_mount (grub_disk_t disk)
|
|||
if (grub_disk_read (data->disk, GRUB_JFS_FS1_INODE_BLK, 0,
|
||||
sizeof (struct grub_jfs_inode), &data->fileset))
|
||||
goto fail;
|
||||
|
||||
|
||||
return data;
|
||||
|
||||
|
||||
fail:
|
||||
grub_free (data);
|
||||
|
||||
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
|
||||
grub_error (GRUB_ERR_BAD_FS, "not a jfs filesystem");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -372,20 +372,20 @@ grub_jfs_opendir (struct grub_jfs_data *data, struct grub_jfs_inode *inode)
|
|||
struct grub_jfs_internal_dirent *de;
|
||||
struct grub_jfs_diropen *diro;
|
||||
int blk;
|
||||
|
||||
|
||||
de = (struct grub_jfs_internal_dirent *) inode->dir.dirents;
|
||||
|
||||
|
||||
if (!((grub_le_to_cpu32 (inode->mode)
|
||||
& GRUB_JFS_FILETYPE_MASK) == GRUB_JFS_FILETYPE_DIR))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
diro = grub_malloc (sizeof (struct grub_jfs_diropen));
|
||||
if (!diro)
|
||||
return 0;
|
||||
|
||||
|
||||
diro->index = 0;
|
||||
diro->data = data;
|
||||
diro->inode = inode;
|
||||
|
@ -408,10 +408,10 @@ grub_jfs_opendir (struct grub_jfs_data *data, struct grub_jfs_inode *inode)
|
|||
grub_free (diro);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
blk = grub_le_to_cpu32 (de[inode->dir.header.sorted[0]].ex.blk2);
|
||||
blk <<= (grub_le_to_cpu16 (data->sblock.log2_blksz) - GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
|
||||
/* Read in the nodes until we are on the leaf node level. */
|
||||
do
|
||||
{
|
||||
|
@ -436,7 +436,7 @@ grub_jfs_opendir (struct grub_jfs_data *data, struct grub_jfs_inode *inode)
|
|||
diro->next_leaf = diro->dirpage->next_dirent;
|
||||
diro->sorted = &diro->dirpage->sorted[diro->dirpage->header.sindex * 32];
|
||||
diro->count = diro->dirpage->header.count;
|
||||
|
||||
|
||||
return diro;
|
||||
}
|
||||
|
||||
|
@ -461,31 +461,31 @@ grub_jfs_getent (struct grub_jfs_diropen *diro)
|
|||
int len;
|
||||
int nextent;
|
||||
grub_uint16_t filename[255];
|
||||
|
||||
|
||||
auto void addstr (grub_uint16_t *uname, int ulen);
|
||||
|
||||
|
||||
/* Add the unicode string to the utf16 filename buffer. */
|
||||
void addstr (grub_uint16_t *name, int ulen)
|
||||
{
|
||||
while (ulen--)
|
||||
filename[strpos++] = *(name++);
|
||||
}
|
||||
|
||||
|
||||
/* The last node, read in more. */
|
||||
if (diro->index == diro->count)
|
||||
{
|
||||
unsigned int next;
|
||||
|
||||
|
||||
/* If the inode contains the entry tree or if this was the last
|
||||
node, there is nothing to read. */
|
||||
if ((diro->inode->file.tree.flags & GRUB_JFS_TREE_LEAF)
|
||||
|| !grub_le_to_cpu64 (diro->dirpage->header.nextb))
|
||||
return GRUB_ERR_OUT_OF_RANGE;
|
||||
|
||||
|
||||
next = grub_le_to_cpu64 (diro->dirpage->header.nextb);
|
||||
next <<= (grub_le_to_cpu16 (diro->data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
|
||||
if (grub_disk_read (diro->data->disk, next, 0,
|
||||
grub_le_to_cpu32 (diro->data->sblock.blksz),
|
||||
diro->dirpage->sorted))
|
||||
|
@ -500,18 +500,18 @@ grub_jfs_getent (struct grub_jfs_diropen *diro)
|
|||
|
||||
leaf = &diro->leaf[(int) diro->sorted[diro->index]];
|
||||
next_leaf = &diro->next_leaf[diro->index];
|
||||
|
||||
|
||||
len = leaf->len;
|
||||
if (!len)
|
||||
{
|
||||
diro->index++;
|
||||
return grub_jfs_getent (diro);
|
||||
}
|
||||
|
||||
|
||||
addstr (leaf->namepart, len < 11 ? len : 11);
|
||||
diro->ino = grub_le_to_cpu32 (leaf->inode);
|
||||
len -= 11;
|
||||
|
||||
|
||||
/* Move down to the leaf level. */
|
||||
nextent = leaf->next;
|
||||
if (leaf->next != 255)
|
||||
|
@ -519,7 +519,7 @@ grub_jfs_getent (struct grub_jfs_diropen *diro)
|
|||
{
|
||||
next_leaf = &diro->next_leaf[nextent];
|
||||
addstr (next_leaf->namepart, len < 15 ? len : 15 );
|
||||
|
||||
|
||||
len -= 15;
|
||||
nextent = next_leaf->next;
|
||||
} while (next_leaf->next != 255 && len > 0);
|
||||
|
@ -528,7 +528,7 @@ grub_jfs_getent (struct grub_jfs_diropen *diro)
|
|||
|
||||
/* Convert the temporary UTF16 filename to UTF8. */
|
||||
*grub_utf16_to_utf8 ((grub_uint8_t *) (diro->name), filename, strpos) = '\0';
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -550,15 +550,15 @@ grub_jfs_read_file (struct grub_jfs_data *data,
|
|||
|
||||
blockcnt = ((len + pos + grub_le_to_cpu32 (data->sblock.blksz) - 1)
|
||||
/ grub_le_to_cpu32 (data->sblock.blksz));
|
||||
|
||||
|
||||
for (i = pos / grub_le_to_cpu32 (data->sblock.blksz); i < blockcnt; i++)
|
||||
{
|
||||
int blknr;
|
||||
int blockoff = pos % grub_le_to_cpu32 (data->sblock.blksz);
|
||||
int blockend = grub_le_to_cpu32 (data->sblock.blksz);
|
||||
|
||||
|
||||
int skipfirst = 0;
|
||||
|
||||
|
||||
blknr = grub_jfs_blkno (data, &data->currinode, i);
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
@ -567,31 +567,31 @@ grub_jfs_read_file (struct grub_jfs_data *data,
|
|||
if (i == blockcnt - 1)
|
||||
{
|
||||
blockend = (len + pos) % grub_le_to_cpu32 (data->sblock.blksz);
|
||||
|
||||
|
||||
if (!blockend)
|
||||
blockend = grub_le_to_cpu32 (data->sblock.blksz);
|
||||
}
|
||||
|
||||
|
||||
/* First block. */
|
||||
if (i == (pos / (int) grub_le_to_cpu32 (data->sblock.blksz)))
|
||||
{
|
||||
skipfirst = blockoff;
|
||||
blockend -= skipfirst;
|
||||
}
|
||||
|
||||
|
||||
data->disk->read_hook = read_hook;
|
||||
grub_disk_read (data->disk,
|
||||
blknr << (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS),
|
||||
skipfirst, blockend, buf);
|
||||
|
||||
|
||||
data->disk->read_hook = 0;
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
||||
|
||||
buf += grub_le_to_cpu32 (data->sblock.blksz) - skipfirst;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -606,9 +606,9 @@ grub_jfs_find_file (struct grub_jfs_data *data, const char *path)
|
|||
char *next;
|
||||
unsigned int pos = 0;
|
||||
struct grub_jfs_diropen *diro;
|
||||
|
||||
|
||||
grub_strncpy (fpath, path, grub_strlen (path) + 1);
|
||||
|
||||
|
||||
if (grub_jfs_read_inode (data, GRUB_JFS_AGGR_INODE, &data->currinode))
|
||||
return grub_errno;
|
||||
|
||||
|
@ -633,28 +633,28 @@ grub_jfs_find_file (struct grub_jfs_data *data, const char *path)
|
|||
diro = grub_jfs_opendir (data, &data->currinode);
|
||||
if (!diro)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (grub_strlen (name) == 0)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
|
||||
if (grub_jfs_getent (diro) == GRUB_ERR_OUT_OF_RANGE)
|
||||
break;
|
||||
|
||||
|
||||
/* Check if the current direntry matches the current part of the
|
||||
pathname. */
|
||||
if (!grub_strcmp (name, diro->name))
|
||||
{
|
||||
int ino = diro->ino;
|
||||
int dirino = grub_le_to_cpu32 (data->currinode.inode);
|
||||
|
||||
|
||||
grub_jfs_closedir (diro);
|
||||
diro = 0;
|
||||
|
||||
|
||||
if (grub_jfs_read_inode (data, ino, &data->currinode))
|
||||
break;
|
||||
|
||||
|
||||
/* Check if this is a symlink. */
|
||||
if ((grub_le_to_cpu32 (data->currinode.mode)
|
||||
& GRUB_JFS_FILETYPE_MASK) == GRUB_JFS_FILETYPE_LNK)
|
||||
|
@ -663,12 +663,12 @@ grub_jfs_find_file (struct grub_jfs_data *data, const char *path)
|
|||
if (grub_errno)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
if (!next)
|
||||
return 0;
|
||||
|
||||
pos = 0;
|
||||
|
||||
|
||||
name = next;
|
||||
next = grub_strchr (name, '/');
|
||||
if (next)
|
||||
|
@ -676,12 +676,12 @@ grub_jfs_find_file (struct grub_jfs_data *data, const char *path)
|
|||
next[0] = '\0';
|
||||
next++;
|
||||
}
|
||||
|
||||
|
||||
/* Open this directory for reading dirents. */
|
||||
diro = grub_jfs_opendir (data, &data->currinode);
|
||||
if (!diro)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -700,33 +700,33 @@ grub_jfs_lookup_symlink (struct grub_jfs_data *data, int ino)
|
|||
|
||||
if (++data->linknest > GRUB_JFS_MAX_SYMLNK_CNT)
|
||||
return grub_error (GRUB_ERR_SYMLINK_LOOP, "too deep nesting of symlinks");
|
||||
|
||||
|
||||
if (size <= 128)
|
||||
grub_strncpy (symlink, (char *) (data->currinode.symlink.path), 128);
|
||||
else if (grub_jfs_read_file (data, 0, 0, size, symlink) < 0)
|
||||
return grub_errno;
|
||||
|
||||
symlink[size] = '\0';
|
||||
|
||||
|
||||
/* The symlink is an absolute path, go back to the root inode. */
|
||||
if (symlink[0] == '/')
|
||||
ino = 2;
|
||||
|
||||
|
||||
/* Now load in the old inode. */
|
||||
if (grub_jfs_read_inode (data, ino, &data->currinode))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
grub_jfs_find_file (data, symlink);
|
||||
if (grub_errno)
|
||||
grub_error (grub_errno, "Can not follow symlink `%s'.", symlink);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
static grub_err_t
|
||||
grub_jfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_jfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_jfs_data *data = 0;
|
||||
|
@ -740,7 +740,7 @@ grub_jfs_dir (grub_device_t device, const char *path,
|
|||
|
||||
if (grub_jfs_find_file (data, path))
|
||||
goto fail;
|
||||
|
||||
|
||||
diro = grub_jfs_opendir (data, &data->currinode);
|
||||
if (!diro)
|
||||
goto fail;
|
||||
|
@ -751,16 +751,16 @@ grub_jfs_dir (grub_device_t device, const char *path,
|
|||
struct grub_jfs_inode inode;
|
||||
struct grub_dirhook_info info;
|
||||
grub_memset (&info, 0, sizeof (info));
|
||||
|
||||
|
||||
if (grub_jfs_read_inode (data, diro->ino, &inode))
|
||||
goto fail;
|
||||
|
||||
|
||||
info.dir = (grub_le_to_cpu32 (inode.mode)
|
||||
& GRUB_JFS_FILETYPE_MASK) == GRUB_JFS_FILETYPE_DIR;
|
||||
if (hook (diro->name, &info))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
/* XXX: GRUB_ERR_OUT_OF_RANGE is used for the last dirent. */
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
|
||||
grub_errno = 0;
|
||||
|
@ -786,11 +786,11 @@ grub_jfs_open (struct grub_file *file, const char *name)
|
|||
data = grub_jfs_mount (file->device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_jfs_find_file (data, name);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
/* It is only possible for open regular files. */
|
||||
if (! ((grub_le_to_cpu32 (data->currinode.mode)
|
||||
& GRUB_JFS_FILETYPE_MASK) == GRUB_JFS_FILETYPE_REG))
|
||||
|
@ -798,18 +798,18 @@ grub_jfs_open (struct grub_file *file, const char *name)
|
|||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a regular file");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
file->data = data;
|
||||
file->size = grub_le_to_cpu64 (data->currinode.size);
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
fail:
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
grub_free (data);
|
||||
|
||||
|
||||
return grub_errno;;
|
||||
}
|
||||
|
||||
|
@ -817,9 +817,9 @@ grub_jfs_open (struct grub_file *file, const char *name)
|
|||
static grub_ssize_t
|
||||
grub_jfs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_jfs_data *data =
|
||||
struct grub_jfs_data *data =
|
||||
(struct grub_jfs_data *) file->data;
|
||||
|
||||
|
||||
return grub_jfs_read_file (data, file->read_hook, file->offset, len, buf);
|
||||
}
|
||||
|
||||
|
@ -828,9 +828,9 @@ static grub_err_t
|
|||
grub_jfs_close (grub_file_t file)
|
||||
{
|
||||
grub_free (file->data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -840,12 +840,12 @@ grub_jfs_label (grub_device_t device, char **label)
|
|||
{
|
||||
struct grub_jfs_data *data;
|
||||
data = grub_jfs_mount (device->disk);
|
||||
|
||||
|
||||
if (data)
|
||||
*label = grub_strndup ((char *) (data->sblock.volname), 11);
|
||||
else
|
||||
*label = 0;
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
|
140
fs/minix.c
140
fs/minix.c
|
@ -96,7 +96,7 @@ struct grub_minix2_inode
|
|||
grub_uint32_t indir_zone;
|
||||
grub_uint32_t double_indir_zone;
|
||||
grub_uint32_t unused;
|
||||
|
||||
|
||||
};
|
||||
|
||||
/* Information about a "mounted" minix filesystem. */
|
||||
|
@ -147,11 +147,11 @@ grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk)
|
|||
return grub_le_to_cpu32 (indir32);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Direct block. */
|
||||
if (blk < 7)
|
||||
return GRUB_MINIX_INODE_DIR_ZONES (data, blk);
|
||||
|
||||
|
||||
/* Indirect block. */
|
||||
blk -= 7;
|
||||
if (blk < GRUB_MINIX_ZONESZ / GRUB_MINIX_INODE_BLKSZ (data))
|
||||
|
@ -159,23 +159,23 @@ grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk)
|
|||
indir = grub_get_indir (GRUB_MINIX_INODE_INDIR_ZONE (data), blk);
|
||||
return indir;
|
||||
}
|
||||
|
||||
|
||||
/* Double indirect block. */
|
||||
blk -= GRUB_MINIX_ZONESZ / GRUB_MINIX_INODE_BLKSZ (data);
|
||||
if (blk < (GRUB_MINIX_ZONESZ / GRUB_MINIX_INODE_BLKSZ (data))
|
||||
* (GRUB_MINIX_ZONESZ / GRUB_MINIX_INODE_BLKSZ (data)))
|
||||
{
|
||||
indir = grub_get_indir (GRUB_MINIX_INODE_DINDIR_ZONE (data),
|
||||
indir = grub_get_indir (GRUB_MINIX_INODE_DINDIR_ZONE (data),
|
||||
blk / GRUB_MINIX_ZONESZ);
|
||||
|
||||
|
||||
indir = grub_get_indir (indir, blk % GRUB_MINIX_ZONESZ);
|
||||
|
||||
|
||||
return indir;
|
||||
}
|
||||
|
||||
|
||||
/* This should never happen. */
|
||||
grub_error (GRUB_ERR_OUT_OF_RANGE, "file bigger than maximum size");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -197,46 +197,46 @@ grub_minix_read_file (struct grub_minix_data *data,
|
|||
len = GRUB_MINIX_INODE_SIZE (data);
|
||||
|
||||
blockcnt = (len + pos + GRUB_MINIX_BSIZE - 1) / GRUB_MINIX_BSIZE;
|
||||
|
||||
|
||||
for (i = pos / GRUB_MINIX_BSIZE; i < blockcnt; i++)
|
||||
{
|
||||
int blknr;
|
||||
int blockoff = pos % GRUB_MINIX_BSIZE;
|
||||
int blockend = GRUB_MINIX_BSIZE;
|
||||
|
||||
|
||||
int skipfirst = 0;
|
||||
|
||||
|
||||
blknr = grub_minix_get_file_block (data, i);
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
||||
|
||||
/* Last block. */
|
||||
if (i == blockcnt - 1)
|
||||
{
|
||||
blockend = (len + pos) % GRUB_MINIX_BSIZE;
|
||||
|
||||
|
||||
if (!blockend)
|
||||
blockend = GRUB_MINIX_BSIZE;
|
||||
}
|
||||
|
||||
|
||||
/* First block. */
|
||||
if (i == (pos / (int) GRUB_MINIX_BSIZE))
|
||||
{
|
||||
skipfirst = blockoff;
|
||||
blockend -= skipfirst;
|
||||
}
|
||||
|
||||
|
||||
data->disk->read_hook = read_hook;
|
||||
grub_disk_read (data->disk, blknr << GRUB_MINIX_LOG2_ZONESZ,
|
||||
skipfirst, blockend, buf);
|
||||
|
||||
|
||||
data->disk->read_hook = 0;
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
||||
|
||||
buf += GRUB_MINIX_BSIZE - skipfirst;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -254,33 +254,33 @@ grub_minix_read_inode (struct grub_minix_data *data, int ino)
|
|||
|
||||
/* The first inode in minix is inode 1. */
|
||||
ino--;
|
||||
|
||||
|
||||
block = ((2 + grub_le_to_cpu16 (sblock->inode_bmap_size)
|
||||
+ grub_le_to_cpu16 (sblock->zone_bmap_size))
|
||||
<< GRUB_MINIX_LOG2_BSIZE);
|
||||
|
||||
|
||||
if (data->version == 1)
|
||||
{
|
||||
block += ino / (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix_inode));
|
||||
int offs = (ino % (GRUB_DISK_SECTOR_SIZE
|
||||
int offs = (ino % (GRUB_DISK_SECTOR_SIZE
|
||||
/ sizeof (struct grub_minix_inode))
|
||||
* sizeof (struct grub_minix_inode));
|
||||
|
||||
|
||||
grub_disk_read (data->disk, block, offs,
|
||||
sizeof (struct grub_minix_inode), &data->inode);
|
||||
}
|
||||
else
|
||||
{
|
||||
block += ino / (GRUB_DISK_SECTOR_SIZE
|
||||
block += ino / (GRUB_DISK_SECTOR_SIZE
|
||||
/ sizeof (struct grub_minix2_inode));
|
||||
int offs = (ino
|
||||
int offs = (ino
|
||||
% (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix2_inode))
|
||||
* sizeof (struct grub_minix2_inode));
|
||||
|
||||
|
||||
grub_disk_read (data->disk, block, offs,
|
||||
sizeof (struct grub_minix2_inode),&data->inode2);
|
||||
}
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -291,28 +291,28 @@ static grub_err_t
|
|||
grub_minix_lookup_symlink (struct grub_minix_data *data, int ino)
|
||||
{
|
||||
char symlink[GRUB_MINIX_INODE_SIZE (data) + 1];
|
||||
|
||||
|
||||
if (++data->linknest > GRUB_MINIX_MAX_SYMLNK_CNT)
|
||||
return grub_error (GRUB_ERR_SYMLINK_LOOP, "too deep nesting of symlinks");
|
||||
|
||||
|
||||
if (grub_minix_read_file (data, 0, 0,
|
||||
GRUB_MINIX_INODE_SIZE (data), symlink) < 0)
|
||||
return grub_errno;
|
||||
|
||||
symlink[GRUB_MINIX_INODE_SIZE (data)] = '\0';
|
||||
|
||||
|
||||
/* The symlink is an absolute path, go back to the root inode. */
|
||||
if (symlink[0] == '/')
|
||||
ino = GRUB_MINIX_ROOT_INODE;
|
||||
|
||||
|
||||
/* Now load in the old inode. */
|
||||
if (grub_minix_read_inode (data, ino))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
grub_minix_find_file (data, symlink);
|
||||
if (grub_errno)
|
||||
grub_error (grub_errno, "Can not follow symlink `%s'.", symlink);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -327,9 +327,9 @@ grub_minix_find_file (struct grub_minix_data *data, const char *path)
|
|||
char *next;
|
||||
unsigned int pos = 0;
|
||||
int dirino;
|
||||
|
||||
|
||||
grub_strcpy (fpath, path);
|
||||
|
||||
|
||||
/* Skip the first slash. */
|
||||
if (name[0] == '/')
|
||||
{
|
||||
|
@ -345,15 +345,15 @@ grub_minix_find_file (struct grub_minix_data *data, const char *path)
|
|||
next[0] = '\0';
|
||||
next++;
|
||||
}
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
grub_uint16_t ino;
|
||||
char filename[data->filename_size + 1];
|
||||
|
||||
|
||||
if (grub_strlen (name) == 0)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
|
||||
if (grub_minix_read_file (data, 0, pos, sizeof (ino),
|
||||
(char *) &ino) < 0)
|
||||
return grub_errno;
|
||||
|
@ -362,28 +362,28 @@ grub_minix_find_file (struct grub_minix_data *data, const char *path)
|
|||
return grub_errno;
|
||||
|
||||
filename[data->filename_size] = '\0';
|
||||
|
||||
|
||||
/* Check if the current direntry matches the current part of the
|
||||
pathname. */
|
||||
if (!grub_strcmp (name, filename))
|
||||
{
|
||||
dirino = data->ino;
|
||||
grub_minix_read_inode (data, grub_le_to_cpu16 (ino));
|
||||
|
||||
|
||||
/* Follow the symlink. */
|
||||
if ((GRUB_MINIX_INODE_MODE (data)
|
||||
if ((GRUB_MINIX_INODE_MODE (data)
|
||||
& GRUB_MINIX_IFLNK) == GRUB_MINIX_IFLNK)
|
||||
{
|
||||
grub_minix_lookup_symlink (data, dirino);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
if (!next)
|
||||
return 0;
|
||||
|
||||
|
||||
pos = 0;
|
||||
|
||||
|
||||
name = next;
|
||||
next = grub_strchr (name, '/');
|
||||
if (next)
|
||||
|
@ -391,17 +391,17 @@ grub_minix_find_file (struct grub_minix_data *data, const char *path)
|
|||
next[0] = '\0';
|
||||
next++;
|
||||
}
|
||||
|
||||
|
||||
if ((GRUB_MINIX_INODE_MODE (data)
|
||||
& GRUB_MINIX_IFDIR) != GRUB_MINIX_IFDIR)
|
||||
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
pos += sizeof (ino) + data->filename_size;
|
||||
} while (pos < GRUB_MINIX_INODE_SIZE (data));
|
||||
|
||||
|
||||
grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
|
||||
return grub_errno;
|
||||
}
|
||||
|
@ -412,11 +412,11 @@ static struct grub_minix_data *
|
|||
grub_minix_mount (grub_disk_t disk)
|
||||
{
|
||||
struct grub_minix_data *data;
|
||||
|
||||
|
||||
data = grub_malloc (sizeof (struct grub_minix_data));
|
||||
if (!data)
|
||||
return 0;
|
||||
|
||||
|
||||
/* Read the superblock. */
|
||||
grub_disk_read (disk, GRUB_MINIX_SBLOCK, 0,
|
||||
sizeof (struct grub_minix_sblock),&data->sblock);
|
||||
|
@ -458,34 +458,34 @@ grub_minix_mount (grub_disk_t disk)
|
|||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_minix_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_minix_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_minix_data *data = 0;
|
||||
struct grub_minix_sblock *sblock;
|
||||
unsigned int pos = 0;
|
||||
|
||||
|
||||
data = grub_minix_mount (device->disk);
|
||||
if (!data)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
grub_minix_read_inode (data, GRUB_MINIX_ROOT_INODE);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
sblock = &data->sblock;
|
||||
|
||||
grub_minix_find_file (data, path);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
if ((GRUB_MINIX_INODE_MODE (data) & GRUB_MINIX_IFDIR) != GRUB_MINIX_IFDIR)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
while (pos < GRUB_MINIX_INODE_SIZE (data))
|
||||
{
|
||||
grub_uint16_t ino;
|
||||
|
@ -494,31 +494,31 @@ grub_minix_dir (grub_device_t device, const char *path,
|
|||
struct grub_dirhook_info info;
|
||||
grub_memset (&info, 0, sizeof (info));
|
||||
|
||||
|
||||
|
||||
if (grub_minix_read_file (data, 0, pos, sizeof (ino),
|
||||
(char *) &ino) < 0)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
if (grub_minix_read_file (data, 0, pos + sizeof (ino),
|
||||
data->filename_size,
|
||||
(char *) filename) < 0)
|
||||
return grub_errno;
|
||||
filename[data->filename_size] = '\0';
|
||||
|
||||
|
||||
/* The filetype is not stored in the dirent. Read the inode to
|
||||
find out the filetype. This *REALLY* sucks. */
|
||||
grub_minix_read_inode (data, grub_le_to_cpu16 (ino));
|
||||
info.dir = ((GRUB_MINIX_INODE_MODE (data)
|
||||
info.dir = ((GRUB_MINIX_INODE_MODE (data)
|
||||
& GRUB_MINIX_IFDIR) == GRUB_MINIX_IFDIR);
|
||||
if (hook (filename, &info) ? 1 : 0)
|
||||
break;
|
||||
|
||||
|
||||
/* Load the old inode back in. */
|
||||
grub_minix_read_inode (data, dirino);
|
||||
|
||||
pos += sizeof (ino) + data->filename_size;
|
||||
}
|
||||
|
||||
|
||||
fail:
|
||||
grub_free (data);
|
||||
return grub_errno;
|
||||
|
@ -541,13 +541,13 @@ grub_minix_open (struct grub_file *file, const char *name)
|
|||
grub_free (data);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
if (!name || name[0] != '/')
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILENAME, "bad filename");
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
/* Traverse the directory tree to the node that should be
|
||||
opened. */
|
||||
grub_minix_find_file (data, name);
|
||||
|
@ -556,10 +556,10 @@ grub_minix_open (struct grub_file *file, const char *name)
|
|||
grub_free (data);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
file->data = data;
|
||||
file->size = GRUB_MINIX_INODE_SIZE (data);
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -567,9 +567,9 @@ grub_minix_open (struct grub_file *file, const char *name)
|
|||
static grub_ssize_t
|
||||
grub_minix_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_minix_data *data =
|
||||
struct grub_minix_data *data =
|
||||
(struct grub_minix_data *) file->data;
|
||||
|
||||
|
||||
return grub_minix_read_file (data, file->read_hook, file->offset, len, buf);
|
||||
}
|
||||
|
||||
|
@ -578,7 +578,7 @@ static grub_err_t
|
|||
grub_minix_close (grub_file_t file)
|
||||
{
|
||||
grub_free (file->data);
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
|
|
@ -862,7 +862,7 @@ fail:
|
|||
|
||||
static grub_err_t
|
||||
grub_ntfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_ntfs_data *data = 0;
|
||||
|
|
|
@ -319,7 +319,7 @@ grub_reiserfs_print_key (const struct grub_reiserfs_key *key)
|
|||
"any ",
|
||||
"unknown "
|
||||
};
|
||||
|
||||
|
||||
for (a = 0; a < sizeof (struct grub_reiserfs_key); a++)
|
||||
grub_printf ("%02x ", ((unsigned int) ((unsigned char *) key)[a]) & 0xFF);
|
||||
grub_printf ("parent id = 0x%08x, self id = 0x%08x, type = %s, offset = ",
|
||||
|
@ -376,7 +376,7 @@ grub_reiserfs_set_key_type (struct grub_reiserfs_key *key,
|
|||
int version)
|
||||
{
|
||||
grub_uint32_t type;
|
||||
|
||||
|
||||
switch (grub_type)
|
||||
{
|
||||
case GRUB_REISERFS_STAT:
|
||||
|
@ -397,14 +397,14 @@ grub_reiserfs_set_key_type (struct grub_reiserfs_key *key,
|
|||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (version == 1)
|
||||
key->u.v1.type = grub_cpu_to_le32 (type);
|
||||
else
|
||||
key->u.v2.offset_type
|
||||
= ((key->u.v2.offset_type & grub_cpu_to_le64 (~0ULL >> 4))
|
||||
| grub_cpu_to_le64 ((grub_uint64_t) type << 60));
|
||||
|
||||
|
||||
assert (grub_reiserfs_get_key_type (key) == grub_type);
|
||||
}
|
||||
|
||||
|
@ -418,31 +418,31 @@ grub_reiserfs_compare_keys (const struct grub_reiserfs_key *key1,
|
|||
grub_uint64_t offset1, offset2;
|
||||
enum grub_reiserfs_item_type type1, type2;
|
||||
grub_uint32_t id1, id2;
|
||||
|
||||
|
||||
if (! key1 || ! key2)
|
||||
return -2;
|
||||
|
||||
|
||||
id1 = grub_le_to_cpu32 (key1->directory_id);
|
||||
id2 = grub_le_to_cpu32 (key2->directory_id);
|
||||
if (id1 < id2)
|
||||
return -1;
|
||||
if (id1 > id2)
|
||||
return 1;
|
||||
|
||||
|
||||
id1 = grub_le_to_cpu32 (key1->object_id);
|
||||
id2 = grub_le_to_cpu32 (key2->object_id);
|
||||
if (id1 < id2)
|
||||
return -1;
|
||||
if (id1 > id2)
|
||||
return 1;
|
||||
|
||||
|
||||
offset1 = grub_reiserfs_get_key_offset (key1);
|
||||
offset2 = grub_reiserfs_get_key_offset (key2);
|
||||
if (offset1 < offset2)
|
||||
return -1;
|
||||
if (offset1 > offset2)
|
||||
return 1;
|
||||
|
||||
|
||||
type1 = grub_reiserfs_get_key_type (key1);
|
||||
type2 = grub_reiserfs_get_key_type (key2);
|
||||
if ((type1 == GRUB_REISERFS_ANY
|
||||
|
@ -456,7 +456,7 @@ grub_reiserfs_compare_keys (const struct grub_reiserfs_key *key1,
|
|||
return -1;
|
||||
if (type1 > type2)
|
||||
return 1;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -474,7 +474,7 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data,
|
|||
grub_uint16_t i;
|
||||
grub_uint16_t previous_level = ~0;
|
||||
struct grub_reiserfs_item_header *item_headers = 0;
|
||||
|
||||
|
||||
if (! data)
|
||||
{
|
||||
grub_error (GRUB_ERR_TEST_FAILURE, "data is NULL");
|
||||
|
@ -492,7 +492,7 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data,
|
|||
grub_error (GRUB_ERR_TEST_FAILURE, "item is NULL");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
block_size = grub_le_to_cpu16 (data->superblock.block_size);
|
||||
block_number = grub_le_to_cpu32 (data->superblock.root_block);
|
||||
#ifdef GRUB_REISERFS_DEBUG
|
||||
|
@ -502,7 +502,7 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data,
|
|||
block_header = grub_malloc (block_size);
|
||||
if (! block_header)
|
||||
goto fail;
|
||||
|
||||
|
||||
item->next_offset = 0;
|
||||
do
|
||||
{
|
||||
|
@ -534,7 +534,7 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data,
|
|||
struct grub_reiserfs_disk_child *children
|
||||
= ((struct grub_reiserfs_disk_child *)
|
||||
(keys + item_count));
|
||||
|
||||
|
||||
for (i = 0;
|
||||
i < item_count
|
||||
&& grub_reiserfs_compare_keys (key, &(keys[i])) >= 0;
|
||||
|
@ -620,7 +620,7 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data,
|
|||
grub_reiserfs_print_key (block_key);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
assert (grub_errno == GRUB_ERR_NONE);
|
||||
grub_free (block_header);
|
||||
return GRUB_ERR_NONE;
|
||||
|
@ -740,7 +740,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
|||
struct grub_fshelp_node directory_item;
|
||||
grub_uint16_t entry_count, entry_number;
|
||||
struct grub_reiserfs_item_header *item_headers;
|
||||
|
||||
|
||||
grub_disk_read (data->disk,
|
||||
block_number * (block_size >> GRUB_DISK_SECTOR_BITS),
|
||||
(((grub_off_t) block_number * block_size)
|
||||
|
@ -758,7 +758,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
|||
goto fail;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
item_headers = (struct grub_reiserfs_item_header *) (block_header + 1);
|
||||
directory_headers
|
||||
= ((struct grub_reiserfs_directory_header *)
|
||||
|
@ -772,7 +772,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
|||
= &directory_headers[entry_number];
|
||||
grub_uint16_t entry_state
|
||||
= grub_le_to_cpu16 (directory_header->state);
|
||||
|
||||
|
||||
if (entry_state & GRUB_REISERFS_VISIBLE_MASK)
|
||||
{
|
||||
grub_fshelp_node_t entry_item;
|
||||
|
@ -792,14 +792,14 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
|||
entry_item = grub_malloc (sizeof (*entry_item));
|
||||
if (! entry_item)
|
||||
goto fail;
|
||||
|
||||
|
||||
if (grub_reiserfs_get_item (data, &entry_key, entry_item)
|
||||
!= GRUB_ERR_NONE)
|
||||
{
|
||||
grub_free (entry_item);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
if (entry_item->type == GRUB_REISERFS_DIRECTORY)
|
||||
entry_type = GRUB_FSHELP_DIR;
|
||||
else
|
||||
|
@ -945,7 +945,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
|||
the current one. */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (next_offset == 0)
|
||||
break;
|
||||
|
||||
|
@ -1096,7 +1096,7 @@ grub_reiserfs_read (grub_file_t file, char *buf, grub_size_t len)
|
|||
while (current_position < final_position)
|
||||
{
|
||||
grub_reiserfs_set_key_offset (&key, current_key_offset);
|
||||
|
||||
|
||||
if (grub_reiserfs_get_item (data, &key, &found) != GRUB_ERR_NONE)
|
||||
goto fail;
|
||||
if (found.block_number == 0)
|
||||
|
@ -1186,7 +1186,7 @@ grub_reiserfs_read (grub_file_t file, char *buf, grub_size_t len)
|
|||
}
|
||||
current_key_offset = current_position + 1;
|
||||
}
|
||||
|
||||
|
||||
grub_dprintf ("reiserfs",
|
||||
"Have successfully read %lld bytes (%ld requested)\n",
|
||||
(unsigned long long) (current_position - initial_position),
|
||||
|
@ -1258,7 +1258,7 @@ grub_reiserfs_close (grub_file_t file)
|
|||
/* Call HOOK with each file under DIR. */
|
||||
static grub_err_t
|
||||
grub_reiserfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_reiserfs_data *data = 0;
|
||||
|
|
24
fs/sfs.c
24
fs/sfs.c
|
@ -194,7 +194,7 @@ grub_sfs_read_extent (struct grub_sfs_data *data, unsigned int block,
|
|||
/* We found a correct leaf. */
|
||||
*size = grub_be_to_cpu16 (extent->size);
|
||||
*nextext = grub_be_to_cpu32 (extent->next);
|
||||
|
||||
|
||||
grub_free (treeblock);
|
||||
return 0;
|
||||
}
|
||||
|
@ -370,7 +370,7 @@ grub_sfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
node->data = data;
|
||||
node->size = size;
|
||||
node->block = block;
|
||||
|
||||
|
||||
return hook (name, type, node);
|
||||
}
|
||||
|
||||
|
@ -451,18 +451,18 @@ grub_sfs_open (struct grub_file *file, const char *name)
|
|||
{
|
||||
struct grub_sfs_data *data;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_sfs_mount (file->device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (name, &data->diropen, &fdiro, grub_sfs_iterate_dir,
|
||||
grub_sfs_read_symlink, GRUB_FSHELP_REG);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
file->size = fdiro->size;
|
||||
data->diropen = *fdiro;
|
||||
grub_free (fdiro);
|
||||
|
@ -478,7 +478,7 @@ grub_sfs_open (struct grub_file *file, const char *name)
|
|||
if (data)
|
||||
grub_free (data->label);
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
return grub_errno;
|
||||
|
@ -510,13 +510,13 @@ grub_sfs_read (grub_file_t file, char *buf, grub_size_t len)
|
|||
|
||||
|
||||
static grub_err_t
|
||||
grub_sfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_sfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_sfs_data *data = 0;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
auto int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node);
|
||||
|
@ -533,7 +533,7 @@ grub_sfs_dir (grub_device_t device, const char *path,
|
|||
}
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_sfs_mount (device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
@ -544,7 +544,7 @@ grub_sfs_dir (grub_device_t device, const char *path,
|
|||
goto fail;
|
||||
|
||||
grub_sfs_iterate_dir (fdiro, iterate);
|
||||
|
||||
|
||||
fail:
|
||||
if (data && fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
|
|
2
fs/udf.c
2
fs/udf.c
|
@ -766,7 +766,7 @@ grub_udf_iterate_dir (grub_fshelp_node_t dir,
|
|||
|
||||
static grub_err_t
|
||||
grub_udf_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_udf_data *data = 0;
|
||||
|
|
154
fs/ufs.c
154
fs/ufs.c
|
@ -71,30 +71,30 @@ struct grub_ufs_sblock
|
|||
grub_uint8_t unused[16];
|
||||
/* The offset of the inodes in the cylinder group. */
|
||||
grub_uint32_t inoblk_offs;
|
||||
|
||||
|
||||
grub_uint8_t unused2[4];
|
||||
|
||||
|
||||
/* The start of the cylinder group. */
|
||||
grub_uint32_t cylg_offset;
|
||||
grub_uint8_t unused3[4];
|
||||
|
||||
grub_uint32_t mtime;
|
||||
grub_uint8_t unused4[12];
|
||||
|
||||
|
||||
/* The size of a block in bytes. */
|
||||
grub_int32_t bsize;
|
||||
grub_uint8_t unused5[48];
|
||||
|
||||
|
||||
/* The size of filesystem blocks to disk blocks. */
|
||||
grub_uint32_t log2_blksz;
|
||||
grub_uint8_t unused6[80];
|
||||
|
||||
|
||||
/* Inodes stored per cylinder group. */
|
||||
grub_uint32_t ino_per_group;
|
||||
|
||||
|
||||
/* The frags per cylinder group. */
|
||||
grub_uint32_t frags_per_group;
|
||||
|
||||
|
||||
grub_uint8_t unused7[488];
|
||||
|
||||
/* Volume name for UFS2. */
|
||||
|
@ -103,7 +103,7 @@ struct grub_ufs_sblock
|
|||
|
||||
grub_uint64_t mtime2;
|
||||
grub_uint8_t unused9[420];
|
||||
|
||||
|
||||
/* Magic value to check if this is really a UFS filesystem. */
|
||||
grub_uint32_t magic;
|
||||
};
|
||||
|
@ -182,7 +182,7 @@ struct grub_ufs_dirent
|
|||
struct
|
||||
{
|
||||
grub_uint8_t filetype_bsd;
|
||||
grub_uint8_t namelen_bsd;
|
||||
grub_uint8_t namelen_bsd;
|
||||
};
|
||||
};
|
||||
} __attribute__ ((packed));
|
||||
|
@ -219,16 +219,16 @@ grub_ufs_get_file_block (struct grub_ufs_data *data, unsigned int blk)
|
|||
{
|
||||
struct grub_ufs_sblock *sblock = &data->sblock;
|
||||
unsigned int indirsz;
|
||||
int log2_blksz;
|
||||
|
||||
int log2_blksz;
|
||||
|
||||
/* Direct. */
|
||||
if (blk < GRUB_UFS_DIRBLKS)
|
||||
return INODE_DIRBLOCKS (data, blk);
|
||||
|
||||
|
||||
log2_blksz = grub_le_to_cpu32 (data->sblock.log2_blksz);
|
||||
|
||||
|
||||
blk -= GRUB_UFS_DIRBLKS;
|
||||
|
||||
|
||||
indirsz = UFS_BLKSZ (sblock) / INODE_BLKSZ (data);
|
||||
/* Single indirect block. */
|
||||
if (blk < indirsz)
|
||||
|
@ -239,20 +239,20 @@ grub_ufs_get_file_block (struct grub_ufs_data *data, unsigned int blk)
|
|||
return (data->ufs_type == UFS1) ? indir[blk] : indir[blk << 1];
|
||||
}
|
||||
blk -= indirsz;
|
||||
|
||||
|
||||
/* Double indirect block. */
|
||||
if (blk < indirsz * indirsz)
|
||||
{
|
||||
grub_uint32_t indir[UFS_BLKSZ (sblock) >> 2];
|
||||
|
||||
|
||||
grub_disk_read (data->disk, INODE_INDIRBLOCKS (data, 1) << log2_blksz,
|
||||
0, sizeof (indir), indir);
|
||||
grub_disk_read (data->disk,
|
||||
((data->ufs_type == UFS1) ?
|
||||
indir[blk / indirsz] : indir [(blk / indirsz) << 1])
|
||||
indir[blk / indirsz] : indir [(blk / indirsz) << 1])
|
||||
<< log2_blksz,
|
||||
0, sizeof (indir), indir);
|
||||
|
||||
|
||||
return (data->ufs_type == UFS1) ?
|
||||
indir[blk % indirsz] : indir[(blk % indirsz) << 1];
|
||||
}
|
||||
|
@ -281,35 +281,35 @@ grub_ufs_read_file (struct grub_ufs_data *data,
|
|||
len = INODE_SIZE (data);
|
||||
|
||||
blockcnt = (len + pos + UFS_BLKSZ (sblock) - 1) / UFS_BLKSZ (sblock);
|
||||
|
||||
|
||||
for (i = pos / UFS_BLKSZ (sblock); i < blockcnt; i++)
|
||||
{
|
||||
int blknr;
|
||||
int blockoff = pos % UFS_BLKSZ (sblock);
|
||||
int blockend = UFS_BLKSZ (sblock);
|
||||
|
||||
|
||||
int skipfirst = 0;
|
||||
|
||||
|
||||
blknr = grub_ufs_get_file_block (data, i);
|
||||
if (grub_errno)
|
||||
return -1;
|
||||
|
||||
|
||||
/* Last block. */
|
||||
if (i == blockcnt - 1)
|
||||
{
|
||||
blockend = (len + pos) % UFS_BLKSZ (sblock);
|
||||
|
||||
|
||||
if (!blockend)
|
||||
blockend = UFS_BLKSZ (sblock);
|
||||
}
|
||||
|
||||
|
||||
/* First block. */
|
||||
if (i == (pos / (int) UFS_BLKSZ (sblock)))
|
||||
{
|
||||
skipfirst = blockoff;
|
||||
blockend -= skipfirst;
|
||||
}
|
||||
|
||||
|
||||
/* XXX: If the block number is 0 this block is not stored on
|
||||
disk but is zero filled instead. */
|
||||
if (blknr)
|
||||
|
@ -327,7 +327,7 @@ grub_ufs_read_file (struct grub_ufs_data *data,
|
|||
|
||||
buf += UFS_BLKSZ (sblock) - skipfirst;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -338,16 +338,16 @@ static grub_err_t
|
|||
grub_ufs_read_inode (struct grub_ufs_data *data, int ino, char *inode)
|
||||
{
|
||||
struct grub_ufs_sblock *sblock = &data->sblock;
|
||||
|
||||
|
||||
/* Determine the group the inode is in. */
|
||||
int group = ino / grub_le_to_cpu32 (sblock->ino_per_group);
|
||||
|
||||
|
||||
/* Determine the inode within the group. */
|
||||
int grpino = ino % grub_le_to_cpu32 (sblock->ino_per_group);
|
||||
|
||||
|
||||
/* The first block of the group. */
|
||||
int grpblk = group * (grub_le_to_cpu32 (sblock->frags_per_group));
|
||||
|
||||
|
||||
if (data->ufs_type == UFS1)
|
||||
{
|
||||
if (!inode)
|
||||
|
@ -380,7 +380,7 @@ grub_ufs_read_inode (struct grub_ufs_data *data, int ino, char *inode)
|
|||
sizeof (struct grub_ufs2_inode),
|
||||
inode);
|
||||
}
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -391,16 +391,16 @@ static grub_err_t
|
|||
grub_ufs_lookup_symlink (struct grub_ufs_data *data, int ino)
|
||||
{
|
||||
char symlink[INODE_SIZE (data)];
|
||||
|
||||
|
||||
if (++data->linknest > GRUB_UFS_MAX_SYMLNK_CNT)
|
||||
return grub_error (GRUB_ERR_SYMLINK_LOOP, "too deep nesting of symlinks");
|
||||
|
||||
|
||||
if (INODE_NBLOCKS (data) == 0)
|
||||
grub_strcpy (symlink, (char *) INODE (data, symlink));
|
||||
else
|
||||
{
|
||||
grub_disk_read (data->disk,
|
||||
(INODE_DIRBLOCKS (data, 0)
|
||||
grub_disk_read (data->disk,
|
||||
(INODE_DIRBLOCKS (data, 0)
|
||||
<< grub_le_to_cpu32 (data->sblock.log2_blksz)),
|
||||
0, INODE_SIZE (data), symlink);
|
||||
symlink[INODE_SIZE (data)] = '\0';
|
||||
|
@ -409,15 +409,15 @@ grub_ufs_lookup_symlink (struct grub_ufs_data *data, int ino)
|
|||
/* The symlink is an absolute path, go back to the root inode. */
|
||||
if (symlink[0] == '/')
|
||||
ino = GRUB_UFS_INODE;
|
||||
|
||||
|
||||
/* Now load in the old inode. */
|
||||
if (grub_ufs_read_inode (data, ino, 0))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
grub_ufs_find_file (data, symlink);
|
||||
if (grub_errno)
|
||||
grub_error (grub_errno, "Can not follow symlink `%s'.", symlink);
|
||||
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
@ -432,9 +432,9 @@ grub_ufs_find_file (struct grub_ufs_data *data, const char *path)
|
|||
char *next;
|
||||
unsigned int pos = 0;
|
||||
int dirino;
|
||||
|
||||
|
||||
grub_strcpy (fpath, path);
|
||||
|
||||
|
||||
/* Skip the first slash. */
|
||||
if (name[0] == '/')
|
||||
{
|
||||
|
@ -450,31 +450,31 @@ grub_ufs_find_file (struct grub_ufs_data *data, const char *path)
|
|||
next[0] = '\0';
|
||||
next++;
|
||||
}
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
struct grub_ufs_dirent dirent;
|
||||
int namelen;
|
||||
|
||||
|
||||
if (grub_strlen (name) == 0)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
|
||||
if (grub_ufs_read_file (data, 0, pos, sizeof (dirent),
|
||||
(char *) &dirent) < 0)
|
||||
return grub_errno;
|
||||
|
||||
namelen = (data->ufs_type == UFS2)
|
||||
? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
|
||||
|
||||
|
||||
{
|
||||
char filename[namelen + 1];
|
||||
|
||||
if (grub_ufs_read_file (data, 0, pos + sizeof (dirent),
|
||||
namelen, filename) < 0)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
filename[namelen] = '\0';
|
||||
|
||||
|
||||
if (!grub_strcmp (name, filename))
|
||||
{
|
||||
dirino = data->ino;
|
||||
|
@ -500,17 +500,17 @@ grub_ufs_find_file (struct grub_ufs_data *data, const char *path)
|
|||
next[0] = '\0';
|
||||
next++;
|
||||
}
|
||||
|
||||
|
||||
if ((INODE_MODE(data) & GRUB_UFS_ATTR_TYPE) != GRUB_UFS_ATTR_DIR)
|
||||
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pos += grub_le_to_cpu16 (dirent.direntlen);
|
||||
} while (pos < INODE_SIZE (data));
|
||||
|
||||
|
||||
grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
|
||||
return grub_errno;
|
||||
}
|
||||
|
@ -522,11 +522,11 @@ grub_ufs_mount (grub_disk_t disk)
|
|||
{
|
||||
struct grub_ufs_data *data;
|
||||
int *sblklist = sblocklist;
|
||||
|
||||
|
||||
data = grub_malloc (sizeof (struct grub_ufs_data));
|
||||
if (!data)
|
||||
return 0;
|
||||
|
||||
|
||||
/* Find a UFS1 or UFS2 sblock. */
|
||||
data->ufs_type = UNKNOWN;
|
||||
while (*sblklist != -1)
|
||||
|
@ -535,7 +535,7 @@ grub_ufs_mount (grub_disk_t disk)
|
|||
&data->sblock);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
if (grub_le_to_cpu32 (data->sblock.magic) == GRUB_UFS_MAGIC)
|
||||
{
|
||||
data->ufs_type = UFS1;
|
||||
|
@ -560,17 +560,17 @@ grub_ufs_mount (grub_disk_t disk)
|
|||
|
||||
fail:
|
||||
grub_free (data);
|
||||
|
||||
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
|
||||
grub_error (GRUB_ERR_BAD_FS, "not a ufs filesystem");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static grub_err_t
|
||||
grub_ufs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_ufs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_ufs_data *data;
|
||||
|
@ -580,50 +580,50 @@ grub_ufs_dir (grub_device_t device, const char *path,
|
|||
data = grub_ufs_mount (device->disk);
|
||||
if (!data)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
grub_ufs_read_inode (data, GRUB_UFS_INODE, 0);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
sblock = &data->sblock;
|
||||
|
||||
|
||||
if (!path || path[0] != '/')
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILENAME, "bad filename");
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
grub_ufs_find_file (data, path);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
goto fail;
|
||||
|
||||
if ((INODE_MODE (data) & GRUB_UFS_ATTR_TYPE) != GRUB_UFS_ATTR_DIR)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
while (pos < INODE_SIZE (data))
|
||||
{
|
||||
struct grub_ufs_dirent dirent;
|
||||
int namelen;
|
||||
|
||||
|
||||
if (grub_ufs_read_file (data, 0, pos, sizeof (dirent),
|
||||
(char *) &dirent) < 0)
|
||||
break;
|
||||
|
||||
namelen = (data->ufs_type == UFS2)
|
||||
? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
|
||||
|
||||
|
||||
{
|
||||
char filename[namelen + 1];
|
||||
struct grub_dirhook_info info;
|
||||
grub_memset (&info, 0, sizeof (info));
|
||||
|
||||
|
||||
if (grub_ufs_read_file (data, 0, pos + sizeof (dirent),
|
||||
namelen, filename) < 0)
|
||||
break;
|
||||
|
||||
|
||||
filename[namelen] = '\0';
|
||||
if (data->ufs_type == UFS1)
|
||||
{
|
||||
|
@ -647,7 +647,7 @@ grub_ufs_dir (grub_device_t device, const char *path,
|
|||
if (hook (filename, &info))
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
pos += grub_le_to_cpu16 (dirent.direntlen);
|
||||
}
|
||||
|
||||
|
@ -666,27 +666,27 @@ grub_ufs_open (struct grub_file *file, const char *name)
|
|||
data = grub_ufs_mount (file->device->disk);
|
||||
if (!data)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
grub_ufs_read_inode (data, 2, 0);
|
||||
if (grub_errno)
|
||||
{
|
||||
grub_free (data);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
if (!name || name[0] != '/')
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FILENAME, "bad filename");
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
grub_ufs_find_file (data, name);
|
||||
if (grub_errno)
|
||||
{
|
||||
grub_free (data);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
file->data = data;
|
||||
file->size = INODE_SIZE (data);
|
||||
|
||||
|
@ -697,9 +697,9 @@ grub_ufs_open (struct grub_file *file, const char *name)
|
|||
static grub_ssize_t
|
||||
grub_ufs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_ufs_data *data =
|
||||
struct grub_ufs_data *data =
|
||||
(struct grub_ufs_data *) file->data;
|
||||
|
||||
|
||||
return grub_ufs_read_file (data, file->read_hook, file->offset, len, buf);
|
||||
}
|
||||
|
||||
|
@ -708,7 +708,7 @@ static grub_err_t
|
|||
grub_ufs_close (grub_file_t file)
|
||||
{
|
||||
grub_free (file->data);
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -737,7 +737,7 @@ grub_ufs_label (grub_device_t device, char **label)
|
|||
}
|
||||
|
||||
/* Get mtime. */
|
||||
static grub_err_t
|
||||
static grub_err_t
|
||||
grub_ufs_mtime (grub_device_t device, grub_int32_t *tm)
|
||||
{
|
||||
struct grub_ufs_data *data = 0;
|
||||
|
|
46
fs/xfs.c
46
fs/xfs.c
|
@ -42,7 +42,7 @@ struct grub_xfs_sblock
|
|||
grub_uint8_t unused2[8];
|
||||
grub_uint64_t rootino;
|
||||
grub_uint8_t unused3[20];
|
||||
grub_uint32_t agsize;
|
||||
grub_uint32_t agsize;
|
||||
grub_uint8_t unused4[20];
|
||||
grub_uint8_t label[12];
|
||||
grub_uint8_t log2_bsize;
|
||||
|
@ -395,7 +395,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
{
|
||||
struct grub_fshelp_node *diro = (struct grub_fshelp_node *) dir;
|
||||
auto int NESTED_FUNC_ATTR call_hook (grub_uint64_t ino, char *filename);
|
||||
|
||||
|
||||
int NESTED_FUNC_ATTR call_hook (grub_uint64_t ino, char *filename)
|
||||
{
|
||||
struct grub_fshelp_node *fdiro;
|
||||
|
@ -403,7 +403,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
fdiro = grub_malloc (sizeof (struct grub_fshelp_node));
|
||||
if (!fdiro)
|
||||
return 0;
|
||||
|
||||
|
||||
/* The inode should be read, otherwise the filetype can
|
||||
not be determined. */
|
||||
fdiro->ino = ino;
|
||||
|
@ -415,7 +415,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
grub_xfs_mode_to_filetype (fdiro->inode.mode),
|
||||
fdiro);
|
||||
}
|
||||
|
||||
|
||||
switch (diro->inode.format)
|
||||
{
|
||||
case XFS_INODE_FORMAT_INO:
|
||||
|
@ -453,7 +453,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
+ sizeof (struct grub_xfs_dir_entry)
|
||||
+ de->len - 1);
|
||||
char name[de->len + 1];
|
||||
|
||||
|
||||
if (smallino)
|
||||
{
|
||||
ino = grub_be_to_cpu32 (*(grub_uint32_t *) inopos);
|
||||
|
@ -467,7 +467,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
if (call_hook (ino, name))
|
||||
return 1;
|
||||
|
||||
de = ((struct grub_xfs_dir_entry *)
|
||||
de = ((struct grub_xfs_dir_entry *)
|
||||
(((char *) de)+ sizeof (struct grub_xfs_dir_entry) + de->len
|
||||
+ ((smallino ? sizeof (grub_uint32_t)
|
||||
: sizeof (grub_uint64_t))) - 1));
|
||||
|
@ -493,7 +493,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
|||
|
||||
/* Iterate over every block the directory has. */
|
||||
for (blk = 0;
|
||||
blk < (grub_be_to_cpu64 (dir->inode.size)
|
||||
blk < (grub_be_to_cpu64 (dir->inode.size)
|
||||
>> dirblk_log2);
|
||||
blk++)
|
||||
{
|
||||
|
@ -585,7 +585,7 @@ grub_xfs_mount (grub_disk_t disk)
|
|||
if (grub_disk_read (disk, 0, 0,
|
||||
sizeof (struct grub_xfs_sblock), &data->sblock))
|
||||
goto fail;
|
||||
|
||||
|
||||
if (grub_strncmp ((char *) (data->sblock.magic), "XFSB", 4))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "not a xfs filesystem");
|
||||
|
@ -606,24 +606,24 @@ grub_xfs_mount (grub_disk_t disk)
|
|||
|
||||
return data;
|
||||
fail:
|
||||
|
||||
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
|
||||
grub_error (GRUB_ERR_BAD_FS, "not an xfs filesystem");
|
||||
|
||||
grub_free (data);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static grub_err_t
|
||||
grub_xfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
grub_xfs_dir (grub_device_t device, const char *path,
|
||||
int (*hook) (const char *filename,
|
||||
const struct grub_dirhook_info *info))
|
||||
{
|
||||
struct grub_xfs_data *data = 0;;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
auto int NESTED_FUNC_ATTR iterate (const char *filename,
|
||||
enum grub_fshelp_filetype filetype,
|
||||
grub_fshelp_node_t node);
|
||||
|
@ -640,18 +640,18 @@ grub_xfs_dir (grub_device_t device, const char *path,
|
|||
}
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_xfs_mount (device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (path, &data->diropen, &fdiro, grub_xfs_iterate_dir,
|
||||
grub_xfs_read_symlink, GRUB_FSHELP_DIR);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
grub_xfs_iterate_dir (fdiro, iterate);
|
||||
|
||||
|
||||
fail:
|
||||
if (fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
|
@ -671,25 +671,25 @@ grub_xfs_open (struct grub_file *file, const char *name)
|
|||
{
|
||||
struct grub_xfs_data *data;
|
||||
struct grub_fshelp_node *fdiro = 0;
|
||||
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
|
||||
data = grub_xfs_mount (file->device->disk);
|
||||
if (!data)
|
||||
goto fail;
|
||||
|
||||
|
||||
grub_fshelp_find_file (name, &data->diropen, &fdiro, grub_xfs_iterate_dir,
|
||||
grub_xfs_read_symlink, GRUB_FSHELP_REG);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
|
||||
|
||||
if (!fdiro->inode_read)
|
||||
{
|
||||
grub_xfs_read_inode (data, fdiro->ino, &fdiro->inode);
|
||||
if (grub_errno)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
grub_memcpy (data->inode,
|
||||
&fdiro->inode,
|
||||
sizeof (struct grub_xfs_inode));
|
||||
|
@ -705,7 +705,7 @@ grub_xfs_open (struct grub_file *file, const char *name)
|
|||
if (fdiro != &data->diropen)
|
||||
grub_free (fdiro);
|
||||
grub_free (data);
|
||||
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
return grub_errno;
|
||||
|
@ -715,7 +715,7 @@ grub_xfs_open (struct grub_file *file, const char *name)
|
|||
static grub_ssize_t
|
||||
grub_xfs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_xfs_data *data =
|
||||
struct grub_xfs_data *data =
|
||||
(struct grub_xfs_data *) file->data;
|
||||
|
||||
return grub_xfs_read_file (&data->diropen, file->read_hook,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue