All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marco Gerards <mgerards@xs4all.nl>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: [PATCH] support joliet extension in iso9660 filesystem
Date: Mon, 04 Feb 2008 16:52:53 +0100	[thread overview]
Message-ID: <878x2090ru.fsf@xs4all.nl> (raw)
In-Reply-To: <ca0f59980802020515t70f73024g344fab02a9de6ee9@mail.gmail.com> (bean123ch@gmail.com's message of "Sat, 2 Feb 2008 21:15:12 +0800")

Bean <bean123ch@gmail.com> writes:

Hi,

> This patch add joliet extension support for iso9660.

Great!  Hopefully Rockridge still works?

> 2008-02-02  Bean  <bean123ch@gmail.com>
>
> 	* 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<len; 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




  reply	other threads:[~2008-02-04 15:51 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-02 13:15 [PATCH] support joliet extension in iso9660 filesystem Bean
2008-02-04 15:52 ` Marco Gerards [this message]
2008-02-04 15:59   ` Jeff Chua
2008-02-04 16:05     ` Marco Gerards
2008-02-04 16:38       ` Jeff Chua
2008-02-04 21:16   ` Bean

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878x2090ru.fsf@xs4all.nl \
    --to=mgerards@xs4all.nl \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.