summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkallt_kaffe <kallt_kaffe@apedroid.com>2012-03-07 10:42:19 +0100
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2012-07-10 20:10:35 +0100
commitce7457dfe9706b24bbfe98af82adceab50c2198e (patch)
tree8a1ba0e83189c4e3a0dfee5602f311e84cd9a539
parent75da9e2314889eef40836c56e232d9eb14e4afae (diff)
downloadsystem_vold-ce7457dfe9706b24bbfe98af82adceab50c2198e.zip
system_vold-ce7457dfe9706b24bbfe98af82adceab50c2198e.tar.gz
system_vold-ce7457dfe9706b24bbfe98af82adceab50c2198e.tar.bz2
vold: Add ntfs (read-only) support.
See http://review.cyanogenmod.com/#change,7457 for more info. Change-Id: Ic841e73be6435e8bbbb22984cc749e27c46826e8
-rw-r--r--Android.mk1
-rw-r--r--Ntfs.cpp103
-rw-r--r--Ntfs.h32
-rw-r--r--Volume.cpp31
4 files changed, 157 insertions, 10 deletions
diff --git a/Android.mk b/Android.mk
index 12826fe..5335cf6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -13,6 +13,7 @@ common_src_files := \
Process.cpp \
Ext4.cpp \
Fat.cpp \
+ Ntfs.cpp \
Loop.cpp \
Devmapper.cpp \
ResponseCode.cpp \
diff --git a/Ntfs.cpp b/Ntfs.cpp
new file mode 100644
index 0000000..d5e9772
--- /dev/null
+++ b/Ntfs.cpp
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "Vold"
+
+#include <cutils/log.h>
+#include <cutils/properties.h>
+
+#include "Ntfs.h"
+
+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;
+
+}
+
+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];
+
+ 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.
+ *
+ * TODO: Remove this code once we have a drop box in system_server.
+ */
+ char value[PROPERTY_VALUE_MAX];
+ property_get("persist.sampling_profiler", value, "");
+ if (value[0] == '1') {
+ SLOGW("The SD card is world-writable because the"
+ " 'persist.sampling_profiler' system property is set to '1'.");
+ permMask = 0;
+ }
+
+ sprintf(mountData,
+ "uid=%d,gid=%d,fmask=%o,dmask=%o",
+ ownerUid, ownerGid, permMask, permMask);
+
+ rc = mount(fsPath, mountPoint, "ntfs", flags, mountData);
+
+ 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);
+ }
+
+ return rc;
+}
+
+int Ntfs::format(const char *fsPath, unsigned int numSectors) {
+
+ SLOGE("Format ntfs filesystem not supported\n");
+ errno = EIO;
+ return -1;
+
+}
diff --git a/Ntfs.h b/Ntfs.h
new file mode 100644
index 0000000..8cc36de
--- /dev/null
+++ b/Ntfs.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _NTFS_H
+#define _NTFS_H
+
+#include <unistd.h>
+
+class Ntfs {
+public:
+ static int check(const char *fsPath);
+ static int doMount(const char *fsPath, const char *mountPoint,
+ bool ro, bool remount, bool executable,
+ int ownerUid, int ownerGid, int permMask,
+ bool createLost);
+ static int format(const char *fsPath, unsigned int numSectors);
+};
+
+#endif
diff --git a/Volume.cpp b/Volume.cpp
index 6421e09..624c3f0 100644
--- a/Volume.cpp
+++ b/Volume.cpp
@@ -44,6 +44,7 @@
#include "VolumeManager.h"
#include "ResponseCode.h"
#include "Fat.h"
+#include "Ntfs.h"
#include "Process.h"
#include "cryptfs.h"
@@ -411,16 +412,18 @@ int Volume::mountVol() {
errno = 0;
setState(Volume::State_Checking);
+ bool isFatFs = true;
if (Fat::check(devicePath)) {
if (errno == ENODATA) {
SLOGW("%s does not contain a FAT filesystem\n", devicePath);
- continue;
+ isFatFs = false;
+ } else {
+ errno = EIO;
+ /* Badness - abort the mount */
+ SLOGE("%s failed FS checks (%s)", devicePath, strerror(errno));
+ setState(Volume::State_Idle);
+ return -1;
}
- errno = EIO;
- /* Badness - abort the mount */
- SLOGE("%s failed FS checks (%s)", devicePath, strerror(errno));
- setState(Volume::State_Idle);
- return -1;
}
/*
@@ -434,10 +437,18 @@ int Volume::mountVol() {
// prevented users from writing to it. We don't want that.
gid = AID_SDCARD_RW;
- if (Fat::doMount(devicePath, "/mnt/secure/staging", false, false, false,
- AID_SYSTEM, gid, 0702, true)) {
- SLOGE("%s failed to mount via VFAT (%s)\n", devicePath, strerror(errno));
- continue;
+ if (isFatFs) {
+ if (Fat::doMount(devicePath, "/mnt/secure/staging", false, false, false,
+ AID_SYSTEM, gid, 0702, true)) {
+ SLOGE("%s failed to mount via VFAT (%s)\n", devicePath, strerror(errno));
+ continue;
+ }
+ } else {
+ if (Ntfs::doMount(devicePath, "/mnt/secure/staging", false, false, false,
+ AID_SYSTEM, gid, 0702, true)) {
+ SLOGE("%s failed to mount via NTFS (%s)\n", devicePath, strerror(errno));
+ continue;
+ }
}
SLOGI("Device %s, target %s mounted @ /mnt/secure/staging", devicePath, getMountpoint());