From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1JM3bA-0003me-OQ for mharc-grub-devel@gnu.org; Mon, 04 Feb 2008 10:51:08 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JM3b9-0003mD-RD for grub-devel@gnu.org; Mon, 04 Feb 2008 10:51:07 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JM3b8-0003ln-TE for grub-devel@gnu.org; Mon, 04 Feb 2008 10:51:07 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JM3b8-0003lY-Ks for grub-devel@gnu.org; Mon, 04 Feb 2008 10:51:06 -0500 Received: from smtp-vbr13.xs4all.nl ([194.109.24.33]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JM3b8-0005El-DX for grub-devel@gnu.org; Mon, 04 Feb 2008 10:51:06 -0500 Received: from localhost.localdomain (249-174.surfsnel.dsl.internl.net [145.99.174.249]) by smtp-vbr13.xs4all.nl (8.13.8/8.13.8) with ESMTP id m14Fp4Qb070017 for ; Mon, 4 Feb 2008 16:51:05 +0100 (CET) (envelope-from mgerards@xs4all.nl) From: Marco Gerards To: The development of GRUB 2 References: Mail-Copies-To: mgerards@xs4all.nl Date: Mon, 04 Feb 2008 16:52:53 +0100 In-Reply-To: (bean123ch@gmail.com's message of "Sat, 2 Feb 2008 21:15:12 +0800") Message-ID: <878x2090ru.fsf@xs4all.nl> User-Agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Virus-Scanned: by XS4ALL Virus Scanner X-detected-kernel: by monty-python.gnu.org: FreeBSD 4.6-4.9 Subject: Re: [PATCH] support joliet extension in iso9660 filesystem X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Feb 2008 15:51:07 -0000 Bean writes: Hi, > This patch add joliet extension support for iso9660. Great! Hopefully Rockridge still works? > 2008-02-02 Bean > > * fs/iso9660.c (GRUB_ISO9660_VOLDESC_BOOT): New macro. > (GRUB_ISO9660_VOLDESC_PRIMARY): Likewise. > (GRUB_ISO9660_VOLDESC_SUPP): Likewise. > (GRUB_ISO9660_VOLDESC_PART): Likewise. > (GRUB_ISO9660_VOLDESC_END): Likewise. > (grub_iso9660_primary_voldesc): New member escape. > (grub_iso9660_data): New member joliet. > (grub_iso9660_convert_string): New function. > (grub_iso9660_mount): Detect joliet extension. > (grub_iso9660_iterate_dir): Convert filename when joliet is detected. > (grub_iso9660_iso9660_label): Likewise. > > diff --git a/fs/iso9660.c b/fs/iso9660.c > index 15ce51d..b1562a7 100644 > --- a/fs/iso9660.c > +++ b/fs/iso9660.c > @@ -38,6 +38,12 @@ > #define GRUB_ISO9660_RR_DOT 2 > #define GRUB_ISO9660_RR_DOTDOT 4 > > +#define GRUB_ISO9660_VOLDESC_BOOT 0 > +#define GRUB_ISO9660_VOLDESC_PRIMARY 1 > +#define GRUB_ISO9660_VOLDESC_SUPP 2 > +#define GRUB_ISO9660_VOLDESC_PART 3 > +#define GRUB_ISO9660_VOLDESC_END 255 > + > /* The head of a volume descriptor. */ > struct grub_iso9660_voldesc > { > @@ -67,11 +73,13 @@ struct grub_iso9660_primary_voldesc > struct grub_iso9660_voldesc voldesc; > grub_uint8_t unused1[33]; > grub_uint8_t volname[32]; > - grub_uint8_t unused2[60]; > + grub_uint8_t unused2[16]; > + grub_uint8_t escape[32]; > + grub_uint8_t unused3[12]; > grub_uint32_t path_table_size; > - grub_uint8_t unused3[4]; > + grub_uint8_t unused4[4]; > grub_uint32_t path_table; > - grub_uint8_t unused4[12]; > + grub_uint8_t unused5[12]; > struct grub_iso9660_dir rootdir; > } __attribute__ ((packed)); > > @@ -115,6 +123,7 @@ struct grub_iso9660_data > unsigned int length; > int rockridge; > int susp_skip; > + int joliet; > }; > > struct grub_fshelp_node > @@ -197,6 +206,23 @@ grub_iso9660_susp_iterate (struct grub_iso9660_data *data, > return 0; > } > > +static grub_uint8_t * > +grub_iso9660_convert_string (grub_uint16_t *us, int len) > +{ > + grub_uint8_t *p; > + int i; > + > + p = grub_malloc (len * 4 + 1); > + if (! p) > + return p; > + > + for (i=0; i + us[i] = grub_be_to_cpu16 (us[i]); > + > + *grub_utf16_to_utf8 (p, us, len) = '\0'; > + > + return p; > +} > > static struct grub_iso9660_data * > grub_iso9660_mount (grub_disk_t disk) > @@ -207,6 +233,8 @@ grub_iso9660_mount (grub_disk_t disk) > int sua_size; > char *sua; > struct grub_iso9660_susp_entry *entry; > + struct grub_iso9660_primary_voldesc voldesc; > + int sec; sec? > auto grub_err_t susp_iterate (struct grub_iso9660_susp_entry *); > > @@ -226,34 +254,51 @@ grub_iso9660_mount (grub_disk_t disk) > if (! data) > return 0; > > + data->disk = disk; > + data->rockridge = 0; > + data->joliet = 0; > + > + sec = 16; > + do > + { > + int is_copy = 0; > + > /* Read the superblock. */ > - if (grub_disk_read (disk, 16 << GRUB_ISO9660_LOG2_BLKSZ, 0, > + if (grub_disk_read (disk, sec << GRUB_ISO9660_LOG2_BLKSZ, 0, > sizeof (struct grub_iso9660_primary_voldesc), > - (char *) &data->voldesc)) > + (char *) &voldesc)) > { > grub_error (GRUB_ERR_BAD_FS, "not a iso9660 filesystem"); > goto fail; > } > > - if (grub_strncmp ((char *) data->voldesc.voldesc.magic, "CD001", 5) != 0) > + if (grub_strncmp ((char *) voldesc.voldesc.magic, "CD001", 5) != 0) Why did the indentation change for the lines above? > { > grub_error (GRUB_ERR_BAD_FS, "not a iso9660 filesystem"); > goto fail; > } > > - data->disk = disk; > - data->rockridge = 0; > - > - /* Read the system use area and test it to see if SUSP is > - supported. */ > - if (grub_disk_read (disk, (grub_le_to_cpu32 > (data->voldesc.rootdir.first_sector) > - << GRUB_ISO9660_LOG2_BLKSZ), 0, > - sizeof (rootdir), (char *) &rootdir)) > + if (voldesc.voldesc.type == GRUB_ISO9660_VOLDESC_PRIMARY) > + is_copy = 1; > + else if ((voldesc.voldesc.type == GRUB_ISO9660_VOLDESC_SUPP) && > + (voldesc.escape[0] == 0x25) && (voldesc.escape[1] == 0x2f) && > + ((voldesc.escape[2] == 0x40) || /* UCS-2 Level 1. */ > + (voldesc.escape[2] == 0x43) || /* UCS-2 Level 2. */ > + (voldesc.escape[2] == 0x45))) /* UCS-2 Level 3. */ > { > - grub_error (GRUB_ERR_BAD_FS, "not a iso9660 filesystem"); > - goto fail; > + is_copy = 1; is_copy? > + data->joliet = 1; > } > > + if (is_copy) > + grub_memcpy((char *) &data->voldesc, (char *) &voldesc, > + sizeof (struct grub_iso9660_primary_voldesc)); > + > + sec++; > + } while (voldesc.voldesc.type != GRUB_ISO9660_VOLDESC_END); > + > + /* Read the system use area and test it to see if SUSP is > + supported. */ > if (grub_disk_read (disk, (grub_le_to_cpu32 > (data->voldesc.rootdir.first_sector) > << GRUB_ISO9660_LOG2_BLKSZ), 0, > sizeof (rootdir), (char *) &rootdir)) > @@ -572,6 +617,20 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir, > filename = name; > } > > + if (dir->data->joliet) > + { > + char *oldname; > + > + oldname = filename; > + filename = grub_iso9660_convert_string > + ((grub_uint16_t *) oldname, dirent.namelen >> 1); > + > + if (filename_alloc) > + grub_free (oldname); > + > + filename_alloc = 1; > + } > + > if (hook (filename, type, node)) > { > if (filename_alloc) > @@ -740,6 +799,10 @@ grub_iso9660_label (grub_device_t device, char **label) > > if (data) > { > + if (data->joliet) > + *label = grub_iso9660_convert_string > + ((grub_uint16_t *) &data->voldesc.volname, 16); > + else > *label = grub_strndup ((char *) data->voldesc.volname, 32); > grub_free (data); > } > > > -- > Bean > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel