[Libguestfs] [PATCH 2/2] daemon: use ntfslabel(1) to get ntfs labels
Richard W.M. Jones
rjones at redhat.com
Mon Jan 19 15:14:30 UTC 2015
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
More information about the Libguestfs
mailing list