diff options
author | kallt_kaffe <kallt_kaffe@apedroid.com> | 2012-03-07 10:42:19 +0100 |
---|---|---|
committer | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2012-07-10 20:10:35 +0100 |
commit | ce7457dfe9706b24bbfe98af82adceab50c2198e (patch) | |
tree | 8a1ba0e83189c4e3a0dfee5602f311e84cd9a539 | |
parent | 75da9e2314889eef40836c56e232d9eb14e4afae (diff) | |
download | system_vold-ce7457dfe9706b24bbfe98af82adceab50c2198e.tar.gz system_vold-ce7457dfe9706b24bbfe98af82adceab50c2198e.tar.bz2 system_vold-ce7457dfe9706b24bbfe98af82adceab50c2198e.zip |
vold: Add ntfs (read-only) support.
See http://review.cyanogenmod.com/#change,7457 for more info.
Change-Id: Ic841e73be6435e8bbbb22984cc749e27c46826e8
-rw-r--r-- | Android.mk | 1 | ||||
-rw-r--r-- | Ntfs.cpp | 103 | ||||
-rw-r--r-- | Ntfs.h | 32 | ||||
-rw-r--r-- | Volume.cpp | 31 |
4 files changed, 157 insertions, 10 deletions
@@ -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; + +} @@ -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 @@ -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()); |