Hi,

I thought it would be a good idea to split tar & cpio into separate modules
to save some space and make things easier to figure out for the users.  I
managed to do this without duplicating code, with a bit of pre-processor
magic.

The saved size is not much, though (~400 bytes).  But users looking for tar
will find it more easily.  How do you feel about this? Is it worth it?

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
Index: conf/common.rmk
===================================================================
--- conf/common.rmk	(revision 1903)
+++ conf/common.rmk	(working copy)
@@ -17,7 +17,7 @@ grub_probe_SOURCES = util/grub-probe.c	\
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c		\
-	fs/ufs.c fs/xfs.c fs/afs.c				\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c			\
 	\
 	partmap/pc.c partmap/apple.c partmap/gpt.c 		\
 	kern/fs.c kern/env.c fs/fshelp.c			\
@@ -37,7 +37,7 @@ grub_fstest_SOURCES = util/grub-fstest.c
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c					\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
 	\
 	kern/partition.c partmap/pc.c partmap/apple.c partmap/gpt.c 	\
 	kern/fs.c kern/env.c fs/fshelp.c disk/lvm.c disk/raid.c		\
@@ -150,8 +150,8 @@ grub-mkconfig_DATA += util/grub.d/README
 # Filing systems.
 pkglib_MODULES += fshelp.mod fat.mod ufs.mod ext2.mod ntfs.mod		\
 	ntfscomp.mod minix.mod hfs.mod jfs.mod iso9660.mod xfs.mod	\
-	affs.mod sfs.mod hfsplus.mod reiserfs.mod cpio.mod udf.mod	\
-	afs.mod
+	affs.mod sfs.mod hfsplus.mod reiserfs.mod cpio.mod tar.mod	\
+	udf.mod	afs.mod
 
 # For fshelp.mod.
 fshelp_mod_SOURCES = fs/fshelp.c
@@ -233,6 +233,11 @@ cpio_mod_SOURCES = fs/cpio.c
 cpio_mod_CFLAGS = $(COMMON_CFLAGS)
 cpio_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For tar.mod.
+tar_mod_SOURCES = fs/cpio.c
+tar_mod_CFLAGS = $(COMMON_CFLAGS) -DMODE_USTAR
+tar_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 # For udf.mod.
 udf_mod_SOURCES = fs/udf.c
 udf_mod_CFLAGS = $(COMMON_CFLAGS)
Index: conf/i386-pc.rmk
===================================================================
--- conf/i386-pc.rmk	(revision 1903)
+++ conf/i386-pc.rmk	(working copy)
@@ -99,7 +99,7 @@ grub_setup_SOURCES = util/i386/pc/grub-s
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c		\
-	fs/ufs.c fs/xfs.c fs/afs.c				\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c			\
 	\
 	partmap/pc.c partmap/gpt.c				\
 	\
@@ -136,7 +136,7 @@ grub_emu_SOURCES = commands/boot.c comma
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c					\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
 	\
 	util/console.c util/hostfs.c util/grub-emu.c util/misc.c	\
 	util/hostdisk.c util/getroot.c					\
Index: conf/i386-efi.rmk
===================================================================
--- conf/i386-efi.rmk	(revision 1903)
+++ conf/i386-efi.rmk	(working copy)
@@ -43,7 +43,7 @@ grub_emu_SOURCES = commands/boot.c comma
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c					\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
 	\
 	io/gzio.c							\
 	kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c	\
Index: conf/powerpc-ieee1275.rmk
===================================================================
--- conf/powerpc-ieee1275.rmk	(revision 1903)
+++ conf/powerpc-ieee1275.rmk	(working copy)
@@ -48,7 +48,7 @@ grub_emu_SOURCES = commands/boot.c comma
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c		\
-	fs/ufs.c fs/xfs.c fs/afs.c				\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c			\
 	\
 	io/gzio.c							\
 	kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c	\
Index: conf/i386-coreboot.rmk
===================================================================
--- conf/i386-coreboot.rmk	(revision 1903)
+++ conf/i386-coreboot.rmk	(working copy)
@@ -65,7 +65,7 @@ grub_emu_SOURCES = commands/boot.c comma
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c					\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
 	\
 	fs/fshelp.c							\
 	io/gzio.c							\
Index: conf/i386-ieee1275.rmk
===================================================================
--- conf/i386-ieee1275.rmk	(revision 1903)
+++ conf/i386-ieee1275.rmk	(working copy)
@@ -63,7 +63,7 @@ grub_emu_SOURCES = commands/boot.c comma
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c					\
+	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
 	\
 	fs/fshelp.c							\
 	io/gzio.c							\
Index: fs/tar.c
===================================================================
--- fs/tar.c	(revision 0)
+++ fs/tar.c	(revision 0)
@@ -0,0 +1,2 @@
+#define MODE_USTAR 1
+#include "fs/cpio.c"
Index: fs/cpio.c
===================================================================
--- fs/cpio.c	(revision 1903)
+++ fs/cpio.c	(working copy)
@@ -66,16 +66,12 @@ struct HEAD_USTAR
 
 #define HEAD_LENG	sizeof(struct HEAD_USTAR)
 
-#define MODE_BCPIO	1
-#define MODE_USTAR	2
-
 struct grub_cpio_data
 {
   grub_disk_t disk;
   grub_uint32_t hofs;
   grub_uint32_t dofs;
   grub_uint32_t size;
-  int mode;
 };
 
 #ifndef GRUB_UTIL
@@ -86,8 +82,7 @@ static grub_err_t
 grub_cpio_find_file (struct grub_cpio_data *data, char **name,
 		     grub_uint32_t * ofs)
 {
-  if (data->mode == MODE_BCPIO)
-    {
+#ifndef MODE_USTAR
       struct HEAD_BCPIO hd;
 
       if (grub_disk_read
@@ -123,9 +118,7 @@ grub_cpio_find_file (struct grub_cpio_da
       *ofs = data->dofs + data->size;
       if (data->size & 1)
 	(*ofs)++;
-    }
-  else
-    {
+#else
       struct HEAD_USTAR hd;
 
       if (grub_disk_read
@@ -148,7 +141,7 @@ grub_cpio_find_file (struct grub_cpio_da
       data->dofs = data->hofs + GRUB_DISK_SECTOR_SIZE;
       *ofs = data->dofs + ((data->size + GRUB_DISK_SECTOR_SIZE - 1) &
 			   ~(GRUB_DISK_SECTOR_SIZE - 1));
-    }
+#endif
   return GRUB_ERR_NONE;
 }
 
@@ -157,17 +150,16 @@ grub_cpio_mount (grub_disk_t disk)
 {
   char hd[HEAD_LENG];
   struct grub_cpio_data *data;
-  int mode;
 
   if (grub_disk_read (disk, 0, 0, sizeof (hd), hd))
     goto fail;
 
-  if (((struct HEAD_BCPIO *) hd)->magic == MAGIC_BCPIO)
-    mode = MODE_BCPIO;
-  else if (!grub_memcmp (((struct HEAD_USTAR *) hd)->magic, MAGIC_USTAR,
+#ifndef MODE_USTAR
+  if (((struct HEAD_BCPIO *) hd)->magic != MAGIC_BCPIO)
+#else
+  if (grub_memcmp (((struct HEAD_USTAR *) hd)->magic, MAGIC_USTAR,
 			 sizeof (MAGIC_USTAR) - 1))
-    mode = MODE_USTAR;
-  else
+#endif
     goto fail;
 
   data = (struct grub_cpio_data *) grub_malloc (sizeof (*data));
@@ -175,12 +167,17 @@ grub_cpio_mount (grub_disk_t disk)
     goto fail;
 
   data->disk = disk;
-  data->mode = mode;
 
   return data;
 
 fail:
-  grub_error (GRUB_ERR_BAD_FS, "not a cpio filesystem");
+  grub_error (GRUB_ERR_BAD_FS, "not a "
+#ifdef MODE_USTAR
+	      "tar"
+#else
+	      "cpio"
+#endif
+	      " filesystem");
   return 0;
 }
 
@@ -331,16 +328,22 @@ grub_cpio_close (grub_file_t file)
 }
 
 static struct grub_fs grub_cpio_fs = {
+#ifdef MODE_USTAR
+  .name = "tarfs",
+#else
   .name = "cpiofs",
+#endif
   .dir = grub_cpio_dir,
   .open = grub_cpio_open,
   .read = grub_cpio_read,
   .close = grub_cpio_close,
-  .label = 0,
-  .next = 0
 };
 
+#ifdef MODE_USTAR
 GRUB_MOD_INIT (cpio)
+#else
+GRUB_MOD_INIT (tar)
+#endif
 {
   grub_fs_register (&grub_cpio_fs);
 #ifndef GRUB_UTIL
@@ -348,7 +351,11 @@ GRUB_MOD_INIT (cpio)
 #endif
 }
 
+#ifdef MODE_USTAR
 GRUB_MOD_FINI (cpio)
+#else
+GRUB_MOD_FINI (tar)
+#endif
 {
   grub_fs_unregister (&grub_cpio_fs);
 }
Index: util/i386/pc/grub-mkrescue.in
===================================================================
--- util/i386/pc/grub-mkrescue.in	(revision 1903)
+++ util/i386/pc/grub-mkrescue.in	(working copy)
@@ -138,7 +138,7 @@ if [ "x${image_type}" = xfloppy -o "x${e
 
   # build core.img
   core_img=`mktemp`
-  ${grub_mkimage} -d ${input_dir}/ -m ${memdisk_img} -o ${core_img} memdisk cpio
+  ${grub_mkimage} -d ${input_dir}/ -m ${memdisk_img} -o ${core_img} memdisk tar
   rm -f ${memdisk_img}
 
   # build floppy image
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to