diff options
-rw-r--r-- | Ntfs.cpp | 104 | ||||
-rw-r--r-- | Ntfs.h | 2 |
2 files changed, 78 insertions, 28 deletions
@@ -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; } @@ -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 |