From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1d0tik-0005vX-GI for mharc-grub-devel@gnu.org; Wed, 19 Apr 2017 13:48:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47095) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d0tih-0005sa-ES for grub-devel@gnu.org; Wed, 19 Apr 2017 13:48:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d0tic-0007XM-I8 for grub-devel@gnu.org; Wed, 19 Apr 2017 13:48:47 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:34000) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d0tic-0007WZ-9t for grub-devel@gnu.org; Wed, 19 Apr 2017 13:48:42 -0400 Received: by mail-wm0-x244.google.com with SMTP id z129so6262437wmb.1 for ; Wed, 19 Apr 2017 10:48:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=RCQLJ005tPyLhvXhnD5m1mQV6BpQR8H9HVZTUH1ZQGI=; b=lGM7gzQ0mL7/5jG7G4XSeH9H+Knm7d4/9RYFrQjm9bfFP+VI//JUgEhtnyMqr5L9N6 6b1JyZpOUFidmxSv00hWKPXqoOgyIj+x88KkBjXNHqVf3qGaRe8IAoxLquxbbwcudeRR lPsIDcCLW366R6Hu6xxCpneplMytKSbj5d2A6Tph9WQ0nmQ7Dp97yCDdDKntJy2c4CIS 2IGoh3bvqQ7CgXoZNKpXCzblMBV/Qv6poBT6gEM5D53HmL/OH3Guq+bo2VHvrU7ErF6/ ZIijF4PxsFu/H/9CG6e9h2Uf2PaYtuNsF9VzU1owxHKZjOB/M+DBAMX0Wrvz7mUvf6IT LDrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=RCQLJ005tPyLhvXhnD5m1mQV6BpQR8H9HVZTUH1ZQGI=; b=LhdnMF3EYTdbaNKGEG5LTn3EAx+YN69Q4yoB/fQBfugFMgo9M1GKi2ztwGp2WLWmqf 7seU9FYEEnCFKDdPwClDH9Frri3yO0HqA4bOdUQQ9Z9v9gynW4q/6XIDshxe4t3PaW31 0ZJnQv1tzVbPM7nKAhWHtXxt7sQRFO9p+AKyd3Suc21mwJGnPscBrWRnH5kR6RgAjMSg ECJV+qz+L0/zBRLexF7ew5erhzxfAn2njfxis4ZdNalebiw2S7v2tOlMs86Hc7eaPyCH K1lBGZAJfjIhngJB7ff8xkCS8LJ6UocfvnmMjx1yN3wg7Gcdeys1eVNDKblWxq0gjt6I gGqg== X-Gm-Message-State: AN3rC/70K8RyPoKA90/hZ/x5x5EYl85RBpSJSNozifzvqARCfcKUY9aw /qoR/Lm4Qhx/j9Pr X-Received: by 10.28.11.208 with SMTP id 199mr4014617wml.24.1492624120606; Wed, 19 Apr 2017 10:48:40 -0700 (PDT) Received: from pali (atrey.karlin.mff.cuni.cz. [195.113.26.193]) by smtp.gmail.com with ESMTPSA id l201sm7006773wmb.3.2017.04.19.10.48.39 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 19 Apr 2017 10:48:39 -0700 (PDT) Date: Wed, 19 Apr 2017 19:48:39 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: grub-devel@gnu.org Subject: Re: [PATCH] * grub-core/fs/udf.c: Add support for UUID Message-ID: <20170419174839.GG18887@pali> References: <1491849330-10140-1-git-send-email-pali.rohar@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1491849330-10140-1-git-send-email-pali.rohar@gmail.com> User-Agent: Mutt/1.5.23.1 (2014-03-12) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Apr 2017 17:48:49 -0000 Hi! I would like to remind this patch. It allows to use UUID of UDF partition in grub2. Linux tool blkid is already able to handle it, so it is possible to specify UUID of UDF partition in /etc/fstab. UDF is filesystem used on optical disks (DVD), but also on hard disks as it is natively supported by Windows, Linux and Mac OS X kernels. Which is a good benefit for multi-boot environment. On Monday 10 April 2017 20:35:30 Pali Rohár wrote: > Use same algorithm as in libblkid from util-linux. > --- > grub-core/fs/udf.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 131 insertions(+), 5 deletions(-) > > diff --git a/grub-core/fs/udf.c b/grub-core/fs/udf.c > index 839bff8..a4baa4c 100644 > --- a/grub-core/fs/udf.c > +++ b/grub-core/fs/udf.c > @@ -321,6 +321,32 @@ struct grub_udf_partmap > }; > } GRUB_PACKED; > > +struct grub_udf_pvd > +{ > + struct grub_udf_tag tag; > + grub_uint32_t seq_num; > + grub_uint32_t pvd_num; > + grub_uint8_t ident[32]; > + grub_uint16_t vol_seq_num; > + grub_uint16_t max_vol_seq_num; > + grub_uint16_t interchange_level; > + grub_uint16_t max_interchange_level; > + grub_uint32_t charset_list; > + grub_uint32_t max_charset_list; > + grub_uint8_t volset_ident[128]; > + struct grub_udf_charspec desc_charset; > + struct grub_udf_charspec expl_charset; > + struct grub_udf_extent_ad vol_abstract; > + struct grub_udf_extent_ad vol_copyright; > + struct grub_udf_regid app_ident; > + struct grub_udf_timestamp recording_time; > + struct grub_udf_regid imp_ident; > + grub_uint8_t imp_use[64]; > + grub_uint32_t pred_vds_loc; > + grub_uint16_t flags; > + grub_uint8_t reserved[22]; > +} GRUB_PACKED; > + > struct grub_udf_lvd > { > struct grub_udf_tag tag; > @@ -348,6 +374,7 @@ struct grub_udf_aed > struct grub_udf_data > { > grub_disk_t disk; > + struct grub_udf_pvd pvd; > struct grub_udf_lvd lvd; > struct grub_udf_pd pds[GRUB_UDF_MAX_PDS]; > struct grub_udf_partmap *pms[GRUB_UDF_MAX_PMS]; > @@ -692,7 +719,17 @@ grub_udf_mount (grub_disk_t disk) > } > > tag.tag_ident = U16 (tag.tag_ident); > - if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PD) > + if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PVD) > + { > + if (grub_disk_read (disk, block << lbshift, 0, > + sizeof (struct grub_udf_pvd), > + &data->pvd)) > + { > + grub_error (GRUB_ERR_BAD_FS, "not an UDF filesystem"); > + goto fail; > + } > + } > + else if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PD) > { > if (data->npd >= GRUB_UDF_MAX_PDS) > { > @@ -821,7 +858,7 @@ grub_udf_get_cluster_sector (grub_disk_t disk, grub_uint64_t *sec_per_lcn) > #endif > > static char * > -read_string (const grub_uint8_t *raw, grub_size_t sz, char *outbuf) > +read_string (const grub_uint8_t *raw, grub_size_t sz, char *outbuf, int normalize_utf8) > { > grub_uint16_t *utf16 = NULL; > grub_size_t utf16len = 0; > @@ -832,6 +869,15 @@ read_string (const grub_uint8_t *raw, grub_size_t sz, char *outbuf) > if (raw[0] != 8 && raw[0] != 16) > return NULL; > > + if (raw[0] == 8 && !normalize_utf8) > + { > + if (!outbuf) > + outbuf = grub_strndup ((char *)raw + 1, sz - 1); > + else > + grub_memcpy (outbuf, raw + 1, sz - 1); > + return outbuf; > + } > + > if (raw[0] == 8) > { > unsigned i; > @@ -923,7 +969,7 @@ grub_udf_iterate_dir (grub_fshelp_node_t dir, > != dirent.file_ident_length) > return 0; > > - filename = read_string (raw, dirent.file_ident_length, 0); > + filename = read_string (raw, dirent.file_ident_length, 0, 1); > if (!filename) > grub_print_error (); > > @@ -1009,7 +1055,7 @@ grub_udf_read_symlink (grub_fshelp_node_t node) > /* in 4 + n bytes. out, at most: 1 + 2 * n bytes. */ > if (optr != out) > *optr++ = '/'; > - if (!read_string (ptr + 4, s - 4, optr)) > + if (!read_string (ptr + 4, s - 4, optr, 1)) > goto fail; > optr += grub_strlen (optr); > break; > @@ -1197,7 +1243,7 @@ grub_udf_label (grub_device_t device, char **label) > > if (data) > { > - *label = read_string (data->lvd.ident, sizeof (data->lvd.ident), 0); > + *label = read_string (data->lvd.ident, sizeof (data->lvd.ident), 0, 1); > grub_free (data); > } > else > @@ -1206,6 +1252,85 @@ grub_udf_label (grub_device_t device, char **label) > return grub_errno; > } > > +static char * > +gen_uuid_from_volset (char *volset_ident) > +{ > + grub_size_t i; > + grub_size_t len; > + grub_size_t binpos; > + grub_uint8_t buf[17]; > + char *uuid; > + > + len = grub_strlen (volset_ident); > + if (len < 8) > + return NULL; > + > + uuid = grub_malloc (17); > + if (!uuid) > + return NULL; > + > + if (len > 16) > + len = 16; > + > + grub_memset (buf, 0, sizeof (buf)); > + grub_memcpy (buf, volset_ident, len); > + > + binpos = 16; > + for (i = 0; i < len; ++i) > + { > + if (!grub_isalnum (buf[i])) > + { > + binpos = i; > + break; > + } > + } > + > + if (binpos < 8) > + { > + grub_snprintf (uuid, 17, "%02x%02x%02x%02x%02x%02x%02x%02x", > + buf[0], buf[1], buf[2], buf[3], > + buf[4], buf[5], buf[6], buf[7]); > + } > + else if (binpos < 16) > + { > + grub_memcpy (uuid, buf, 8); > + grub_snprintf (uuid+8, 9, "%02x%02x%02x%02x", > + buf[8], buf[9], buf[10], buf[11]); > + } > + else > + { > + grub_memcpy (uuid, buf, 16); > + uuid[16] = 0; > + } > + > + return uuid; > +} > + > +static grub_err_t > +grub_udf_uuid (grub_device_t device, char **uuid) > +{ > + char *volset_ident; > + struct grub_udf_data *data; > + data = grub_udf_mount (device->disk); > + > + if (data) > + { > + volset_ident = read_string (data->pvd.volset_ident, sizeof (data->pvd.volset_ident), 0, 0); > + if (volset_ident) > + { > + *uuid = gen_uuid_from_volset (volset_ident); > + grub_free (volset_ident); > + } > + else > + *uuid = 0; > + grub_free (data); > + } > + else > + *uuid = 0; > + > + return grub_errno; > +} > + > static struct grub_fs grub_udf_fs = { > .name = "udf", > .dir = grub_udf_dir, > @@ -1213,6 +1338,7 @@ static struct grub_fs grub_udf_fs = { > .read = grub_udf_read, > .close = grub_udf_close, > .label = grub_udf_label, > + .uuid = grub_udf_uuid, > #ifdef GRUB_UTIL > .reserved_first_sector = 1, > .blocklist_install = 1, -- Pali Rohár pali.rohar@gmail.com