Files
main/hardware/disk/libblockdev/files/aefd677.patch
T
2023-07-17 19:42:42 +03:00

161 lines
6.8 KiB
Diff

diff --git a/src/plugins/fs/generic.c b/src/plugins/fs/generic.c
index 4406d5c..075af7e 100644
--- a/src/plugins/fs/generic.c
+++ b/src/plugins/fs/generic.c
@@ -229,7 +229,7 @@ const BDFSInfo fs_info[BD_FS_LAST_FS] = {
.repair_util = "ntfsfix",
.resize_util = "ntfsresize",
.label_util = "ntfslabel",
- .info_util = "ntfscluster",
+ .info_util = "ntfsinfo",
.uuid_util = "ntfslabel" },
/* F2FS */
{ .type = "f2fs",
diff --git a/src/plugins/fs/ntfs.c b/src/plugins/fs/ntfs.c
index 517d1cf..1aa503c 100644
--- a/src/plugins/fs/ntfs.c
+++ b/src/plugins/fs/ntfs.c
@@ -20,6 +20,7 @@
#include <blockdev/utils.h>
#include <check_deps.h>
#include <string.h>
+#include <stdio.h>
#include "ntfs.h"
#include "fs.h"
@@ -36,8 +37,8 @@ static GMutex deps_check_lock;
#define DEPS_NTFSRESIZE_MASK (1 << DEPS_NTFSRESIZE)
#define DEPS_NTFSLABEL 3
#define DEPS_NTFSLABEL_MASK (1 << DEPS_NTFSLABEL)
-#define DEPS_NTFSCLUSTER 4
-#define DEPS_NTFSCLUSTER_MASK (1 << DEPS_NTFSCLUSTER)
+#define DEPS_NTFSINFO 4
+#define DEPS_NTFSINFO_MASK (1 << DEPS_NTFSINFO)
#define DEPS_LAST 5
@@ -46,7 +47,7 @@ static const UtilDep deps[DEPS_LAST] = {
{"ntfsfix", NULL, NULL, NULL},
{"ntfsresize", NULL, NULL, NULL},
{"ntfslabel", NULL, NULL, NULL},
- {"ntfscluster", NULL, NULL, NULL},
+ {"ntfsinfo", NULL, NULL, NULL},
};
static guint32 fs_mode_util[BD_FS_MODE_LAST+1] = {
@@ -55,7 +56,7 @@ static guint32 fs_mode_util[BD_FS_MODE_LAST+1] = {
DEPS_NTFSFIX_MASK, /* check */
DEPS_NTFSFIX_MASK, /* repair */
DEPS_NTFSLABEL_MASK, /* set-label */
- DEPS_NTFSCLUSTER_MASK, /* query */
+ DEPS_NTFSINFO_MASK, /* query */
DEPS_NTFSRESIZE_MASK, /* resize */
DEPS_NTFSLABEL_MASK /* set-uuid */
};
@@ -356,7 +357,7 @@ gboolean bd_fs_ntfs_resize (const gchar *device, guint64 new_size, GError **erro
* Tech category: %BD_FS_TECH_NTFS-%BD_FS_TECH_MODE_QUERY
*/
BDFSNtfsInfo* bd_fs_ntfs_get_info (const gchar *device, GError **error) {
- const gchar *args[3] = {"ntfscluster", device, NULL};
+ const gchar *args[4] = {"ntfsinfo", "-m", device, NULL};
gboolean success = FALSE;
gchar *output = NULL;
BDFSNtfsInfo *ret = NULL;
@@ -365,8 +366,9 @@ BDFSNtfsInfo* bd_fs_ntfs_get_info (const gchar *device, GError **error) {
gchar *val_start = NULL;
g_autofree gchar* mountpoint = NULL;
GError *l_error = NULL;
+ size_t cluster_size = 0;
- if (!check_deps (&avail_deps, DEPS_NTFSCLUSTER_MASK, deps, DEPS_LAST, &deps_check_lock, error))
+ if (!check_deps (&avail_deps, DEPS_NTFSINFO_MASK, deps, DEPS_LAST, &deps_check_lock, error))
return NULL;
mountpoint = bd_fs_get_mountpoint (device, &l_error);
@@ -400,8 +402,9 @@ BDFSNtfsInfo* bd_fs_ntfs_get_info (const gchar *device, GError **error) {
lines = g_strsplit (output, "\n", 0);
g_free (output);
line_p = lines;
+
/* find the beginning of the (data) section we are interested in */
- while (line_p && *line_p && !g_str_has_prefix (*line_p, "bytes per volume"))
+ while (line_p && *line_p && !strstr (*line_p, "Cluster Size"))
line_p++;
if (!line_p || !(*line_p)) {
g_set_error (error, BD_FS_ERROR, BD_FS_ERROR_PARSE, "Failed to parse NTFS file system information");
@@ -410,12 +413,12 @@ BDFSNtfsInfo* bd_fs_ntfs_get_info (const gchar *device, GError **error) {
return NULL;
}
- /* extract data from something like this: "bytes per volume : 998240256" */
+ /* extract data from something like this: "Cluster Size: 4096" */
val_start = strchr (*line_p, ':');
val_start++;
- ret->size = g_ascii_strtoull (val_start, NULL, 0);
+ cluster_size = g_ascii_strtoull (val_start, NULL, 0);
- while (line_p && *line_p && !g_str_has_prefix (*line_p, "bytes of free space"))
+ while (line_p && *line_p && !strstr (*line_p, "Volume Size in Clusters"))
line_p++;
if (!line_p || !(*line_p)) {
g_set_error (error, BD_FS_ERROR, BD_FS_ERROR_PARSE, "Failed to parse NTFS file system information");
@@ -424,10 +427,27 @@ BDFSNtfsInfo* bd_fs_ntfs_get_info (const gchar *device, GError **error) {
return NULL;
}
- /* extract data from something like this: "bytes of free space : 992759808" */
+ /* extract data from something like this: "Volume Size in Clusters: 15314943" */
val_start = strchr (*line_p, ':');
val_start++;
- ret->free_space = g_ascii_strtoull (val_start, NULL, 0);
+ ret->size = g_ascii_strtoull (val_start, NULL, 0) * cluster_size;
+
+ while (line_p && *line_p && !strstr (*line_p, "Free Clusters"))
+ line_p++;
+ if (!line_p || !(*line_p)) {
+ g_set_error (error, BD_FS_ERROR, BD_FS_ERROR_PARSE, "Failed to parse NTFS file system information");
+ g_strfreev (lines);
+ bd_fs_ntfs_info_free (ret);
+ return NULL;
+ }
+
+ /* extract data from something like this: "Free Clusters: 7812655 (51,0%)" */
+ val_start = strchr (*line_p, ':');
+ val_start++;
+ ret->free_space = g_ascii_strtoull (val_start, NULL, 0) * cluster_size;
+
+ printf("size: %lu\n", ret->size);
+ printf("free_space: %lu\n", ret->free_space);
g_strfreev (lines);
diff --git a/tests/fs_tests/ntfs_test.py b/tests/fs_tests/ntfs_test.py
index c04e39d..ff0fc31 100644
--- a/tests/fs_tests/ntfs_test.py
+++ b/tests/fs_tests/ntfs_test.py
@@ -56,9 +56,9 @@ class NTFSTestAvailability(NTFSNoDevTestCase):
with self.assertRaisesRegex(GLib.GError, "The 'ntfsfix' utility is not available"):
BlockDev.fs_is_tech_avail(BlockDev.FSTech.NTFS, BlockDev.FSTechMode.REPAIR)
- # now try without ntfscluster
- with utils.fake_path(all_but="ntfscluster"):
- with self.assertRaisesRegex(GLib.GError, "The 'ntfscluster' utility is not available"):
+ # now try without ntfsinfo
+ with utils.fake_path(all_but="ntfsinfo"):
+ with self.assertRaisesRegex(GLib.GError, "The 'ntfsinfo' utility is not available"):
BlockDev.fs_is_tech_avail(BlockDev.FSTech.NTFS, BlockDev.FSTechMode.QUERY)
# now try without ntfsresize
diff --git a/tests/utils.py b/tests/utils.py
index c498c10..ef21507 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -81,7 +81,7 @@ ALL_UTILS = {"lvm", "btrfs", "mkswap", "swaplabel", "multipath", "mpathconf", "d
"mke2fs", "e2fsck", "tune2fs", "dumpe2fs", "resize2fs",
"mkfs.f2fs", "fsck.f2fs", "fsck.f2fs", "dump.f2fs", "resize.f2fs",
"mkfs.nilfs2", "nilfs-tune", "nilfs-resize",
- "mkntfs", "ntfsfix", "ntfsresize", "ntfslabel", "ntfscluster",
+ "mkntfs", "ntfsfix", "ntfsresize", "ntfslabel", "ntfsinfo",
"mkfs.vfat", "fatlabel", "fsck.vfat", "vfat-resize",
"mkfs.xfs", "xfs_db", "xfs_repair", "xfs_admin", "xfs_growfs"}