From 2350c44ff39b4cb2940893964a05f778fc80a436 Mon Sep 17 00:00:00 2001 From: San Mehat Date: Tue, 2 Mar 2010 13:16:50 -0800 Subject: [PATCH] vold: Add support for xwarp Signed-off-by: San Mehat --- Android.mk | 3 +- CommandListener.cpp | 47 +++++++++++++++++++++++++ CommandListener.h | 7 ++++ ResponseCode.h | 1 + Xwarp.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++ Xwarp.h | 37 ++++++++++++++++++++ 6 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 Xwarp.cpp create mode 100644 Xwarp.h diff --git a/Android.mk b/Android.mk index bdb2325..7b18ca0 100644 --- a/Android.mk +++ b/Android.mk @@ -25,7 +25,8 @@ LOCAL_SRC_FILES:= \ Fat.cpp \ Loop.cpp \ Devmapper.cpp \ - ResponseCode.cpp + ResponseCode.cpp \ + Xwarp.cpp LOCAL_MODULE:= vold diff --git a/CommandListener.cpp b/CommandListener.cpp index 9516a67..7f81cc7 100644 --- a/CommandListener.cpp +++ b/CommandListener.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #define LOG_TAG "CommandListener" #include @@ -31,6 +32,7 @@ #include "VolumeManager.h" #include "ResponseCode.h" #include "Process.h" +#include "Xwarp.h" CommandListener::CommandListener() : FrameworkListener("vold") { @@ -38,6 +40,7 @@ CommandListener::CommandListener() : registerCmd(new AsecCmd()); registerCmd(new ShareCmd()); registerCmd(new StorageCmd()); + registerCmd(new XwarpCmd()); } CommandListener::VolumeCmd::VolumeCmd() : @@ -285,3 +288,47 @@ int CommandListener::AsecCmd::runCommand(SocketClient *cli, return 0; } + +CommandListener::XwarpCmd::XwarpCmd() : + VoldCommand("xwarp") { +} + +int CommandListener::XwarpCmd::runCommand(SocketClient *cli, + int argc, char **argv) { + if (argc < 2) { + cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); + return 0; + } + + if (!strcmp(argv[1], "enable")) { + if (Xwarp::enable()) { + cli->sendMsg(ResponseCode::OperationFailed, "Failed to enable xwarp", true); + return 0; + } + + cli->sendMsg(ResponseCode::CommandOkay, "Xwarp mirroring started", false); + } else if (!strcmp(argv[1], "disable")) { + if (Xwarp::disable()) { + cli->sendMsg(ResponseCode::OperationFailed, "Failed to disable xwarp", true); + return 0; + } + + cli->sendMsg(ResponseCode::CommandOkay, "Xwarp disabled", false); + } else if (!strcmp(argv[1], "status")) { + char msg[255]; + bool r; + unsigned mirrorPos, maxSize; + + if (Xwarp::status(&r, &mirrorPos, &maxSize)) { + cli->sendMsg(ResponseCode::OperationFailed, "Failed to get xwarp status", true); + return 0; + } + snprintf(msg, sizeof(msg), "%s %u %u", (r ? "ready" : "not-ready"), mirrorPos, maxSize); + cli->sendMsg(ResponseCode::XwarpStatusResult, msg, false); + } else { + cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false); + } + + return 0; +} + diff --git a/CommandListener.h b/CommandListener.h index 7d4560f..8861e38 100644 --- a/CommandListener.h +++ b/CommandListener.h @@ -54,6 +54,13 @@ private: virtual ~StorageCmd() {} int runCommand(SocketClient *c, int argc, char ** argv); }; + + class XwarpCmd : public VoldCommand { + public: + XwarpCmd(); + virtual ~XwarpCmd() {} + int runCommand(SocketClient *c, int argc, char ** argv); + }; }; #endif diff --git a/ResponseCode.h b/ResponseCode.h index 31d6482..5e15c80 100644 --- a/ResponseCode.h +++ b/ResponseCode.h @@ -32,6 +32,7 @@ public: static const int ShareStatusResult = 210; static const int AsecPathResult = 211; static const int ShareEnabledResult = 212; + static const int XwarpStatusResult = 213; // 400 series - The command was accepted but the requested action // did not take place. diff --git a/Xwarp.cpp b/Xwarp.cpp new file mode 100644 index 0000000..1435a53 --- /dev/null +++ b/Xwarp.cpp @@ -0,0 +1,83 @@ +/* + * 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 +#include +#include +#include +#include + +#include +#include + +#define LOG_TAG "Vold" + +#include + +#include "Xwarp.h" +const char *Xwarp::XWARP_BACKINGFILE = "/mnt/secure/asec/xwarp.img"; +const char *Xwarp::XWARP_CFG = "/sys/fs/yaffs/mtd3/xwarp-backing-store"; +const char *Xwarp::XWARP_READY = "/sys/fs/yaffs/mtd3/xwarp-ready"; +const char *Xwarp::XWARP_MIRROR_STATUS = "/sys/fs/yaffs/mtd3/xwarp-mirror"; + +int Xwarp::enable() { + return doEnableDisable(true); +} + +int Xwarp::disable() { + return doEnableDisable(false); +} + +int Xwarp::status(bool *ready, unsigned *mirrorPos, unsigned *maxSize) { + FILE *fp; + + *ready = false; + *mirrorPos = 0; + *maxSize = 0; + if (!(fp = fopen(XWARP_READY, "r"))) { + return -1; + } + + fscanf(fp, "%d", (int *) ready); + fclose(fp); + + if (!(fp = fopen(XWARP_MIRROR_STATUS, "r"))) { + return -1; + } + + fscanf(fp, "%u %u", mirrorPos, maxSize); + fclose(fp); + return 0; +} + +int Xwarp::doEnableDisable(bool enable) { + const char *tmp; + int fd = open(XWARP_CFG, O_WRONLY); + + if (fd < 0) + return -1; + + tmp = (enable ? XWARP_BACKINGFILE : ""); + + if (write(fd, tmp, strlen(tmp)+1) < 0) { + LOGE("Failed to write xwarp cfg (%s)", strerror(errno)); + close(fd); + return -1; + } + + close(fd); + return 0; +} diff --git a/Xwarp.h b/Xwarp.h new file mode 100644 index 0000000..918a843 --- /dev/null +++ b/Xwarp.h @@ -0,0 +1,37 @@ +/* + * 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 _XWARP_H +#define _XWARP_H + +#include + +class Xwarp { + static const char *XWARP_BACKINGFILE; + static const char *XWARP_CFG; + static const char *XWARP_READY; + static const char *XWARP_MIRROR_STATUS; + +public: + static int enable(); + static int disable(); + static int status(bool *ready, unsigned *mirrorPos, unsigned *maxSize); + +private: + static int doEnableDisable(bool enable); +}; + +#endif