2004-05-24 Marco Gerards <metgerards@student.han.nl>
Add support for UFS version 1 and 2. Add support for the minix filesystem version 1 and 2, both the variants with 14 and 30 long filenames. * conf/i386-pc.rmk (grub_setup_SOURCES): Add fs/ufs.c and fs/minix.c. (grub_emu_SOURCES): Likewise. (pkgdata_MODULES): Add ufs.mod and minix.mod. (ufs_mod_SOURCES): New variable. (ufs_mod_CFLAGS): Likewise. (minix_mod_SOURCES): Likewise. (minix_mod_CFLAGS): Likewise. * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Add fs/ufs.c and fs/minix.c. (grubof_SOURCES): Likewise. * fs/ufs.c: New file. * fs/minix.c: New file. * include/grub/fs.h (grub_ufs_init): New prototype. (grub_ufs_fini): Likewise. (grub_minix_init): Likewise. (grub_minix_fini): Likewise. * util/grub-emu.c (main): Initialize and deinitialize UFS and minix fs.
This commit is contained in:
		
							parent
							
								
									cc2e748a08
								
							
						
					
					
						commit
						66e19ef8ba
					
				
					 9 changed files with 1518 additions and 23 deletions
				
			
		
							
								
								
									
										26
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								ChangeLog
									
										
									
									
									
								
							|  | @ -1,3 +1,29 @@ | ||||||
|  | 2004-05-24  Marco Gerards  <metgerards@student.han.nl> | ||||||
|  | 
 | ||||||
|  | 	Add support for UFS version 1 and 2.  Add support for the minix | ||||||
|  | 	filesystem version 1 and 2, both the variants with 14 and 30 long | ||||||
|  | 	filenames. | ||||||
|  | 	 | ||||||
|  | 	* conf/i386-pc.rmk (grub_setup_SOURCES): Add fs/ufs.c and | ||||||
|  | 	fs/minix.c. | ||||||
|  | 	(grub_emu_SOURCES): Likewise. | ||||||
|  | 	(pkgdata_MODULES): Add ufs.mod and minix.mod. | ||||||
|  | 	(ufs_mod_SOURCES): New variable. | ||||||
|  | 	(ufs_mod_CFLAGS): Likewise. | ||||||
|  | 	(minix_mod_SOURCES): Likewise. | ||||||
|  | 	(minix_mod_CFLAGS): Likewise. | ||||||
|  | 	* conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Add fs/ufs.c and | ||||||
|  | 	fs/minix.c. | ||||||
|  | 	(grubof_SOURCES): Likewise. | ||||||
|  | 	* fs/ufs.c: New file. | ||||||
|  | 	* fs/minix.c: New file. | ||||||
|  | 	* include/grub/fs.h (grub_ufs_init): New prototype. | ||||||
|  | 	(grub_ufs_fini): Likewise. | ||||||
|  | 	(grub_minix_init): Likewise. | ||||||
|  | 	(grub_minix_fini): Likewise. | ||||||
|  | 	* util/grub-emu.c (main): Initialize and deinitialize UFS and | ||||||
|  | 	minix fs. | ||||||
|  | 
 | ||||||
| 2004-04-30  Jeroen Dekkers  <jeroen@dekkers.cx> | 2004-04-30  Jeroen Dekkers  <jeroen@dekkers.cx> | ||||||
| 
 | 
 | ||||||
| 	* conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Add normal/arg.c, | 	* conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Add normal/arg.c, | ||||||
|  |  | ||||||
							
								
								
									
										128
									
								
								conf/i386-pc.mk
									
										
									
									
									
								
							
							
						
						
									
										128
									
								
								conf/i386-pc.mk
									
										
									
									
									
								
							|  | @ -289,11 +289,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 \
 | ||||||
| 	kern/file.c kern/fs.c kern/env.c | 	fs/ufs.c fs/minix.c kern/file.c kern/fs.c kern/env.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-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-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.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-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-kern_file.d grub_setup-kern_fs.d grub_setup-kern_env.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-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-kern_file.o grub_setup-kern_fs.o grub_setup-kern_env.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 | ||||||
|  | @ -384,6 +384,22 @@ grub_setup-fs_ext2.d: fs/ext2.c | ||||||
| 
 | 
 | ||||||
| -include grub_setup-fs_ext2.d | -include grub_setup-fs_ext2.d | ||||||
| 
 | 
 | ||||||
|  | grub_setup-fs_ufs.o: fs/ufs.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grub_setup-fs_ufs.d: fs/ufs.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -M $< 	  | sed 's,ufs\.o[ :]*,grub_setup-fs_ufs.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grub_setup-fs_ufs.d | ||||||
|  | 
 | ||||||
|  | grub_setup-fs_minix.o: fs/minix.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grub_setup-fs_minix.d: fs/minix.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -M $< 	  | sed 's,minix\.o[ :]*,grub_setup-fs_minix.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grub_setup-fs_minix.d | ||||||
|  | 
 | ||||||
| grub_setup-kern_file.o: kern/file.c | grub_setup-kern_file.o: kern/file.c | ||||||
| 	$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -c -o $@ $< | 	$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_setup_CFLAGS) -c -o $@ $< | ||||||
| 
 | 
 | ||||||
|  | @ -415,13 +431,13 @@ grub_emu_SOURCES = kern/main.c kern/device.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		\
 | ||||||
| 	commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c		\
 | 	commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c		\
 | ||||||
| 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c			\
 | 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.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-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-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-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-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-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-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-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-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-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 | ||||||
|  | @ -592,6 +608,22 @@ grub_emu-fs_ext2.d: fs/ext2.c | ||||||
| 
 | 
 | ||||||
| -include grub_emu-fs_ext2.d | -include grub_emu-fs_ext2.d | ||||||
| 
 | 
 | ||||||
|  | grub_emu-fs_ufs.o: fs/ufs.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grub_emu-fs_ufs.d: fs/ufs.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $< 	  | sed 's,ufs\.o[ :]*,grub_emu-fs_ufs.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grub_emu-fs_ufs.d | ||||||
|  | 
 | ||||||
|  | grub_emu-fs_minix.o: fs/minix.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grub_emu-fs_minix.d: fs/minix.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $< 	  | sed 's,minix\.o[ :]*,grub_emu-fs_minix.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grub_emu-fs_minix.d | ||||||
|  | 
 | ||||||
| grub_emu-normal_cmdline.o: normal/cmdline.c | grub_emu-normal_cmdline.o: normal/cmdline.c | ||||||
| 	$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | 	$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | ||||||
| 
 | 
 | ||||||
|  | @ -684,7 +716,7 @@ genmoddep-util_genmoddep.d: util/genmoddep.c | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Modules.
 | # Modules.
 | ||||||
| pkgdata_MODULES = _chain.mod _linux.mod fat.mod ext2.mod normal.mod hello.mod \
 | pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod normal.mod hello.mod \
 | ||||||
| 	 vga.mod font.mod _multiboot.mod ls.mod boot.mod cmp.mod cat.mod terminal.mod | 	 vga.mod font.mod _multiboot.mod ls.mod boot.mod cmp.mod cat.mod terminal.mod | ||||||
| 
 | 
 | ||||||
| # For _chain.mod.
 | # For _chain.mod.
 | ||||||
|  | @ -804,6 +836,84 @@ ext2_mod-fs_ext2.d: fs/ext2.c | ||||||
| 
 | 
 | ||||||
| ext2_mod_CFLAGS = $(COMMON_CFLAGS) | ext2_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
| 
 | 
 | ||||||
|  | # For ufs.mod.
 | ||||||
|  | ufs_mod_SOURCES = fs/ufs.c | ||||||
|  | CLEANFILES += ufs.mod mod-ufs.o mod-ufs.c pre-ufs.o ufs_mod-fs_ufs.o def-ufs.lst und-ufs.lst | ||||||
|  | MOSTLYCLEANFILES += ufs_mod-fs_ufs.d | ||||||
|  | DEFSYMFILES += def-ufs.lst | ||||||
|  | UNDSYMFILES += und-ufs.lst | ||||||
|  | 
 | ||||||
|  | ufs.mod: pre-ufs.o mod-ufs.o | ||||||
|  | 	-rm -f $@ | ||||||
|  | 	$(LD) -r -o $@ $^ | ||||||
|  | 	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ | ||||||
|  | 
 | ||||||
|  | pre-ufs.o: ufs_mod-fs_ufs.o | ||||||
|  | 	-rm -f $@ | ||||||
|  | 	$(LD) -r -o $@ $^ | ||||||
|  | 
 | ||||||
|  | mod-ufs.o: mod-ufs.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) $(ufs_mod_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | mod-ufs.c: moddep.lst genmodsrc.sh | ||||||
|  | 	sh $(srcdir)/genmodsrc.sh 'ufs' $< > $@ || (rm -f $@; exit 1) | ||||||
|  | 
 | ||||||
|  | def-ufs.lst: pre-ufs.o | ||||||
|  | 	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 ufs/' > $@ | ||||||
|  | 
 | ||||||
|  | und-ufs.lst: pre-ufs.o | ||||||
|  | 	echo 'ufs' > $@ | ||||||
|  | 	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@ | ||||||
|  | 
 | ||||||
|  | ufs_mod-fs_ufs.o: fs/ufs.c | ||||||
|  | 	$(CC) -Ifs -I$(srcdir)/fs $(CPPFLAGS) $(CFLAGS) $(ufs_mod_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | ufs_mod-fs_ufs.d: fs/ufs.c | ||||||
|  | 	set -e; 	  $(CC) -Ifs -I$(srcdir)/fs $(CPPFLAGS) $(CFLAGS) $(ufs_mod_CFLAGS) -M $< 	  | sed 's,ufs\.o[ :]*,ufs_mod-fs_ufs.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include ufs_mod-fs_ufs.d | ||||||
|  | 
 | ||||||
|  | ufs_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
|  | 
 | ||||||
|  | # For minix.mod.
 | ||||||
|  | minix_mod_SOURCES = fs/minix.c | ||||||
|  | CLEANFILES += minix.mod mod-minix.o mod-minix.c pre-minix.o minix_mod-fs_minix.o def-minix.lst und-minix.lst | ||||||
|  | MOSTLYCLEANFILES += minix_mod-fs_minix.d | ||||||
|  | DEFSYMFILES += def-minix.lst | ||||||
|  | UNDSYMFILES += und-minix.lst | ||||||
|  | 
 | ||||||
|  | minix.mod: pre-minix.o mod-minix.o | ||||||
|  | 	-rm -f $@ | ||||||
|  | 	$(LD) -r -o $@ $^ | ||||||
|  | 	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ | ||||||
|  | 
 | ||||||
|  | pre-minix.o: minix_mod-fs_minix.o | ||||||
|  | 	-rm -f $@ | ||||||
|  | 	$(LD) -r -o $@ $^ | ||||||
|  | 
 | ||||||
|  | mod-minix.o: mod-minix.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) $(minix_mod_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | mod-minix.c: moddep.lst genmodsrc.sh | ||||||
|  | 	sh $(srcdir)/genmodsrc.sh 'minix' $< > $@ || (rm -f $@; exit 1) | ||||||
|  | 
 | ||||||
|  | def-minix.lst: pre-minix.o | ||||||
|  | 	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 minix/' > $@ | ||||||
|  | 
 | ||||||
|  | und-minix.lst: pre-minix.o | ||||||
|  | 	echo 'minix' > $@ | ||||||
|  | 	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@ | ||||||
|  | 
 | ||||||
|  | minix_mod-fs_minix.o: fs/minix.c | ||||||
|  | 	$(CC) -Ifs -I$(srcdir)/fs $(CPPFLAGS) $(CFLAGS) $(minix_mod_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | minix_mod-fs_minix.d: fs/minix.c | ||||||
|  | 	set -e; 	  $(CC) -Ifs -I$(srcdir)/fs $(CPPFLAGS) $(CFLAGS) $(minix_mod_CFLAGS) -M $< 	  | sed 's,minix\.o[ :]*,minix_mod-fs_minix.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include minix_mod-fs_minix.d | ||||||
|  | 
 | ||||||
|  | minix_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
|  | 
 | ||||||
| # For _linux.mod.
 | # For _linux.mod.
 | ||||||
| _linux_mod_SOURCES = loader/i386/pc/linux.c | _linux_mod_SOURCES = loader/i386/pc/linux.c | ||||||
| CLEANFILES += _linux.mod mod-_linux.o mod-_linux.c pre-_linux.o _linux_mod-loader_i386_pc_linux.o def-_linux.lst und-_linux.lst | CLEANFILES += _linux.mod mod-_linux.o mod-_linux.c pre-_linux.o _linux_mod-loader_i386_pc_linux.o def-_linux.lst und-_linux.lst | ||||||
|  |  | ||||||
|  | @ -56,7 +56,7 @@ 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 \ | ||||||
| 	kern/file.c kern/fs.c kern/env.c | 	fs/ufs.c fs/minix.c kern/file.c kern/fs.c kern/env.c | ||||||
| 
 | 
 | ||||||
| # For grub | # For grub | ||||||
| grub_emu_SOURCES = kern/main.c kern/device.c				\ | grub_emu_SOURCES = kern/main.c kern/device.c				\ | ||||||
|  | @ -64,7 +64,7 @@ grub_emu_SOURCES = kern/main.c kern/device.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		\ | ||||||
| 	commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c		\ | 	commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c		\ | ||||||
| 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c			\ | 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.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 | ||||||
| grub_emu_LDFLAGS = -lncurses | grub_emu_LDFLAGS = -lncurses | ||||||
|  | @ -73,7 +73,7 @@ grub_emu_LDFLAGS = -lncurses | ||||||
| genmoddep_SOURCES = util/genmoddep.c | genmoddep_SOURCES = util/genmoddep.c | ||||||
| 
 | 
 | ||||||
| # Modules. | # Modules. | ||||||
| pkgdata_MODULES = _chain.mod _linux.mod fat.mod ext2.mod normal.mod hello.mod \ | pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod normal.mod hello.mod \ | ||||||
| 	 vga.mod font.mod _multiboot.mod ls.mod boot.mod cmp.mod cat.mod terminal.mod | 	 vga.mod font.mod _multiboot.mod ls.mod boot.mod cmp.mod cat.mod terminal.mod | ||||||
| 
 | 
 | ||||||
| # For _chain.mod. | # For _chain.mod. | ||||||
|  | @ -88,6 +88,14 @@ fat_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
| ext2_mod_SOURCES = fs/ext2.c | ext2_mod_SOURCES = fs/ext2.c | ||||||
| ext2_mod_CFLAGS = $(COMMON_CFLAGS) | ext2_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
| 
 | 
 | ||||||
|  | # For ufs.mod. | ||||||
|  | ufs_mod_SOURCES = fs/ufs.c | ||||||
|  | ufs_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
|  | 
 | ||||||
|  | # For minix.mod. | ||||||
|  | minix_mod_SOURCES = fs/minix.c | ||||||
|  | minix_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
|  | 
 | ||||||
| # For _linux.mod. | # For _linux.mod. | ||||||
| _linux_mod_SOURCES = loader/i386/pc/linux.c | _linux_mod_SOURCES = loader/i386/pc/linux.c | ||||||
| _linux_mod_CFLAGS = $(COMMON_CFLAGS) | _linux_mod_CFLAGS = $(COMMON_CFLAGS) | ||||||
|  |  | ||||||
|  | @ -25,16 +25,16 @@ 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 					\
 | ||||||
| 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c			\
 | 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c	\
 | ||||||
| 	normal/cmdline.c normal/command.c normal/main.c normal/menu.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-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-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-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-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-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-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-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-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-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 | ||||||
|  | @ -157,6 +157,22 @@ grub_emu-fs_ext2.d: fs/ext2.c | ||||||
| 
 | 
 | ||||||
| -include grub_emu-fs_ext2.d | -include grub_emu-fs_ext2.d | ||||||
| 
 | 
 | ||||||
|  | grub_emu-fs_ufs.o: fs/ufs.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grub_emu-fs_ufs.d: fs/ufs.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $< 	  | sed 's,ufs\.o[ :]*,grub_emu-fs_ufs.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grub_emu-fs_ufs.d | ||||||
|  | 
 | ||||||
|  | grub_emu-fs_minix.o: fs/minix.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grub_emu-fs_minix.d: fs/minix.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $< 	  | sed 's,minix\.o[ :]*,grub_emu-fs_minix.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grub_emu-fs_minix.d | ||||||
|  | 
 | ||||||
| grub_emu-normal_cmdline.o: normal/cmdline.c | grub_emu-normal_cmdline.o: normal/cmdline.c | ||||||
| 	$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | 	$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $< | ||||||
| 
 | 
 | ||||||
|  | @ -284,14 +300,14 @@ grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.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/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 normal/cmdline.c \
 | 	kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c normal/cmdline.c \
 | ||||||
| 	normal/command.c normal/main.c normal/menu.c \
 | 	normal/command.c normal/main.c normal/menu.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 | 	kern/env.c normal/arg.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-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 | 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-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 | ||||||
| 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-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 | 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-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: 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-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: 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-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 | ||||||
| 	$(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 | ||||||
|  | @ -446,6 +462,22 @@ grubof-fs_ext2.d: fs/ext2.c | ||||||
| 
 | 
 | ||||||
| -include grubof-fs_ext2.d | -include grubof-fs_ext2.d | ||||||
| 
 | 
 | ||||||
|  | grubof-fs_ufs.o: fs/ufs.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grubof-fs_ufs.d: fs/ufs.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -M $< 	  | sed 's,ufs\.o[ :]*,grubof-fs_ufs.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grubof-fs_ufs.d | ||||||
|  | 
 | ||||||
|  | grubof-fs_minix.o: fs/minix.c | ||||||
|  | 	$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $< | ||||||
|  | 
 | ||||||
|  | grubof-fs_minix.d: fs/minix.c | ||||||
|  | 	set -e; 	  $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -M $< 	  | sed 's,minix\.o[ :]*,grubof-fs_minix.o $@ : ,g' > $@; 	  [ -s $@ ] || rm -f $@ | ||||||
|  | 
 | ||||||
|  | -include grubof-fs_minix.d | ||||||
|  | 
 | ||||||
| grubof-normal_cmdline.o: normal/cmdline.c | grubof-normal_cmdline.o: normal/cmdline.c | ||||||
| 	$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $< | 	$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grubof_CFLAGS) -c -o $@ $< | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ 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 					\ | ||||||
| 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c			\ | 	util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c	\ | ||||||
| 	normal/cmdline.c normal/command.c normal/main.c normal/menu.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 \ | ||||||
|  | @ -38,7 +38,7 @@ grubof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.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/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 normal/cmdline.c \ | 	kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c normal/cmdline.c \ | ||||||
| 	normal/command.c normal/main.c normal/menu.c \ | 	normal/command.c normal/main.c normal/menu.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 | 	kern/env.c normal/arg.c | ||||||
|  |  | ||||||
							
								
								
									
										621
									
								
								fs/minix.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										621
									
								
								fs/minix.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,621 @@ | ||||||
|  | /* minix.c - The minix filesystem, version 1 and 2.  */ | ||||||
|  | /*
 | ||||||
|  |  *  GRUB  --  GRand Unified Bootloader | ||||||
|  |  *  Copyright (C) 2004  Free Software Foundation, Inc. | ||||||
|  |  * | ||||||
|  |  *  This program 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 this program; if not, write to the Free Software | ||||||
|  |  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <grub/err.h> | ||||||
|  | #include <grub/file.h> | ||||||
|  | #include <grub/mm.h> | ||||||
|  | #include <grub/misc.h> | ||||||
|  | #include <grub/disk.h> | ||||||
|  | #include <grub/dl.h> | ||||||
|  | #include <grub/types.h> | ||||||
|  | 
 | ||||||
|  | #define GRUB_MINIX_MAGIC	0x137F | ||||||
|  | #define GRUB_MINIX2_MAGIC	0x2468 | ||||||
|  | #define GRUB_MINIX_MAGIC_30	0x138F | ||||||
|  | #define GRUB_MINIX2_MAGIC_30	0x2478 | ||||||
|  | #define GRUB_MINIX_BSIZE	1024U | ||||||
|  | #define GRUB_MINIX_LOG2_BSIZE	1 | ||||||
|  | #define GRUB_MINIX_ROOT_INODE	1 | ||||||
|  | #define GRUB_MINIX_MAX_SYMLNK_CNT	8 | ||||||
|  | #define GRUB_MINIX_SBLOCK	2 | ||||||
|  | 
 | ||||||
|  | #define GRUB_MINIX_IFDIR	0040000U | ||||||
|  | #define GRUB_MINIX_IFLNK	0120000U | ||||||
|  | 
 | ||||||
|  | #define GRUB_MINIX_INODE(data,field) (data->version == 1 ? \ | ||||||
|  |                            data->inode.  field : data->inode2.  field) | ||||||
|  | #define GRUB_MINIX_INODE_ENDIAN(data,field,bits1,bits2) (data->version == 1 ?	\ | ||||||
|  |                         grub_le_to_cpu##bits1 (data->inode.field) :		\ | ||||||
|  |                         grub_le_to_cpu##bits2 (data->inode2.field)) | ||||||
|  | #define GRUB_MINIX_INODE_SIZE(data) GRUB_MINIX_INODE_ENDIAN (data,size,16,32) | ||||||
|  | #define GRUB_MINIX_INODE_MODE(data) GRUB_MINIX_INODE_ENDIAN (data,mode,16,16) | ||||||
|  | #define GRUB_MINIX_INODE_DIR_ZONES(data,blk) GRUB_MINIX_INODE_ENDIAN		\ | ||||||
|  |                                                (data,dir_zones[blk],16,32) | ||||||
|  | #define GRUB_MINIX_INODE_INDIR_ZONE(data)				\ | ||||||
|  |                         GRUB_MINIX_INODE_ENDIAN (data,indir_zone,16,32) | ||||||
|  | #define GRUB_MINIX_INODE_DINDIR_ZONE(data)					\ | ||||||
|  |                         GRUB_MINIX_INODE_ENDIAN (data,double_indir_zone,16,32) | ||||||
|  | #define GRUB_MINIX_INODE_BLKSZ(data) (data->version == 1 ? 2 : 4) | ||||||
|  | #define GRUB_MINIX_LOG2_ZONESZ	(GRUB_MINIX_LOG2_BSIZE				\ | ||||||
|  | 				 + grub_le_to_cpu16 (sblock->log2_zone_size)) | ||||||
|  | #define GRUB_MINIX_ZONESZ	(GRUB_MINIX_BSIZE 				\ | ||||||
|  | 				 << grub_le_to_cpu16 (sblock->log2_zone_size)) | ||||||
|  | 
 | ||||||
|  | struct grub_minix_sblock | ||||||
|  | { | ||||||
|  |   grub_uint16_t inode_cnt; | ||||||
|  |   grub_uint16_t zone_cnt; | ||||||
|  |   grub_uint16_t inode_bmap_size; | ||||||
|  |   grub_uint16_t zone_bmap_size; | ||||||
|  |   grub_uint16_t first_data_zone; | ||||||
|  |   grub_uint16_t log2_zone_size; | ||||||
|  |   grub_uint32_t max_file_size; | ||||||
|  |   grub_uint16_t magic; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct grub_minix_inode | ||||||
|  | { | ||||||
|  |   grub_uint16_t mode; | ||||||
|  |   grub_uint16_t uid; | ||||||
|  |   grub_uint16_t size; | ||||||
|  |   grub_uint32_t ctime; | ||||||
|  |   grub_uint8_t gid; | ||||||
|  |   grub_uint8_t nlinks; | ||||||
|  |   grub_uint16_t dir_zones[7]; | ||||||
|  |   grub_uint16_t indir_zone; | ||||||
|  |   grub_uint16_t double_indir_zone; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct grub_minix2_inode | ||||||
|  | { | ||||||
|  |   grub_uint16_t mode; | ||||||
|  |   grub_uint16_t nlinks; | ||||||
|  |   grub_uint16_t uid; | ||||||
|  |   grub_uint16_t gid; | ||||||
|  |   grub_uint32_t size; | ||||||
|  |   grub_uint32_t atime; | ||||||
|  |   grub_uint32_t mtime; | ||||||
|  |   grub_uint32_t ctime; | ||||||
|  |   grub_uint32_t dir_zones[7]; | ||||||
|  |   grub_uint32_t indir_zone; | ||||||
|  |   grub_uint32_t double_indir_zone; | ||||||
|  |   grub_uint32_t unused; | ||||||
|  |    | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Information about a "mounted" minix filesystem.  */ | ||||||
|  | struct grub_minix_data | ||||||
|  | { | ||||||
|  |   struct grub_minix_sblock sblock; | ||||||
|  |   struct grub_minix_inode inode; | ||||||
|  |   struct grub_minix2_inode inode2; | ||||||
|  |   int ino; | ||||||
|  |   int linknest; | ||||||
|  |   grub_disk_t disk; | ||||||
|  |   int version; | ||||||
|  |   int filename_size; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #ifndef GRUB_UTIL | ||||||
|  | static grub_dl_t my_mod; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | static grub_err_t grub_minix_find_file (struct grub_minix_data *data, | ||||||
|  | 					const char *path); | ||||||
|  | 
 | ||||||
|  | static int | ||||||
|  | grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk) | ||||||
|  | { | ||||||
|  |   struct grub_minix_sblock *sblock = &data->sblock; | ||||||
|  |   int indir; | ||||||
|  | 
 | ||||||
|  |   /* Read the block pointer in ZONE, on the offset NUM.  */ | ||||||
|  |   int grub_get_indir (int zone, int num) | ||||||
|  |     { | ||||||
|  |       if (data->version == 1) | ||||||
|  | 	{ | ||||||
|  | 	  grub_uint16_t indir; | ||||||
|  | 	  grub_disk_read (data->disk, | ||||||
|  | 			  zone << GRUB_MINIX_LOG2_ZONESZ, | ||||||
|  | 			  sizeof (grub_uint16_t) * num, | ||||||
|  | 			  sizeof (grub_uint16_t), (char *) &indir); | ||||||
|  | 	  return grub_le_to_cpu16 (indir); | ||||||
|  | 	} | ||||||
|  |       else | ||||||
|  | 	{ | ||||||
|  | 	  grub_uint32_t indir; | ||||||
|  | 	  grub_disk_read (data->disk, | ||||||
|  | 			  zone << GRUB_MINIX_LOG2_ZONESZ, | ||||||
|  | 			  sizeof (grub_uint32_t) * num, | ||||||
|  | 			  sizeof (grub_uint32_t), (char *) &indir); | ||||||
|  | 	  return grub_le_to_cpu32 (indir); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   /* 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)) | ||||||
|  |     { | ||||||
|  |       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),  | ||||||
|  | 			      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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Read LEN bytes from the file described by DATA starting with byte
 | ||||||
|  |    POS.  Return the amount of read bytes in READ.  */ | ||||||
|  | static grub_ssize_t | ||||||
|  | grub_minix_read_file (struct grub_minix_data *data, | ||||||
|  | 		      void (*read_hook) (unsigned long sector, | ||||||
|  | 					 unsigned offset, unsigned length), | ||||||
|  | 		      int pos, unsigned int len, char *buf) | ||||||
|  | { | ||||||
|  |   struct grub_minix_sblock *sblock = &data->sblock; | ||||||
|  |   int i; | ||||||
|  |   int blockcnt; | ||||||
|  | 
 | ||||||
|  |   /* Adjust len so it we can't read past the end of the file.  */ | ||||||
|  |   if (len > GRUB_MINIX_INODE_SIZE (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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Read inode INO from the mounted filesystem described by DATA.  This
 | ||||||
|  |    inode is used by default now.  */ | ||||||
|  | static grub_err_t | ||||||
|  | grub_minix_read_inode (struct grub_minix_data *data, int ino) | ||||||
|  | { | ||||||
|  |   struct grub_minix_sblock *sblock = &data->sblock; | ||||||
|  | 
 | ||||||
|  |   /* Block in which the inode is stored.  */ | ||||||
|  |   int block; | ||||||
|  |   data->ino = 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  | ||||||
|  | 			 / sizeof (struct grub_minix_inode)) | ||||||
|  | 		  * sizeof (struct grub_minix_inode)); | ||||||
|  |        | ||||||
|  |       grub_disk_read (data->disk, block, offs, | ||||||
|  | 		      sizeof (struct grub_minix_inode), (char *) &data->inode); | ||||||
|  |     } | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       block += ino / (GRUB_DISK_SECTOR_SIZE  | ||||||
|  | 		      / sizeof (struct grub_minix2_inode)); | ||||||
|  |       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),(char *) &data->inode2); | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Lookup the symlink the current inode points to.  INO is the inode
 | ||||||
|  |    number of the directory the symlink is relative to.  */ | ||||||
|  | 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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Find the file with the pathname PATH on the filesystem described by
 | ||||||
|  |    DATA.  */ | ||||||
|  | static grub_err_t | ||||||
|  | grub_minix_find_file (struct grub_minix_data *data, const char *path) | ||||||
|  | { | ||||||
|  |   char fpath[grub_strlen (path)]; | ||||||
|  |   char *name = fpath; | ||||||
|  |   char *next; | ||||||
|  |   unsigned int pos = 0; | ||||||
|  |   int dirino; | ||||||
|  |    | ||||||
|  |   grub_strncpy (fpath, path, grub_strlen (path)); | ||||||
|  |    | ||||||
|  |   /* Skip the first slash.  */ | ||||||
|  |   if (name[0] == '/') | ||||||
|  |     { | ||||||
|  |       name++; | ||||||
|  |       if (!*name) | ||||||
|  | 	return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   /* Extract the actual part from the pathname.  */ | ||||||
|  |   next = grub_strchr (name, '/'); | ||||||
|  |   if (next) | ||||||
|  |     { | ||||||
|  |       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; | ||||||
|  |       if (grub_minix_read_file (data, 0, pos + sizeof (ino), | ||||||
|  | 				data->filename_size, (char *) filename)< 0) | ||||||
|  | 	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)  | ||||||
|  | 	       & 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) | ||||||
|  | 	    { | ||||||
|  | 	      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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Mount the filesystem on the disk DISK.  */ | ||||||
|  | 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),(char *) &data->sblock); | ||||||
|  | 
 | ||||||
|  |   if (grub_le_to_cpu16 (data->sblock.magic) == GRUB_MINIX_MAGIC) | ||||||
|  |     { | ||||||
|  |       data->version = 1; | ||||||
|  |       data->filename_size = 14; | ||||||
|  |     } | ||||||
|  |   else if (grub_le_to_cpu16 (data->sblock.magic) == GRUB_MINIX2_MAGIC) | ||||||
|  |     { | ||||||
|  |       data->version = 2; | ||||||
|  |       data->filename_size = 14; | ||||||
|  |     } | ||||||
|  |   else if (grub_le_to_cpu16 (data->sblock.magic) == GRUB_MINIX_MAGIC_30) | ||||||
|  |     { | ||||||
|  |       data->version = 1; | ||||||
|  |       data->filename_size = 30; | ||||||
|  |     } | ||||||
|  |   else if (grub_le_to_cpu16 (data->sblock.magic) == GRUB_MINIX2_MAGIC_30) | ||||||
|  |     { | ||||||
|  |       data->version = 2; | ||||||
|  |       data->filename_size = 30; | ||||||
|  |     } | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       grub_free (data); | ||||||
|  |       grub_error (GRUB_ERR_BAD_FS, "not an minix filesystem"); | ||||||
|  |       return 0; | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   data->disk = disk; | ||||||
|  |   data->linknest = 0; | ||||||
|  | 
 | ||||||
|  |   return data; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static grub_err_t | ||||||
|  | grub_minix_dir (grub_device_t device, const char *path,  | ||||||
|  | 		  int (*hook) (const char *filename, int dir)) | ||||||
|  | { | ||||||
|  |   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; | ||||||
|  |       char filename[data->filename_size + 1]; | ||||||
|  |       int dirino = data->ino; | ||||||
|  |        | ||||||
|  |       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)); | ||||||
|  |       if (hook (filename, ((GRUB_MINIX_INODE_MODE (data)  | ||||||
|  | 			    & GRUB_MINIX_IFDIR) == GRUB_MINIX_IFDIR)) ? 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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Open a file named NAME and initialize FILE.  */ | ||||||
|  | static grub_err_t | ||||||
|  | grub_minix_open (struct grub_file *file, const char *name) | ||||||
|  | { | ||||||
|  |   struct grub_minix_data *data; | ||||||
|  |   data = grub_minix_mount (file->device->disk); | ||||||
|  |   if (!data) | ||||||
|  |     return grub_errno; | ||||||
|  | 
 | ||||||
|  |   /* Open the inode op the root directory.  */ | ||||||
|  |   grub_minix_read_inode (data, GRUB_MINIX_ROOT_INODE); | ||||||
|  |   if (grub_errno) | ||||||
|  |     { | ||||||
|  |       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); | ||||||
|  |   if (grub_errno) | ||||||
|  |     { | ||||||
|  |       grub_free (data); | ||||||
|  |       return grub_errno; | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   file->data = data; | ||||||
|  |   file->size = GRUB_MINIX_INODE_SIZE (data); | ||||||
|  |    | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_ssize_t | ||||||
|  | grub_minix_read (grub_file_t file, char *buf, grub_ssize_t len) | ||||||
|  | { | ||||||
|  |   struct grub_minix_data *data =  | ||||||
|  |     (struct grub_minix_data *) file->data; | ||||||
|  |    | ||||||
|  |   return grub_minix_read_file (data, file->read_hook, file->offset, len, buf); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_err_t | ||||||
|  | grub_minix_close (grub_file_t file) | ||||||
|  | { | ||||||
|  |   grub_free (file->data); | ||||||
|  |    | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_err_t | ||||||
|  | grub_minix_label (grub_device_t device __attribute ((unused)), | ||||||
|  | 		char **label __attribute ((unused))) | ||||||
|  | { | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | static struct grub_fs grub_minix_fs = | ||||||
|  |   { | ||||||
|  |     .name = "minix", | ||||||
|  |     .dir = grub_minix_dir, | ||||||
|  |     .open = grub_minix_open, | ||||||
|  |     .read = grub_minix_read, | ||||||
|  |     .close = grub_minix_close, | ||||||
|  |     .label = grub_minix_label, | ||||||
|  |     .next = 0 | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_UTIL | ||||||
|  | void | ||||||
|  | grub_minix_init (void) | ||||||
|  | { | ||||||
|  |   grub_fs_register (&grub_minix_fs); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | grub_minix_fini (void) | ||||||
|  | { | ||||||
|  |   grub_fs_unregister (&grub_minix_fs); | ||||||
|  | } | ||||||
|  | #else /* ! GRUB_UTIL */ | ||||||
|  | GRUB_MOD_INIT | ||||||
|  | { | ||||||
|  |   grub_fs_register (&grub_minix_fs); | ||||||
|  |   my_mod = mod; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | GRUB_MOD_FINI | ||||||
|  | { | ||||||
|  |   grub_fs_unregister (&grub_minix_fs); | ||||||
|  | } | ||||||
|  | #endif /* ! GRUB_UTIL */ | ||||||
							
								
								
									
										690
									
								
								fs/ufs.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										690
									
								
								fs/ufs.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,690 @@ | ||||||
|  | /* ufs.c - Unix File System */ | ||||||
|  | /*
 | ||||||
|  |  *  GRUB  --  GRand Unified Bootloader | ||||||
|  |  *  Copyright (C) 2004  Free Software Foundation, Inc. | ||||||
|  |  * | ||||||
|  |  *  This program 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 this program; if not, write to the Free Software | ||||||
|  |  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <grub/err.h> | ||||||
|  | #include <grub/file.h> | ||||||
|  | #include <grub/mm.h> | ||||||
|  | #include <grub/misc.h> | ||||||
|  | #include <grub/disk.h> | ||||||
|  | #include <grub/dl.h> | ||||||
|  | #include <grub/types.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #define GRUB_UFS_MAGIC		0x11954 | ||||||
|  | #define GRUB_UFS2_MAGIC		0x19540119 | ||||||
|  | #define GRUB_UFS_INODE		2 | ||||||
|  | #define GRUB_UFS_FILETYPE_DIR	4 | ||||||
|  | #define GRUB_UFS_FILETYPE_LNK	10 | ||||||
|  | #define GRUB_UFS_MAX_SYMLNK_CNT	8 | ||||||
|  | 
 | ||||||
|  | #define GRUB_UFS_DIRBLKS	12 | ||||||
|  | #define GRUB_UFS_INDIRBLKS	3 | ||||||
|  | 
 | ||||||
|  | #define GRUB_UFS_ATTR_DIR	040000 | ||||||
|  | 
 | ||||||
|  | /* Calculate in which group the inode can be found.  */ | ||||||
|  | #define inode_group(inode,sblock) () | ||||||
|  | 
 | ||||||
|  | #define UFS_BLKSZ(sblock) (grub_le_to_cpu32 (sblock->bsize)) | ||||||
|  | 
 | ||||||
|  | #define INODE(data,field) (data->ufs_type == UFS1 ? \ | ||||||
|  |                            data->inode.  field : data->inode2.  field) | ||||||
|  | #define INODE_ENDIAN(data,field,bits1,bits2) (data->ufs_type == UFS1 ? \ | ||||||
|  |                            grub_le_to_cpu##bits1 (data->inode.field) : \ | ||||||
|  |                            grub_le_to_cpu##bits2 (data->inode2.field)) | ||||||
|  | #define INODE_SIZE(data) INODE_ENDIAN (data,size,32,64) | ||||||
|  | #define INODE_MODE(data) INODE_ENDIAN (data,mode,16,16) | ||||||
|  | #define INODE_BLKSZ(data) (data->ufs_type == UFS1 ? 32 : 64) | ||||||
|  | #define INODE_DIRBLOCKS(data,blk) INODE_ENDIAN \ | ||||||
|  |                                    (data,blocks.dir_blocks[blk],32,64) | ||||||
|  | #define INODE_INDIRBLOCKS(data,blk) INODE_ENDIAN \ | ||||||
|  |                                      (data,blocks.indir_blocks[blk],32,64) | ||||||
|  | 
 | ||||||
|  | /* The blocks on which the superblock can be found.  */ | ||||||
|  | static int sblocklist[] = { 128, 16, 0, 512, -1 }; | ||||||
|  | 
 | ||||||
|  | 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[20]; | ||||||
|  |    | ||||||
|  |   /* The size of a block in bytes.  */ | ||||||
|  |   grub_int32_t bsize; | ||||||
|  |   grub_uint8_t unused4[48]; | ||||||
|  |    | ||||||
|  |   /* The size of filesystem blocks to disk blocks.  */ | ||||||
|  |   grub_uint32_t log2_blksz; | ||||||
|  |   grub_uint8_t unused5[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[1180]; | ||||||
|  |    | ||||||
|  |   /* Magic value to check if this is really a UFS filesystem.  */ | ||||||
|  |   grub_uint32_t magic; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* UFS inode.  */ | ||||||
|  | struct grub_ufs_inode | ||||||
|  | { | ||||||
|  |   grub_uint16_t mode; | ||||||
|  |   grub_uint16_t nlinks; | ||||||
|  |   grub_uint16_t uid; | ||||||
|  |   grub_uint16_t gid; | ||||||
|  |   grub_int64_t size; | ||||||
|  |   grub_uint64_t atime; | ||||||
|  |   grub_uint64_t mtime; | ||||||
|  |   grub_uint64_t ctime; | ||||||
|  |   union | ||||||
|  |   { | ||||||
|  |     struct | ||||||
|  |     { | ||||||
|  |       grub_uint32_t dir_blocks[GRUB_UFS_DIRBLKS]; | ||||||
|  |       grub_uint32_t indir_blocks[GRUB_UFS_INDIRBLKS]; | ||||||
|  |     } blocks; | ||||||
|  |     grub_uint8_t symlink[(GRUB_UFS_DIRBLKS + GRUB_UFS_INDIRBLKS) * 4]; | ||||||
|  |   }; | ||||||
|  |   grub_uint32_t flags; | ||||||
|  |   grub_uint32_t nblocks; | ||||||
|  |   grub_uint32_t gen; | ||||||
|  |   grub_uint32_t unused; | ||||||
|  |   grub_uint8_t pad[12]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* UFS inode.  */ | ||||||
|  | struct grub_ufs2_inode | ||||||
|  | { | ||||||
|  |   grub_uint16_t mode; | ||||||
|  |   grub_uint16_t nlinks; | ||||||
|  |   grub_uint32_t uid; | ||||||
|  |   grub_uint32_t gid; | ||||||
|  |   grub_uint32_t blocksize; | ||||||
|  |   grub_int64_t size; | ||||||
|  |   grub_int64_t nblocks; | ||||||
|  |   grub_uint64_t atime; | ||||||
|  |   grub_uint64_t mtime; | ||||||
|  |   grub_uint64_t ctime; | ||||||
|  |   grub_uint64_t create_time; | ||||||
|  |   grub_uint32_t atime_sec; | ||||||
|  |   grub_uint32_t mtime_sec; | ||||||
|  |   grub_uint32_t ctime_sec; | ||||||
|  |   grub_uint32_t create_time_sec; | ||||||
|  |   grub_uint32_t gen; | ||||||
|  |   grub_uint32_t kernel_flags; | ||||||
|  |   grub_uint32_t flags; | ||||||
|  |   grub_uint32_t extsz; | ||||||
|  |   grub_uint64_t ext[2]; | ||||||
|  |   union | ||||||
|  |   { | ||||||
|  |     struct | ||||||
|  |     { | ||||||
|  |       grub_uint64_t dir_blocks[GRUB_UFS_DIRBLKS]; | ||||||
|  |       grub_uint64_t indir_blocks[GRUB_UFS_INDIRBLKS]; | ||||||
|  |     } blocks; | ||||||
|  |     grub_uint8_t symlink[(GRUB_UFS_DIRBLKS + GRUB_UFS_INDIRBLKS) * 8]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   grub_uint8_t unused[24]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Directory entry.  */ | ||||||
|  | struct grub_ufs_dirent | ||||||
|  | { | ||||||
|  |   grub_uint32_t ino; | ||||||
|  |   grub_uint16_t direntlen; | ||||||
|  |   grub_uint8_t filetype; | ||||||
|  |   grub_uint8_t namelen; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Information about a "mounted" ufs filesystem.  */ | ||||||
|  | struct grub_ufs_data | ||||||
|  | { | ||||||
|  |   struct grub_ufs_sblock sblock; | ||||||
|  |   grub_disk_t disk; | ||||||
|  |   union | ||||||
|  |   { | ||||||
|  |     struct grub_ufs_inode inode; | ||||||
|  |     struct grub_ufs2_inode inode2; | ||||||
|  |   }; | ||||||
|  |   enum | ||||||
|  |     { | ||||||
|  |       UFS1, | ||||||
|  |       UFS2, | ||||||
|  |       UNKNOWN | ||||||
|  |     } ufs_type; | ||||||
|  |   int ino; | ||||||
|  |   int linknest; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #ifndef GRUB_UTIL | ||||||
|  | static grub_dl_t my_mod; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Forward declaration.  */ | ||||||
|  | static grub_err_t grub_ufs_find_file (struct grub_ufs_data *data, | ||||||
|  | 				      const char *path); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static int | ||||||
|  | grub_ufs_get_file_block (struct grub_ufs_data *data, unsigned int blk) | ||||||
|  | { | ||||||
|  |   struct grub_ufs_sblock *sblock = &data->sblock; | ||||||
|  |   unsigned int indirsz; | ||||||
|  |    | ||||||
|  |   /* Direct.  */ | ||||||
|  |   if (blk < GRUB_UFS_DIRBLKS) | ||||||
|  |     return INODE_DIRBLOCKS (data, blk); | ||||||
|  |    | ||||||
|  |   blk -= GRUB_UFS_DIRBLKS; | ||||||
|  |    | ||||||
|  |   indirsz = UFS_BLKSZ (sblock) / INODE_BLKSZ (data); | ||||||
|  |   /* Single indirect block.  */ | ||||||
|  |   if (blk < indirsz) | ||||||
|  |     { | ||||||
|  |       grub_uint32_t indir[UFS_BLKSZ (sblock)]; | ||||||
|  |       grub_disk_read (data->disk, INODE_INDIRBLOCKS (data, 0), | ||||||
|  | 		      0, sizeof (indir), (char *) indir); | ||||||
|  |       return indir[blk]; | ||||||
|  |     } | ||||||
|  |   blk -= indirsz; | ||||||
|  |    | ||||||
|  |   /* Double indirect block.  */ | ||||||
|  |   if (blk < UFS_BLKSZ (sblock) / indirsz) | ||||||
|  |     { | ||||||
|  |       grub_uint32_t indir[UFS_BLKSZ (sblock)]; | ||||||
|  |        | ||||||
|  |       grub_disk_read (data->disk, INODE_INDIRBLOCKS (data, 1), | ||||||
|  | 		      0, sizeof (indir), (char *) indir); | ||||||
|  |       grub_disk_read (data->disk,  indir[blk / indirsz], | ||||||
|  | 		      0, sizeof (indir), (char *) indir); | ||||||
|  |        | ||||||
|  |       return indir[blk % indirsz]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, | ||||||
|  | 	      "ufs does not support tripple indirect blocks"); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Read LEN bytes from the file described by DATA starting with byte
 | ||||||
|  |    POS.  Return the amount of read bytes in READ.  */ | ||||||
|  | static grub_ssize_t | ||||||
|  | grub_ufs_read_file (struct grub_ufs_data *data, | ||||||
|  | 		    void (*read_hook) (unsigned long sector, | ||||||
|  | 				       unsigned offset, unsigned length), | ||||||
|  | 		    int pos, unsigned int len, char *buf) | ||||||
|  | { | ||||||
|  |   struct grub_ufs_sblock *sblock = &data->sblock; | ||||||
|  |   int i; | ||||||
|  |   int blockcnt; | ||||||
|  | 
 | ||||||
|  |   /* Adjust len so it we can't read past the end of the file.  */ | ||||||
|  |   if (len > INODE_SIZE (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) | ||||||
|  | 	{ | ||||||
|  | 	  data->disk->read_hook = read_hook; | ||||||
|  | 	  grub_disk_read (data->disk, | ||||||
|  | 			  blknr << grub_le_to_cpu32 (data->sblock.log2_blksz), | ||||||
|  | 			  skipfirst, blockend, buf); | ||||||
|  | 	  data->disk->read_hook = 0; | ||||||
|  | 	  if (grub_errno) | ||||||
|  | 	    return -1; | ||||||
|  | 	} | ||||||
|  |       else | ||||||
|  | 	grub_memset (buf, UFS_BLKSZ (sblock) - skipfirst, 0); | ||||||
|  | 
 | ||||||
|  |       buf += UFS_BLKSZ (sblock) - skipfirst; | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   return len; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Read inode INO from the mounted filesystem described by DATA.  This
 | ||||||
|  |    inode is used by default now.  */ | ||||||
|  | static grub_err_t | ||||||
|  | grub_ufs_read_inode (struct grub_ufs_data *data, int ino) | ||||||
|  | { | ||||||
|  |   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) | ||||||
|  |     { | ||||||
|  |       struct grub_ufs_inode *inode = &data->inode; | ||||||
|  |        | ||||||
|  |       grub_disk_read (data->disk, | ||||||
|  | 		      (((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk) | ||||||
|  | 			<< grub_le_to_cpu32 (data->sblock.log2_blksz))) | ||||||
|  | 		      + grpino / 4, | ||||||
|  | 		      (grpino % 4) * sizeof (struct grub_ufs_inode), | ||||||
|  | 		      sizeof (struct grub_ufs_inode), | ||||||
|  | 		      (char *) inode); | ||||||
|  |     } | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       struct grub_ufs2_inode *inode = &data->inode2; | ||||||
|  |        | ||||||
|  |       grub_disk_read (data->disk, | ||||||
|  | 		      (((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk) | ||||||
|  | 			<< grub_le_to_cpu32 (data->sblock.log2_blksz))) | ||||||
|  | 		      + grpino / 2, | ||||||
|  | 		      (grpino % 2) * sizeof (struct grub_ufs2_inode), | ||||||
|  | 		      sizeof (struct grub_ufs2_inode), | ||||||
|  | 		      (char *) inode); | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   data->ino = ino; | ||||||
|  |   return grub_errno; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Lookup the symlink the current inode points to.  INO is the inode
 | ||||||
|  |    number of the directory the symlink is relative to.  */ | ||||||
|  | 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_SIZE (data) < (GRUB_UFS_DIRBLKS + GRUB_UFS_INDIRBLKS | ||||||
|  | 			  * INODE_BLKSZ (data))) | ||||||
|  |     grub_strcpy (symlink, INODE (data, symlink)); | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       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'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   /* 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)) | ||||||
|  |     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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Find the file with the pathname PATH on the filesystem described by
 | ||||||
|  |    DATA.  */ | ||||||
|  | static grub_err_t | ||||||
|  | grub_ufs_find_file (struct grub_ufs_data *data, const char *path) | ||||||
|  | { | ||||||
|  |   char fpath[grub_strlen (path)]; | ||||||
|  |   char *name = fpath; | ||||||
|  |   char *next; | ||||||
|  |   unsigned int pos = 0; | ||||||
|  |   int dirino; | ||||||
|  |    | ||||||
|  |   grub_strncpy (fpath, path, grub_strlen (path)); | ||||||
|  |    | ||||||
|  |   /* Skip the first slash.  */ | ||||||
|  |   if (name[0] == '/') | ||||||
|  |     { | ||||||
|  |       name++; | ||||||
|  |       if (!*name) | ||||||
|  | 	return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   /* Extract the actual part from the pathname.  */ | ||||||
|  |   next = grub_strchr (name, '/'); | ||||||
|  |   if (next) | ||||||
|  |     { | ||||||
|  |       next[0] = '\0'; | ||||||
|  |       next++; | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   do | ||||||
|  |     { | ||||||
|  |       struct grub_ufs_dirent dirent; | ||||||
|  |        | ||||||
|  |       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; | ||||||
|  |        | ||||||
|  |       { | ||||||
|  | 	char filename[dirent.namelen + 1]; | ||||||
|  | 
 | ||||||
|  | 	if (grub_ufs_read_file (data, 0, pos + sizeof (dirent), | ||||||
|  | 				dirent.namelen, filename) < 0) | ||||||
|  | 	  return grub_errno; | ||||||
|  | 	 | ||||||
|  | 	filename[dirent.namelen] = '\0'; | ||||||
|  | 	 | ||||||
|  | 	if (!grub_strcmp (name, filename)) | ||||||
|  | 	  { | ||||||
|  | 	    dirino = data->ino; | ||||||
|  | 	    grub_ufs_read_inode (data, grub_le_to_cpu32 (dirent.ino)); | ||||||
|  | 	     | ||||||
|  | 	    if (dirent.filetype == GRUB_UFS_FILETYPE_LNK) | ||||||
|  | 	      { | ||||||
|  | 		grub_ufs_lookup_symlink (data, dirino); | ||||||
|  | 		if (grub_errno) | ||||||
|  | 		  return grub_errno; | ||||||
|  | 	      } | ||||||
|  | 
 | ||||||
|  | 	    if (!next) | ||||||
|  | 	      return 0; | ||||||
|  | 
 | ||||||
|  | 	    pos = 0; | ||||||
|  | 
 | ||||||
|  | 	    name = next; | ||||||
|  | 	    next = grub_strchr (name, '/'); | ||||||
|  | 	    if (next) | ||||||
|  | 	      { | ||||||
|  | 		next[0] = '\0'; | ||||||
|  | 		next++; | ||||||
|  | 	      } | ||||||
|  | 	     | ||||||
|  | 	    if (!(dirent.filetype & GRUB_UFS_FILETYPE_DIR)) | ||||||
|  | 	      return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory"); | ||||||
|  | 	     | ||||||
|  | 	    continue; | ||||||
|  | 	  } | ||||||
|  |       } | ||||||
|  |        | ||||||
|  |       pos += grub_le_to_cpu16 (dirent.direntlen); | ||||||
|  |     } while (pos < grub_le_to_cpu32 (INODE_SIZE (data))); | ||||||
|  |    | ||||||
|  |   grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found"); | ||||||
|  |   return grub_errno; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Mount the filesystem on the disk DISK.  */ | ||||||
|  | static struct grub_ufs_data * | ||||||
|  | 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) | ||||||
|  |     { | ||||||
|  |       grub_disk_read (disk, *sblklist, 0, sizeof (struct grub_ufs_sblock), | ||||||
|  | 		      (char *) &data->sblock); | ||||||
|  |       if (grub_errno) | ||||||
|  | 	goto fail; | ||||||
|  |        | ||||||
|  |       if (grub_le_to_cpu32 (data->sblock.magic) == GRUB_UFS_MAGIC) | ||||||
|  | 	{ | ||||||
|  | 	  data->ufs_type = UFS1; | ||||||
|  | 	  break; | ||||||
|  | 	} | ||||||
|  |       else if (grub_le_to_cpu32 (data->sblock.magic) == GRUB_UFS2_MAGIC) | ||||||
|  | 	{ | ||||||
|  | 	  data->ufs_type = UFS2; | ||||||
|  | 	  break; | ||||||
|  | 	} | ||||||
|  |       sblklist++; | ||||||
|  |     } | ||||||
|  |   if (data->ufs_type == UNKNOWN) | ||||||
|  |     { | ||||||
|  |       grub_error (GRUB_ERR_BAD_FS, "not an ufs filesystem"); | ||||||
|  |       goto fail; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   data->disk = disk; | ||||||
|  |   data->linknest = 0; | ||||||
|  |   return data; | ||||||
|  | 
 | ||||||
|  |  fail: | ||||||
|  |   grub_free (data); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_err_t | ||||||
|  | grub_ufs_dir (grub_device_t device, const char *path,  | ||||||
|  | 	       int (*hook) (const char *filename, int dir)) | ||||||
|  | { | ||||||
|  |   struct grub_ufs_data *data; | ||||||
|  |   struct grub_ufs_sblock *sblock; | ||||||
|  |   unsigned int pos = 0; | ||||||
|  | 
 | ||||||
|  |   data = grub_ufs_mount (device->disk); | ||||||
|  |   if (!data) | ||||||
|  |     return grub_errno; | ||||||
|  |    | ||||||
|  |   grub_ufs_read_inode (data, GRUB_UFS_INODE); | ||||||
|  |   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;   | ||||||
|  |    | ||||||
|  |   if (!(INODE_MODE (data) & 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; | ||||||
|  |        | ||||||
|  |       if (grub_ufs_read_file (data, 0, pos, sizeof (dirent), | ||||||
|  | 			      (char *) &dirent) < 0) | ||||||
|  | 	break; | ||||||
|  |        | ||||||
|  |       { | ||||||
|  | 	char filename[dirent.namelen + 1]; | ||||||
|  | 	 | ||||||
|  | 	if (grub_ufs_read_file (data, 0, pos + sizeof (dirent), | ||||||
|  | 				dirent.namelen, filename) < 0) | ||||||
|  | 	  break; | ||||||
|  | 	 | ||||||
|  | 	filename[dirent.namelen] = '\0'; | ||||||
|  | 	if (hook (filename, dirent.filetype == GRUB_UFS_FILETYPE_DIR)) | ||||||
|  | 	  break; | ||||||
|  |       } | ||||||
|  |        | ||||||
|  |       pos += grub_le_to_cpu16 (dirent.direntlen); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |  fail: | ||||||
|  |   grub_free (data); | ||||||
|  | 
 | ||||||
|  |   return grub_errno; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Open a file named NAME and initialize FILE.  */ | ||||||
|  | static grub_err_t | ||||||
|  | grub_ufs_open (struct grub_file *file, const char *name) | ||||||
|  | { | ||||||
|  |   struct grub_ufs_data *data; | ||||||
|  |   data = grub_ufs_mount (file->device->disk); | ||||||
|  |   if (!data) | ||||||
|  |     return grub_errno; | ||||||
|  |    | ||||||
|  |   grub_ufs_read_inode (data, 2); | ||||||
|  |   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); | ||||||
|  | 
 | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_ssize_t | ||||||
|  | grub_ufs_read (grub_file_t file, char *buf, grub_ssize_t len) | ||||||
|  | { | ||||||
|  |   struct grub_ufs_data *data =  | ||||||
|  |     (struct grub_ufs_data *) file->data; | ||||||
|  |    | ||||||
|  |   return grub_ufs_read_file (data, file->read_hook, file->offset, len, buf); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_err_t | ||||||
|  | grub_ufs_close (grub_file_t file) | ||||||
|  | { | ||||||
|  |   grub_free (file->data); | ||||||
|  |    | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static grub_err_t | ||||||
|  | grub_ufs_label (grub_device_t device __attribute ((unused)), | ||||||
|  | 		char **label __attribute ((unused))) | ||||||
|  | { | ||||||
|  |   return GRUB_ERR_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | static struct grub_fs grub_ufs_fs = | ||||||
|  |   { | ||||||
|  |     .name = "ufs", | ||||||
|  |     .dir = grub_ufs_dir, | ||||||
|  |     .open = grub_ufs_open, | ||||||
|  |     .read = grub_ufs_read, | ||||||
|  |     .close = grub_ufs_close, | ||||||
|  |     .label = grub_ufs_label, | ||||||
|  |     .next = 0 | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_UTIL | ||||||
|  | void | ||||||
|  | grub_ufs_init (void) | ||||||
|  | { | ||||||
|  |   grub_fs_register (&grub_ufs_fs); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | grub_ufs_fini (void) | ||||||
|  | { | ||||||
|  |   grub_fs_unregister (&grub_ufs_fs); | ||||||
|  | } | ||||||
|  | #else /* ! GRUB_UTIL */ | ||||||
|  | GRUB_MOD_INIT | ||||||
|  | { | ||||||
|  |   grub_fs_register (&grub_ufs_fs); | ||||||
|  |   my_mod = mod; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | GRUB_MOD_FINI | ||||||
|  | { | ||||||
|  |   grub_fs_unregister (&grub_ufs_fs); | ||||||
|  | } | ||||||
|  | #endif /* ! GRUB_UTIL */ | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| /* fs.h - filesystem manager */ | /* fs.h - filesystem manager */ | ||||||
| /*
 | /*
 | ||||||
|  *  GRUB  --  GRand Unified Bootloader |  *  GRUB  --  GRand Unified Bootloader | ||||||
|  *  Copyright (C) 2002,2003  Free Software Foundation, Inc. |  *  Copyright (C) 2002,2003,2004  Free Software Foundation, Inc. | ||||||
|  * |  * | ||||||
|  *  GRUB is free software; you can redistribute it and/or modify |  *  GRUB is free software; you can redistribute it and/or modify | ||||||
|  *  it under the terms of the GNU General Public License as published by |  *  it under the terms of the GNU General Public License as published by | ||||||
|  | @ -70,6 +70,10 @@ void grub_fat_init (void); | ||||||
| void grub_fat_fini (void); | void grub_fat_fini (void); | ||||||
| void grub_ext2_init (void); | void grub_ext2_init (void); | ||||||
| void grub_ext2_fini (void); | void grub_ext2_fini (void); | ||||||
|  | void grub_ufs_init (void); | ||||||
|  | void grub_ufs_fini (void); | ||||||
|  | void grub_minix_init (void); | ||||||
|  | void grub_minix_fini (void); | ||||||
| #endif /* GRUB_UTIL */ | #endif /* GRUB_UTIL */ | ||||||
| 
 | 
 | ||||||
| #endif /* ! GRUB_FS_HEADER */ | #endif /* ! GRUB_FS_HEADER */ | ||||||
|  |  | ||||||
|  | @ -158,6 +158,8 @@ main (int argc, char *argv[]) | ||||||
|   /* Initialize the default modules.  */ |   /* Initialize the default modules.  */ | ||||||
|   grub_fat_init (); |   grub_fat_init (); | ||||||
|   grub_ext2_init (); |   grub_ext2_init (); | ||||||
|  |   grub_ufs_init (); | ||||||
|  |   grub_minix_init (); | ||||||
|   grub_ls_init (); |   grub_ls_init (); | ||||||
|   grub_boot_init (); |   grub_boot_init (); | ||||||
|   grub_cmp_init (); |   grub_cmp_init (); | ||||||
|  | @ -172,7 +174,9 @@ main (int argc, char *argv[]) | ||||||
| 
 | 
 | ||||||
|   grub_util_biosdisk_fini (); |   grub_util_biosdisk_fini (); | ||||||
|   grub_normal_fini (); |   grub_normal_fini (); | ||||||
|  |   grub_ufs_fini (); | ||||||
|   grub_ext2_fini (); |   grub_ext2_fini (); | ||||||
|  |   grub_minix_fini (); | ||||||
|   grub_fat_fini (); |   grub_fat_fini (); | ||||||
|   grub_boot_fini (); |   grub_boot_fini (); | ||||||
|   grub_cmp_fini (); |   grub_cmp_fini (); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue