[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