On Thu, Jan 15, 2015 at 02:39:39PM +0100, Pino Toscano wrote:
blkid(1) (or actually, libblkid) seems to handle filesystem labels
up
to 127 characters. Considering that btrfs labels can be up to 128
characters, this means long labels are not read correctly (i.e. get
truncated) by blkid. Furthermore, ntfs labels are actually unicode,
and libblkid seems to not decode them correctly.
Hence, if ntfsprogs is available invoke `ntfslabel` to get the label
of ntfs filesystems.
Related to RHBZ#1164708.
---
daemon/blkid.c | 2 ++
daemon/daemon.h | 3 +++
daemon/ntfs.c | 24 ++++++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/daemon/blkid.c b/daemon/blkid.c
index e8e7b58..1ac42b4 100644
--- a/daemon/blkid.c
+++ b/daemon/blkid.c
@@ -82,6 +82,8 @@ do_vfs_label (const mountable_t *mountable)
if (type) {
if (STREQ (type, "btrfs") && optgroup_btrfs_available ())
return btrfs_get_label (mountable->device);
+ if (STREQ (type, "ntfs") && optgroup_ntfsprogs_available ())
+ return ntfs_get_label (mountable->device);
}
return get_blkid_tag (mountable->device, "LABEL");
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 4ee1a40..9405ce6 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -265,6 +265,9 @@ extern char *debug_bmap_device (const char *subcmd, size_t argc, char
*const *co
/*-- in btrfs.c --*/
extern char *btrfs_get_label (const char *device);
+/*-- in ntfs.c --*/
+extern char *ntfs_get_label (const char *device);
+
/* ordinary daemon functions use these to indicate errors
* NB: you don't need to prefix the string with the current command,
* it is added automatically by the client-side RPC stubs.
diff --git a/daemon/ntfs.c b/daemon/ntfs.c
index 762ca88..f1d12e0 100644
--- a/daemon/ntfs.c
+++ b/daemon/ntfs.c
@@ -33,6 +33,7 @@
GUESTFSD_EXT_CMD(str_ntfs3g_probe, ntfs-3g.probe);
GUESTFSD_EXT_CMD(str_ntfsresize, ntfsresize);
GUESTFSD_EXT_CMD(str_ntfsfix, ntfsfix);
+GUESTFSD_EXT_CMD(str_ntfslabel, ntfslabel);
int
optgroup_ntfs3g_available (void)
@@ -46,6 +47,29 @@ optgroup_ntfsprogs_available (void)
return prog_exists (str_ntfsresize);
}
+char *
+ntfs_get_label (const char *device)
+{
+ int r;
+ CLEANUP_FREE char *err = NULL;
+ char *out = NULL;
+ size_t len;
+
+ r = command (&out, &err, str_ntfslabel, device, NULL);
+ if (r == -1) {
+ reply_with_error ("%s", err);
+ free (out);
+ return NULL;
+ }
+
+ /* Trim trailing \n if present. */
+ len = strlen (out);
+ if (len > 0 && out[len-1] == '\n')
+ out[len-1] = '\0';
+
+ return out;
+}
+
int
do_ntfs_3g_probe (int rw, const char *device)
{
--
1.9.3
ACK series.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW