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> | ||||
| 
 | ||||
| 	* 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 \
 | ||||
| 	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/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 | ||||
| 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 | ||||
| 	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-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-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) | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| 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 | ||||
| 	$(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		\
 | ||||
| 	disk/i386/pc/partition.c kern/env.c commands/ls.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	\
 | ||||
| 	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 | ||||
| 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 | ||||
| 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-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) | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| 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 | ||||
| 	$(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.
 | ||||
| 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 | ||||
| 
 | ||||
| # For _chain.mod.
 | ||||
|  | @ -804,6 +836,84 @@ ext2_mod-fs_ext2.d: fs/ext2.c | |||
| 
 | ||||
| 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.
 | ||||
| _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 | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ grub_mkimage_LDFLAGS = -llzo | |||
| 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 \ | ||||
| 	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 | ||||
| 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		\ | ||||
| 	disk/i386/pc/partition.c kern/env.c commands/ls.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	\ | ||||
| 	util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c | ||||
| grub_emu_LDFLAGS = -lncurses | ||||
|  | @ -73,7 +73,7 @@ grub_emu_LDFLAGS = -lncurses | |||
| genmoddep_SOURCES = util/genmoddep.c | ||||
| 
 | ||||
| # 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 | ||||
| 
 | ||||
| # For _chain.mod. | ||||
|  | @ -88,6 +88,14 @@ fat_mod_CFLAGS = $(COMMON_CFLAGS) | |||
| ext2_mod_SOURCES = fs/ext2.c | ||||
| 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. | ||||
| _linux_mod_SOURCES = loader/i386/pc/linux.c | ||||
| _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/misc.c kern/loader.c kern/rescue.c kern/term.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/arg.c	\
 | ||||
| 	util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c \
 | ||||
| 	kern/env.c commands/ls.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 | ||||
| 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 | ||||
| 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-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) | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| 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 | ||||
| 	$(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/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/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 \
 | ||||
| 	disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.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 | ||||
| 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 | ||||
| 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-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) | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| 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 | ||||
| 	$(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/misc.c kern/loader.c kern/rescue.c kern/term.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/arg.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/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/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 \ | ||||
| 	disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.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 */ | ||||
| /*
 | ||||
|  *  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 | ||||
|  *  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_ext2_init (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_FS_HEADER */ | ||||
|  |  | |||
|  | @ -158,6 +158,8 @@ main (int argc, char *argv[]) | |||
|   /* Initialize the default modules.  */ | ||||
|   grub_fat_init (); | ||||
|   grub_ext2_init (); | ||||
|   grub_ufs_init (); | ||||
|   grub_minix_init (); | ||||
|   grub_ls_init (); | ||||
|   grub_boot_init (); | ||||
|   grub_cmp_init (); | ||||
|  | @ -172,7 +174,9 @@ main (int argc, char *argv[]) | |||
| 
 | ||||
|   grub_util_biosdisk_fini (); | ||||
|   grub_normal_fini (); | ||||
|   grub_ufs_fini (); | ||||
|   grub_ext2_fini (); | ||||
|   grub_minix_fini (); | ||||
|   grub_fat_fini (); | ||||
|   grub_boot_fini (); | ||||
|   grub_cmp_fini (); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue