diff options
author | Mike Lockwood <lockwood@android.com> | 2010-07-02 15:15:07 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2010-07-02 15:19:32 -0400 |
commit | dad69277b7fdcc2759bec5a35ac45dae8f61ec9b (patch) | |
tree | ee9919310eddf3159d941aa11fd50eb54d9b988a /media/mtp | |
parent | 8dd2a39bae441143ebbb65237db63f65fdc1c645 (diff) | |
download | frameworks_base-dad69277b7fdcc2759bec5a35ac45dae8f61ec9b.zip frameworks_base-dad69277b7fdcc2759bec5a35ac45dae8f61ec9b.tar.gz frameworks_base-dad69277b7fdcc2759bec5a35ac45dae8f61ec9b.tar.bz2 |
MTP: Fix ownership and file permissions for transferred files and folders
All new files and folders are created with group sdcard_rw
Permissions for new files are 0664 and directories 0775
Change-Id: I6d508231150f687e2e529112fd47f10e30fa594f
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/mtp')
-rw-r--r-- | media/mtp/MtpServer.cpp | 16 | ||||
-rw-r--r-- | media/mtp/MtpServer.h | 9 | ||||
-rw-r--r-- | media/mtp/mtptest.cpp | 3 |
3 files changed, 24 insertions, 4 deletions
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index cc6fdad..b9eeec5 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -113,10 +113,14 @@ static const MtpObjectFormat kSupportedPlaybackFormats[] = { // MTP_FORMAT_PLS_PLAYLIST, }; -MtpServer::MtpServer(int fd, const char* databasePath) +MtpServer::MtpServer(int fd, const char* databasePath, + int fileGroup, int filePerm, int directoryPerm) : mFD(fd), mDatabasePath(databasePath), mDatabase(NULL), + mFileGroup(fileGroup), + mFilePermission(filePerm), + mDirectoryPermission(directoryPerm), mSessionID(0), mSessionOpen(false), mSendObjectHandle(kInvalidObjectHandle), @@ -536,10 +540,11 @@ MtpResponseCode MtpServer::doSendObjectInfo() { if (format == MTP_FORMAT_ASSOCIATION) { mode_t mask = umask(0); - int ret = mkdir((const char *)path, S_IRWXU | S_IRWXG | S_IRWXO); + int ret = mkdir((const char *)path, mDirectoryPermission); umask(mask); if (ret && ret != -EEXIST) return MTP_RESPONSE_GENERAL_ERROR; + chown((const char *)path, getuid(), mFileGroup); } else { mSendObjectFilePath = path; // save the handle for the SendObject call, which should follow @@ -571,12 +576,19 @@ MtpResponseCode MtpServer::doSendObject() { if (mfr.fd < 0) { return MTP_RESPONSE_GENERAL_ERROR; } + fchown(mfr.fd, getuid(), mFileGroup); + // set permissions + mode_t mask = umask(0); + fchmod(mfr.fd, mFilePermission); + umask(mask); + mfr.offset = 0; mfr.length = mSendObjectFileSize; // transfer the file ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr); close(mfr.fd); + // FIXME - we need to delete mSendObjectHandle from the database if this fails. LOGV("MTP_RECEIVE_FILE returned %d", ret); mSendObjectHandle = kInvalidObjectHandle; diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h index 42261a9..25635af 100644 --- a/media/mtp/MtpServer.h +++ b/media/mtp/MtpServer.h @@ -41,6 +41,12 @@ private: MtpSqliteDatabase* mDatabase; + // group to own new files and folders + int mFileGroup; + // permissions for new files and directories + int mFilePermission; + int mDirectoryPermission; + // current session ID MtpSessionID mSessionID; // true if we have an open session and mSessionID is valid @@ -61,7 +67,8 @@ private: size_t mSendObjectFileSize; public: - MtpServer(int fd, const char* databasePath); + MtpServer(int fd, const char* databasePath, + int fileGroup, int filePerm, int directoryPerm); virtual ~MtpServer(); void addStorage(const char* filePath); diff --git a/media/mtp/mtptest.cpp b/media/mtp/mtptest.cpp index 9062494..af0f77f 100644 --- a/media/mtp/mtptest.cpp +++ b/media/mtp/mtptest.cpp @@ -27,6 +27,7 @@ #include "MtpServer.h" #include "MtpStorage.h" #include "f_mtp.h" +#include "private/android_filesystem_config.h" using namespace android; @@ -76,7 +77,7 @@ int main(int argc, char* argv[]) { enable_usb_function("usb_mass_storage", false); enable_usb_function("mtp", true); - MtpServer server(fd, "/data/data/mtp/mtp.db"); + MtpServer server(fd, "/data/data/mtp/mtp.db", AID_SDCARD_RW, 0664, 0775); server.addStorage(storagePath); server.scanStorage(); server.run(); |