CommandListener.cpp revision a19b250bd273455933ca3502cf2c2e0a803aff77
1f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat/* 2f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Copyright (C) 2008 The Android Open Source Project 3f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 4f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * you may not use this file except in compliance with the License. 6f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * You may obtain a copy of the License at 7f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 8f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 10f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Unless required by applicable law or agreed to in writing, software 11f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * See the License for the specific language governing permissions and 14f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * limitations under the License. 15f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat */ 16f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 17f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <stdlib.h> 18f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sys/socket.h> 19a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat#include <sys/types.h> 20f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <netinet/in.h> 21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <arpa/inet.h> 22a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat#include <dirent.h> 23f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <errno.h> 24f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define LOG_TAG "CommandListener" 26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sysutils/SocketClient.h> 29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "CommandListener.h" 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h" 32a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "ResponseCode.h" 33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 34f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::CommandListener() : 35f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat FrameworkListener("vold") { 36f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat registerCmd(new ListVolumesCmd()); 37a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new MountCmd()); 38a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new UnmountCmd()); 39a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareCmd()); 40a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new UnshareCmd()); 41a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareAvailableCmd()); 42a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new SimulateCmd()); 43a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new FormatCmd()); 44a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new CreateAsecCmd()); 45a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new FinalizeAsecCmd()); 46a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new DestroyAsecCmd()); 47a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new MountAsecCmd()); 48a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new ListAsecCmd()); 49a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new AsecPathCmd()); 50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 52f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::ListVolumesCmd::ListVolumesCmd() : 53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VoldCommand("list_volumes") { 54f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 55f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 56f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint CommandListener::ListVolumesCmd::runCommand(SocketClient *cli, 57f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 58f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return VolumeManager::Instance()->listVolumes(cli); 59f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 60f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 61a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::MountCmd::MountCmd() : 62a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("mount") { 63f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 64f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 65a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::MountCmd::runCommand(SocketClient *cli, 66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 6749e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat /* Synchronously mount a volume */ 6849e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat if (VolumeManager::Instance()->mountVolume(argv[1])) { 69a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to mount volume.", true); 7049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 71a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume mounted.", false); 7249e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 7349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 74f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 75f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 76f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 77a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnmountCmd::UnmountCmd() : 78a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("unmount") { 79f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 80f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 81a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnmountCmd::runCommand(SocketClient *cli, 82f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 8349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat /* Synchronously unmount a volume */ 84a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->unmountVolume(argv[1])) { 85a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to unmount volume.", true); 86a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 87a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume unmounted.", false); 88a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 89a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 90a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 91a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 92a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 93a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() : 94a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share") { 95a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 96a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 97a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli, 98a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 99a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->shareVolume(argv[1], argv[2])) { 100a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to share volume.", true); 10149e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 102a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume shared.", false); 10349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 10449e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 105f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 106f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 107f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 108a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnshareCmd::UnshareCmd() : 109a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("unshare") { 110f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 111f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 112a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnshareCmd::runCommand(SocketClient *cli, 113f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 114a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->unshareVolume(argv[1], argv[2])) { 115a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to unshare volume.", true); 116a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 117a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume unshared.", false); 118a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 119a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 120f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 121f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 122f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 123a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareAvailableCmd::ShareAvailableCmd() : 124a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share_available") { 125f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 126f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 127a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareAvailableCmd::runCommand(SocketClient *cli, 128f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 129a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat bool avail = false; 130a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 131a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->shareAvailable(argv[1], &avail)) { 132a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, 133a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat "Failed to determine share availability", true); 134a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 135a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::ShareAvailabilityResult, 136a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat (avail ? "Share available" : "Share unavailable"), 137a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat false); 138a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 139a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 140a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 141a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 142a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::SimulateCmd::SimulateCmd() : 143a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("simulate") { 144a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 145a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 146a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::SimulateCmd::runCommand(SocketClient *cli, 147a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 148a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->simulate(argv[1], argv[2])) { 149a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to execute.", true); 150a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 151a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Simulation executed.", false); 152a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 153a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 154a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 155a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 156a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 157a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::FormatCmd::FormatCmd() : 158a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("format") { 159a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 160a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 161a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::FormatCmd::runCommand(SocketClient *cli, 162a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 163a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->formatVolume(argv[1])) { 164a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to format", true); 165a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 166a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume formatted.", false); 167a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 168a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 169f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 170f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 171a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 172a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::CreateAsecCmd::CreateAsecCmd() : 173a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("create_asec") { 174a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 175a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 176a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::CreateAsecCmd::runCommand(SocketClient *cli, 177a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 178a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 6) { 179a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 180a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: create_asec <namespace-id> <size_mb> <fstype> <key> <ownerUid>", 181a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat false); 182a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 183a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 184a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 185a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->createAsec(argv[1], atoi(argv[2]), 186a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat argv[3], argv[4], 187a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat atoi(argv[5]))) { 188a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Cache creation failed", true); 189a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 190a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Cache created", false); 191a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 192a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 193a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 194a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 195a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 196a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::FinalizeAsecCmd::FinalizeAsecCmd() : 197a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("finalize_asec") { 198a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 199a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 200a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::FinalizeAsecCmd::runCommand(SocketClient *cli, 201a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 202a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 2) { 203a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 204a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: finalize_asec <namespace-id>", false); 205a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 206a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 207a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 208a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->finalizeAsec(argv[1])) { 209a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Cache finalize failed", true); 210a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 211a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Cache finalized", false); 212a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 213a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 214a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 215a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 216a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::DestroyAsecCmd::DestroyAsecCmd() : 217a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("destroy_asec") { 218a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 219a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 220a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::DestroyAsecCmd::runCommand(SocketClient *cli, 221a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 222a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 2) { 223a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 224a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: destroy_asec <namespace-id>", false); 225a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 226a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 227a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 228a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->destroyAsec(argv[1])) { 229a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Destroy failed", true); 230a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 231a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Cache Destroyed", false); 232a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 233a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 234a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 235a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 236a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::MountAsecCmd::MountAsecCmd() : 237a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("mount_asec") { 238a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 239a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 240a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::MountAsecCmd::runCommand(SocketClient *cli, 241a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 242a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 4) { 243a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 244a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: mount_asec <namespace-id> <key> <ownerUid>", false); 245a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 246a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 247a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 248a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->mountAsec(argv[1], argv[2], atoi(argv[3]))) { 249a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Mount failed", true); 250a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 251a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Mount succeeded", false); 252a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 253a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 254a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 255a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 256a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::ListAsecCmd::ListAsecCmd() : 257a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("list_asec") { 258a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 259a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 260a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 261a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::ListAsecCmd::runCommand(SocketClient *cli, 262a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 263a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat DIR *d = opendir("/sdcard/android_secure"); 264a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 265a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (!d) { 266a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true); 267a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 268a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 269a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 270a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat struct dirent *dent; 271a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat while ((dent = readdir(d))) { 272a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (dent->d_name[0] == '.') 273a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat continue; 274a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) { 275a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat char id[255]; 276a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat memset(id, 0, sizeof(id)); 277a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat strncpy(id, dent->d_name, strlen(dent->d_name) -5); 278a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::AsecListResult, id, false); 279a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 280a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 281a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat closedir(d); 282a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ASEC listing complete", false); 283a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 284a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 285a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 286a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 287a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::AsecPathCmd::AsecPathCmd() : 288a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("asec_path") { 289a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 290a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 291a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::AsecPathCmd::runCommand(SocketClient *cli, 292a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 293a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 2) { 294a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 295a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: asec_path <namespace-id>", false); 296a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 297a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 298a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 299a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat char mountPath[255]; 300a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 301a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->getAsecMountPath(argv[1], mountPath, 302a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat sizeof(mountPath))) { 303a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get mount path", true); 304a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 305a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::AsecPathResult, mountPath, false); 306a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 307a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 308a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 309a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 310