neil / rpms / udisks2

Forked from rpms/udisks2 a year ago
Clone
aebde2
commit ef1979d8cbfb8ad976de0af21a70f8c0f98fbbe9
aebde2
Author: Tomas Bzatek <tbzatek@redhat.com>
aebde2
Date:   Wed Mar 17 18:50:19 2021 +0100
aebde2
aebde2
    udiskslinuxfsinfo: Add dosfstools >= 4.2 quirks
aebde2
    
aebde2
    Reverting back the legacy behaviour with no protective (fake) MBR
aebde2
    created while making new FAT filesystem on an unpartitioned block device.
aebde2
    
aebde2
    Added a label clear functionality as well.
aebde2
aebde2
diff --git a/src/udiskslinuxfsinfo.c b/src/udiskslinuxfsinfo.c
aebde2
index 15af26c8..f18b9b80 100644
aebde2
--- a/src/udiskslinuxfsinfo.c
aebde2
+++ b/src/udiskslinuxfsinfo.c
aebde2
@@ -21,6 +21,8 @@
aebde2
 #include <string.h>
aebde2
 #include <glib.h>
aebde2
 
aebde2
+#include <blockdev/exec.h>
aebde2
+
aebde2
 #include "config.h"
aebde2
 #include "udiskslinuxfsinfo.h"
aebde2
 #include "udisksconfigmanager.h"
aebde2
@@ -236,6 +238,19 @@ const FSInfo _fs_info[] =
aebde2
     },
aebde2
   };
aebde2
 
aebde2
+/* workaround for dosfstools >= 4.2 */
aebde2
+static const FSInfo vfat_dosfstools_42 =
aebde2
+    {
aebde2
+      FS_VFAT,
aebde2
+      "fatlabel $DEVICE $LABEL",
aebde2
+      "fatlabel --reset $DEVICE",
aebde2
+      FALSE, /* supports_online_label_rename */
aebde2
+      FALSE, /* supports_owners */
aebde2
+      "mkfs.vfat -I -n $LABEL --mbr=n $DEVICE",
aebde2
+      NULL,
aebde2
+      NULL, /* option_no_discard */
aebde2
+    };
aebde2
+
aebde2
 /**
aebde2
  * get_fs_info:
aebde2
  *
aebde2
@@ -248,6 +263,7 @@ const FSInfo _fs_info[] =
aebde2
 const FSInfo *
aebde2
 get_fs_info (const gchar *fstype)
aebde2
 {
aebde2
+  const FSInfo *info = NULL;
aebde2
   guint n;
aebde2
 
aebde2
   g_return_val_if_fail (fstype != NULL, NULL);
aebde2
@@ -255,10 +271,20 @@ get_fs_info (const gchar *fstype)
aebde2
   for (n = 0; n < sizeof(_fs_info)/sizeof(FSInfo); n++)
aebde2
     {
aebde2
       if (strcmp (_fs_info[n].fstype, fstype) == 0)
aebde2
-        return &_fs_info[n];
aebde2
+        {
aebde2
+          info = &_fs_info[n];
aebde2
+          break;
aebde2
+        }
aebde2
+    }
aebde2
+
aebde2
+  /* dosfstools >= 4.2 workaround */
aebde2
+  if (g_str_equal (fstype, FS_VFAT) &&
aebde2
+      bd_utils_check_util_version ("mkfs.vfat", "4.2", "--help", "mkfs.fat\\s+([\\d\\.]+).+", NULL))
aebde2
+    {
aebde2
+      info = &vfat_dosfstools_42;
aebde2
     }
aebde2
 
aebde2
-  return NULL;
aebde2
+  return info;
aebde2
 }
aebde2
 
aebde2
 /**