From: Rafał Miłecki Date: Thu, 3 Nov 2022 13:21:49 +0000 (+0100) Subject: block: try multiple NTFS filesystem implementations X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=3affe9ea5098c8bb90111ce97d50ad976ef0c034;p=project%2Ffstools.git block: try multiple NTFS filesystem implementations NTFS filesystem is supported by multiple implementations. Try mounting it using all known drivers. Trying just "ntfs" string was limiting fstools to compatibility with the read-only upstream Linux driver. This fixes: daemon.err block: No "mount.ntfs" utility available daemon.err block: mounting /dev/sda1 (ntfs) as /mnt/sda1 failed (25) - Not a tty Above errors were appearing even with ntfs3 upstrea kernel driver or ntfs-3g (user-space) installed. Signed-off-by: Rafał Miłecki --- diff --git a/block.c b/block.c index 40c52a0..4b45200 100644 --- a/block.c +++ b/block.c @@ -934,15 +934,34 @@ static int exec_mount(const char *source, const char *target, return err; } +static const char * const ntfs_fs[] = { "ntfs3", "ntfs-3g", "antfs", "ntfs" }; + static int handle_mount(const char *source, const char *target, const char *fstype, struct mount *m) { - int i, err; size_t mount_opts_len; char *mount_opts = NULL, *ptr; + const char * const *filesystems; + int err = -EINVAL; + size_t count; + int i; + + if (!strcmp(fstype, "ntfs")) { + filesystems = ntfs_fs; + count = ARRAY_SIZE(ntfs_fs); + } else { + filesystems = &fstype; + count = 1; + } - err = mount(source, target, fstype, m ? m->flags : 0, - (m && m->options) ? m->options : ""); + for (i = 0; i < count; i++) { + const char *fs = filesystems[i]; + + err = mount(source, target, fs, m ? m->flags : 0, + (m && m->options) ? m->options : ""); + if (!err || errno != ENODEV) + break; + } /* Requested file system type is not available in kernel, attempt to call mount helper. */ @@ -979,7 +998,13 @@ static int handle_mount(const char *source, const char *target, } /* ... and now finally invoke the external mount program */ - err = exec_mount(source, target, fstype, mount_opts); + for (i = 0; i < count; i++) { + const char *fs = filesystems[i]; + + err = exec_mount(source, target, fs, mount_opts); + if (!err) + break; + } } free(mount_opts);