vold: Add support for xwarp

Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
San Mehat 2010-03-02 13:16:50 -08:00
parent f1b07fb5e3
commit 2350c44ff3
6 changed files with 177 additions and 1 deletions

View file

@ -25,7 +25,8 @@ LOCAL_SRC_FILES:= \
Fat.cpp \
Loop.cpp \
Devmapper.cpp \
ResponseCode.cpp
ResponseCode.cpp \
Xwarp.cpp
LOCAL_MODULE:= vold

View file

@ -21,6 +21,7 @@
#include <arpa/inet.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#define LOG_TAG "CommandListener"
#include <cutils/log.h>
@ -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;
}

View file

@ -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

View file

@ -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.

83
Xwarp.cpp Normal file
View file

@ -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 <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#define LOG_TAG "Vold"
#include <cutils/log.h>
#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;
}

37
Xwarp.h Normal file
View file

@ -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 <unistd.h>
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