2004-09-11 Marco Gerards <metgerards@student.han.nl>

* conf/i386-pc.rmk (kernel_img_SOURCES): Added kern/fshelp.c.
	(grub_mkimage_LDFLAGS): Likewise.
	(grub_emu_SOURCES): Likewise.
	(kernel_img_HEADERS): Added fshelp.h.
	* fs/ext2.c: Include <grub/fshelp.h>.
	(FILETYPE_REG): New macro.
	(FILETYPE_INO_REG): Likewise.
	(grub_ext_sblock): Renamed to `grub_ext2_sblock'.
	Changed all users.
	(ext2_block_group): Renamed to `grub_ext2_block_group'.  Changed
	all users.
	(grub_fshelp_node): New struct.
	(grub_ext2_data): Added member `diropen'.  Changed member `inode'
	to a pointer.
	(grub_ext2_get_file_block): Removed function.
	(grub_ext2_read_block): New function.
	(grub_ext2_read_file): Replaced parameter `data' by `node'.
	This function was written.
	(grub_ext2_mount): Read the root inode.  Create a diropen struct.
	(grub_ext2_find_file): Removed function.
	(grub_ext2_read_symlink): New function.
	(grub_ext2_iterate_dir): Likewise.
	(grub_ext2_open): Rewritten.
	(grub_ext2_dir): Rewritten.
	* include/grub/fshelp.h: New file.
	* fs/fshelp.c: Likewise.
This commit is contained in:
marco_g 2004-09-11 11:42:43 +00:00
parent 3c52136a94
commit 2c1f4ce368
8 changed files with 726 additions and 374 deletions

View file

@ -1,3 +1,32 @@
2004-09-11 Marco Gerards <metgerards@student.han.nl>
* conf/i386-pc.rmk (kernel_img_SOURCES): Added kern/fshelp.c.
(grub_mkimage_LDFLAGS): Likewise.
(grub_emu_SOURCES): Likewise.
(kernel_img_HEADERS): Added fshelp.h.
* fs/ext2.c: Include <grub/fshelp.h>.
(FILETYPE_REG): New macro.
(FILETYPE_INO_REG): Likewise.
(grub_ext_sblock): Renamed to `grub_ext2_sblock'.
Changed all users.
(ext2_block_group): Renamed to `grub_ext2_block_group'. Changed
all users.
(grub_fshelp_node): New struct.
(grub_ext2_data): Added member `diropen'. Changed member `inode'
to a pointer.
(grub_ext2_get_file_block): Removed function.
(grub_ext2_read_block): New function.
(grub_ext2_read_file): Replaced parameter `data' by `node'.
This function was written.
(grub_ext2_mount): Read the root inode. Create a diropen struct.
(grub_ext2_find_file): Removed function.
(grub_ext2_read_symlink): New function.
(grub_ext2_iterate_dir): Likewise.
(grub_ext2_open): Rewritten.
(grub_ext2_dir): Rewritten.
* include/grub/fshelp.h: New file.
* fs/fshelp.c: Likewise.
2004-09-10 Yoshinori K. Okuji <okuji@enbug.org> 2004-09-10 Yoshinori K. Okuji <okuji@enbug.org>
* normal/menu.c: Include grub/loader.h and grub/machine/time.h. * normal/menu.c: Include grub/loader.h and grub/machine/time.h.

View file

@ -311,11 +311,11 @@ grub_mkimage_LDFLAGS = -llzo
grub_setup_SOURCES = util/i386/pc/grub-setup.c util/i386/pc/biosdisk.c \ grub_setup_SOURCES = util/i386/pc/grub-setup.c util/i386/pc/biosdisk.c \
util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \ util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \
kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \ kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \
fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c kern/file.c kern/fs.c kern/env.c fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c kern/file.c kern/fs.c kern/env.c fs/fshelp.c
CLEANFILES += grub-setup grub_setup-util_i386_pc_grub_setup.o grub_setup-util_i386_pc_biosdisk.o grub_setup-util_misc.o grub_setup-util_i386_pc_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-disk_i386_pc_partition.o grub_setup-fs_fat.o grub_setup-fs_ext2.o grub_setup-fs_ufs.o grub_setup-fs_minix.o grub_setup-fs_hfs.o grub_setup-fs_jfs.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o CLEANFILES += grub-setup grub_setup-util_i386_pc_grub_setup.o grub_setup-util_i386_pc_biosdisk.o grub_setup-util_misc.o grub_setup-util_i386_pc_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-disk_i386_pc_partition.o grub_setup-fs_fat.o grub_setup-fs_ext2.o grub_setup-fs_ufs.o grub_setup-fs_minix.o grub_setup-fs_hfs.o grub_setup-fs_jfs.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o
MOSTLYCLEANFILES += grub_setup-util_i386_pc_grub_setup.d grub_setup-util_i386_pc_biosdisk.d grub_setup-util_misc.d grub_setup-util_i386_pc_getroot.d grub_setup-kern_device.d grub_setup-kern_disk.d grub_setup-kern_err.d grub_setup-kern_misc.d grub_setup-disk_i386_pc_partition.d grub_setup-fs_fat.d grub_setup-fs_ext2.d grub_setup-fs_ufs.d grub_setup-fs_minix.d grub_setup-fs_hfs.d grub_setup-fs_jfs.d grub_setup-kern_file.d grub_setup-kern_fs.d grub_setup-kern_env.d MOSTLYCLEANFILES += grub_setup-util_i386_pc_grub_setup.d grub_setup-util_i386_pc_biosdisk.d grub_setup-util_misc.d grub_setup-util_i386_pc_getroot.d grub_setup-kern_device.d grub_setup-kern_disk.d grub_setup-kern_err.d grub_setup-kern_misc.d grub_setup-disk_i386_pc_partition.d grub_setup-fs_fat.d grub_setup-fs_ext2.d grub_setup-fs_ufs.d grub_setup-fs_minix.d grub_setup-fs_hfs.d grub_setup-fs_jfs.d grub_setup-kern_file.d grub_setup-kern_fs.d grub_setup-kern_env.d grub_setup-fs_fshelp.d
grub-setup: grub_setup-util_i386_pc_grub_setup.o grub_setup-util_i386_pc_biosdisk.o grub_setup-util_misc.o grub_setup-util_i386_pc_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-disk_i386_pc_partition.o grub_setup-fs_fat.o grub_setup-fs_ext2.o grub_setup-fs_ufs.o grub_setup-fs_minix.o grub_setup-fs_hfs.o grub_setup-fs_jfs.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub-setup: grub_setup-util_i386_pc_grub_setup.o grub_setup-util_i386_pc_biosdisk.o grub_setup-util_misc.o grub_setup-util_i386_pc_getroot.o grub_setup-kern_device.o grub_setup-kern_disk.o grub_setup-kern_err.o grub_setup-kern_misc.o grub_setup-disk_i386_pc_partition.o grub_setup-fs_fat.o grub_setup-fs_ext2.o grub_setup-fs_ufs.o grub_setup-fs_minix.o grub_setup-fs_hfs.o grub_setup-fs_jfs.o grub_setup-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.o grub_setup-fs_fshelp.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_setup_LDFLAGS) $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_setup_LDFLAGS)
grub_setup-util_i386_pc_grub_setup.o: util/i386/pc/grub-setup.c grub_setup-util_i386_pc_grub_setup.o: util/i386/pc/grub-setup.c
@ -462,9 +462,17 @@ grub_setup-kern_env.d: kern/env.c
-include grub_setup-kern_env.d -include grub_setup-kern_env.d
grub_setup-fs_fshelp.o: fs/fshelp.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -c -o $@ $<
grub_setup-fs_fshelp.d: fs/fshelp.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -M $< | sed 's,fshelp\.o[ :]*,grub_setup-fs_fshelp.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include grub_setup-fs_fshelp.d
# For grub # For grub
grub_emu_SOURCES = kern/main.c kern/device.c \ grub_emu_SOURCES = kern/main.c kern/device.c fs/fshelp.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \ kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
disk/i386/pc/partition.c kern/env.c commands/ls.c \ disk/i386/pc/partition.c kern/env.c commands/ls.c \
@ -472,10 +480,10 @@ grub_emu_SOURCES = kern/main.c kern/device.c \
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c\ util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c\
normal/cmdline.c normal/command.c normal/main.c normal/menu.c normal/arg.c \ normal/cmdline.c normal/command.c normal/main.c normal/menu.c normal/arg.c \
util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c
CLEANFILES += grub-emu grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_i386_pc_partition.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o CLEANFILES += grub-emu grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-fs_fshelp.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_i386_pc_partition.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o
MOSTLYCLEANFILES += grub_emu-kern_main.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_err.d grub_emu-kern_misc.d grub_emu-kern_loader.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-disk_i386_pc_partition.d grub_emu-kern_env.d grub_emu-commands_ls.d grub_emu-commands_terminal.d grub_emu-commands_boot.d grub_emu-commands_cmp.d grub_emu-commands_cat.d grub_emu-util_i386_pc_biosdisk.d grub_emu-fs_fat.d grub_emu-fs_ext2.d grub_emu-fs_ufs.d grub_emu-fs_minix.d grub_emu-fs_hfs.d grub_emu-fs_jfs.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_arg.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_getroot.d MOSTLYCLEANFILES += grub_emu-kern_main.d grub_emu-kern_device.d grub_emu-fs_fshelp.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_err.d grub_emu-kern_misc.d grub_emu-kern_loader.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-disk_i386_pc_partition.d grub_emu-kern_env.d grub_emu-commands_ls.d grub_emu-commands_terminal.d grub_emu-commands_boot.d grub_emu-commands_cmp.d grub_emu-commands_cat.d grub_emu-util_i386_pc_biosdisk.d grub_emu-fs_fat.d grub_emu-fs_ext2.d grub_emu-fs_ufs.d grub_emu-fs_minix.d grub_emu-fs_hfs.d grub_emu-fs_jfs.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_arg.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_getroot.d
grub-emu: grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_i386_pc_partition.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o grub-emu: grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-fs_fshelp.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_i386_pc_partition.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS) $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS)
grub_emu-kern_main.o: kern/main.c grub_emu-kern_main.o: kern/main.c
@ -494,6 +502,14 @@ grub_emu-kern_device.d: kern/device.c
-include grub_emu-kern_device.d -include grub_emu-kern_device.d
grub_emu-fs_fshelp.o: fs/fshelp.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
grub_emu-fs_fshelp.d: fs/fshelp.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $< | sed 's,fshelp\.o[ :]*,grub_emu-fs_fshelp.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include grub_emu-fs_fshelp.d
grub_emu-kern_disk.o: kern/disk.c grub_emu-kern_disk.o: kern/disk.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
@ -772,7 +788,7 @@ genmoddep-util_genmoddep.d: util/genmoddep.c
# Modules. # Modules.
pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod \ pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod \
hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod ls.mod \ hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod ls.mod \
boot.mod cmp.mod cat.mod terminal.mod boot.mod cmp.mod cat.mod terminal.mod fshelp.mod
# For _chain.mod. # For _chain.mod.
_chain_mod_SOURCES = loader/i386/pc/chainloader.c _chain_mod_SOURCES = loader/i386/pc/chainloader.c
@ -813,6 +829,45 @@ _chain_mod-loader_i386_pc_chainloader.d: loader/i386/pc/chainloader.c
_chain_mod_CFLAGS = $(COMMON_CFLAGS) _chain_mod_CFLAGS = $(COMMON_CFLAGS)
# For fshelp.mod.
fshelp_mod_SOURCES = fs/fshelp.c
CLEANFILES += fshelp.mod mod-fshelp.o mod-fshelp.c pre-fshelp.o fshelp_mod-fs_fshelp.o def-fshelp.lst und-fshelp.lst
MOSTLYCLEANFILES += fshelp_mod-fs_fshelp.d
DEFSYMFILES += def-fshelp.lst
UNDSYMFILES += und-fshelp.lst
fshelp.mod: pre-fshelp.o mod-fshelp.o
-rm -f $@
$(LD) -r -o $@ $^
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
pre-fshelp.o: fshelp_mod-fs_fshelp.o
-rm -f $@
$(LD) -r -o $@ $^
mod-fshelp.o: mod-fshelp.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(fshelp_mod_CFLAGS) -c -o $@ $<
mod-fshelp.c: moddep.lst genmodsrc.sh
sh $(srcdir)/genmodsrc.sh 'fshelp' $< > $@ || (rm -f $@; exit 1)
def-fshelp.lst: pre-fshelp.o
$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 fshelp/' > $@
und-fshelp.lst: pre-fshelp.o
echo 'fshelp' > $@
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
fshelp_mod-fs_fshelp.o: fs/fshelp.c
$(CC) -Ifs -I$(srcdir)/fs $(CPPFLAGS) $(CFLAGS) $(fshelp_mod_CFLAGS) -c -o $@ $<
fshelp_mod-fs_fshelp.d: fs/fshelp.c
set -e; $(CC) -Ifs -I$(srcdir)/fs $(CPPFLAGS) $(CFLAGS) $(fshelp_mod_CFLAGS) -M $< | sed 's,fshelp\.o[ :]*,fshelp_mod-fs_fshelp.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include fshelp_mod-fs_fshelp.d
fshelp_mod_CFLAGS = $(COMMON_CFLAGS)
# For fat.mod. # For fat.mod.
fat_mod_SOURCES = fs/fat.c fat_mod_SOURCES = fs/fat.c
CLEANFILES += fat.mod mod-fat.o mod-fat.c pre-fat.o fat_mod-fs_fat.o def-fat.lst und-fat.lst CLEANFILES += fat.mod mod-fat.o mod-fat.c pre-fat.o fat_mod-fs_fat.o def-fat.lst und-fat.lst

View file

@ -61,10 +61,10 @@ grub_mkimage_LDFLAGS = -llzo
grub_setup_SOURCES = util/i386/pc/grub-setup.c util/i386/pc/biosdisk.c \ grub_setup_SOURCES = util/i386/pc/grub-setup.c util/i386/pc/biosdisk.c \
util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \ util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \
kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \ kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \
fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c kern/file.c kern/fs.c kern/env.c fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c kern/file.c kern/fs.c kern/env.c fs/fshelp.c
# For grub # For grub
grub_emu_SOURCES = kern/main.c kern/device.c \ grub_emu_SOURCES = kern/main.c kern/device.c fs/fshelp.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \ kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
disk/i386/pc/partition.c kern/env.c commands/ls.c \ disk/i386/pc/partition.c kern/env.c commands/ls.c \
@ -80,12 +80,16 @@ genmoddep_SOURCES = util/genmoddep.c
# Modules. # Modules.
pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod \ pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod \
hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod ls.mod \ hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod ls.mod \
boot.mod cmp.mod cat.mod terminal.mod boot.mod cmp.mod cat.mod terminal.mod fshelp.mod
# For _chain.mod. # For _chain.mod.
_chain_mod_SOURCES = loader/i386/pc/chainloader.c _chain_mod_SOURCES = loader/i386/pc/chainloader.c
_chain_mod_CFLAGS = $(COMMON_CFLAGS) _chain_mod_CFLAGS = $(COMMON_CFLAGS)
# For fshelp.mod.
fshelp_mod_SOURCES = fs/fshelp.c
fshelp_mod_CFLAGS = $(COMMON_CFLAGS)
# For fat.mod. # For fat.mod.
fat_mod_SOURCES = fs/fat.c fat_mod_SOURCES = fs/fat.c
fat_mod_CFLAGS = $(COMMON_CFLAGS) fat_mod_CFLAGS = $(COMMON_CFLAGS)

View file

@ -24,17 +24,17 @@ noinst_UTILITIES = genmoddep
grub_emu_SOURCES = kern/main.c kern/device.c \ grub_emu_SOURCES = kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \ kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
disk/powerpc/ieee1275/partition.c \ disk/powerpc/ieee1275/partition.c fs/fshelp.c \
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \ util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \
fs/jfs.c normal/cmdline.c normal/command.c normal/main.c normal/menu.c \ fs/jfs.c normal/cmdline.c normal/command.c normal/main.c normal/menu.c \
normal/arg.c \ normal/arg.c \
util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c \ util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c \
kern/env.c commands/ls.c \ kern/env.c commands/ls.c \
commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c
CLEANFILES += grub-emu grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_powerpc_ieee1275_partition.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o CLEANFILES += grub-emu grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_powerpc_ieee1275_partition.o grub_emu-fs_fshelp.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o
MOSTLYCLEANFILES += grub_emu-kern_main.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_err.d grub_emu-kern_misc.d grub_emu-kern_loader.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-disk_powerpc_ieee1275_partition.d grub_emu-util_i386_pc_biosdisk.d grub_emu-fs_fat.d grub_emu-fs_ext2.d grub_emu-fs_ufs.d grub_emu-fs_minix.d grub_emu-fs_hfs.d grub_emu-fs_jfs.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_arg.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_getroot.d grub_emu-kern_env.d grub_emu-commands_ls.d grub_emu-commands_terminal.d grub_emu-commands_boot.d grub_emu-commands_cmp.d grub_emu-commands_cat.d MOSTLYCLEANFILES += grub_emu-kern_main.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_err.d grub_emu-kern_misc.d grub_emu-kern_loader.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-disk_powerpc_ieee1275_partition.d grub_emu-fs_fshelp.d grub_emu-util_i386_pc_biosdisk.d grub_emu-fs_fat.d grub_emu-fs_ext2.d grub_emu-fs_ufs.d grub_emu-fs_minix.d grub_emu-fs_hfs.d grub_emu-fs_jfs.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_arg.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_getroot.d grub_emu-kern_env.d grub_emu-commands_ls.d grub_emu-commands_terminal.d grub_emu-commands_boot.d grub_emu-commands_cmp.d grub_emu-commands_cat.d
grub-emu: grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_powerpc_ieee1275_partition.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o grub-emu: grub_emu-kern_main.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_err.o grub_emu-kern_misc.o grub_emu-kern_loader.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-disk_powerpc_ieee1275_partition.o grub_emu-fs_fshelp.o grub_emu-util_i386_pc_biosdisk.o grub_emu-fs_fat.o grub_emu-fs_ext2.o grub_emu-fs_ufs.o grub_emu-fs_minix.o grub_emu-fs_hfs.o grub_emu-fs_jfs.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_arg.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_getroot.o grub_emu-kern_env.o grub_emu-commands_ls.o grub_emu-commands_terminal.o grub_emu-commands_boot.o grub_emu-commands_cmp.o grub_emu-commands_cat.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS) $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS)
grub_emu-kern_main.o: kern/main.c grub_emu-kern_main.o: kern/main.c
@ -133,6 +133,14 @@ grub_emu-disk_powerpc_ieee1275_partition.d: disk/powerpc/ieee1275/partition.c
-include grub_emu-disk_powerpc_ieee1275_partition.d -include grub_emu-disk_powerpc_ieee1275_partition.d
grub_emu-fs_fshelp.o: fs/fshelp.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
grub_emu-fs_fshelp.d: fs/fshelp.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $< | sed 's,fshelp\.o[ :]*,grub_emu-fs_fshelp.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include grub_emu-fs_fshelp.d
grub_emu-util_i386_pc_biosdisk.o: util/i386/pc/biosdisk.c grub_emu-util_i386_pc_biosdisk.o: util/i386/pc/biosdisk.c
$(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
@ -313,7 +321,7 @@ grub_emu_LDFLAGS = -lncurses
grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c \ grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c \
boot/powerpc/ieee1275/crt0.S kern/main.c kern/device.c \ boot/powerpc/ieee1275/crt0.S kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c fs/fshelp.c \
kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \ kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \
kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \ kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \
@ -321,10 +329,10 @@ grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c
disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.c \ disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.c \
kern/env.c normal/arg.c loader/powerpc/ieee1275/linux.c \ kern/env.c normal/arg.c loader/powerpc/ieee1275/linux.c \
loader/powerpc/ieee1275/linux_normal.c commands/boot.c loader/powerpc/ieee1275/linux_normal.c commands/boot.c
CLEANFILES += grubof grubof-boot_powerpc_ieee1275_cmain.o grubof-boot_powerpc_ieee1275_ieee1275.o grubof-boot_powerpc_ieee1275_crt0.o grubof-kern_main.o grubof-kern_device.o grubof-kern_disk.o grubof-kern_dl.o grubof-kern_file.o grubof-kern_fs.o grubof-kern_err.o grubof-kern_misc.o grubof-kern_mm.o grubof-kern_loader.o grubof-kern_rescue.o grubof-kern_term.o grubof-kern_powerpc_ieee1275_init.o grubof-term_powerpc_ieee1275_ofconsole.o grubof-kern_powerpc_ieee1275_openfw.o grubof-fs_ext2.o grubof-fs_ufs.o grubof-fs_minix.o grubof-fs_hfs.o grubof-fs_jfs.o grubof-normal_cmdline.o grubof-normal_command.o grubof-normal_main.o grubof-normal_menu.o grubof-disk_powerpc_ieee1275_ofdisk.o grubof-disk_powerpc_ieee1275_partition.o grubof-kern_env.o grubof-normal_arg.o grubof-loader_powerpc_ieee1275_linux.o grubof-loader_powerpc_ieee1275_linux_normal.o grubof-commands_boot.o CLEANFILES += grubof grubof-boot_powerpc_ieee1275_cmain.o grubof-boot_powerpc_ieee1275_ieee1275.o grubof-boot_powerpc_ieee1275_crt0.o grubof-kern_main.o grubof-kern_device.o grubof-kern_disk.o grubof-kern_dl.o grubof-kern_file.o grubof-kern_fs.o grubof-kern_err.o grubof-fs_fshelp.o grubof-kern_misc.o grubof-kern_mm.o grubof-kern_loader.o grubof-kern_rescue.o grubof-kern_term.o grubof-kern_powerpc_ieee1275_init.o grubof-term_powerpc_ieee1275_ofconsole.o grubof-kern_powerpc_ieee1275_openfw.o grubof-fs_ext2.o grubof-fs_ufs.o grubof-fs_minix.o grubof-fs_hfs.o grubof-fs_jfs.o grubof-normal_cmdline.o grubof-normal_command.o grubof-normal_main.o grubof-normal_menu.o grubof-disk_powerpc_ieee1275_ofdisk.o grubof-disk_powerpc_ieee1275_partition.o grubof-kern_env.o grubof-normal_arg.o grubof-loader_powerpc_ieee1275_linux.o grubof-loader_powerpc_ieee1275_linux_normal.o grubof-commands_boot.o
MOSTLYCLEANFILES += grubof-boot_powerpc_ieee1275_cmain.d grubof-boot_powerpc_ieee1275_ieee1275.d grubof-boot_powerpc_ieee1275_crt0.d grubof-kern_main.d grubof-kern_device.d grubof-kern_disk.d grubof-kern_dl.d grubof-kern_file.d grubof-kern_fs.d grubof-kern_err.d grubof-kern_misc.d grubof-kern_mm.d grubof-kern_loader.d grubof-kern_rescue.d grubof-kern_term.d grubof-kern_powerpc_ieee1275_init.d grubof-term_powerpc_ieee1275_ofconsole.d grubof-kern_powerpc_ieee1275_openfw.d grubof-fs_ext2.d grubof-fs_ufs.d grubof-fs_minix.d grubof-fs_hfs.d grubof-fs_jfs.d grubof-normal_cmdline.d grubof-normal_command.d grubof-normal_main.d grubof-normal_menu.d grubof-disk_powerpc_ieee1275_ofdisk.d grubof-disk_powerpc_ieee1275_partition.d grubof-kern_env.d grubof-normal_arg.d grubof-loader_powerpc_ieee1275_linux.d grubof-loader_powerpc_ieee1275_linux_normal.d grubof-commands_boot.d MOSTLYCLEANFILES += grubof-boot_powerpc_ieee1275_cmain.d grubof-boot_powerpc_ieee1275_ieee1275.d grubof-boot_powerpc_ieee1275_crt0.d grubof-kern_main.d grubof-kern_device.d grubof-kern_disk.d grubof-kern_dl.d grubof-kern_file.d grubof-kern_fs.d grubof-kern_err.d grubof-fs_fshelp.d grubof-kern_misc.d grubof-kern_mm.d grubof-kern_loader.d grubof-kern_rescue.d grubof-kern_term.d grubof-kern_powerpc_ieee1275_init.d grubof-term_powerpc_ieee1275_ofconsole.d grubof-kern_powerpc_ieee1275_openfw.d grubof-fs_ext2.d grubof-fs_ufs.d grubof-fs_minix.d grubof-fs_hfs.d grubof-fs_jfs.d grubof-normal_cmdline.d grubof-normal_command.d grubof-normal_main.d grubof-normal_menu.d grubof-disk_powerpc_ieee1275_ofdisk.d grubof-disk_powerpc_ieee1275_partition.d grubof-kern_env.d grubof-normal_arg.d grubof-loader_powerpc_ieee1275_linux.d grubof-loader_powerpc_ieee1275_linux_normal.d grubof-commands_boot.d
grubof: grubof-boot_powerpc_ieee1275_cmain.o grubof-boot_powerpc_ieee1275_ieee1275.o grubof-boot_powerpc_ieee1275_crt0.o grubof-kern_main.o grubof-kern_device.o grubof-kern_disk.o grubof-kern_dl.o grubof-kern_file.o grubof-kern_fs.o grubof-kern_err.o grubof-kern_misc.o grubof-kern_mm.o grubof-kern_loader.o grubof-kern_rescue.o grubof-kern_term.o grubof-kern_powerpc_ieee1275_init.o grubof-term_powerpc_ieee1275_ofconsole.o grubof-kern_powerpc_ieee1275_openfw.o grubof-fs_ext2.o grubof-fs_ufs.o grubof-fs_minix.o grubof-fs_hfs.o grubof-fs_jfs.o grubof-normal_cmdline.o grubof-normal_command.o grubof-normal_main.o grubof-normal_menu.o grubof-disk_powerpc_ieee1275_ofdisk.o grubof-disk_powerpc_ieee1275_partition.o grubof-kern_env.o grubof-normal_arg.o grubof-loader_powerpc_ieee1275_linux.o grubof-loader_powerpc_ieee1275_linux_normal.o grubof-commands_boot.o grubof: grubof-boot_powerpc_ieee1275_cmain.o grubof-boot_powerpc_ieee1275_ieee1275.o grubof-boot_powerpc_ieee1275_crt0.o grubof-kern_main.o grubof-kern_device.o grubof-kern_disk.o grubof-kern_dl.o grubof-kern_file.o grubof-kern_fs.o grubof-kern_err.o grubof-fs_fshelp.o grubof-kern_misc.o grubof-kern_mm.o grubof-kern_loader.o grubof-kern_rescue.o grubof-kern_term.o grubof-kern_powerpc_ieee1275_init.o grubof-term_powerpc_ieee1275_ofconsole.o grubof-kern_powerpc_ieee1275_openfw.o grubof-fs_ext2.o grubof-fs_ufs.o grubof-fs_minix.o grubof-fs_hfs.o grubof-fs_jfs.o grubof-normal_cmdline.o grubof-normal_command.o grubof-normal_main.o grubof-normal_menu.o grubof-disk_powerpc_ieee1275_ofdisk.o grubof-disk_powerpc_ieee1275_partition.o grubof-kern_env.o grubof-normal_arg.o grubof-loader_powerpc_ieee1275_linux.o grubof-loader_powerpc_ieee1275_linux_normal.o grubof-commands_boot.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grubof_LDFLAGS) $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grubof_LDFLAGS)
grubof-boot_powerpc_ieee1275_cmain.o: boot/powerpc/ieee1275/cmain.c grubof-boot_powerpc_ieee1275_cmain.o: boot/powerpc/ieee1275/cmain.c
@ -407,6 +415,14 @@ grubof-kern_err.d: kern/err.c
-include grubof-kern_err.d -include grubof-kern_err.d
grubof-fs_fshelp.o: fs/fshelp.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $<
grubof-fs_fshelp.d: fs/fshelp.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -M $< | sed 's,fshelp\.o[ :]*,grubof-fs_fshelp.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include grubof-fs_fshelp.d
grubof-kern_misc.o: kern/misc.c grubof-kern_misc.o: kern/misc.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $< $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $<

View file

@ -24,7 +24,7 @@ noinst_UTILITIES = genmoddep
grub_emu_SOURCES = kern/main.c kern/device.c \ grub_emu_SOURCES = kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \ kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
disk/powerpc/ieee1275/partition.c \ disk/powerpc/ieee1275/partition.c fs/fshelp.c \
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \ util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \
fs/jfs.c normal/cmdline.c normal/command.c normal/main.c normal/menu.c \ fs/jfs.c normal/cmdline.c normal/command.c normal/main.c normal/menu.c \
normal/arg.c \ normal/arg.c \
@ -35,7 +35,7 @@ grub_emu_LDFLAGS = -lncurses
grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c \ grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c \
boot/powerpc/ieee1275/crt0.S kern/main.c kern/device.c \ boot/powerpc/ieee1275/crt0.S kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c fs/fshelp.c \
kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \ kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \
kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \ kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \

535
fs/ext2.c
View file

@ -29,11 +29,13 @@
/* Filetype used in directory entry. */ /* Filetype used in directory entry. */
#define FILETYPE_UNKNOWN 0 #define FILETYPE_UNKNOWN 0
#define FILETYPE_REG 1
#define FILETYPE_DIRECTORY 2 #define FILETYPE_DIRECTORY 2
#define FILETYPE_SYMLINK 7 #define FILETYPE_SYMLINK 7
/* Filetype information as used in inodes. */ /* Filetype information as used in inodes. */
#define FILETYPE_INO_MASK 0170000 #define FILETYPE_INO_MASK 0170000
#define FILETYPE_INO_REG 0100000
#define FILETYPE_INO_DIRECTORY 0040000 #define FILETYPE_INO_DIRECTORY 0040000
#define FILETYPE_INO_SYMLINK 0120000 #define FILETYPE_INO_SYMLINK 0120000
@ -44,6 +46,7 @@
#include <grub/disk.h> #include <grub/disk.h>
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/fshelp.h>
/* Log2 size of ext2 block in 512 blocks. */ /* Log2 size of ext2 block in 512 blocks. */
#define LOG2_EXT2_BLOCK_SIZE(data) \ #define LOG2_EXT2_BLOCK_SIZE(data) \
@ -57,7 +60,7 @@
#define EXT2_BLOCK_SIZE(data) (1 << LOG2_BLOCK_SIZE(data)) #define EXT2_BLOCK_SIZE(data) (1 << LOG2_BLOCK_SIZE(data))
/* The ext2 superblock. */ /* The ext2 superblock. */
struct grub_ext_sblock struct grub_ext2_sblock
{ {
grub_uint32_t total_inodes; grub_uint32_t total_inodes;
grub_uint32_t total_blocks; grub_uint32_t total_blocks;
@ -97,7 +100,7 @@ struct grub_ext_sblock
}; };
/* The ext2 blockgroup. */ /* The ext2 blockgroup. */
struct ext2_block_group struct grub_ext2_block_group
{ {
grub_uint32_t block_id; grub_uint32_t block_id;
grub_uint32_t inode_id; grub_uint32_t inode_id;
@ -150,12 +153,21 @@ struct ext2_dirent
grub_uint8_t filetype; grub_uint8_t filetype;
}; };
struct grub_fshelp_node
{
struct grub_ext2_data *data;
struct grub_ext2_inode inode;
int ino;
int inode_read;
};
/* Information about a "mounted" ext2 filesystem. */ /* Information about a "mounted" ext2 filesystem. */
struct grub_ext2_data struct grub_ext2_data
{ {
struct grub_ext_sblock sblock; struct grub_ext2_sblock sblock;
grub_disk_t disk; grub_disk_t disk;
struct grub_ext2_inode inode; struct grub_ext2_inode *inode;
struct grub_fshelp_node diropen;
}; };
#ifndef GRUB_UTIL #ifndef GRUB_UTIL
@ -166,60 +178,59 @@ static grub_dl_t my_mod;
the mounted filesystem DATA. */ the mounted filesystem DATA. */
inline static grub_err_t 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 ext2_block_group *blkgrp) struct grub_ext2_block_group *blkgrp)
{ {
return grub_disk_read (data->disk, return grub_disk_read (data->disk,
((grub_le_to_cpu32 (data->sblock.first_data_block) + 1) ((grub_le_to_cpu32 (data->sblock.first_data_block) + 1)
<< LOG2_EXT2_BLOCK_SIZE (data)), << LOG2_EXT2_BLOCK_SIZE (data)),
group * sizeof (struct ext2_block_group), group * sizeof (struct grub_ext2_block_group),
sizeof (struct ext2_block_group), (char *) blkgrp); sizeof (struct grub_ext2_block_group), (char *) blkgrp);
} }
/* Return in BLOCK the on disk block number of block FILEBLOCK in the
opened file descibed by DATA. If this block is not stored on disk static int
in case of a sparse file return 0. */ grub_ext2_read_block (grub_fshelp_node_t node, int fileblock)
static grub_err_t
grub_ext2_get_file_block (struct grub_ext2_data *data,
int fileblock, int *block)
{ {
struct grub_ext2_data *data = node->data;
struct grub_ext2_inode *inode = &node->inode;
int blknr; int blknr;
struct grub_ext2_inode *inode = &data->inode; int blksz = EXT2_BLOCK_SIZE (data);
int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data);
/* Direct blocks. */ /* Direct blocks. */
if (fileblock < INDIRECT_BLOCKS) if (fileblock < INDIRECT_BLOCKS)
blknr = grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]); blknr = grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]);
/* Indirect. */ /* Indirect. */
else if (fileblock < INDIRECT_BLOCKS + EXT2_BLOCK_SIZE (data) / 4) else if (fileblock < INDIRECT_BLOCKS + blksz / 4)
{ {
grub_uint32_t indir[EXT2_BLOCK_SIZE (data) / 4]; grub_uint32_t indir[blksz / 4];
if (grub_disk_read (data->disk, if (grub_disk_read (data->disk,
grub_le_to_cpu32 (inode->blocks.indir_block) grub_le_to_cpu32 (inode->blocks.indir_block)
<< LOG2_EXT2_BLOCK_SIZE (data), << log2_blksz,
0, EXT2_BLOCK_SIZE (data), (char *) indir)) 0, blksz, (char *) indir))
return grub_errno; return grub_errno;
blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]); blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]);
} }
/* Double indirect. */ /* Double indirect. */
else if (fileblock < INDIRECT_BLOCKS + EXT2_BLOCK_SIZE (data) / 4 else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * (blksz / 4 + 1))
* (EXT2_BLOCK_SIZE (data) / 4 + 1))
{ {
unsigned int perblock = EXT2_BLOCK_SIZE (data) / 4; unsigned int perblock = blksz / 4;
unsigned int rblock = fileblock - (INDIRECT_BLOCKS unsigned int rblock = fileblock - (INDIRECT_BLOCKS
+ EXT2_BLOCK_SIZE (data) / 4); + blksz / 4);
grub_uint32_t indir[EXT2_BLOCK_SIZE (data) / 4]; grub_uint32_t indir[blksz / 4];
if (grub_disk_read (data->disk, if (grub_disk_read (data->disk,
grub_le_to_cpu32 (inode->blocks.double_indir_block) grub_le_to_cpu32 (inode->blocks.double_indir_block)
<< LOG2_EXT2_BLOCK_SIZE (data), << log2_blksz,
0, EXT2_BLOCK_SIZE (data), (char *) indir)) 0, blksz, (char *) indir))
return grub_errno; return grub_errno;
if (grub_disk_read (data->disk, if (grub_disk_read (data->disk,
grub_le_to_cpu32 (indir[rblock / perblock]) grub_le_to_cpu32 (indir[rblock / perblock])
<< LOG2_EXT2_BLOCK_SIZE (data), << log2_blksz,
0, EXT2_BLOCK_SIZE (data), (char *) indir)) 0, blksz, (char *) indir))
return grub_errno; return grub_errno;
@ -233,78 +244,23 @@ grub_ext2_get_file_block (struct grub_ext2_data *data,
return grub_errno; return grub_errno;
} }
*block = blknr; return blknr;
return 0;
} }
/* Read LEN bytes from the file described by DATA starting with byte /* Read LEN bytes from the file described by DATA starting with byte
POS. Return the amount of read bytes in READ. */ POS. Return the amount of read bytes in READ. */
static grub_ssize_t static grub_ssize_t
grub_ext2_read_file (struct grub_ext2_data *data, grub_ext2_read_file (grub_fshelp_node_t node,
void (*read_hook) (unsigned long sector, void (*read_hook) (unsigned long sector,
unsigned offset, unsigned length), unsigned offset, unsigned length),
int pos, unsigned int len, char *buf) int pos, unsigned int len, char *buf)
{ {
int i; return grub_fshelp_read_file (node->data->disk, node, read_hook,
int blockcnt; pos, len, buf, grub_ext2_read_block,
node->inode.size,
LOG2_EXT2_BLOCK_SIZE (node->data));
/* Adjust len so it we can't read past the end of the file. */
if (len > grub_le_to_cpu32 (data->inode.size))
len = grub_le_to_cpu32 (data->inode.size);
blockcnt = ((len + pos)
+ EXT2_BLOCK_SIZE (data) - 1) / EXT2_BLOCK_SIZE (data);
for (i = pos / EXT2_BLOCK_SIZE (data); i < blockcnt; i++)
{
int blknr;
int blockoff = pos % EXT2_BLOCK_SIZE (data);
int blockend = EXT2_BLOCK_SIZE (data);
int skipfirst = 0;
grub_ext2_get_file_block (data, i, &blknr);
if (grub_errno)
return -1;
blknr = blknr << LOG2_EXT2_BLOCK_SIZE (data);
/* Last block. */
if (i == blockcnt - 1)
{
blockend = (len + pos) % EXT2_BLOCK_SIZE (data);
/* The last portion is exactly EXT2_BLOCK_SIZE (data). */
if (!blockend)
blockend = EXT2_BLOCK_SIZE (data);
}
/* First block. */
if (i == pos / EXT2_BLOCK_SIZE (data))
{
skipfirst = blockoff;
blockend -= skipfirst;
}
/* If the block number is 0 this block is not stored on disk but
is zero filled instead. */
if (blknr)
{
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;
}
else
grub_memset (buf, EXT2_BLOCK_SIZE (data) - skipfirst, 0);
buf += EXT2_BLOCK_SIZE (data) - skipfirst;
}
return len;
} }
@ -313,8 +269,8 @@ static grub_err_t
grub_ext2_read_inode (struct grub_ext2_data *data, grub_ext2_read_inode (struct grub_ext2_data *data,
int ino, struct grub_ext2_inode *inode) int ino, struct grub_ext2_inode *inode)
{ {
struct ext2_block_group blkgrp; struct grub_ext2_block_group blkgrp;
struct grub_ext_sblock *sblock = &data->sblock; struct grub_ext2_sblock *sblock = &data->sblock;
int inodes_per_block; int inodes_per_block;
unsigned int blkno; unsigned int blkno;
@ -355,7 +311,7 @@ grub_ext2_mount (grub_disk_t disk)
return 0; return 0;
/* Read the superblock. */ /* Read the superblock. */
grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_ext_sblock), grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_ext2_sblock),
(char *) &data->sblock); (char *) &data->sblock);
if (grub_errno) if (grub_errno)
goto fail; goto fail;
@ -364,7 +320,17 @@ grub_ext2_mount (grub_disk_t disk)
if (grub_le_to_cpu16 (data->sblock.magic) != EXT2_MAGIC) if (grub_le_to_cpu16 (data->sblock.magic) != EXT2_MAGIC)
goto fail; goto fail;
data->diropen.data = data;
data->diropen.ino = 2;
data->diropen.inode_read = 1;
data->inode = &data->diropen.inode;
data->disk = disk; data->disk = disk;
grub_ext2_read_inode (data, 2, data->inode);
if (grub_errno)
goto fail;
return data; return data;
fail: fail:
@ -373,198 +339,137 @@ grub_ext2_mount (grub_disk_t disk)
return 0; return 0;
} }
/* Find the file with the pathname PATH on the filesystem described by static char *
DATA. Return its inode number in INO. */ grub_ext2_read_symlink (grub_fshelp_node_t node)
static grub_err_t
grub_ext2_find_file (struct grub_ext2_data *data, const char *path, int *ino)
{ {
int blocksize = EXT2_BLOCK_SIZE (data) char *symlink;
<< grub_le_to_cpu32 (data->sblock.log2_block_size); struct grub_fshelp_node *diro = node;
struct grub_ext2_inode *inode = &data->inode;
int currinode = 2;
int symlinkcnt = 0;
char fpath[EXT2_PATH_MAX]; if (!diro->inode_read)
char *name = fpath;
grub_strncpy (fpath, path, EXT2_PATH_MAX);
if (!name || name[0] != '/')
{ {
grub_error (GRUB_ERR_BAD_FILENAME, "bad filename"); grub_ext2_read_inode (diro->data, diro->ino, &diro->inode);
return grub_errno;
}
/* Skip the first slash. */
name++;
if (!*name)
{
*ino = 2;
return 0;
}
/* Remove trailing "/". */
if (name[grub_strlen (name) - 1] =='/')
name[grub_strlen (name) - 1] = '\0';
while (*name)
{
unsigned int fpos = 0;
char *next;
int namesize;
/* Extract the actual part from the pathname. */
next = grub_strchr (name, '/');
if (next)
{
next[0] = '\0';
next++;
}
namesize = grub_strlen (name);
/* Open the file. */
grub_ext2_read_inode (data, currinode, inode);
if (grub_errno) if (grub_errno)
goto fail; return 0;
}
/* Search the file. */ symlink = grub_malloc (grub_le_to_cpu32 (diro->inode.size) + 1);
while (fpos < grub_le_to_cpu32 (inode->size)) 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,
diro->inode.symlink,
grub_le_to_cpu32 (diro->inode.size));
else
{
grub_ext2_read_file (diro, 0, 0,
grub_le_to_cpu32 (diro->inode.size),
symlink);
if (grub_errno)
{ {
struct ext2_dirent dirent; grub_free (symlink);
return 0;
}
}
/* Read the directory entry. */ symlink[grub_le_to_cpu32 (diro->inode.size)] = '\0';
grub_ext2_read_file (data, 0, fpos, sizeof (struct ext2_dirent), return symlink;
(char *) &dirent); }
static int
grub_ext2_iterate_dir (grub_fshelp_node_t dir,
int NESTED_FUNC_ATTR
(*hook) (const char *filename,
enum grub_fshelp_filetype filetype,
grub_fshelp_node_t node))
{
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))
{
struct ext2_dirent dirent;
grub_ext2_read_file (diro, 0, fpos, sizeof (struct ext2_dirent),
(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) if (grub_errno)
goto fail; return 0;
if (dirent.namelen != 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)
{ {
char filename[dirent.namelen + 1]; fdiro->inode_read = 0;
/* Read the filename part of this directory entry. */ if (dirent.filetype == FILETYPE_DIRECTORY)
grub_ext2_read_file (data, 0, fpos type = GRUB_FSHELP_DIR;
+ sizeof (struct ext2_dirent), else if (dirent.filetype == FILETYPE_SYMLINK)
dirent.namelen, filename); type = GRUB_FSHELP_SYMLINK;
else if (dirent.filetype == FILETYPE_REG)
type = GRUB_FSHELP_REG;
}
else
{
/* The filetype can not be read from the dirent, read
the inode to get more information. */
grub_ext2_read_inode (diro->data, grub_le_to_cpu32 (dirent.inode),
&fdiro->inode);
if (grub_errno) if (grub_errno)
goto fail;
filename[dirent.namelen] = '\0';
/* Check if the current directory entry described the
file we are looking for. */
if (dirent.namelen == namesize
&& !grub_strncmp (name, filename, namesize))
{ {
/* Stat the inode. */ grub_free (fdiro);
grub_ext2_read_inode (data, return 0;
grub_le_to_cpu32 (dirent.inode),
inode);
/* If this is a symlink, follow it. */
if ((grub_le_to_cpu16 (data->inode.mode)
& FILETYPE_INO_MASK) == FILETYPE_INO_SYMLINK)
{
/* XXX: Use malloc instead? */
char symlink[blocksize];
if (++symlinkcnt == EXT2_MAX_SYMLINKCNT)
{
grub_error (GRUB_ERR_SYMLINK_LOOP,
"too deep nesting of symlinks");
goto fail;
}
/* 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 (inode->size) <= 60)
grub_strncpy (symlink,
inode->symlink,
grub_le_to_cpu32 (inode->size));
else
{
grub_ext2_read_file (data, 0, 0,
grub_le_to_cpu32 (inode->size),
symlink);
if (grub_errno)
goto fail;
}
symlink[grub_le_to_cpu32 (inode->size)] = '\0';
/* Check if the symlink is absolute or relative. */
if (symlink[0] == '/')
{
grub_strncpy (fpath, symlink + 1, EXT2_PATH_MAX);
name = fpath;
currinode = 2;
}
else
{
char *bak = 0;
if (next)
{
bak = grub_strdup (next);
if (!bak)
goto fail;
}
/* Relative symlink, construct the new path. */
grub_strcpy (fpath, symlink);
name = fpath;
if (next)
{
grub_strcat (name, "/");
grub_strcat (name, bak);
grub_free (bak);
}
}
fpos = 0;
break;
}
if (next)
{
currinode = grub_le_to_cpu32 (dirent.inode);
name = next;
if ((grub_le_to_cpu16 (data->inode.mode)
& FILETYPE_INO_MASK) != FILETYPE_INO_DIRECTORY)
{
grub_error (GRUB_ERR_BAD_FILE_TYPE,
"not a directory");
goto fail;
}
break;
}
else /* Found it! */
{
*ino = grub_le_to_cpu32 (dirent.inode);
return 0;
}
} }
fdiro->inode_read = 1;
if ((grub_le_to_cpu16 (diro->inode.mode)
& FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
type = GRUB_FSHELP_DIR;
else if ((grub_le_to_cpu16 (diro->inode.mode)
& FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
type = GRUB_FSHELP_SYMLINK;
else if ((grub_le_to_cpu16 (diro->inode.mode)
& FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
type = GRUB_FSHELP_REG;
} }
/* Move to next directory entry. */ if (hook (filename, type, fdiro))
fpos += grub_le_to_cpu16 (dirent.direntlen); return 1;
} }
/* The complete directory was read and no matching file was fpos += grub_le_to_cpu16 (dirent.direntlen);
found. */
if (fpos >= grub_le_to_cpu32 (inode->size))
{
grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
goto fail;
}
} }
fail: return 0;
return grub_errno;
} }
/* Open a file named NAME and initialize FILE. */ /* Open a file named NAME and initialize FILE. */
@ -572,7 +477,7 @@ static grub_err_t
grub_ext2_open (struct grub_file *file, const char *name) grub_ext2_open (struct grub_file *file, const char *name)
{ {
struct grub_ext2_data *data; struct grub_ext2_data *data;
int ino; struct grub_fshelp_node *fdiro = 0;
#ifndef GRUB_UTIL #ifndef GRUB_UTIL
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
@ -582,29 +487,31 @@ grub_ext2_open (struct grub_file *file, const char *name)
if (!data) if (!data)
goto fail; goto fail;
grub_ext2_find_file (data, name, &ino); grub_fshelp_find_file (name, &data->diropen, &fdiro, grub_ext2_iterate_dir,
grub_ext2_read_symlink, GRUB_FSHELP_REG);
if (grub_errno) if (grub_errno)
goto fail; goto fail;
grub_ext2_read_inode (data, ino, &data->inode); if (!fdiro->inode_read)
if (grub_errno)
goto fail;
if (!(grub_le_to_cpu16 (data->inode.mode) & 0100000))
{ {
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a regular file"); grub_ext2_read_inode (data, fdiro->ino, &fdiro->inode);
goto fail; if (grub_errno)
goto fail;
} }
file->size = grub_le_to_cpu32 (data->inode.size); grub_memcpy (data->inode, &fdiro->inode, sizeof (struct grub_ext2_inode));
grub_free (fdiro);
file->size = grub_le_to_cpu32 (data->inode->size);
file->data = data; file->data = data;
file->offset = 0; file->offset = 0;
return 0; return 0;
fail: fail:
grub_free (data); grub_free (data);
if (fdiro != &data->diropen)
grub_free (fdiro);
#ifndef GRUB_UTIL #ifndef GRUB_UTIL
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
@ -632,7 +539,8 @@ grub_ext2_read (grub_file_t file, char *buf, grub_ssize_t len)
struct grub_ext2_data *data = struct grub_ext2_data *data =
(struct grub_ext2_data *) file->data; (struct grub_ext2_data *) file->data;
return grub_ext2_read_file (data, file->read_hook, file->offset, len, buf); return grub_ext2_read_file (&data->diropen, file->read_hook,
file->offset, len, buf);
} }
@ -641,9 +549,25 @@ grub_ext2_dir (grub_device_t device, const char *path,
int (*hook) (const char *filename, int dir)) int (*hook) (const char *filename, int dir))
{ {
struct grub_ext2_data *data = 0;; struct grub_ext2_data *data = 0;;
struct grub_fshelp_node *fdiro = 0;
int ino; auto int NESTED_FUNC_ATTR iterate (const char *filename,
unsigned int fpos = 0; enum grub_fshelp_filetype filetype,
grub_fshelp_node_t node);
int NESTED_FUNC_ATTR iterate (const char *filename,
enum grub_fshelp_filetype filetype,
grub_fshelp_node_t node)
{
grub_free (node);
if (filetype == GRUB_FSHELP_DIR)
return hook (filename, 1);
else
return hook (filename, 0);
return 0;
}
#ifndef GRUB_UTIL #ifndef GRUB_UTIL
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
@ -653,60 +577,17 @@ grub_ext2_dir (grub_device_t device, const char *path,
if (!data) if (!data)
goto fail; goto fail;
grub_ext2_find_file (data, (char *) path, &ino); grub_fshelp_find_file (path, &data->diropen, &fdiro, grub_ext2_iterate_dir,
grub_ext2_read_symlink, GRUB_FSHELP_DIR);
if (grub_errno) if (grub_errno)
goto fail; return grub_errno;
grub_ext2_read_inode (data, ino, &data->inode); grub_ext2_iterate_dir (fdiro, iterate);
if (grub_errno)
goto fail;
if ((grub_le_to_cpu16 (data->inode.mode)
& FILETYPE_INO_MASK) != FILETYPE_INO_DIRECTORY)
{
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
goto fail;
}
/* Search the file. */
while (fpos < grub_le_to_cpu32 (data->inode.size))
{
struct ext2_dirent dirent;
grub_ext2_read_file (data, 0, fpos, sizeof (struct ext2_dirent),
(char *) &dirent);
if (grub_errno)
goto fail;
if (dirent.namelen != 0)
{
char filename[dirent.namelen + 1];
grub_ext2_read_file (data, 0, fpos + sizeof (struct ext2_dirent),
dirent.namelen, filename);
if (grub_errno)
goto fail;
filename[dirent.namelen] = '\0';
if (dirent.filetype != FILETYPE_UNKNOWN)
hook (filename, dirent.filetype == FILETYPE_DIRECTORY);
else
{
struct grub_ext2_inode inode;
grub_ext2_read_inode (data, grub_le_to_cpu32 (dirent.inode), &inode);
hook (filename, (grub_le_to_cpu16 (inode.mode)
& FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY);
}
}
fpos += grub_le_to_cpu16 (dirent.direntlen);
}
fail: fail:
grub_free (data); grub_free (data);
if (fdiro != &data->diropen)
grub_free (fdiro);
#ifndef GRUB_UTIL #ifndef GRUB_UTIL
grub_dl_unref (my_mod); grub_dl_unref (my_mod);

292
fs/fshelp.c Normal file
View file

@ -0,0 +1,292 @@
/* fshelp.c -- Filesystem helper functions */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2004 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <grub/err.h>
#include <grub/mm.h>
#include <grub/misc.h>
#include <grub/disk.h>
#include <grub/fshelp.h>
/* Lookup the node PATH. The node ROOTNODE describes the root of the
directory tree. The node found is returned in FOUNDNODE, which is
either a ROOTNODE or a new malloc'ed node. ITERATE_DIR is used to
iterate over all directory entries in the current node.
READ_SYMLINK is used to read the symlink if a node is a symlink.
EXPECTTYPE is the type node that is expected by the called, an
error is generated if the node is not of the expected type. Make
sure you use the NESTED_FUNC_ATTR macro for HOOK, this is required
because GCC has a nasty bug when using regparm=3. */
grub_err_t
grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
grub_fshelp_node_t *foundnode,
int (*iterate_dir) (grub_fshelp_node_t dir,
int NESTED_FUNC_ATTR (*hook)
(const char *filename,
enum grub_fshelp_filetype filetype,
grub_fshelp_node_t node)),
char *(*read_symlink) (grub_fshelp_node_t node),
enum grub_fshelp_filetype expecttype)
{
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);
grub_err_t NESTED_FUNC_ATTR find_file (const char *currpath,
grub_fshelp_node_t currroot,
grub_fshelp_node_t *currfound)
{
char fpath[grub_strlen (currpath) + 1];
char *name = fpath;
char *next;
// unsigned int pos = 0;
enum grub_fshelp_filetype type = GRUB_FSHELP_DIR;
grub_fshelp_node_t currnode = currroot;
grub_fshelp_node_t oldnode = currroot;
auto int NESTED_FUNC_ATTR iterate (const char *filename,
enum grub_fshelp_filetype filetype,
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)
{
if (type == GRUB_FSHELP_UNKNOWN || grub_strcmp (name, filename))
{
grub_free (node);
return 0;
}
/* The node is found, stop iterating over the nodes. */
type = filetype;
oldnode = currnode == rootnode ? 0 : 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)
{
/* Remove all leading slashes. */
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)
{
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)
{
free_node (oldnode);
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)
{
free_node (currnode);
free_node (oldnode);
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);
grub_free (symlink);
if (grub_errno)
{
free_node (oldnode);
return grub_errno;
}
}
free_node (oldnode);
/* Found the node! */
if (!next || *next == '\0')
{
*currfound = currnode;
foundtype = type;
return 0;
}
name = next;
}
return grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
}
if (!path || path[0] != '/')
{
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;
}
/* Read LEN bytes from the file NODE on disk DISK into the buffer BUF,
beginning with the block POS. READ_HOOK should be set before
reading a block from the file. GET_BLOCK is used to translate file
blocks to disk blocks. The file is FILESIZE bytes big and the
blocks have a size of LOG2BLOCKSIZE (in log2). */
grub_ssize_t
grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node,
void (*read_hook) (unsigned long sector,
unsigned offset, unsigned length),
int pos, unsigned int len, char *buf,
int (*get_block) (grub_fshelp_node_t node, int block),
unsigned int filesize, int log2blocksize)
{
int i;
int blockcnt;
int blocksize = 1 << (log2blocksize + GRUB_DISK_SECTOR_BITS);
/* Adjust len so it we can't read past the end of the file. */
if (len > filesize)
len = filesize;
blockcnt = ((len + pos)
+ blocksize - 1) / blocksize;
for (i = pos / blocksize; i < blockcnt; i++)
{
int blknr;
int blockoff = pos % blocksize;
int blockend = blocksize;
int skipfirst = 0;
blknr = get_block (node, i);
if (grub_errno)
return -1;
blknr = blknr << log2blocksize;
/* Last block. */
if (i == blockcnt - 1)
{
blockend = (len + pos) % blocksize;
/* The last portion is exactly blocksize. */
if (!blockend)
blockend = blocksize;
}
/* First block. */
if (i == pos / blocksize)
{
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;
grub_disk_read (disk, blknr, skipfirst,
blockend, buf);
disk->read_hook = 0;
if (grub_errno)
return -1;
}
else
grub_memset (buf, blocksize - skipfirst, 0);
buf += blocksize - skipfirst;
}
return len;
}

75
include/grub/fshelp.h Normal file
View file

@ -0,0 +1,75 @@
/* fshelp.h -- Filesystem helper functions */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2004 Free Software Foundation, Inc.
*
* GRUB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef GRUB_FSHELP_HEADER
#define GRUB_FSHELP_HEADER 1
#include <grub/types.h>
#include <grub/symbol.h>
#include <grub/err.h>
typedef struct grub_fshelp_node *grub_fshelp_node_t;
enum grub_fshelp_filetype
{
GRUB_FSHELP_UNKNOWN,
GRUB_FSHELP_REG,
GRUB_FSHELP_DIR,
GRUB_FSHELP_SYMLINK
};
/* Lookup the node PATH. The node ROOTNODE describes the root of the
directory tree. The node found is returned in FOUNDNODE, which is
either a ROOTNODE or a new malloc'ed node. ITERATE_DIR is used to
iterate over all directory entries in the current node.
READ_SYMLINK is used to read the symlink if a node is a symlink.
EXPECTTYPE is the type node that is expected by the called, an
error is generated if the node is not of the expected type. Make
sure you use the NESTED_FUNC_ATTR macro for HOOK, this is required
because GCC has a nasty bug when using regparm=3. */
grub_err_t
EXPORT_FUNC(grub_fshelp_find_file) (const char *path,
grub_fshelp_node_t rootnode,
grub_fshelp_node_t *foundnode,
int (*iterate_dir) (grub_fshelp_node_t dir,
int NESTED_FUNC_ATTR
(*hook) (const char *filename,
enum grub_fshelp_filetype filetype,
grub_fshelp_node_t node)),
char *(*read_symlink) (grub_fshelp_node_t node),
enum grub_fshelp_filetype expect);
/* Read LEN bytes from the file NODE on disk DISK into the buffer BUF,
beginning with the block POS. READ_HOOK should be set before
reading a block from the file. GET_BLOCK is used to translate file
blocks to disk blocks. The file is FILESIZE bytes big and the
blocks have a size of LOG2BLOCKSIZE (in log2). */
grub_ssize_t
EXPORT_FUNC(grub_fshelp_read_file) (grub_disk_t disk, grub_fshelp_node_t node,
void (*read_hook) (unsigned long sector,
unsigned offset,
unsigned length),
int pos, unsigned int len, char *buf,
int (*get_block) (grub_fshelp_node_t node,
int block),
unsigned int filesize, int log2blocksize);
#endif /* ! GRUB_FSHELP_HEADER */