summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2013-07-07 14:21:50 -0700
committerSteve Kondik <shade@chemlab.org>2013-07-07 14:21:50 -0700
commitbcd5a74dc03344aaff54cd443d5e6582bd4dd832 (patch)
tree13e479c9a094dfcd66186f15b002198cfd10ec60
parentce6e95e153201be046736e2360f51d3bca48c9f4 (diff)
downloadsystem_vold-bcd5a74dc03344aaff54cd443d5e6582bd4dd832.zip
system_vold-bcd5a74dc03344aaff54cd443d5e6582bd4dd832.tar.gz
system_vold-bcd5a74dc03344aaff54cd443d5e6582bd4dd832.tar.bz2
vold: Add NTFS read+write support via ntfs-3g
* Use ntfs-3g for full NTFS support. * Original code from Freescale. Change-Id: I01191c3c339421904dc9415eb00143f7f8365152
-rw-r--r--Ntfs.cpp104
-rw-r--r--Ntfs.h2
2 files changed, 78 insertions, 28 deletions
diff --git a/Ntfs.cpp b/Ntfs.cpp
index d5e9772..41a1663 100644
--- a/Ntfs.cpp
+++ b/Ntfs.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,6 +16,7 @@
*/
#include <stdio.h>
+#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
@@ -30,6 +32,7 @@
#include <sys/mount.h>
#include <linux/kdev_t.h>
+#include <linux/fs.h>
#define LOG_TAG "Vold"
@@ -38,33 +41,56 @@
#include "Ntfs.h"
+static char NTFS_FIX_PATH[] = "/system/bin/ntfsfix";
+static char NTFS_MOUNT_PATH[] = "/system/bin/ntfs-3g";
extern "C" int logwrap(int argc, const char **argv, int background);
-extern "C" int mount(const char *, const char *, const char *, unsigned long, const void *);
int Ntfs::check(const char *fsPath) {
-
- // no NTFS file system check is performed, always return true
- SLOGI("Ntfs filesystem: Skipping fs checks\n");
- return 0;
+ if (access(NTFS_FIX_PATH, X_OK)) {
+ SLOGW("Skipping fs checks\n");
+ return 0;
+ }
+
+ int rc = 0;
+ const char *args[4];
+ /* we first use -n to do ntfs detection */
+ args[0] = NTFS_FIX_PATH;
+ args[1] = "-n";
+ args[2] = fsPath;
+ args[3] = NULL;
+
+ rc = logwrap(3, args, 1);
+ if (rc) {
+ errno = ENODATA;
+ return -1;
+ }
+
+ SLOGI("Ntfs filesystem existed");
+
+ /* do the real fix */
+ /* redo the ntfsfix without -n to fix problems */
+ args[1] = fsPath;
+ args[2] = NULL;
+
+ rc = logwrap(2, args, 1);
+ if (rc) {
+ errno = EIO;
+ SLOGE("Filesystem check failed (unknown exit code %d)", rc);
+ return -1;
+ }
+
+ SLOGI("Ntfs filesystem check completed OK");
+ return 0;
}
int Ntfs::doMount(const char *fsPath, const char *mountPoint,
bool ro, bool remount, bool executable,
int ownerUid, int ownerGid, int permMask, bool createLost) {
int rc;
- unsigned long flags;
char mountData[255];
+ const char *args[6];
- flags = MS_NODEV | MS_NOSUID | MS_DIRSYNC;
-
- flags |= (executable ? 0 : MS_NOEXEC);
- flags |= (ro ? MS_RDONLY : 0);
- flags |= (remount ? MS_REMOUNT : 0);
-
- // Testing/security, mount ro up to now
- flags |= MS_RDONLY;
-
/*
* Note: This is a temporary hack. If the sampling profiler is enabled,
* we make the SD card world-writable so any process can write snapshots.
@@ -80,24 +106,48 @@ int Ntfs::doMount(const char *fsPath, const char *mountPoint,
}
sprintf(mountData,
- "uid=%d,gid=%d,fmask=%o,dmask=%o",
+ "utf8,uid=%d,gid=%d,fmask=%o,dmask=%o,"
+ "shortname=mixed,nodev,nosuid,dirsync",
ownerUid, ownerGid, permMask, permMask);
- rc = mount(fsPath, mountPoint, "ntfs", flags, mountData);
+ if (!executable)
+ strcat(mountData, ",noexec");
+ if (ro)
+ strcat(mountData, ",ro");
+ if (remount)
+ strcat(mountData, ",remount");
+
+ SLOGD("Mounting ntfs with options:%s\n", mountData);
+
+ args[0] = NTFS_MOUNT_PATH;
+ args[1] = "-o";
+ args[2] = mountData;
+ args[3] = fsPath;
+ args[4] = mountPoint;
+ args[5] = NULL;
+
+ rc = logwrap(5, args, 1);
if (rc && errno == EROFS) {
SLOGE("%s appears to be a read only filesystem - retrying mount RO", fsPath);
- flags |= MS_RDONLY;
- rc = mount(fsPath, mountPoint, "ntfs", flags, mountData);
+ strcat(mountData, ",ro");
+ rc = logwrap(5, args, 1);
}
- return rc;
-}
-
-int Ntfs::format(const char *fsPath, unsigned int numSectors) {
-
- SLOGE("Format ntfs filesystem not supported\n");
- errno = EIO;
- return -1;
+ if (rc == 0 && createLost) {
+ char *lost_path;
+ asprintf(&lost_path, "%s/LOST.DIR", mountPoint);
+ if (access(lost_path, F_OK)) {
+ /*
+ * Create a LOST.DIR in the root so we have somewhere to put
+ * lost cluster chains (fsck_msdos doesn't currently do this)
+ */
+ if (mkdir(lost_path, 0755)) {
+ SLOGE("Unable to create LOST.DIR (%s)", strerror(errno));
+ }
+ }
+ free(lost_path);
+ }
+ return rc;
}
diff --git a/Ntfs.h b/Ntfs.h
index 8cc36de..c15e58b 100644
--- a/Ntfs.h
+++ b/Ntfs.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,7 +27,6 @@ public:
bool ro, bool remount, bool executable,
int ownerUid, int ownerGid, int permMask,
bool createLost);
- static int format(const char *fsPath, unsigned int numSectors);
};
#endif