From 48035cf253bdf27a1a7d460b86e19e53cfc82e3b Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 29 Aug 2013 11:41:46 +0100 Subject: [PATCH] daemon: Allow labels to be set on DOS filesystems using 'dosfslabel'. You can now use virt-format or virt-make-fs --label option to set a label for a DOS filesystem: $ ./run ./format/virt-format -a /tmp/test.img --filesystem=vfat --label=BOOT $ ./run ./cat/virt-filesystems -a /tmp/test.img --all --long -h Name Type VFS Label MBR Size Parent /dev/sda1 filesystem vfat BOOT - 1.0G - /dev/sda1 partition - - 0b 1.0G /dev/sda /dev/sda device - - - 1.0G - This also contains a small code refactoring. Thanks: Gerd Hoffmann (kraxel) (cherry picked from commit a75ca610b80614253f8a9d9828a97dc61d919b8a) --- daemon/labels.c | 61 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/daemon/labels.c b/daemon/labels.c index 10e40dc..f417c57 100644 --- a/daemon/labels.c +++ b/daemon/labels.c @@ -28,11 +28,43 @@ #include "optgroups.h" GUESTFSD_EXT_CMD(str_btrfs, btrfs); +GUESTFSD_EXT_CMD(str_dosfslabel, dosfslabel); GUESTFSD_EXT_CMD(str_e2label, e2label); GUESTFSD_EXT_CMD(str_ntfslabel, ntfslabel); GUESTFSD_EXT_CMD(str_xfs_admin, xfs_admin); static int +btrfslabel (const char *device, const char *label) +{ + int r; + CLEANUP_FREE char *err = NULL; + + r = command (NULL, &err, str_btrfs, "filesystem", "label", + device, label, NULL); + if (r == -1) { + reply_with_error ("%s", err); + return -1; + } + + return 0; +} + +static int +dosfslabel (const char *device, const char *label) +{ + int r; + CLEANUP_FREE char *err = NULL; + + r = command (NULL, &err, str_dosfslabel, device, label, NULL); + if (r == -1) { + reply_with_error ("%s", err); + return -1; + } + + return 0; +} + +static int e2label (const char *device, const char *label) { int r; @@ -95,22 +127,6 @@ xfslabel (const char *device, const char *label) return 0; } -static int -btrfslabel (const char *device, const char *label) -{ - int r; - CLEANUP_FREE char *err = NULL; - - r = command (NULL, &err, str_btrfs, "filesystem", "label", - device, label, NULL); - if (r == -1) { - reply_with_error ("%s", err); - return -1; - } - - return 0; -} - int do_set_label (const mountable_t *mountable, const char *label) { @@ -121,7 +137,15 @@ do_set_label (const mountable_t *mountable, const char *label) if (vfs_type == NULL) return -1; - if (fstype_is_extfs (vfs_type)) + if (STREQ (vfs_type, "btrfs")) + r = btrfslabel (mountable->device, label); + + else if (STREQ (vfs_type, "msdos") || + STREQ (vfs_type, "fat") || + STREQ (vfs_type, "vfat")) + r = dosfslabel (mountable->device, label); + + else if (fstype_is_extfs (vfs_type)) r = e2label (mountable->device, label); else if (STREQ (vfs_type, "ntfs")) @@ -130,9 +154,6 @@ do_set_label (const mountable_t *mountable, const char *label) else if (STREQ (vfs_type, "xfs")) r = xfslabel (mountable->device, label); - else if (STREQ (vfs_type, "btrfs")) - r = btrfslabel (mountable->device, label); - else { reply_with_error ("don't know how to set the label for '%s' filesystems", vfs_type); -- 1.8.3.1